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

举报
倔强的石头_ 发表于 2025/12/11 14:30:46 2025/12/11
【摘要】 文章目录一、为什么需要条件判断?先看 3 个痛点场景场景 1:成绩手动评级太繁琐场景 2:用户权限区分场景 3:用户输入验证二、条件测试:判断 “是 / 否” 的核心1. 相等性测试:判断 “是不是”避坑:大小写敏感问题2. 不等性测试:判断 “不是”3. 数值比较:判断 “大小关系”4. 逻辑运算符:判断 “多个条件”场景 1:用 and 判断 “同时满足两个条件”场景 2:用 or 判断...

c6e3154d215982a75f2280a6ca6650b4.jpeg

文章目录


欢迎回到「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("及格")

六、综合实操:用户权限管理系统

咱们结合 “条件判断 + 列表 + 循环”,做一个简单的 “用户权限管理系统”,实现以下功能:

  1. 用列表存储用户信息(每个元素是 “用户名 - 角色” 的字典);
  2. 遍历用户列表,根据角色(admin/normal/guest)分配不同权限;
  3. 对 admin 用户显示 “增删改查” 权限,normal 用户显示 “查” 权限,guest 用户提示 “需要登录”;
  4. 统计每种角色的用户数量。

完整代码:

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 编程的 “组合拳”,能解决很多实际问题。

七、小结与下一篇预告

这篇你学到了什么?

  1. 条件测试:判断 “相等 / 不等 / 数值大小 / 包含关系”,用and/or组合多个条件,用布尔值表示状态;
  2. if 语句结构:简单 if(单分支)、if-else(二选一)、if-elif-else(多分支),注意条件顺序和冒号;
  3. 实战结合:遍历列表时用条件判断筛选元素、处理特殊值、验证输入合法性;
  4. 避坑要点:区分===,记得写冒号,注意逻辑运算符优先级,正确判断空值。

下一篇预告

今天的条件判断让程序能 “做选择”,但处理 “关联数据”(比如 “用户名 - 密码”“商品名 - 价格”)时,列表 + 条件判断还是不够高效 —— 比如要根据用户名找密码,需要遍历列表。下一篇咱们会学 Python 的 “关联数据神器”——字典,它能通过 “键” 快速找到 “值”,不用遍历,让数据查询效率翻倍,同时更适合存储结构化信息。

如果这篇内容帮你掌握了条件判断,欢迎在评论区分享你的 “权限管理系统” 改进版本(比如添加 “修改用户角色” 功能),咱们一起交流进步~

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。