引言:程序也需要做选择
想象你正在开发一个电商网站的折扣系统:当用户购物车总额超过500元时自动打8折,否则按原价结算。这种根据不同条件执行不同操作的逻辑,就是程序中的条件控制。在Python中,这种"智能决策"能力主要通过if语句家族实现。本文将用最接地气的方式,带你掌握Python条件控制的精髓。
一、最基础的判断:if语句
1.1 单条件判断
bash
age = 18
if age >= 18:
print("您已成年,可以观看此影片")
这段代码就像一个简单的门卫:当年龄大于等于18岁时,打印允许观看的信息。if语句的结构非常直观:
if
关键字后跟条件表达式- 条件后必须加冒号
:
- 条件满足时执行的代码需要缩进(通常4个空格)
1.2 条件表达式的秘密
Python的条件表达式可以是:
- 比较运算:
==
,!=
,>
,<
,>=
,<=
- 逻辑运算:
and
,or
,not
- 成员运算:
in
,not in
- 身份运算:
is
,is not
ini
username = "admin"
password = "123456"
if username == "admin" and password == "123456":
print("登录成功")
1.3 常见误区
新手常犯的错误:
- 忘记冒号:
if age > 18
(缺少:
) - 缩进错误:Python靠缩进区分代码块
- 混淆
=
和==
:赋值用=
,比较用==
二、多条件分支:if-elif-else结构
2.1 基本结构
当需要处理多种可能时,if-elif-else
组合就派上用场了:
bash
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
这个成绩评判系统就像一个自动分级机,从上到下依次检查条件,第一个满足的条件会被执行,之后的所有条件都会被跳过。
2.2 执行流程解析
Python会按顺序检查每个条件:
- 检查第一个
if
条件,如果为真则执行对应代码块,然后跳过整个结构 - 如果第一个条件为假,则检查第一个
elif
条件 - 以此类推,直到找到第一个为真的条件
- 如果所有条件都为假,则执行
else
代码块
2.3 实际案例:会员等级判断
ini
points = 1200
if points >= 2000:
level = "钻石会员"
elif points >= 1000:
level = "白金会员"
elif points >= 500:
level = "黄金会员"
else:
level = "普通会员"
print(f"您的会员等级是:{level}")
这个例子展示了如何根据积分将用户分类到不同等级,是电商系统中的常见逻辑。
三、嵌套条件:处理复杂逻辑
3.1 基本嵌套结构
当需要更精细的判断时,可以将条件语句嵌套使用:
python
temperature = 28
is_sunny = True
if temperature > 30:
print("天气很热")
if is_sunny:
print("记得涂防晒霜")
else:
print("天气不算太热")
if not is_sunny:
print("考虑带把伞")
3.2 嵌套的最佳实践
虽然嵌套很有用,但过度嵌套会让代码难以阅读。建议:
- 嵌套层次不超过3层
- 考虑将部分逻辑提取为函数
- 使用逻辑运算符简化条件
bash
# 不好的嵌套示例
if user_logged_in:
if is_admin:
if has_permission:
print("允许操作")
# 改进后的版本
if user_logged_in and is_admin and has_permission:
print("允许操作")
3.3 实际案例:订单状态处理
bash
order_status = "shipped"
payment_status = "paid"
if order_status == "pending":
print("订单待处理")
elif order_status == "confirmed":
if payment_status == "paid":
print("订单已确认,等待发货")
else:
print("订单已确认,但未付款")
elif order_status == "shipped":
print("订单已发货")
if payment_status != "paid":
print("警告:已发货但未付款")
else:
print("未知订单状态")
这个例子展示了电商系统中如何根据订单和支付状态显示不同信息。
四、条件表达式:简洁的替代方案
4.1 三元运算符
Python提供了简洁的条件表达式语法:
ini
age = 20
message = "成年" if age >= 18 else "未成年"
print(message)
arduino
这种写法适合简单的条件赋值,比完整的if-else结构更紧凑。
4.2 多条件的三元表达式
makefile
score = 75
result = "优秀" if score >= 90 else "良好" if score >= 80 else "及格" if score >= 60 else "不及格"
print(result)
python
虽然可以这样写,但建议超过两个条件时还是使用完整的if-elif-else结构,以保证可读性。
4.3 实际应用:价格计算
ini
quantity = 15
unit_price = 10
# 批量购买折扣:超过10件打9折
total_price = quantity * unit_price * 0.9 if quantity > 10 else quantity * unit_price
print(f"总价:{total_price:.2f}元")
这个例子展示了如何用条件表达式实现简单的折扣计算。
五、match-case:Python 3.10的新选择
5.1 基本语法
Python 3.10引入了更强大的模式匹配语法match-case
,适合处理多种可能的值:
python
status = 404
match status:
case 200:
print("请求成功")
case 404:
print("页面未找到")
case 500:
print("服务器错误")
case _:
print("未知状态码")
arduino
_作为默认情况,类似于else。
5.2 模式匹配的强大之处
match-case
不仅可以匹配具体值,还可以:
- 匹配多个值
- 捕获匹配的值
- 进行更复杂的模式匹配
python
http_method = "POST"
path = "/users"
match (http_method, path):
case ("GET", "/users"):
print("获取用户列表")
case ("POST", "/users"):
print("创建新用户")
case ("GET", "/users/" + id):
print(f"获取ID为{id}的用户")
case _:
print("未处理的路由")
5.3 适用场景
match-case
特别适合:
- 处理HTTP状态码
- 解析命令行参数
- 实现状态机
- 处理复杂的条件分支
六、条件控制的最佳实践
6.1 保持条件简单
复杂的条件表达式应该拆分成多个简单条件:
python
# 不好的写法
if (user is not None and user.is_active and
user.has_permission('edit') and
post.author_id == user.id):
...
# 改进后的写法
if user is None or not user.is_active:
return False
if not user.has_permission('edit'):
return False
if post.author_id != user.id:
return False
# 所有条件满足
6.2 提前返回减少嵌套
python
def check_access(user, resource):
if user is None:
return False
if not user.is_active:
return False
if resource.is_public:
return True
if user.id == resource.owner_id:
return True
return False
这种写法避免了多层嵌套,提高了可读性。
6.3 使用枚举提高可读性
ini
from enum import Enum
class OrderStatus(Enum):
PENDING = 1
CONFIRMED = 2
SHIPPED = 3
DELIVERED = 4
status = OrderStatus.SHIPPED
if status == OrderStatus.PENDING:
print("待处理")
elif status == OrderStatus.CONFIRMED:
print("已确认")
elif status == OrderStatus.SHIPPED:
print("已发货")
elif status == OrderStatus.DELIVERED:
print("已送达")
6.4 文档字符串说明条件逻辑
python
def calculate_discount(total):
"""根据购物车总额计算折扣
Args:
total: 购物车总额
Returns:
折扣率(0-1之间)
折扣规则:
- 总额 < 100: 无折扣
- 100 <= 总额 < 500: 9折
- 总额 >= 500: 8折
"""
if total < 100:
return 1.0
elif total < 500:
return 0.9
else:
return 0.8
七、常见问题解决方案
7.1 条件永远不满足
检查:
- 条件表达式是否正确
- 变量值是否符合预期
- 是否有缩进错误
python
# 调试技巧:打印变量值
x = 10
print(f"x的值是:{x}") # 确认x的值
if x > 20:
print("x大于20") # 这段代码不会执行
7.2 多个条件同时满足
确保条件之间是互斥的,或者明确优先级:
python
# 不好的设计:两个条件可能同时满足
age = 25
is_student = True
if age < 30:
print("30岁以下")
if is_student:
print("学生")
# 改进:明确优先级
if is_student:
print("学生")
elif age < 30:
print("30岁以下非学生")
7.3 性能考虑
对于频繁执行的条件判断:
- 将最可能为真的条件放在前面
- 避免在循环中进行复杂的条件计算
scss
# 不好的写法:每次循环都计算len(data)
data = [1, 2, 3]
for i in range(10000):
if i < len(data): # 每次循环都计算len(data)
print(data[i])
# 改进后的写法
length = len(data)
for i in range(10000):
if i < length: # 只计算一次
print(data[i])
八、实战案例:简易ATM系统
让我们用条件控制实现一个简易ATM系统:
python
def atm_system():
balance = 1000
pin = "1234"
attempts = 3
while attempts > 0:
input_pin = input("请输入PIN码:")
if input_pin == pin:
break
attempts -= 1
print(f"PIN码错误,还剩{attempts}次机会")
if attempts == 0:
print("卡已被锁定,请联系银行")
return
while True:
print("\nATM菜单:")
print("1. 查询余额")
print("2. 取款")
print("3. 存款")
print("4. 退出")
choice = input("请选择操作(1-4):")
if choice == "1":
print(f"当前余额:{balance}元")
elif choice == "2":
amount = float(input("请输入取款金额:"))
if amount > balance:
print("余额不足")
elif amount <= 0:
print("金额必须大于0")
else:
balance -= amount
print(f"取款成功,剩余余额:{balance}元")
elif choice == "3":
amount = float(input("请输入存款金额:"))
if amount <= 0:
print("金额必须大于0")
else:
balance += amount
print(f"存款成功,当前余额:{balance}元")
elif choice == "4":
print("感谢使用,再见!")
break
else:
print("无效选择,请重新输入")
atm_system()
这个案例展示了:
- 多层条件判断(PIN验证和菜单选择)
- 输入验证
- 循环与条件控制的结合
- 实际业务逻辑的实现
结语:条件控制是编程的基石
从简单的if判断到复杂的模式匹配,条件控制是编程中最基础也最重要的概念之一。它让程序能够根据不同情况做出不同反应,实现真正的智能行为。
记住这些要点:
- 保持条件简单明了
- 合理使用嵌套,避免过度复杂
- 优先使用可读性强的写法
- 对于复杂逻辑,考虑使用设计模式或重构
随着经验的积累,你会逐渐掌握如何编写既高效又易读的条件控制代码。现在,打开你的编辑器,开始实践吧!