大家好,我是正在实战各种AI项目的程序员晚枫。
一个真实的故事 2024年,有个读者找我求助:
"晚枫老师,我写了一个自动发邮件的脚本,结果半夜给我老板发了100封一样的邮件!怎么回事?"
我看了一眼他的代码:
1 2 3 4 5 send_email() log("邮件发送成功" )
问题在于:代码没有判断发送是否成功,就直接记录"成功"了。
如果加了条件判断:
1 2 3 4 5 6 if send_email(): log("邮件发送成功" ) else : log("发送失败,正在重试..." ) retry_send()
这就是条件判断的价值——让程序会思考,而不是盲目执行 。
上篇我们学了运算符,会做比较和判断了。这篇来学条件判断 ——让程序自己"做决定"。
学完这篇,你的程序就不再是死板地执行一条条命令,而是能根据不同情况走不同的路了。
生活中的条件判断 你每天都在做条件判断,只是没意识到:
1 2 3 4 5 6 7 8 如果(今天下雨)→ 带伞 否则 → 不带伞 如果(余额>=票价)→ 可以买 否则 → 回家取钱 如果(时间>=22:00 且 没有急事)→ 睡觉 否则 → 继续工作
条件判断就是程序里的"如果...否则..."
if语句:最基本的判断 场景举例 你去买奶茶,如果余额足够,就买:
1 2 3 4 5 6 7 balance = 15 price = 12 if balance >= price: print ("买!奶茶真香~" ) print ("程序结束" )
运行结果:
if语句的语法规则 要点:
if 后面跟一个条件(结果必须是 True 或 False)条件后面要加冒号 : 缩进的代码块在条件成立时执行 Python 靠缩进判断代码块的范围(推荐4个空格) 条件可以是任何表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 if age >= 18 : print ("成年" ) if has_ticket and age >= 18 : print ("可以进场" ) if is_valid_email(email): print ("邮箱格式正确" ) if "admin" in username: print ("管理员账号" ) if is_logged_in: print ("已登录" )
if-else:两个分支 只有一个分支不够用——如果条件不成立呢?
1 2 3 4 5 6 7 balance = 8 price = 12 if balance >= price: print ("买!奶茶真香~" ) else : print ("算了,奶茶太贵,喝白开水吧" )
运行结果:
else的作用 else 是"否则"的意思,当 if 条件不成立时执行:
1 2 3 4 5 6 if 条件: 代码块A else : 代码块B
注意: else 后面不需要条件,直接加冒号。
省略else的情况 如果条件不成立时什么都不做,可以省略 else:
1 2 3 4 5 6 7 8 stock = 0 if stock > 0 : print ("有库存,可以购买" ) print ("继续执行后面的代码" )
if-elif-else:多个条件分支 生活中的判断往往不止两个选项。比如考试成绩:
1 2 3 4 - 90分以上:A(优秀) - 80~89分:B(良好) - 60~79分:C(及格) - 60分以下:D(不及格)
用 elif(else if 的缩写)来处理多个条件:
1 2 3 4 5 6 7 8 9 10 11 12 score = 73 if score >= 90 : grade = "A(优秀)" elif score >= 80 : grade = "B(良好)" elif score >= 60 : grade = "C(及格)" else : grade = "D(不及格)" print (f"你的成绩等级:{grade} " )
运行结果:
执行顺序(重要!) Python 从上往下检查,遇到第一个满足的条件就执行,然后跳出整个结构 :
1 2 3 4 5 6 7 8 9 10 score = 95 if score >= 60 : print ("及格" ) elif score >= 80 : print ("良好" ) elif score >= 90 : print ("优秀" )
正确写法: 把范围小的条件写在前面:
1 2 3 4 5 6 7 8 9 10 score = 95 if score >= 90 : print ("优秀" ) elif score >= 80 : print ("良好" ) elif score >= 60 : print ("及格" )
多个elif的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 day = 3 if day == 1 : print ("星期一,新的一周开始" ) elif day == 2 : print ("星期二" ) elif day == 3 : print ("星期三,一周过半" ) elif day == 4 : print ("星期四" ) elif day == 5 : print ("星期五,快周末了" ) elif day == 6 or day == 7 : print ("周末愉快!" ) else : print ("输入错误,请输入1-7的数字" )
嵌套条件:条件里还有条件 当需要多层判断时,可以在 if 里面再写 if:
VIP折扣示例 1 2 3 4 5 6 7 8 9 10 11 12 is_vip = True balance = 150 if is_vip: if balance >= 100 : discount = 0.8 print (f"VIP满减价:¥{balance * discount} " ) else : discount = 0.9 print (f"VIP普通价:¥{balance * discount} " ) else : print (f"普通价:¥{balance} " )
运行结果:
登录验证示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 username = "admin" password = "123456" is_active = True if username == "admin" : if password == "123456" : if is_active: print ("登录成功!欢迎回来" ) else : print ("账号已被禁用,请联系管理员" ) else : print ("密码错误" ) else : print ("用户名不存在" )
嵌套层级建议 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 if condition1: if condition2: if condition3: if condition4: if condition5: print ("太多了..." ) if condition1 and condition2 and condition3: if condition4 and condition5: print ("清晰多了" ) def check_user (username, password ): if username != "admin" : return "用户名不存在" if password != "123456" : return "密码错误" return "登录成功"
简化写法:三元运算符 简单的 if-else 可以写成一行,更简洁:
基本语法 1 2 3 4 5 6 7 8 9 10 11 12 age = 20 if age >= 18 : status = "成年" else : status = "未成年" status = "成年" if age >= 18 else "未成年" print (status)
格式: 值1 if 条件 else 值2
实际应用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 name = input ("请输入姓名: " ) or "匿名用户" name = input ("请输入姓名: " ) name = name if name else "匿名用户" score = 75 result = "及格" if score >= 60 else "不及格" price = 100 is_vip = True final_price = price * 0.8 if is_vip else price numbers = [1 , 2 , 3 , 4 , 5 ] labels = ["偶数" if n % 2 == 0 else "奇数" for n in numbers] print (labels)
三元运算符的嵌套(不推荐) 1 2 3 4 5 6 7 8 9 10 11 12 grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 60 else "D" if score >= 90 : grade = "A" elif score >= 80 : grade = "B" elif score >= 60 : grade = "C" else : grade = "D"
Python 3.10新特性:match-case Python 3.10 引入了类似其他语言的 switch-case 结构:
基本用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 day = 3 match day: case 1 : print ("星期一" ) case 2 : print ("星期二" ) case 3 : print ("星期三" ) case 4 : print ("星期四" ) case 5 : print ("星期五" ) case 6 | 7 : print ("周末" ) case _: print ("无效输入" )
模式匹配 1 2 3 4 5 6 7 8 9 10 11 12 point = [1 , 2 ] match point: case [0 , 0 ]: print ("原点" ) case [x, 0 ]: print (f"在x轴上,x={x} " ) case [0 , y]: print (f"在y轴上,y={y} " ) case [x, y]: print (f"坐标:({x} , {y} )" )
匹配字典 1 2 3 4 5 6 7 8 9 10 11 user = {"type" : "vip" , "level" : 3 } match user: case {"type" : "vip" , "level" : level} if level >= 5 : print (f"高级VIP,等级:{level} " ) case {"type" : "vip" }: print ("普通VIP" ) case {"type" : "normal" }: print ("普通用户" ) case _: print ("未知用户类型" )
常见判断模式 ① 判断是否为空 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 name = "" items = [] data = None if name == "" : print ("名字不能为空" ) if len (items) == 0 : print ("列表为空" ) if not name: print ("名字不能为空" ) if not items: print ("列表为空" ) if data is None : print ("数据为None" )
Python中的"假值":
FalseNone0, 0.0""(空字符串)[], {}, ()(空容器)② 同时满足多个条件 1 2 3 4 5 6 7 8 9 10 age = 25 has_ticket = True if age >= 18 and has_ticket: print ("可以入场" ) if age >= 18 and has_ticket: print ("可以入场" )
③ 满足任一条件 1 2 3 4 5 6 7 8 9 day = "周六" if day == "周六" or day == "周日" : print ("周末快乐!" ) if day in ["周六" , "周日" ]: print ("周末快乐!" )
④ 判断是否在范围内 1 2 3 4 5 6 7 8 9 score = 85 if 60 <= score <= 100 : print ("成绩有效" ) if score >= 60 and score <= 100 : print ("成绩有效" )
⑤ 判断元素是否在列表里 1 2 3 4 5 6 7 fruits = ["苹果" , "香蕉" , "橙子" ] if "苹果" in fruits: print ("有苹果!可以做个苹果派" ) if "葡萄" not in fruits: print ("没有葡萄" )
⑥ 判断字典的键 1 2 3 4 5 6 7 8 9 10 11 12 13 14 user = {"name" : "张三" , "age" : 25 } if "name" in user: print (f"姓名:{user['name' ]} " ) if "email" in user: email = user["email" ] else : email = "未设置" email = user.get("email" , "未设置" )
避坑指南 ❌ 坑1:忘记缩进 Python靠缩进判断代码属于哪个块,忘了缩进就会报错:
1 2 3 4 5 6 7 8 age = 20 if age >= 18 :print ("成年" ) if age >= 18 : print ("成年" )
❌ 坑2:把 = 和 == 搞混 1 2 3 4 5 6 7 x = 5 if x == 10 : print ("x是10" ) if x = 10 : print ("..." )
记忆技巧:
= 一个等号是"赋值"(把右边的值存到左边)== 两个等号是"比较"(左右是否相等)❌ 坑3:条件写反了 1 2 3 4 5 6 7 8 9 10 11 12 13 age = 20 if age > 18 and age < 12 : print ("..." ) if age < 12 or age > 65 : print ("享受优惠票" ) if 12 <= age <= 18 : print ("青少年" )
❌ 坑4:浮点数精度问题 1 2 3 4 5 6 7 8 9 result = 0.1 + 0.2 if result == 0.3 : print ("相等" ) import mathif math.isclose(result, 0.3 ): print ("相等" )
❌ 坑5:多余的else 1 2 3 4 5 6 7 8 if x > 0 : return True else : return False return x > 0
❌ 坑6:使用is比较值 1 2 3 4 5 6 7 8 x = 500 if x is 500 : print ("相等" ) if x == 500 : print ("相等" )
实战练习:智能客服机器人 写一个根据关键词自动回复的客服程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 def smart_reply (message ): """根据用户消息返回自动回复""" message = message.lower() if "价格" in message or "多少钱" in message: return "基础版免费,专业版¥99/月,企业版¥399/月" elif "退款" in message or "退货" in message: return "7天无理由退款,请联系客服:400-123-4567" elif "账号" in message or "登录" in message: return "请尝试重置密码,或发送'人工'转人工客服" elif "谢谢" in message: return "不客气!有其他问题随时找我 😊" elif "人工" in message: return "正在为您转接人工客服,请稍候..." else : return "抱歉,我没听懂你的问题。请输入'人工'转人工客服" questions = [ "这个软件多少钱?" , "我想退款怎么办" , "我登录不上账号" , "谢谢你的帮助" , "你们营业时间?" ] print ("🤖 智能客服已上线\n" )print ("=" * 40 )for q in questions: print (f"用户:{q} " ) print (f"客服:{smart_reply(q)} " ) print ("-" * 40 )
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 🤖 智能客服已上线 ======================================== 用户:这个软件多少钱? 客服:基础版免费,专业版¥99/月,企业版¥399/月 ---------------------------------------- 用户:我想退款怎么办 客服:7天无理由退款,请联系客服:400-123-4567 ---------------------------------------- 用户:我登录不上账号 客服:请尝试重置密码,或发送'人工'转人工客服 ---------------------------------------- 用户:谢谢你的帮助 客服:不客气!有其他问题随时找我 😊 ---------------------------------------- 用户:你们营业时间? 客服:抱歉,我没听懂你的问题。请输入'人工'转人工客服 ----------------------------------------
实战练习:用户登录系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 def login_system (): """简单的登录系统""" users = { "admin" : {"password" : "admin123" , "role" : "管理员" }, "user1" : {"password" : "user123" , "role" : "普通用户" }, "vip" : {"password" : "vip123" , "role" : "VIP用户" } } print ("=" * 40 ) print ("欢迎登录系统" .center(34 )) print ("=" * 40 ) username = input ("用户名:" ) password = input ("密码:" ) if username not in users: print ("❌ 用户名不存在" ) return if users[username]["password" ] != password: print ("❌ 密码错误" ) return role = users[username]["role" ] print (f"\n✅ 登录成功!" ) print (f"欢迎回来,{username} ({role} )" ) if role == "管理员" : print ("\n管理员菜单:" ) print ("1. 用户管理" ) print ("2. 系统设置" ) print ("3. 数据统计" ) elif role == "VIP用户" : print ("\nVIP用户菜单:" ) print ("1. 查看报告" ) print ("2. 下载资源" ) else : print ("\n用户菜单:" ) print ("1. 查看信息" ) print ("2. 修改密码" ) if __name__ == "__main__" : login_system()
实战练习:成绩管理系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 def grade_management (): """成绩管理系统""" print ("=" * 50 ) print ("成绩管理系统" .center(44 )) print ("=" * 50 ) while True : print ("\n请选择操作:" ) print ("1. 录入成绩" ) print ("2. 查询成绩" ) print ("3. 统计分析" ) print ("0. 退出系统" ) choice = input ("\n请输入选项:" ) if choice == "1" : score = float (input ("请输入成绩(0-100):" )) if 0 <= score <= 100 : if score >= 90 : grade = "A" elif score >= 80 : grade = "B" elif score >= 60 : grade = "C" else : grade = "D" print (f"成绩:{score} ,等级:{grade} " ) else : print ("❌ 成绩必须在0-100之间" ) elif choice == "2" : print ("查询功能开发中..." ) elif choice == "3" : print ("统计功能开发中..." ) elif choice == "0" : print ("感谢使用,再见!" ) break else : print ("❌ 无效选项,请重新输入" ) if __name__ == "__main__" : grade_management()
性能对比:不同的条件写法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import timeitdef method1 (x ): if x == 1 : return "一" if x == 2 : return "二" if x == 3 : return "三" return "其他" def method2 (x ): if x == 1 : return "一" elif x == 2 : return "二" elif x == 3 : return "三" else : return "其他" def method3 (x ): mapping = {1 : "一" , 2 : "二" , 3 : "三" } return mapping.get(x, "其他" ) def method4 (x ): match x: case 1 : return "一" case 2 : return "二" case 3 : return "三" case _: return "其他" print ("多个if:" , timeit.timeit(lambda : method1(3 ), number=1000000 ))print ("if-elif:" , timeit.timeit(lambda : method2(3 ), number=1000000 ))print ("字典映射:" , timeit.timeit(lambda : method3(3 ), number=1000000 ))
结论:
字典映射最快(O(1)查找) if-elif 次之 多个 if 最慢(每次都要判断所有条件) 📚 推荐:Python 零基础实战营 系统学习Python,推荐这个免费入门课程 👇
特点 说明 🎯 专为0基础设计 门槛低,上手快 📹 配套视频讲解 配合文章学习效果更好 💬 专属答疑群 遇到问题有人带 🎁 实体书赠送 优秀学员送《Python编程从入门到实践》
👉 点击免费领取 Python 零基础实战营
本讲小结 语法 说明 if 条件:如果满足条件,执行下面的代码 else:前面条件不满足时,执行这里 elif 条件:前面的if不满足,再来判断这个 条件1 and 条件2两个都要满足 条件1 or 条件2满足任一个就行 not 条件取反 值1 if 条件 else 值2三元运算符,简化写法 match x: case 1:Python 3.10+的模式匹配
下节预告 学会了做选择,下一篇来学循环 ——让程序自动重复做事,批量处理大量数据。
你将学会:
for循环:遍历序列 while循环:条件循环 break和continue:控制循环 循环的高级用法 👉 继续阅读:Python循环
课程导航 上一篇: Python运算符与表达式
下一篇: Python循环-for和while完全指南
相关阅读 PS:条件判断让程序拥有了"智慧"。多观察生活中的"如果...否则...",编程思维就慢慢养成了。记住:好的代码要像人一样会做选择,而不是盲目执行。
2026-04-23 更新 by 程序员晚枫
🎓 AI 编程实战课程 想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!