Python中的for循环是一种极其强大且灵活的控制结构,它通过遍历可迭代对象(iterable)来执行重复操作。与C/C++等语言不同,Python的for循环更像是"foreach"循环,专注于遍历集合元素而非基于计数器。
python复制for 变量 in 可迭代对象:
# 循环体(必须缩进)
执行语句
这里的"可迭代对象"可以是:
注意:Python使用缩进(通常是4个空格)来界定代码块。循环体必须保持一致的缩进级别,这是Python语法强制要求的。
当for循环执行时,Python解释器会:
__iter__()方法获取迭代器__next__()方法获取下一个值这个机制使得for循环可以统一处理各种可迭代对象,无论是内置类型还是自定义类。
列表和元组是最常见的遍历对象:
python复制# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit.upper())
# 遍历元组
colors = ("red", "green", "blue")
for color in colors:
print(f"Color: {color}")
字符串本质上也是字符序列:
python复制text = "Python"
for char in text:
print(char, ord(char)) # 打印字符及其ASCII码
range()函数生成整数序列,常用于控制循环次数:
python复制# 基本用法:range(stop)
for i in range(5): # 0-4
print(i)
# 指定起始点:range(start, stop)
for i in range(3, 7): # 3-6
print(i**2)
# 指定步长:range(start, stop, step)
for i in range(10, 0, -2): # 10,8,6,4,2
print(i)
提示:range()生成的是"惰性序列",不会立即创建所有元素,而是按需生成,内存效率高。
字典遍历有多种方式,各有适用场景:
python复制person = {"name": "Alice", "age": 25, "city": "New York"}
# 遍历键(默认行为)
for key in person:
print(key)
# 显式遍历键
for key in person.keys():
print(key)
# 遍历值
for value in person.values():
print(value)
# 同时遍历键值对(最常用)
for key, value in person.items():
print(f"{key}: {value}")
break和continue提供了精细的循环控制:
python复制# break示例:查找第一个偶数
numbers = [1, 3, 5, 8, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"找到第一个偶数: {num}")
break
else: # 循环正常结束(未遇到break)时执行
print("未找到偶数")
# continue示例:跳过负数
values = [5, -2, 8, -1, 9]
total = 0
for val in values:
if val < 0:
continue
total += val
print(f"正数总和: {total}")
嵌套循环常用于处理多维数据:
python复制# 矩阵乘法示例
matrix_a = [[1, 2], [3, 4]]
matrix_b = [[5, 6], [7, 8]]
result = [[0, 0], [0, 0]]
for i in range(len(matrix_a)):
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
result[i][j] += matrix_a[i][k] * matrix_b[k][j]
性能提示:Python的嵌套循环性能较低,对于大规模数值计算,建议使用NumPy等专业库。
在遍历时直接修改集合会导致意外行为:
python复制# 错误示范:遍历时删除元素
numbers = [1, 2, 3, 4]
for num in numbers:
if num % 2 == 0:
numbers.remove(num) # 可能导致跳过元素或错误
# 正确做法:创建副本或使用列表推导式
numbers = [1, 2, 3, 4]
for num in numbers[:]: # 遍历副本
if num % 2 == 0:
numbers.remove(num)
使用enumerate()同时获取索引和值:
python复制fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1): # 从1开始计数
print(f"{index}. {fruit}")
zip()函数可以并行遍历多个序列:
python复制names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"{name} is {age} years old")
python复制# 列表 vs 生成器表达式
# 低效方式
sum([x**2 for x in range(1000000)]) # 先生成完整列表
# 高效方式
sum(x**2 for x in range(1000000)) # 使用生成器表达式
python复制# 查找元素时,直接使用in运算符比循环更高效
if target in my_list: # 替代for循环检查
print("Found")
许多内置函数可以替代显式循环:
python复制# 使用map()替代循环
numbers = [1, 2, 3]
squared = list(map(lambda x: x**2, numbers))
# 使用filter()过滤元素
evens = list(filter(lambda x: x % 2 == 0, numbers))
python复制# 从CSV文件读取数据并处理
import csv
with open('data.csv') as f:
reader = csv.DictReader(f)
for row in reader:
# 数据清洗
row['price'] = float(row['price'].strip('$'))
# 条件过滤
if row['price'] > 100:
# 数据处理
discount = row['price'] * 0.9
print(f"原价: {row['price']}, 折后价: {discount}")
python复制import os
# 遍历目录树
for root, dirs, files in os.walk('/path/to/directory'):
for filename in files:
if filename.endswith('.py'):
filepath = os.path.join(root, filename)
print(f"Python文件: {filepath}")
python复制import requests
# 批量处理API请求
urls = [
'https://api.example.com/users/1',
'https://api.example.com/users/2',
'https://api.example.com/users/3'
]
for url in urls:
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print(f"用户: {data['name']}, 邮箱: {data['email']}")
可读性优先:使用有意义的变量名,如for student in students而非for x in y
保持循环简洁:如果循环体过长,考虑将部分逻辑提取为函数
异常处理:在循环内部处理可能的异常,避免整个循环中断
python复制for url in urls:
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
# 处理响应
except requests.RequestException as e:
print(f"请求失败: {url}, 错误: {e}")
continue
python复制for filename in file_list:
with open(filename) as f:
process(f.read())
python复制total = len(big_list)
for i, item in enumerate(big_list, 1):
process(item)
if i % 100 == 0:
print(f"进度: {i/total:.1%}")
for循环是Python编程中最基础也最强大的工具之一。掌握其各种用法和最佳实践,可以编写出既高效又易读的Python代码。在实际项目中,我经常发现合理使用for循环配合Python的内置函数和生成器表达式,可以大幅简化代码逻辑并提升执行效率。