Python 循环结构使用指南
循环结构是程序中进行重复操作的重要控制结构,Python 提供了 for 和 while 两种循环语句。
1. for 循环
1.1 基本用法
# 遍历列表
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
print(fruit)
# 遍历字符串
for char in "Python":
print(char)
# 使用 range()
for i in range(5): # 0 到 4
print(i)
for i in range(2, 5): # 2 到 4
print(i)
for i in range(0, 10, 2): # 0,2,4,6,8 (步长为2)
print(i)
1.2 高级用法
# enumerate() 同时获取索引和值
fruits = ['apple', 'banana', 'orange']
for index, fruit in enumerate(fruits):
print(f"索引 {index}: {fruit}")
# zip() 同时遍历多个序列
names = ['张三', '李四', '王五']
ages = [20, 25, 30]
for name, age in zip(names, ages):
print(f"{name} 今年 {age} 岁")
# 字典遍历
student = {'name': '张三', 'age': 20, 'city': '北京'}
for key in student: # 遍历键
print(key)
for value in student.values(): # 遍历值
print(value)
for key, value in student.items(): # 遍历键值对
print(f"{key}: {value}")
1.3 range 详解
# range() 函数的三种用法
# 1. range(stop):从0开始,步长为1
for i in range(5):
print(i) # 输出: 0, 1, 2, 3, 4
# 2. range(start, stop):指定起始值和结束值
for i in range(2, 6):
print(i) # 输出: 2, 3, 4, 5
# 3. range(start, stop, step):指定起始值、结束值和步长
for i in range(1, 10, 2):
print(i) # 输出: 1, 3, 5, 7, 9
# 负步长:倒序遍历
for i in range(10, 0, -1):
print(i) # 输出: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
# 常见应用场景
# 1. 遍历列表索引
fruits = ['apple', 'banana', 'orange']
for i in range(len(fruits)):
print(f"索引 {i}: {fruits[i]}")
# 2. 生成数字序列
even_numbers = list(range(0, 11, 2)) # [0, 2, 4, 6, 8, 10]
# 3. 指定循环次数
for _ in range(3): # 当不需要使用索引值时,可用_代替
print("重复三次")
2. while 循环
2.1 基本用法
# 基本 while 循环
count = 0
while count < 5:
print(count)
count += 1
# 无限循环
while True:
user_input = input("请输入(q退出):")
if user_input == 'q':
break
print(f"你输入了:{user_input}")
2.2 条件控制
# break 语句:跳出循环
for i in range(5):
if i == 3:
break
print(i) # 输出 0,1,2
# continue 语句:跳过当前迭代
for i in range(5):
if i == 3:
continue
print(i) # 输出 0,1,2,4
# else 子句:循环正常完成时执行
for i in range(3):
print(i)
else:
print("循环正常结束") # 循环没有被 break 时执行
3. 循环技巧
3.1 列表推导式
# 基本列表推导式
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0] # [0, 4, 16, 36, 64]
# 嵌套循环的列表推导式
matrix = [[i+j for j in range(3)] for i in range(3)]
# [[0,1,2], [1,2,3], [2,3,4]]
# 字典推导式
squares_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 集合推导式
squares_set = {x**2 for x in range(5)}
# {0, 1, 4, 9, 16}
3.2 生成器表达式
# 生成器表达式(节省内存)
squares_gen = (x**2 for x in range(5))
for square in squares_gen:
print(square)
# 生成器函数
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for num in fibonacci(5):
print(num) # 输出斐波那契数列前5个数
4. 实用示例
4.1 嵌套循环
# 打印乘法表
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()
4.2 循环应用
def find_prime_numbers(n):
"""找出n以内的所有质数"""
primes = []
for num in range(2, n + 1):
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
break
else:
primes.append(num)
return primes
# 冒泡排序
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
5. 性能优化
5.1 循环优化技巧
# 在循环外定义变量
size = len(array) # 避免在循环中重复计算
for i in range(size):
# 处理数组
# 使用 join 而不是 += 连接字符串
parts = []
for item in items:
parts.append(str(item))
result = ''.join(parts) # 比循环中使用 += 更高效
# 使用生成器处理大数据
def process_large_file(filename):
with open(filename) as f:
for line in f: # 逐行读取,节省内存
yield line.strip()
5.2 避免常见陷阱
# 避免在循环中修改列表
# 错误方式
items = [1, 2, 3, 4, 5]
for item in items:
if item % 2 == 0:
items.remove(item) # 可能跳过元素
# 正确方式
items = [item for item in items if item % 2 != 0]
# 避免在循环中频繁分配内存
# 错误方式
result = ''
for item in items:
result += str(item) # 每次都创建新字符串
# 正确方式
result = ''.join(str(item) for item in items)
注意事项
- 选择合适的循环类型(for 用于已知迭代次数,while 用于条件控制)
- 注意循环的终止条件,避免无限循环
- 合理使用 break 和 continue
- 列表推导式要保持简洁,过于复杂时应使用常规循环
- 处理大数据时考虑使用生成器
- 避免在循环中修改正在迭代的序列
常见错误处理
# 处理可能的异常
try:
for i in range(5):
result = 10 / (2 - i) # 可能发生除零错误
print(result)
except ZeroDivisionError:
print("除数不能为零")
# 循环中的类型错误
try:
numbers = [1, '2', 3, 'four', 5]
for num in numbers:
print(int(num))
except ValueError:
print("无法转换为整数")