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)
|
遍历字典:默认遍历键
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)
for name, score in scores.items(): print(f"{name}: {score}")
|
遍历 range:固定次数循环
1 2 3 4 5 6 7 8
| for i in range(5): print(f"第 {i} 次")
for i in range(1, 6): print(i)
for i in range(1, 10, 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}")
|
continue:这次跳过,继续下一次
1 2 3 4
| for i in range(1, 6): if i % 2 == 0: continue print(f"奇数:{i}")
|
else:循环正常结束了(没被 break 打断)才执行
1 2 3 4 5 6 7 8 9
| fruits = ["苹果", "香蕉", "橙子"] target = "葡萄"
for fruit in fruits: if fruit == target: print("找到了") break else: print("没找到")
|
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]
|