Python 3 循环详解:for 循环、while 循环与实战技巧

Python 循环:重复的事交给代码去做

写程序,大量的事情都是重复的——遍历列表里的每个元素、处理文件的每一行、一直等到某个条件满足。

Python 给了你两种方式做重复的事:for 循环和 while 循环。什么时候用哪个,判断标准就一条:知道要遍历什么用 for,知道要等到什么时候用 while

for 循环:给我一个集合,我挨个处理

for 循环的核心是”遍历”——你给我一个列表、字符串、字典、或者任何”可迭代”的东西,我一个一个取出来处理。

遍历列表:

students = ["张三", "李四", "王五"]

for name in students:
    print(f"当前学生:{name}")

遍历字符串:按字符遍历

for char in "Python":
    print(char)   # P, y, t, h, o, n

遍历字典:默认遍历键

scores = {"张三": 95, "李四": 88}

for name in scores:          # 遍历键
    print(name)              # 张三, 李四

for score in scores.values(): # 遍历值
    print(score)             # 95, 88

for name, score in scores.items():  # 遍历键值对
    print(f"{name}: {score}")

遍历 range:固定次数循环

for i in range(5):      # 0, 1, 2, 3, 4
    print(f"第 {i} 次")

for i in range(1, 6):   # 1, 2, 3, 4, 5
    print(i)

for i in range(1, 10, 2):  # 1, 3, 5, 7, 9,步长2
    print(i)

同时取索引和值:用 enumerate

fruits = ["苹果", "香蕉", "橙子"]

for index, fruit in enumerate(fruits):
    print(f"第{index+1}个:{fruit}")

并行遍历多个列表:用 zip

names = ["Alice", "Bob", "Charlie"]
scores = [95, 88, 92]

for name, score in zip(names, scores):
    print(f"{name} 得分:{score}")

while 循环:条件成立就一直做

while 循环的核心是”等条件变 false”——你不知道要循环多少次,只知道”什么时候该停”。

固定次数用 while 写(虽然不如 for 方便):

count = 1
while count <= 5:
    print(f"第 {count} 次")
    count += 1   # 别忘了更新条件,否则死循环

等到用户输入正确为止:

correct = "python123"
user_input = ""

while user_input != correct:
    user_input = input("请输入密码:")
    if user_input != correct:
        print("密码错误")

print("登录成功")

处理不确定长度的数据:

lines = ["第一行", "第二行", "第三行"]
index = 0

while index < len(lines):
    print(lines[index])
    index += 1

什么时候用 while 而不是 for?

场景 用什么
遍历已知的列表、字典、字符串 for
固定次数循环(如 10 次) for + range()
不知道要循环几次,只知道什么时候停 while
等待某个条件成立(如用户输入正确) while
流式处理(边读边处理,直到读完) while

循环控制:break、continue、else

break:找到想要的东西就停

numbers = [10, 20, 30, 40, 50]

for num in numbers:
    if num == 30:
        print("找到了,停止")
        break
    print(f"当前:{num}")   # 只打印 10, 20

continue:这次跳过,继续下一次

for i in range(1, 6):
    if i % 2 == 0:
        continue   # 偶数跳过
    print(f"奇数:{i}")   # 1, 3, 5

else:循环正常结束了(没被 break 打断)才执行

fruits = ["苹果", "香蕉", "橙子"]
target = "葡萄"

for fruit in fruits:
    if fruit == target:
        print("找到了")
        break
else:
    print("没找到")   # 这个会执行,因为 break 没触发

for-else 这个写法第一次看到可能会觉得奇怪,但在”查找某个元素”的场景下很好用——else 表示”找遍了都没有”。

嵌套循环:循环里面套循环

外层循环执行一次,内层循环执行完整一轮。

打印九九乘法表:

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()   # 换行

遍历二维列表:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for row in matrix:
    for num in row:
        print(num, end=" ")
    print()

嵌套循环的层数不宜过多,两层是常见的极限。三层以上就要考虑能不能拆成多个函数了。

循环性能优化

1. 用列表推导式代替简单循环

# 普通写法
squares = []
for i in range(10):
    squares.append(i ** 2)

# 列表推导式(更快、更简洁)
squares = [i ** 2 for i in range(10)]

# 带条件的推导式
evens = [i for i in range(20) if i % 2 == 0]

列表推导式底层是 C 语言实现,比手动循环快 30%-50%,而且代码更短。

2. 把不变的计算移到循环外面

# 错误 每次循环都算一遍
for i in range(1000000):
    if i < math.sqrt(100):
        pass

# 优化: 算一次,用多次
limit = math.sqrt(100)
for i in range(1000000):
    if i < limit:
        pass

3. 遍历时不要修改被遍历的对象

# 错误: 边遍历边删,会出问题
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)

# 优化: 遍历副本
for num in numbers[:]:
    if num % 2 == 0:
        numbers.remove(num)

# 更好:用列表推导式直接生成新列表
numbers = [num for num in numbers if num % 2 != 0]