Python 从入门到实战(五):条件判断(让程序学会 “做选择”)

文章目录
- 一、为什么需要条件判断?先看 3 个痛点场景
- 二、条件测试:判断 “是 / 否” 的核心
- 1. 相等性测试:判断 “是不是”
- 2. 不等性测试:判断 “不是”
- 3. 数值比较:判断 “大小关系”
- 4. 逻辑运算符:判断 “多个条件”
- 5. 包含关系测试:判断 “在不在列表里”
- 6. 布尔值测试:判断 “真假状态”
- 三、if 语句的 3 种核心结构:从简单到复杂
- 四、条件判断与列表、循环结合:实战场景
- 五、新手必踩的 5 个坑:避坑指南
- 坑 1:用 “=” 代替 “==”(赋值 vs 相等测试)
- 坑 2:条件测试后的 “冒号” 忘记写
- 坑 3:逻辑运算符优先级搞反
- 坑 4:空列表 / 空字符串的判断
- 坑 5:elif 和 else 的位置错误
- 六、综合实操:用户权限管理系统
- 七、小结与下一篇预告
欢迎回到「Python 从入门到实战」系列专栏。上一篇咱们掌握了循环结构,能让程序自动批量处理数据 —— 比如遍历 100 个学生的成绩。但光批量处理还不够,实际场景中经常需要 “根据不同情况做不同操作”:比如成绩 > 90 评 “优秀”、60~90 评 “及格”、<60 评 “不及格”;再比如用户登录时,管理员和普通用户看到的界面不一样。
今天咱们要学 Python 的 “决策核心”——条件判断(if 语句)。它就像程序的 “大脑”,能根据预设条件决定执行哪段代码,让程序从 “机械重复” 升级为 “智能选择”。接下来咱们从实际场景出发,一步步掌握条件判断的所有核心用法,再结合前面学的列表、循环做综合实战。
一、为什么需要条件判断?先看 3 个痛点场景
在学语法前,先搞懂 “条件判断能解决什么问题”。咱们举 3 个前面学循环时无法解决的痛点:
场景 1:成绩手动评级太繁琐
用循环遍历成绩列表时,想给每个成绩评级,如果没有条件判断,只能手动写多个循环,效率极低:
python
运行
# 没有条件判断:手动筛选不同成绩(繁琐!)
scores = [85, 92, 58, 76, 95]
# 筛选优秀成绩(>90)
excellent = []
for score in scores:
if score > 90: # 这里其实偷偷用了条件判断,只是之前没细讲
excellent.append(score)
# 筛选及格成绩(60~90)
passed = []
for score in scores:
if score >=60 and score <=90:
passed.append(score)
print(f"优秀成绩:{excellent}") # 输出:优秀成绩:[92, 95]
print(f"及格成绩:{passed}") # 输出:及格成绩:[85, 76]
如果要评 “优秀 / 良好 / 及格 / 不及格” 四个等级,用这种方式要写 4 个循环 —— 而有了系统的条件判断逻辑,一个循环就能搞定所有评级。
场景 2:用户权限区分
假设系统里有管理员和普通用户,登录后要显示不同功能:管理员能删数据,普通用户只能看数据。没有条件判断,无法实现这种差异化功能:
python
运行
# 没有条件判断:无法区分用户权限
users = [{"name": "admin", "role": "admin"}, {"name": "user1", "role": "normal"}]
for user in users:
# 这里需要判断role是admin还是normal,才能决定显示什么功能
print(f"欢迎{user['name']}!")
# 缺少条件判断,只能显示相同的功能
场景 3:用户输入验证
接收用户输入时,需要判断输入是否合法(比如年龄必须是正数、成绩必须在 0~100 之间)。没有条件判断,会导致错误数据进入程序:
python
运行
# 没有条件判断:无法验证输入合法性
age = input("请输入年龄:")
age = int(age)
# 如果用户输入负数,程序会继续执行,导致逻辑错误
print(f"你今年{age}岁")
而有了条件判断,以上问题都能轻松解决 —— 程序能自动 “做选择”,根据不同情况执行不同代码。接下来咱们先学条件判断的 “基础单元”:条件测试。
二、条件测试:判断 “是 / 否” 的核心
条件判断的本质是 “判断一个表达式的结果是 True(真)还是 False(假)”,这个表达式就是条件测试。所有 if 语句的核心,都是先做条件测试,再决定是否执行代码。
咱们从 “最常用的条件测试类型” 入手,每个类型都配实际场景和代码示例:
1. 相等性测试:判断 “是不是”
最基础的测试是 “判断两个值是否相等”,用==(两个等号,注意和赋值=区分)。
python
运行
# 场景:判断用户输入的颜色是否是“红色”
user_color = input("请输入你喜欢的颜色:")
# 相等性测试:判断user_color是否等于"红色"
if user_color == "红色":
print("你喜欢的颜色是红色!")
else:
print(f"你喜欢的颜色是{user_color},不是红色~")
运行示例 1(输入 “红色”):
plaintext
请输入你喜欢的颜色:红色
你喜欢的颜色是红色!
运行示例 2(输入 “蓝色”):
plaintext
请输入你喜欢的颜色:蓝色
你喜欢的颜色是蓝色,不是红色~
避坑:大小写敏感问题
Python 的相等性测试区分大小写,比如 “Red” 和 “red” 会被视为不相等:
python
运行
# 错误示例:大小写不同,判断为不相等
color1 = "Red"
color2 = "red"
print(color1 == color2) # 输出:False
# 解决办法:先统一大小写再判断
print(color1.lower() == color2.lower()) # 输出:True(都转小写后比较)
实际场景中(比如用户名验证),通常会先把输入转成统一大小写(比如全小写),再做判断,避免因大小写导致的误判。
2. 不等性测试:判断 “不是”
如果要判断 “两个值不相等”,用!=(感叹号加等号),适合 “排除某个特定值” 的场景。
python
运行
# 场景:判断用户点的比萨配料不是“ anchovies”(意式小银鱼)
requested_topping = input("请输入你要加的比萨配料:")
if requested_topping != "anchovies":
print(f"好的,给你加{requested_topping}!")
else:
print("抱歉,我们没有anchovies配料~")
运行示例(输入 “蘑菇”):
plaintext
请输入你要加的比萨配料:蘑菇
好的,给你加蘑菇!
3. 数值比较:判断 “大小关系”
处理数字时,常用<(小于)、>(大于)、<=(小于等于)、>=(大于等于)做测试,比如成绩判断、年龄判断。
python
运行
# 场景:判断用户是否成年(>=18岁)
age = int(input("请输入你的年龄:"))
if age >= 18:
print("你已成年,可以独立办理业务!")
else:
print("你未成年,需要监护人陪同~")
运行示例(输入 “20”):
plaintext
请输入你的年龄:20
你已成年,可以独立办理业务!
再比如判断成绩是否及格(>=60):
python
运行
score = 75
if score >= 60:
print("成绩及格!")
else:
print("成绩不及格,需要补考~")
4. 逻辑运算符:判断 “多个条件”
有时候需要同时判断多个条件(比如 “年龄>=18 且有身份证”),这时候要用逻辑运算符把多个测试结合起来:
and:所有条件都为 True,结果才是 True(相当于 “并且”);or:只要有一个条件为 True,结果就是 True(相当于 “或者”)。
场景 1:用 and 判断 “同时满足两个条件”
比如判断用户是否 “年龄>=18 且有身份证”:
python
运行
age = 20
has_id = True
# and:两个条件都满足才为True
if age >= 18 and has_id:
print("可以办理银行卡!")
else:
print("办理银行卡需要满足:年龄>=18且持有身份证~")
运行结果:可以办理银行卡!
如果has_id改为 False,结果会变成:办理银行卡需要满足:年龄>=18且持有身份证~
场景 2:用 or 判断 “满足一个条件即可”
比如判断用户是否 “年龄 < 14 或年龄>=60”(享受优惠):
python
运行
age = 12
if age < 14 or age >= 60:
print("你符合优惠条件,门票半价!")
else:
print("你需要购买全价门票~")
运行结果:你符合优惠条件,门票半价!
5. 包含关系测试:判断 “在不在列表里”
处理列表时,经常需要判断 “某个值是否在列表中”,用in;或者 “不在列表中”,用not in,比遍历列表判断高效得多。
python
运行
# 场景:判断用户名是否在已注册列表中
registered_users = ["zhangsan", "lisi", "wangwu"]
username = input("请输入用户名:")
if username in registered_users:
print(f"用户名{username}已注册,请直接登录~")
else:
print(f"用户名{username}未注册,是否需要注册?")
运行示例(输入 “lisi”):
plaintext
请输入用户名:lisi
用户名lisi已注册,请直接登录~
再比如判断 “禁止词不在用户输入中”:
python
运行
banned_words = ["垃圾", "脏话"]
user_input = input("请输入评论:")
if user_input not in banned_words:
print(f"评论发布成功:{user_input}")
else:
print("评论包含禁止词,无法发布~")
6. 布尔值测试:判断 “真假状态”
布尔值(True/False)是条件测试的 “最终结果”,也可以直接用布尔值做条件判断,适合表示 “状态”(比如游戏是否运行、用户是否登录)。
python
运行
# 场景:判断游戏是否在运行
game_active = True
if game_active:
print("游戏正在运行,按ESC暂停~")
else:
print("游戏已暂停,按空格键继续~")
运行结果:游戏正在运行,按ESC暂停~
实际场景中,布尔值常用来控制循环(比如while game_active:),这也是前面循环章节里 “标志位” 的核心原理。
三、if 语句的 3 种核心结构:从简单到复杂
掌握了条件测试后,就可以用if语句组织这些测试,实现不同的分支逻辑。Python 中的 if 语句主要有 3 种结构,覆盖从 “单分支” 到 “多分支” 的所有场景。
1. 简单 if 结构:满足条件才执行
适合 “只有一个条件,满足就做,不满足就不做” 的场景,比如 “年龄 >=18 就打印成年提示,不满足就什么都不做”。
python
运行
# 结构:
if 条件测试:
满足条件时执行的代码(缩进)
# 示例:判断成绩是否优秀(>90),优秀才打印提示
score = 95
if score > 90:
print("恭喜!你的成绩是优秀等级~")
print("可以申请奖学金哦~") # 缩进,属于if的代码块
运行结果:
plaintext
恭喜!你的成绩是优秀等级~
可以申请奖学金哦~
如果score改为 85,条件不满足,代码块不会执行,没有任何输出。
2. if-else 结构:二选一
适合 “两个互斥条件,必须选一个执行” 的场景,比如 “及格 / 不及格”“成年 / 未成年”,不会出现 “既不执行也不执行” 的情况。
python
运行
# 结构:
if 条件测试:
满足条件时执行的代码
else:
不满足条件时执行的代码
# 示例:判断成绩是否及格
score = 58
if score >= 60:
print(f"成绩{score},及格!")
else:
print(f"成绩{score},不及格,需要补考~")
运行结果:成绩58,不及格,需要补考~
再比如用户登录时的密码验证:
python
运行
correct_password = "123456"
user_password = input("请输入密码:")
if user_password == correct_password:
print("密码正确,登录成功!")
else:
print("密码错误,请重新输入~")
3. if-elif-else 结构:多分支选择
适合 “三个及以上分支” 的场景,比如成绩评级(优秀 / 良好 / 及格 / 不及格)、会员等级(VIP / 普通 / 新用户),Python 会 “逐个检查条件,满足一个就执行,跳过后面所有分支”。
python
运行
# 结构:
if 条件1:
执行代码1
elif 条件2:
执行代码2
elif 条件3:
执行代码3
else:
所有条件都不满足时执行的代码(可选)
# 示例:成绩多等级评级
score = 85
if score >= 90:
grade = "优秀"
elif score >= 80: # 隐含条件:score <90(因为前面90+的已经被筛选)
grade = "良好"
elif score >= 60: # 隐含条件:score <80
grade = "及格"
else: # 隐含条件:score <60
grade = "不及格"
print(f"你的成绩是{score}分,等级:{grade}")
运行结果:你的成绩是85分,等级:良好
关键注意点:elif 的顺序很重要
elif 是 “依次检查”,如果把范围大的条件放在前面,会导致后面的条件永远不执行。比如把 “>=60” 放在 “>=80” 前面:
python
运行
# 错误示例:条件顺序错误
score = 85
if score >= 60: # 85>=60为True,执行后跳过后面所有条件
grade = "及格"
elif score >= 80:
grade = "良好"
elif score >= 90:
grade = "优秀"
else:
grade = "不及格"
print(grade) # 输出:及格(错误!)
正确做法:把 “范围小、更严格” 的条件放在前面(比如先判断 >=90,再 >=80,最后 >=60)。
四、条件判断与列表、循环结合:实战场景
前面学了列表、循环,现在加上条件判断,就能实现 “批量处理 + 智能选择” 的核心功能。咱们讲 3 个高频实战场景:
1. 场景 1:遍历列表时筛选元素
比如遍历成绩列表,打印每个成绩的等级,同时统计及格人数:
python
运行
# 成绩列表
scores = [85, 92, 58, 76, 95, 45, 88]
passed_count = 0 # 统计及格人数
# 遍历列表+条件判断
for score in scores:
if score >= 90:
grade = "优秀"
passed_count += 1
elif score >= 80:
grade = "良好"
passed_count += 1
elif score >= 60:
grade = "及格"
passed_count += 1
else:
grade = "不及格"
print(f"成绩:{score},等级:{grade}")
# 循环结束后打印统计结果
print(f"\n总人数:{len(scores)}人")
print(f"及格人数:{passed_count}人")
print(f"及格率:{passed_count/len(scores)*100:.1f}%")
运行结果(节选):
plaintext
成绩:85,等级:良好
成绩:92,等级:优秀
...
总人数:7人
及格人数:5人
及格率:71.4%
2. 场景 2:处理列表中的 “特殊元素”
比如遍历汽车列表,对 “bmw” 品牌用全大写打印,其他品牌用首字母大写:
python
运行
# 汽车列表
cars = ["audi", "bmw", "subaru", "toyota"]
for car in cars:
if car == "bmw":
print(car.upper()) # 特殊处理:全大写
else:
print(car.title()) # 普通处理:首字母大写
运行结果:
plaintext
Audi
BMW
Subaru
Toyota
3. 场景 3:验证用户输入的合法性
比如让用户输入 “1~10” 之间的数字,用循环 + 条件判断确保输入合法:
python
运行
# 循环接收输入,直到输入合法
while True:
num = input("请输入1~10之间的数字:")
# 第一步:判断输入是否是数字
if num.isdigit():
num = int(num)
# 第二步:判断数字是否在1~10之间
if 1 <= num <= 10:
print(f"你输入的数字是{num},符合要求!")
break # 输入合法,退出循环
else:
print("数字必须在1~10之间,请重新输入~")
else:
print("输入无效,请输入数字!")
运行示例:
plaintext
请输入1~10之间的数字:abc
输入无效,请输入数字!
请输入1~10之间的数字:15
数字必须在1~10之间,请重新输入~
请输入1~10之间的数字:5
你输入的数字是5,符合要求!
五、新手必踩的 5 个坑:避坑指南
条件判断看似简单,但新手容易在细节上出错,导致逻辑错误或报错。咱们总结 5 个高频坑点:
坑 1:用 “=” 代替 “==”(赋值 vs 相等测试)
python
运行
# 错误示例:用=(赋值)代替==(相等测试)
age = 18
if age = 18: # 报错:SyntaxError: invalid syntax
print("成年")
原因:=是 “赋值”(把 18 给 age),==才是 “判断相等”。正确写法:if age == 18:
坑 2:条件测试后的 “冒号” 忘记写
python
运行
# 错误示例:if语句后忘记写冒号
score = 85
if score > 80 # 报错:SyntaxError: expected ':'
print("良好")
原因:Python 用冒号标识 “条件测试结束,开始写代码块”。正确写法:if score > 80:
坑 3:逻辑运算符优先级搞反
比如 “age>=18 and age <=30” 写成 “18 <= age <=30” 是对的,但如果用and,要注意括号:
python
运行
# 错误示例:逻辑运算符优先级错误
age = 25
if age >= 18 and 30: # 错误:30是True,相当于age>=18 and True
print("青年")
# 正确写法:
if age >= 18 and age <= 30:
print("青年")
原因:and两边需要都是完整的条件测试,不能省略后面的age。
坑 4:空列表 / 空字符串的判断
新手常误以为 “空列表[]是 True”,但 Python 中 “空值”(空列表、空字符串、0)都会被视为 False:
python
运行
# 错误示例:判断空列表是否有元素
shopping_cart = []
if shopping_cart: # 空列表是False,条件不满足
print("购物车有商品")
else:
print("购物车是空的") # 正确输出
正确做法:直接用列表名做测试,空列表返回 False,非空返回 True。
坑 5:elif 和 else 的位置错误
else 必须放在最后,且每个 elif 都要带条件测试:
python
运行
# 错误示例:else放在中间
score = 75
if score >= 90:
print("优秀")
else: # 错误:else后面不能有elif
print("不优秀")
elif score >= 80:
print("良好")
正确写法:elif 在前,else 在最后:
python
运行
score = 75
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
else:
print("及格")
六、综合实操:用户权限管理系统
咱们结合 “条件判断 + 列表 + 循环”,做一个简单的 “用户权限管理系统”,实现以下功能:
- 用列表存储用户信息(每个元素是 “用户名 - 角色” 的字典);
- 遍历用户列表,根据角色(admin/normal/guest)分配不同权限;
- 对 admin 用户显示 “增删改查” 权限,normal 用户显示 “查” 权限,guest 用户提示 “需要登录”;
- 统计每种角色的用户数量。
完整代码:
python
运行
# 用户权限管理系统
print("===== 用户权限管理系统 =====")
# 1. 初始化用户列表(字典元素:包含username和role)
users = [
{"username": "admin", "role": "admin"},
{"username": "zhangsan", "role": "normal"},
{"username": "lisi", "role": "normal"},
{"username": "wangwu", "role": "guest"},
{"username": "zhaoliu", "role": "admin"}
]
# 2. 初始化角色计数器
role_count = {"admin": 0, "normal": 0, "guest": 0}
# 3. 遍历用户列表,分配权限+统计角色
for user in users:
username = user["username"]
role = user["role"]
# 统计角色数量
role_count[role] += 1
# 条件判断:根据角色分配权限
print(f"\n=== 用户:{username} ===")
if role == "admin":
print("角色:管理员")
print("权限:")
print(" - 增加用户")
print(" - 删除用户")
print(" - 修改用户信息")
print(" - 查看用户列表")
elif role == "normal":
print("角色:普通用户")
print("权限:")
print(" - 查看个人信息")
print(" - 编辑个人信息")
elif role == "guest":
print("角色:游客")
print("权限:")
print(" - 查看公开内容")
print("提示:请登录后获取更多权限~")
else:
print("角色:未知角色,无权限~")
# 4. 打印角色统计结果
print("\n===== 角色统计 =====")
for role, count in role_count.items():
print(f"{role}角色:{count}人")
print("======================")
运行结果(节选):
plaintext
===== 用户权限管理系统 =====
=== 用户:admin ===
角色:管理员
权限:
- 增加用户
- 删除用户
- 修改用户信息
- 查看用户列表
=== 用户:wangwu ===
角色:游客
权限:
- 查看公开内容
提示:请登录后获取更多权限~
===== 角色统计 =====
admin角色:2人
normal角色:2人
guest角色:1人
======================
这个系统整合了前面学的所有核心知识:用列表存储多个用户,用字典存储每个用户的关联信息,用循环遍历用户,用条件判断分配权限 —— 这就是 Python 编程的 “组合拳”,能解决很多实际问题。
七、小结与下一篇预告
这篇你学到了什么?
- 条件测试:判断 “相等 / 不等 / 数值大小 / 包含关系”,用
and/or组合多个条件,用布尔值表示状态; - if 语句结构:简单 if(单分支)、if-else(二选一)、if-elif-else(多分支),注意条件顺序和冒号;
- 实战结合:遍历列表时用条件判断筛选元素、处理特殊值、验证输入合法性;
- 避坑要点:区分
==和=,记得写冒号,注意逻辑运算符优先级,正确判断空值。
下一篇预告
今天的条件判断让程序能 “做选择”,但处理 “关联数据”(比如 “用户名 - 密码”“商品名 - 价格”)时,列表 + 条件判断还是不够高效 —— 比如要根据用户名找密码,需要遍历列表。下一篇咱们会学 Python 的 “关联数据神器”——字典,它能通过 “键” 快速找到 “值”,不用遍历,让数据查询效率翻倍,同时更适合存储结构化信息。
如果这篇内容帮你掌握了条件判断,欢迎在评论区分享你的 “权限管理系统” 改进版本(比如添加 “修改用户角色” 功能),咱们一起交流进步~
- 点赞
- 收藏
- 关注作者
评论(0)