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 最常用的语法,熟练掌握能大大提升编码效率。