for循环
# for 循环
在 Python 中,for
循环是处理重复性任务最强大、最常用的工具之一。它能让你优雅地“遍历”一个数据集合中的每一项,并对它们执行操作。本指南将带你从基础到高级,彻底掌握 for
循环的方方面面。
# 1. for
循环的核心:遍历可迭代对象
for
循环的本质是遍历 (Iteration)。所谓遍历,就是逐一访问一个集合中所有元素的过程。
可迭代对象 (Iterable):任何可以被
for
循环遍历的对象都是可迭代对象。Python 中最常见的可迭代对象包括:- 序列类型:列表
list
, 元组tuple
, 字符串str
- 映射类型:字典
dict
- 集合类型:集合
set
- 其他:
range()
对象、文件对象等。
- 序列类型:列表
基本语法结构:
for temporary_variable in iterable: # 对 temporary_variable 执行的代码块 # 每一轮循环,temporary_variable 都会被赋予 iterable 中的下一个元素 ...
1
2
3
4示例:遍历列表和字符串
# 遍历一个水果列表 fruits = ["apple", "banana", "cherry"] print("--- 遍历水果列表 ---") for fruit in fruits: print(f"当前水果是: {fruit}") # 输出: # 当前水果是: apple # 当前水果是: banana # 当前水果是: cherry # 遍历一个字符串 text = "Python" print("\n--- 遍历字符串 ---") for char in text: print(char, end=' ') # end=' ' 让输出不换行,用空格分隔 # 输出: P y t h o n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2. 使用 range()
函数进行数值循环
当你需要循环指定的次数,或者需要一个数字序列时,range()
函数是最佳选择。
range(stop)
: 生成从0
到stop-1
的整数序列。range(start, stop)
: 生成从start
到stop-1
的整数序列。range(start, stop, step)
: 生成从start
到stop-1
,每次递增step
的整数序列。
# 示例 1: 循环 5 次
print("--- range(5) ---")
for i in range(5):
print(i) # 输出: 0, 1, 2, 3, 4
# 示例 2: 从 2 到 5
print("\n--- range(2, 6) ---")
for i in range(2, 6):
print(i) # 输出: 2, 3, 4, 5
# 示例 3: 1到10之间的奇数
print("\n--- range(1, 10, 2) ---")
for i in range(1, 10, 2):
print(i) # 输出: 1, 3, 5, 7, 9
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3. 遍历字典:键、值与键值对
遍历字典时,你可以选择只遍历键、只遍历值,或者同时遍历键值对。
student = {"name": "Alice", "age": 25, "major": "CS"}
# 方法 1: 直接遍历字典 (默认遍历键)
print("--- 遍历键 ---")
for key in student:
print(f"键: {key}, 值: {student[key]}")
# 输出:
# 键: name, 值: Alice
# 键: age, 值: 25
# 键: major, 值: CS
# 方法 2: 使用 .values() 遍历值
print("\n--- 遍历值 ---")
for value in student.values():
print(value)
# 输出:
# Alice
# 25
# CS
# 方法 3: 使用 .items() 遍历键值对 (最常用)
print("\n--- 遍历键值对 ---")
for key, value in student.items():
print(f"{key} -> {value}")
# 输出:
# name -> Alice
# age -> 25
# major -> CS
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 4. 循环控制:break
与 continue
break
和 continue
可以在循环内部提供更精细的流程控制。
# 4.1 break
:立即终止循环
当循环遇到 break
语句时,会立即完全终止当前的 for
循环,程序将执行循环之后的代码。
# 场景:在列表中找到第一个目标数字就停止
numbers = [1, 5, 8, 12, 7, 20]
target = 12
for num in numbers:
print(f"正在检查: {num}")
if num == target:
print(f"找到了目标数字 {target}!")
break # 立即跳出循环
print("循环结束。")
# 输出:
# 正在检查: 1
# 正在检查: 5
# 正在检查: 8
# 正在检查: 12
# 找到了目标数字 12!
# 循环结束。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4.2 continue
:跳过当前迭代
当循环遇到 continue
语句时,会跳过当前这一轮循环的剩余部分,直接进入下一轮迭代。
# 场景:只打印列表中的偶数
numbers = [1, 2, 3, 4, 5, 6]
for num in numbers:
if num % 2 != 0: # 如果是奇数
continue # 跳过本次循环的 print 语句
print(f"发现一个偶数: {num}")
# 输出:
# 发现一个偶数: 2
# 发现一个偶数: 4
# 发现一个偶数: 6
2
3
4
5
6
7
8
9
10
11
# 5. 嵌套 for
循环:处理多维数据
在一个 for
循环内部嵌套另一个 for
循环,常用于处理二维数据结构,如矩阵(列表的列表)。
# 示例:打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}x{i}={i*j}\t", end="") # \t 是制表符,end="" 防止换行
print() # 在每行结束后换行
# 输出:
# 1x1=1
# 1x2=2 2x2=4
# 1x3=3 2x3=6 3x3=9
# ... (以此类推)
2
3
4
5
6
7
8
9
10
11
# 6. 优雅的遍历工具:enumerate
和 zip
# 6.1 enumerate()
:同时获取索引和元素
enumerate()
函数可以让你在遍历时,同时获得每个元素的索引和值,使代码更简洁。
fruits = ["apple", "banana", "cherry"]
# 传统方式
# i = 0
# for fruit in fruits:
# print(f"{i}: {fruit}")
# i += 1
# 使用 enumerate (推荐)
for index, fruit in enumerate(fruits):
print(f"索引 {index} 对应水果 {fruit}")
# 输出:
# 索引 0 对应水果 apple
# 索引 1 对应水果 banana
# 索引 2 对应水果 cherry
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 6.2 zip()
:并行遍历多个序列
zip()
函数可以将多个可迭代对象“压缩”在一起,让你可以在一次循环中并行地遍历它们。
注意:
zip()
会在最短的那个可迭代对象耗尽时停止。
students = ["Alice", "Bob", "Charlie"]
scores = [95, 88, 72]
for student, score in zip(students, scores):
print(f"{student} 的分数是 {score}")
# 输出:
# Alice 的分数是 95
# Bob 的分数是 88
# Charlie 的分数是 72
2
3
4
5
6
7
8
9
# 7. for-else
语句:循环结束后的附加操作
for
循环可以带有一个 else
子句。这个 else
块的执行时机非常特殊:它只在 for
循环正常、完整地执行完毕(即没有被 break
语句中断)后才会执行。
# 场景1:循环正常结束
print("--- 场景1:寻找数字 10 ---")
numbers = [1, 3, 5, 7]
for num in numbers:
if num == 10:
print("找到了 10!")
break
else:
# 因为循环跑完了都没找到 10,所以 else 会执行
print("列表中没有找到 10。")
# 输出:
# --- 场景1:寻找数字 10 ---
# 列表中没有找到 10。
# 场景2:循环被 break 中断
print("\n--- 场景2:寻找数字 5 ---")
numbers = [1, 3, 5, 7]
for num in numbers:
if num == 5:
print("找到了 5!")
break # 循环在此处中断
else:
# 因为循环被 break 了,所以 else 不会执行
print("列表中没有找到 5。")
# 输出:
# --- 场景2:寻找数字 5 ---
# 找到了 5!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 8. for
循环的升华:推导式 (Comprehensions)
推导式是一种极其 Pythonic 的语法,它允许你用一行代码,通过 for
循环来快速创建列表、集合或字典。
列表推导式 (List Comprehension)
# 创建一个包含 0 到 9 平方的列表 squares = [x**2 for x in range(10)] print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1
2
3字典推导式 (Dictionary Comprehension)
# 创建一个数字及其平方的字典 square_dict = {x: x**2 for x in range(5)} print(square_dict) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
1
2
3
# 9. 最佳实践与常见陷阱
不要在循环中修改你正在迭代的序列! 在
for
循环中对列表或字典进行添加或删除操作,可能会导致不可预知的行为或错误。如果需要修改,最好是创建一个新列表,或迭代原列表的副本 (for item in my_list[:]
)。明确循环变量的意义: 给循环变量起一个有意义的名字(如
for fruit in fruits:
而不是for x in my_list:
),这能极大地提高代码的可读性。善用
enumerate
和zip
: 当需要索引或需要并行处理多个序列时,优先使用这两个内置函数,它们比手动管理索引更高效、更不易出错。