Python 循环
学习 for 循环和 while 循环 · 难度:入门 · +10XP
Python 循环 — 让计算机不知疲倦地工作
一、什么是循环?为什么它如此重要?
循环(Loop)是让计算机重复执行某段代码的控制结构。如果说变量是编程的基石,函数是复用的单元,那么循环就是效率的引擎。计算机最大的优势就是可以不知疲倦地重复做同一件事,而循环正是利用这一优势的核心工具。
为什么循环重要?没有循环,你只能手动重复代码——处理 100 条数据就要写 100 段代码。有了循环,3 行代码就能处理 100 万条数据。循环让你能:遍历列表中的所有元素、逐个处理文件中的每一行、反复请求直到满足条件、生成各种数列和图案。
Python 提供了两种基本循环:for 循环(遍历可迭代对象)和 while 循环(条件为真时持续执行)。这两种循环配合 break、continue、else 子句,能应对几乎所有的重复执行场景。
二、for 循环 vs while 循环 — 全面对比
| 比较维度 | for 循环 | while 循环 |
|---|---|---|
| 使用场景 | 已知迭代次数或遍历集合 | 未知迭代次数,靠条件判断 |
| 语法 | for item in iterable: | while condition: |
| 初始/更新变量 | 自动处理(迭代器) | 需手动管理 |
| 无限循环风险 | 低(自动终止) | 高(忘记更新条件就会死循环) |
| 典型例子 | 遍历列表、遍历字典、range() | 游戏主循环、等待用户输入、网络重试 |
| Python 风格 | 更 Pythonic(优先使用) | 只在 for 不合适时使用 |
三、break、continue、else — 循环控制关键字
| 关键字 | 作用 | 示例场景 |
|---|---|---|
| break | 立即终止整个循环 | 找到目标元素后停止搜索 |
| continue | 跳过本次迭代,继续下一次 | 跳过不符合条件的元素 |
| else(循环的) | 循环正常结束(未 break)时执行 | 搜索失败时执行回退逻辑 |
四、详细代码示例(逐行注释)
# ======== 1. for 循环基础 ========
# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits: # fruit 依次取列表中的每个值
print(f"我喜欢吃{fruit}") # 每个元素都会打印一次
# 使用 range() — 生成数字序列
for i in range(5): # range(5) → 0, 1, 2, 3, 4(不包含 5)
print(i, end=" ") # 输出:0 1 2 3 4
# range 的三种形式
range(5) # 0, 1, 2, 3, 4 — 只给结束值
range(2, 6) # 2, 3, 4, 5 — 开始和结束
range(1, 10, 2) # 1, 3, 5, 7, 9 — 开始、结束、步长
# ======== 2. 遍历字典 ========
user = {"name": "小明", "age": 18, "city": "北京"}
for key in user: # 默认遍历键
print(key)
for key, value in user.items(): # 同时获取键和值(推荐!)
print(f"{key}: {value}")
# ======== 3. enumerate() — 带索引遍历 ========
fruits = ["苹果", "香蕉", "橙子"]
for index, fruit in enumerate(fruits):
print(f"{index+1}. {fruit}") # 1. 苹果 2. 香蕉 3. 橙子
# enumerate 第二个参数指定起始值
for i, f in enumerate(fruits, start=1): # 索引从 1 开始
print(i, f)
# ======== 4. zip() — 同时遍历多个列表 ========
names = ["小明", "小红", "小刚"]
scores = [85, 92, 78]
subjects = ["数学", "数学", "数学"]
for name, score, subj in zip(names, scores, subjects):
print(f"{name} 的{subj}成绩:{score}分")
# ======== 5. while 循环 ========
# 基本 while — 当条件为 True 时持续执行
count = 0
while count < 5: # 条件检查在每次迭代前
print(count, end=" ")
count += 1 # 必须更新条件变量!否则死循环
# 输出:0 1 2 3 4
# while True 无限循环(由 break 退出)
while True:
user_input = input("输入 'quit' 退出:")
if user_input == "quit":
break # 终止循环
print(f"你输入了:{user_input}")
# ======== 6. break 和 continue ========
# break — 提前终止循环
for i in range(10):
if i == 5:
break # 到 5 就停止,不再继续
print(i, end=" ") # 输出:0 1 2 3 4
# continue — 跳过当前迭代
for i in range(10):
if i % 2 == 0: # i 是偶数
continue # 跳过偶数
print(i, end=" ") # 只打印奇数:1 3 5 7 9
# ======== 7. for...else — Python 特色语法 ========
# else 在循环正常结束(未被 break 中断)时执行
items = [1, 3, 5, 7, 9]
target = 4
for item in items:
if item == target:
print("找到了!")
break # 找到后 break
else: # 只有 break 没执行才运行这里
print(f"{target} 不在列表中") # 输出:4 不在列表中
# 实用场景:判断质数
n = 17
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
print(f"{n} 不是质数")
break
else:
print(f"{n} 是质数") # 输出:17 是质数
# ======== 8. 列表推导式(List Comprehension) ========
# Python 风格的"循环",更简洁高效
# 传统写法
squares1 = []
for x in range(10):
squares1.append(x**2)
# 列表推导式(一行搞定!)
squares2 = [x**2 for x in range(10)]
# 带条件的推导式
evens = [x for x in range(20) if x % 2 == 0] # 偶数列
# 嵌套循环的推导式
pairs = [(x, y) for x in "AB" for y in "12"] # [('A','1'),('A','2'),('B','1'),('B','2')]
# ======== 9. 嵌套循环 ========
# 九九乘法表
for i in range(1, 10): # 外层循环:行
for j in range(1, i + 1): # 内层循环:列
print(f"{j}×{i}={i*j}", end=" ")
print() # 换行
# ======== 10. 性能优化:避免重复计算 ========
# 不好:每次循环都计算 len()
for i in range(len(items)):
if i < len(items): # len() 被调用了 n 次
pass
# 更好:提前计算
n = len(items)
for i in range(n):
if i < n:
pass
# ======== 11. 生成器表达式 — 节省内存 ========
# 列表推导式一次性生成所有数据(占内存)
big_list = [x**2 for x in range(10**6)] # 100 万个元素的列表,占内存
# 生成器表达式按需生成(省内存)
big_gen = (x**2 for x in range(10**6)) # 只是一个生成器对象
print(sum(big_gen)) # 边计算边求和,内存占用极小
五、Python 循环 vs JavaScript 循环 对比
| 特性 | Python | JavaScript |
|---|---|---|
| for...of / for...in | for x in list:(值) | for (x of arr)(值) / for (x in obj)(键) |
| C 风格 for | 无(用 range 代替) | for (let i=0; i |
| while | 有 | 有 |
| 循环 else | 支持 | 不支持 |
| 列表/数组推导式 | [x for x in arr if x>0] | arr.filter(x => x>0) |
| 遍历对象 | dict.items() | Object.entries() |
六、实践任务
- 使用 for 循环和 range 计算 1 到 100 的所有整数之和
- 使用列表推导式生成 1 到 50 中所有能被 3 整除的数的平方
- 打印九九乘法表(嵌套循环)
- 使用 while 循环实现一个猜数字游戏:系统随机生成 1-100 的数字,用户输入猜测,提示"大了"或"小了",直到猜对
- 使用 for...else 结构,在列表中查找一个不存在的元素,观察 else 块的执行