0%

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

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

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

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

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

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

遍历列表:

1
2
3
4
students = ["张三", "李四", "王五"]

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

遍历字符串:按字符遍历

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

遍历字典:默认遍历键

1
2
3
4
5
6
7
8
9
10
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:固定次数循环

1
2
3
4
5
6
7
8
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

1
2
3
4
fruits = ["苹果", "香蕉", "橙子"]

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

并行遍历多个列表:用 zip

1
2
3
4
5
names = ["Alice", "Bob", "Charlie"]
scores = [95, 88, 92]

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

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

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

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

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

等到用户输入正确为止:

1
2
3
4
5
6
7
8
9
correct = "python123"
user_input = ""

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

print("登录成功")

处理不确定长度的数据:

1
2
3
4
5
6
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:找到想要的东西就停

1
2
3
4
5
6
7
numbers = [10, 20, 30, 40, 50]

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

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

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

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

1
2
3
4
5
6
7
8
9
fruits = ["苹果", "香蕉", "橙子"]
target = "葡萄"

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

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

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

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

打印九九乘法表:

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

遍历二维列表:

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

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

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

循环性能优化

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

1
2
3
4
5
6
7
8
9
10
# 普通写法
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. 把不变的计算移到循环外面

1
2
3
4
5
6
7
8
9
10
# 错误 每次循环都算一遍
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. 遍历时不要修改被遍历的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
# 错误: 边遍历边删,会出问题
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]

欢迎关注我的其它发布渠道