【Python从入门到精通】第 005 篇:流程控制——条件判断与循环让程序活起来
上一篇:【第 004 篇】Python 数据类型与变量:从零开始理解数据
下一篇:【第 006 篇】函数——Python 编程的核心抽象
系列说明:本系列共 30 篇,全面介绍 Python 编程从零基础到软件工程师的完整路径。本文为第 005 篇,讲解 Python 的流程控制语句:条件判断(if/elif/else)和循环(for/while),这是让程序具备"思考"和"重复"能力的核心机制。
摘要
没有流程控制的程序只是一个执行固定步骤的脚本,真正有用的程序需要能够做判断(根据条件选择不同的执行路径)和做重复(对大量数据循环处理)。这两种能力分别由条件语句和循环语句提供。
本文涵盖:
if / elif / else条件判断的完整用法- 比较运算符与逻辑运算符
for循环遍历序列range()函数生成数字序列while循环按条件重复break(跳出循环)、continue(跳过当次)、pass(占位)- 循环的
else子句(Python 独有特性) - 列表推导式(List Comprehension)
- 生成器表达式
- 常见模式与实战案例
一、条件判断:if / elif / else
1.1 基本语法
# 基本 if 语句
temperature = 35
if temperature > 30:
print("天气很热,记得喝水!")
print("建议开空调")
# if-else
if temperature > 30:
print("天气热")
else:
print("天气凉爽")
# if-elif-else(多条件判断)
score = 85
if score >= 90:
grade = "A(优秀)"
elif score >= 80:
grade = "B(良好)"
elif score >= 70:
grade = "C(中等)"
elif score >= 60:
grade = "D(及格)"
else:
grade = "F(不及格)"
print(f"成绩:{score} → 等级:{grade}")
# 成绩:85 → 等级:B(良好)
注意事项:
if、elif、else后面必须有冒号:- 代码块用 4 个空格缩进
elif可以有多个,else最多一个,且在末尾
1.2 比较运算符
a, b = 10, 20
print(a == b) # False:等于
print(a != b) # True:不等于
print(a < b) # True:小于
print(a <= b) # True:小于等于
print(a > b) # False:大于
print(a >= b) # False:大于等于
# Python 支持链式比较(非常优雅)
x = 15
print(10 < x < 20) # True(等价于 10 < x and x < 20)
print(1 < 2 < 3 < 4) # True
# 字符串比较(按字典序,即 ASCII 码大小)
print("apple" < "banana") # True
print("Z" < "a") # True(大写字母 ASCII 码小于小写)
1.3 逻辑运算符
# and(与):两个条件都为 True
age = 25
has_ticket = True
if age >= 18 and has_ticket:
print("可以入场")
# or(或):至少一个条件为 True
is_vip = False
is_member = True
if is_vip or is_member:
print("享受折扣")
# not(非):取反
is_closed = False
if not is_closed:
print("商店营业中")
# 组合逻辑(注意运算符优先级:not > and > or)
a, b, c = True, False, True
# 不推荐:依赖优先级,可读性差
result = a or b and c
# 推荐:用括号明确意图
result = a or (b and c)
print(result) # True
1.4 短路求值(Short-circuit Evaluation)
Python 的 and 和 or 采用短路求值,这是一个重要特性:
# and:左边为 False,不再计算右边
x = 0
# 如果 x 为 0,不会触发 ZeroDivisionError
if x != 0 and 10 / x > 1:
print("成立")
else:
print("x 为 0,短路跳过了除法")
# or:左边为 True,不再计算右边
name = None
# 常用技巧:提供默认值
display_name = name or "匿名用户"
print(display_name) # 匿名用户
name = "Alice"
display_name = name or "匿名用户"
print(display_name) # Alice
1.5 三元运算符(条件表达式)
Python 的"三元运算符"语法与其他语言不同:
# 语法:值_if_true if 条件 else 值_if_false
age = 20
status = "成年" if age >= 18 else "未成年"
print(status) # 成年
# 实际应用
score = 75
result = "通过" if score >= 60 else "未通过"
# 可以嵌套(但不推荐过多嵌套,可读性下降)
grade = "A" if score >= 90 else ("B" if score >= 80 else "C")
二、for 循环
2.1 遍历序列
for 循环用于遍历任何可迭代对象(列表、字符串、字典、集合等):
# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 遍历字符串(逐字符)
for char in "Python":
print(char, end=" ")
print() # 换行
# P y t h o n
# 遍历 range() 生成的数字序列
for i in range(5):
print(i, end=" ")
print()
# 0 1 2 3 4
2.2 range() 函数详解
range() 是生成整数序列的内置函数:
# range(stop):从 0 到 stop-1
list(range(5)) # [0, 1, 2, 3, 4]
# range(start, stop):从 start 到 stop-1
list(range(2, 8)) # [2, 3, 4, 5, 6, 7]
# range(start, stop, step):步长
list(range(0, 20, 5)) # [0, 5, 10, 15]
list(range(10, 0, -1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1](倒序)
# 实际使用场景
# 打印 1 到 10 的平方
for i in range(1, 11):
print(f"{i}² = {i**2}")
# 遍历偶数
for i in range(0, 20, 2):
print(i, end=" ")
# 0 2 4 6 8 10 12 14 16 18
2.3 enumerate():同时获取索引和值
fruits = ["苹果", "香蕉", "橙子"]
# 普通方式(不推荐)
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# 使用 enumerate(推荐)
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# 指定起始索引
for i, fruit in enumerate(fruits, start=1):
print(f"第{i}个:{fruit}")
# 第1个:苹果
# 第2个:香蕉
# 第3个:橙子
2.4 zip():同时遍历多个序列
names = ["Alice", "Bob", "Charlie"]
scores = [92, 85, 78]
grades = ["A", "B", "C"]
for name, score, grade in zip(names, scores, grades):
print(f"{name}: {score}分 ({grade})")
# Alice: 92分 (A)
# Bob: 85分 (B)
# Charlie: 78分 (C)
# zip 在最短序列结束时停止
# 如需处理长度不等的情况,用 itertools.zip_longest
2.5 遍历字典
person = {"name": "Alice", "age": 30, "city": "北京"}
# 遍历键
for key in person:
print(key)
# 遍历值
for value in person.values():
print(value)
# 遍历键值对(最常用)
for key, value in person.items():
print(f"{key}: {value}")
三、while 循环
3.1 基本语法
while 循环在条件为 True 时持续执行:
# 倒计时
count = 5
while count > 0:
print(f"倒计时:{count}")
count -= 1 # 等价于 count = count - 1
print("发射!🚀")
# 用户输入验证
password = ""
while password != "python123":
password = input("请输入密码:")
if password != "python123":
print("密码错误,请重试")
print("登录成功!")
3.2 无限循环与 break
有时需要"永远循环,直到某条件触发退出":
# 游戏主循环示意
while True: # 无限循环
command = input("请输入命令(quit 退出):")
if command == "quit":
print("再见!")
break # 跳出循环
elif command == "help":
print("可用命令:help, quit")
else:
print(f"执行命令:{command}")
四、循环控制:break / continue / pass
4.1 break:提前退出循环
# 在列表中查找第一个负数
numbers = [4, 7, 2, -3, 8, -1, 5]
for num in numbers:
if num < 0:
print(f"找到第一个负数:{num}")
break # 找到后立即退出循环
else:
print("没有找到负数") # 循环正常结束(没有 break)时执行
4.2 continue:跳过当次迭代
# 打印 1-10 中的奇数,跳过偶数
for i in range(1, 11):
if i % 2 == 0:
continue # 跳过偶数,继续下一次循环
print(i, end=" ")
# 1 3 5 7 9
# 过滤处理数据
data = [10, None, 25, None, 30, 0, 45]
valid_data = []
for item in data:
if item is None or item == 0:
continue # 跳过无效数据
valid_data.append(item)
print(valid_data) # [10, 25, 30, 45]
4.3 pass:占位符
pass 语句什么都不做,用作占位符:
# 占位:函数/类还没有实现
def future_feature():
pass # 待实现
class PlaceholderClass:
pass # 待实现
# 在 if 中占位
for i in range(10):
if i % 2 == 0:
pass # 偶数暂时不处理
else:
print(i, end=" ")
# 1 3 5 7 9
4.4 循环的 else 子句(Python 独有)
Python 的 for 和 while 循环可以有 else 子句,仅当循环正常结束(没有被 break 打断)时执行:
# 查找列表中的特定元素
def find_prime(numbers):
for num in numbers:
if num > 1:
for i in range(2, int(num**0.5) + 1):
if num % i == 0:
break # 找到因子,不是质数
else:
# for 正常结束(没有 break),说明 num 是质数
print(f"{num} 是质数")
find_prime([2, 3, 4, 5, 6, 7, 8, 9, 10])
# 2 是质数
# 3 是质数
# 5 是质数
# 7 是质数
# while-else 的应用
attempt = 0
max_attempts = 3
while attempt < max_attempts:
password = input(f"第 {attempt + 1} 次输入密码:")
if password == "correct":
print("验证成功!")
break
attempt += 1
else:
# while 正常结束(attempt >= max_attempts),说明超过最大尝试次数
print("验证失败,账户已锁定")
五、列表推导式(List Comprehension)
列表推导式是 Python 最具特色的语法之一,可以用一行代码创建列表:
5.1 基本语法
# 传统写法
squares = []
for i in range(1, 11):
squares.append(i ** 2)
# 列表推导式(更简洁)
squares = [i ** 2 for i in range(1, 11)]
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
语法:[表达式 for 变量 in 可迭代对象]
5.2 带条件过滤
# 语法:[表达式 for 变量 in 可迭代对象 if 条件]
# 获取 1-20 中的偶数
evens = [x for x in range(1, 21) if x % 2 == 0]
print(evens) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# 过滤并转换:把字符串列表中长度 > 3 的单词转为大写
words = ["cat", "python", "go", "javascript", "rust"]
long_words_upper = [w.upper() for w in words if len(w) > 3]
print(long_words_upper) # ['PYTHON', 'JAVASCRIPT', 'RUST']
# 实际应用:处理用户列表
users = [
{"name": "Alice", "active": True},
{"name": "Bob", "active": False},
{"name": "Charlie", "active": True},
]
active_names = [user["name"] for user in users if user["active"]]
print(active_names) # ['Alice', 'Charlie']
5.3 嵌套推导式
# 展平二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成乘法表
table = [(x, y, x*y) for x in range(1, 4) for y in range(1, 4)]
for x, y, product in table:
print(f"{x} × {y} = {product}")
注意:列表推导式应保持简洁可读。如果逻辑过于复杂,应改用普通 for 循环。
5.4 字典推导式与集合推导式
# 字典推导式
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 反转字典(键值互换)
original = {"a": 1, "b": 2, "c": 3}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}
# 集合推导式
unique_lengths = {len(word) for word in ["hello", "world", "hi", "python"]}
print(unique_lengths) # {2, 5, 6}(集合自动去重)
六、生成器表达式
生成器表达式与列表推导式类似,但用圆括号 () 而非方括号 [],不会立即生成所有元素,而是按需生成,内存效率更高:
# 列表推导式:立即生成所有数据,占用内存
squares_list = [x**2 for x in range(1_000_000)] # 占用大量内存
# 生成器表达式:惰性求值,按需生成
squares_gen = (x**2 for x in range(1_000_000)) # 几乎不占内存
# 适合一次性消费(如求和)
total = sum(x**2 for x in range(1, 11))
print(total) # 385
# 适合配合其他函数
max_val = max(x**2 for x in range(-5, 6))
print(max_val) # 25
# 检查是否存在满足条件的元素
has_negative = any(x < 0 for x in [1, 2, -3, 4])
print(has_negative) # True
all_positive = all(x > 0 for x in [1, 2, 3, 4])
print(all_positive) # True
七、嵌套循环实战
7.1 打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i*j}", end="\t")
print() # 换行
输出:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
...
7.2 模式打印
# 打印三角形
n = 5
for i in range(1, n + 1):
print("*" * i)
# 打印菱形
for i in range(1, n + 1):
print(" " * (n - i) + "*" * (2 * i - 1))
for i in range(n - 1, 0, -1):
print(" " * (n - i) + "*" * (2 * i - 1))
八、综合实战:猜数字游戏
"""
猜数字游戏
综合运用:条件判断、while 循环、break/continue、格式化输出
"""
import random
def play_guess_game():
"""运行一次猜数字游戏。"""
secret = random.randint(1, 100) # 随机生成 1-100 的数字
max_attempts = 7
attempts = 0
print("=" * 40)
print("欢迎来到猜数字游戏!")
print(f"我想了一个 1 到 100 之间的数字")
print(f"你有 {max_attempts} 次机会")
print("=" * 40)
while attempts < max_attempts:
attempts += 1
remaining = max_attempts - attempts + 1
# 获取用户输入
try:
guess = int(input(f"\n第 {attempts} 次猜测(剩余 {remaining} 次):"))
except ValueError:
print("⚠️ 请输入一个整数!")
attempts -= 1 # 输入无效不算次数
continue
# 范围检查
if guess < 1 or guess > 100:
print("⚠️ 请输入 1 到 100 之间的数字!")
attempts -= 1
continue
# 判断结果
if guess == secret:
print(f"\n🎉 恭喜!你猜对了!答案就是 {secret}")
print(f"你用了 {attempts} 次猜到了!")
if attempts <= 3:
print("🌟 太厉害了!")
elif attempts <= 5:
print("👍 不错的成绩!")
break
elif guess < secret:
diff = secret - guess
if diff <= 5:
print("📈 太小了,非常接近!")
elif diff <= 20:
print("📈 小了一些")
else:
print("📈 太小了,差得远呢")
else:
diff = guess - secret
if diff <= 5:
print("📉 太大了,非常接近!")
elif diff <= 20:
print("📉 大了一些")
else:
print("📉 太大了,差得远呢")
else:
# 用完所有机会
print(f"\n😞 很遗憾,机会用完了!答案是 {secret}")
# 询问是否再玩
again = input("\n再来一局?(y/n): ")
if again.lower() == "y":
play_guess_game() # 递归调用(简单演示)
else:
print("感谢游玩,再见!👋")
# 运行游戏
play_guess_game()
九、总结
本文深入讲解了 Python 的流程控制:
| 语句 | 用途 | 关键点 |
|---|---|---|
if/elif/else | 条件分支 | 支持链式比较,elif 可多个 |
for | 遍历可迭代对象 | enumerate()、zip()、items() |
range() | 生成整数序列 | 三参数:start, stop, step |
while | 按条件循环 | 注意避免死循环 |
break | 跳出循环 | 跳出最内层循环 |
continue | 跳过当次 | 继续下一次迭代 |
pass | 占位符 | 语法上需要语句但无内容时 |
for/while...else | 循环正常结束时执行 | 被 break 打断则不执行 |
| 列表推导式 | 简洁创建列表 | [expr for x in iter if cond] |
| 生成器表达式 | 惰性求值 | 内存效率高,(expr for x in iter) |
下一篇,我们进入函数的世界——Python 编程最重要的抽象机制,学会如何将代码封装成可复用的模块。
上一篇:【第 004 篇】Python 数据类型与变量:从零开始理解数据
下一篇:【第 006 篇】函数——Python 编程的核心抽象
参考资料
- Python 官方文档 - 控制流
- Python 官方文档 - 列表推导式
- PEP 202 — List Comprehensions
- PEP 289 — Generator Expressions
- Python 官方文档 - range()
- Python 官方文档 - enumerate()
更多推荐
所有评论(0)