Python 循环语句
目录
学习目标
- 掌握
for循环和while循环的用法 - 理解
break、continue、else在循环中的作用 - 学会使用
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 1range 的特性
# 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. cherryzip():并行遍历多个序列
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]是循环的简洁写法 - 不要在遍历列表时修改它,使用副本或推导式
练习
- 使用
for循环计算 1 到 100 的累加和。 - 打印九九乘法表(使用嵌套循环)。
- 使用列表推导式生成 1-50 中能被 3 整除但不能被 5 整除的数。
- 编写程序找出 100 以内的所有质数。
- 使用
zip()合并两个列表,当长度不一致时以较长的列表为准(提示:使用itertools.zip_longest)。