for、while、推导式入门
本文介绍 Python 的循环结构和列表推导式,是 Python 编程的核心技能。
1. for 循环
Python 的 for 循环用于遍历序列(列表、元组、字符串等)。
基本语法
# 遍历列表
fruits = ["apple", "banana", "orange"]
for fruit in fruits:
print(fruit)
# 遍历字符串
for char in "hello":
print(char)
# 遍历元组
colors = ("red", "green", "blue")
for color in colors:
print(color)
range 函数
# range(start, stop, step)
range(5) # 0,1,2,3,4
range(1, 6) # 1,2,3,4,5
range(0, 10, 2) # 0,2,4,6,8
range(5, 0, -1) # 5,4,3,2,1
# 常用场景
for i in range(10):
print(i) # 打印 0-9
enumerate - 带索引遍历
fruits = ["apple", "banana", "orange"]
# 带索引遍历
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 指定起始索引
for index, fruit in enumerate(fruits, start=1):
print(f"{index}: {fruit}")
zip - 并行遍历
names = ["Alice", "Bob", "Carol"]
ages = [25, 30, 28]
# 并行遍历
for name, age in zip(names, ages):
print(f"{name}: {age}")
# 多个序列
for name, age, city in zip(names, ages, ["Beijing", "Shanghai", "Guangzhou"]):
print(f"{name}, {age}, {city}")
2. while 循环
while 循环在条件为真时重复执行代码块。
基本语法
count = 0
while count < 5:
print(count)
count += 1
# 死循环示例(不要这样写)
# while True:
# print("forever")
循环控制
# break - 跳出循环
while True:
user_input = input("输入 'quit' 退出: ")
if user_input == "quit":
break
print(f"你输入了: {user_input}")
# continue - 跳过本次迭代
for i in range(10):
if i % 2 == 0:
continue # 跳过偶数
print(i) # 只打印奇数
while…else
# else 在循环正常结束后执行
password = ""
while password != "secret":
password = input("请输入密码: ")
if password == "quit":
print("退出")
break
else:
print("密码正确,欢迎进入!")
3. 列表推导式
列表推导式是 Python 的简洁语法,用一行代码创建列表。
基本语法
# 传统写法
squares = []
for x in range(5):
squares.append(x ** 2)
# 列表推导式
squares = [x ** 2 for x in range(5)] # [0, 1, 4, 9, 16]
带条件
# 只保留偶数
evens = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
# 转换元素
words = ["Hello", "World"]
lowercase = [word.lower() for word in words] # ["hello", "world"]
嵌套推导式
# 二维列表展平
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row] # [1,2,3,4,5,6,7,8,9]
# 生成二维数组
grid = [[i * j for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
4. 其他推导式
字典推导式
# 创建字典
{x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 交换键值
d = {"a": 1, "b": 2}
swap = {v: k for k, v in d.items()} # {1: "a", 2: "b"}
集合推导式
# 创建集合
{x % 3 for x in range(5)} # {0, 1, 2}
生成器表达式
# 不立即创建列表,按需生成
squares = (x ** 2 for x in range(5))
# 需要遍历或转列表使用
print(list(squares)) # [0, 1, 4, 9, 16]
# 节省内存
for x in (y ** 2 for y in range(1000)):
print(x) # 每次只生成一个
5. 实用示例
文件名处理
import os
# 列出所有 .py 文件
py_files = [f for f in os.listdir('.') if f.endswith('.py')]
# 按大小排序
files = [(f, os.path.getsize(f)) for f in os.listdir('.')]
files.sort(key=lambda x: x[1], reverse=True)
数据过滤
# 过滤数字
numbers = [1, -2, 3, -4, 5, -6]
positive = [x for x in numbers if x > 0] # [1, 3, 5]
# 多条件
data = [
{"name": "Alice", "age": 25, "city": "Beijing"},
{"name": "Bob", "age": 30, "city": "Shanghai"},
]
beijing_young = [p for p in data if p["city"] == "Beijing" and p["age"] < 30]
常见错误
# 常见错误 1: 在推导式中使用相同变量名
x = 10
result = [x for x in range(5)] # x 被覆盖!
print(x) # 4
# 常见错误 2: 元组需要括号
# 错误
# [x, x**2 for x in range(5)]
# 正确
[(x, x**2) for x in range(5)] # [(0,0), (1,1), (2,4), (3,9), (4,16)]
快速对照表
| 语法 | 用途 |
|---|---|
for x in list |
遍历序列 |
range(n) |
生成 0 到 n-1 |
enumerate(list) |
带索引遍历 |
zip(a, b) |
并行遍历 |
break |
跳出循环 |
continue |
跳过本次 |
[x for x in list] |
列表推导式 |
[x for x in list if condition] |
带条件推导式 |
循环和推导式是 Python 最常用的语法,熟练掌握能大大提升编码效率。