目录

Python 循环语句

学习目标

  • 掌握 for 循环和 while 循环的用法
  • 理解 breakcontinueelse 在循环中的作用
  • 学会使用 range()enumerate()zip() 等辅助函数
  • 能够编写嵌套循环解决实际问题

一、for 循环

for 循环用于遍历可迭代对象(如列表、字符串、元组、字典等)。

# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# 遍历字符串
for char in "Python":
    print(char, end=" ")
# P y t h o n

# 遍历字典
user = {"name": "Alice", "age": 25, "city": "Beijing"}
for key in user:
    print(f"{key}: {user[key]}")

for key, value in user.items():
    print(f"{key} = {value}")

二、range() 函数

range() 生成整数序列,常与 for 配合使用。

# range(stop)        0 到 stop-1
for i in range(5):
    print(i, end=" ")    # 0 1 2 3 4

# range(start, stop)  start 到 stop-1
for i in range(2, 6):
    print(i, end=" ")    # 2 3 4 5

# range(start, stop, step)  带步长
for i in range(0, 10, 2):
    print(i, end=" ")    # 0 2 4 6 8

# 倒序
for i in range(5, 0, -1):
    print(i, end=" ")    # 5 4 3 2 1

range 的特性

# range 返回的是可迭代对象,不是列表
r = range(5)
print(type(r))       # <class 'range'>
print(list(r))       # [0, 1, 2, 3, 4]

# 支持索引和切片
print(r[2])          # 2
print(list(r[1:4]))  # [1, 2, 3]

# 大范围不占用大量内存
big = range(1000000)
print(len(big))      # 1000000

三、while 循环

# 基本用法
count = 0
while count < 5:
    print(count, end=" ")
    count += 1
# 0 1 2 3 4

# 用户输入验证
password = ""
while password != "secret":
    password = input("请输入密码: ")
print("登录成功!")

# 无限循环 + break
while True:
    command = input("输入命令 (q 退出): ")
    if command == "q":
        break
    print(f"执行: {command}")

四、break 与 continue

# break:立即终止整个循环
for i in range(10):
    if i == 5:
        break
    print(i, end=" ")
# 0 1 2 3 4

# continue:跳过当前迭代,继续下一次
for i in range(10):
    if i % 2 == 0:
        continue
    print(i, end=" ")
# 1 3 5 7 9

实际应用

# 查找列表中第一个负数
numbers = [3, 7, 2, -1, 5, -3, 8]

for num in numbers:
    if num < 0:
        print(f"找到第一个负数: {num}")
        break

# 跳过处理空值
items = [10, None, 20, "", 30, 0]
total = 0
for item in items:
    if not item:        # None、空字符串、0 都被跳过
        continue
    total += item
print(f"总和: {total}")   # 60

五、循环的 else 子句

循环的 else循环正常结束(没有被 break)时执行。

# 判断是否为质数
n = 17

for i in range(2, n):
    if n % i == 0:
        print(f"{n} 不是质数")
        break
else:
    print(f"{n} 是质数")

# 对比:不用 else 的写法
found = False
for i in range(2, n):
    if n % i == 0:
        found = True
        break
if not found:
    print(f"{n} 是质数")

六、enumerate() 与 zip()

enumerate():同时获取索引和值

fruits = ["apple", "banana", "cherry"]

# 普通写法
for i in range(len(fruits)):
    print(f"{i}: {fruits[i]}")

# 使用 enumerate
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

# 指定起始索引
for index, fruit in enumerate(fruits, start=1):
    print(f"{index}. {fruit}")
# 1. apple
# 2. banana
# 3. cherry

zip():并行遍历多个序列

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["Beijing", "Shanghai", "Shenzhen"]

for name, age, city in zip(names, ages, cities):
    print(f"{name}, {age}岁, {city}")

# 长度不一致时以最短为准
a = [1, 2, 3]
b = ["a", "b"]
for x, y in zip(a, b):
    print(x, y)
# 1 a
# 2 b

# zip 配合 enumerate
for i, (name, age) in enumerate(zip(names, ages)):
    print(f"{i}: {name} - {age}")

七、嵌套循环

# 打印乘法表
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j:2}", end="  ")
    print()

# 输出:
# 1×1= 1
# 1×2= 2  2×2= 4
# 1×3= 3  2×3= 6  3×3= 9
# ...
# 遍历二维列表
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix:
    for item in row:
        print(item, end=" ")
    print()
# 1 2 3
# 4 5 6
# 7 8 9

八、列表推导式(循环的简洁写法)

# 普通循环
squares = []
for x in range(10):
    squares.append(x ** 2)

# 列表推导式
squares = [x ** 2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 带条件的列表推导式
evens = [x for x in range(20) if x % 2 == 0]
print(evens)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 双重循环的列表推导式
pairs = [(x, y) for x in [1, 2] for y in ["a", "b"]]
print(pairs)
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

九、综合示例

"""
猜数字游戏
"""
import random

target = random.randint(1, 100)
attempts = 0
max_attempts = 7

print("=" * 30)
print("      猜 数 字 游 戏")
print(f"我想了一个 1-100 的整数,你有 {max_attempts} 次机会")
print("=" * 30)

while attempts < max_attempts:
    guess_input = input(f"\n{attempts + 1} 次猜测: ")

    # 输入验证
    if not guess_input.isdigit():
        print("请输入有效的整数!")
        continue

    guess = int(guess_input)
    attempts += 1

    if guess < target:
        print("太小了! ↑")
    elif guess > target:
        print("太大了! ↓")
    else:
        print(f"\n🎉 恭喜你猜对了! 答案就是 {target}")
        print(f"你用了 {attempts} 次")
        break
else:
    print(f"\n😔 机会用完了,正确答案是 {target}")

十、常见陷阱

# 陷阱 1:修改正在遍历的列表
items = [1, 2, 3, 4, 5]
for item in items:
    if item % 2 == 0:
        items.remove(item)   # 危险!会跳过元素
print(items)   # [1, 3, 5](碰巧正确,但不建议)

# 正确做法:遍历副本
items = [1, 2, 3, 4, 5]
for item in items[:]:
    if item % 2 == 0:
        items.remove(item)
print(items)   # [1, 3, 5]

# 或者用列表推导式
items = [1, 2, 3, 4, 5]
items = [x for x in items if x % 2 != 0]

# 陷阱 2:while 忘记更新条件变量
# i = 0
# while i < 5:
#     print(i)   # 死循环!i 没有增加

# 陷阱 3:for 循环变量泄露到外部
for i in range(5):
    pass
print(i)   # 4(i 在循环外仍可用)

小结

  • for 遍历可迭代对象,while 基于条件循环
  • range() 生成整数序列,支持起始、结束、步长参数
  • break 终止循环,continue 跳过当前迭代
  • 循环的 else 子句在未被 break 时执行
  • enumerate() 同时获取索引和值,zip() 并行遍历多个序列
  • 列表推导式 [x for x in iterable if condition] 是循环的简洁写法
  • 不要在遍历列表时修改它,使用副本或推导式

练习

  1. 使用 for 循环计算 1 到 100 的累加和。
  2. 打印九九乘法表(使用嵌套循环)。
  3. 使用列表推导式生成 1-50 中能被 3 整除但不能被 5 整除的数。
  4. 编写程序找出 100 以内的所有质数。
  5. 使用 zip() 合并两个列表,当长度不一致时以较长的列表为准(提示:使用 itertools.zip_longest)。