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]