条件判断

刚学编程的朋友,最开始应该会好奇:程序难道只会从上往下一条路走到黑吗?比如能不能让它根据输入不同的密码,决定是否放行?根据年龄不同,给不同的电影分级提示?这时候就轮到控制流的核心——条件判断登场了。

Python 的条件判断语法非常友好,没有多余的大括号(用缩进代替),完全贴合自然语言的逻辑,今天我们就来从入门到进阶,吃透它!


1. 最基础的单分支:if 语句

当你只需要“满足某个条件才做特定事”时,用单分支的 if 就够了。

语法结构

Python 的语法规则很简单:

if 能判断真假的条件:
    # 条件为真时执行的代码块(必须缩进!通常是4个空格或1个Tab)

小试牛刀的例子

比如你想给满18岁的人发成年礼通知:

age = 20
if age >= 18:
    print('🎉 恭喜你成年啦!')
    print('记得办理身份证更新哦~')

这里的 age >= 18 是一个布尔表达式,只会返回 TrueFalse。如果是 True,就缩进下面的两行代码;如果是 False,这两行直接跳过,程序继续往下走。


2. 满足做A,不满足做B:if-else 双分支

单分支只能处理“做/不做”,但很多时候需要“二选一的必做分支”——比如年龄够了去买成人票,不够去买儿童票,这时候加个 else 就行。

语法结构

if 条件:
    # 真分支
else:
    # 假分支

实用例子

我们把成年礼的例子稍微改改,变成票房查询场景:

age = 7
if age >= 18:
    print('请购买普通票:50元')
else:
    print('请购买儿童票:25元')

3. 三选一、四选一?用 if-elif-else 多分支

如果有超过两个连续且互斥的条件(比如电影分级0-3岁免票、4-12岁半票、13-64岁全票、65+免票),就不要写嵌套的 if-else 了(嵌套多了可读性很差),直接用 Python 专属的 elif(else if 的缩写)。

语法结构

if 条件1:
    # 条件1真,执行这里,后面的全跳过
elif 条件2:
    # 条件1假、条件2真,执行这里
elif 条件3:
    # 前两个假、第三个真,执行这里
else:
    # 所有前面的都假,执行这里的兜底逻辑

注意执行顺序!

这是很多新手会踩的坑:Python 是从上到下依次匹配条件的,一旦匹配到第一个真的,剩下的 elifelse 直接全部跳过!

比如下面这个错误的电影分级代码:

age = 25
if age >= 65:
    print('请出示老年证免票')
elif age >= 13:
    print('请购买全票:50元')  # 这里才是正确的执行顺序
elif age >= 4:
    print('请购买半票:25元')
else:
    print('请家长陪同免票')

如果把 age >= 13 放到最前面,那 25岁 的人会直接匹配到第一个条件,输出全票,没问题;但如果顺序乱了,比如先写 age >= 4,那 25岁 也会匹配到半票!


4. 不用写全 == True/!= 0?Python 的“真值/假值”简化

Python 有个非常贴心的设计:不是只有 TrueFalse 才能当条件!很多值会被自动“视为假”,其他的都“视为真”,可以直接用来简化代码。

自动视为 False 的值列表

记不住没关系,核心记住几个常用的就行:

  1. 显式的假:NoneFalse
  2. 数值的假:整数 0、浮点数 0.0、复数 0j
  3. 空序列的假:空字符串 ''、空列表 []、空元组 ()、空集合 set()
  4. 空映射的假:空字典 {}

简化前后的对比

比如检查用户是否输入了有效内容:

# 冗余写法
username = input('请输入用户名:')
if username != '' and username != None:
    print('用户名有效')

# 简化写法(Pythonic)
if username:
    print('用户名有效')

再比如检查变量是否是0:

# 冗余写法
count = 0
if count == 0:
    print('库存为空')

# 简化写法
if not count:
    print('库存为空')

5. 处理用户输入要小心!别忘了类型转换和异常捕获

我们经常用 input() 函数获取用户输入,但input() 返回的永远是字符串!如果要用来做数值比较(比如年龄、BMI的体重身高),必须先转成 intfloat

直接转的话,如果用户输入的不是数字(比如“abc”),程序会直接报错退出——这太不友好了!所以还要加个 try-except 捕获异常。

安全又完整的输入处理例子

比如判断用户是00前还是00后:

try:
    # 先尝试转成整数
    birth_year = int(input('请输入你的出生年份(四位数字):'))
    if birth_year < 2000:
        print('你是00前的朋友~')
    else:
        print('你是00后的新生代呀!')
except ValueError:
    # 如果转整数失败,提示用户
    print('❌ 输入无效,请输入纯数字的四位年份!')

6. 结合小案例练手:BMI 计算器

BMI(身体质量指数)是衡量体重是否健康的常用指标,刚好适合用多分支条件判断。

完整代码

def calculate_bmi(height: float, weight: float) -> str:
    # 计算BMI
    bmi = weight / (height ** 2)
    # 保留两位小数,方便展示
    bmi_display = round(bmi, 2)

    # 多分支判断BMI区间
    if bmi < 18.5:
        status = '体重过轻'
    elif 18.5 <= bmi < 25:
        status = '体重正常(继续保持!)'
    elif 25 <= bmi < 28:
        status = '体重过重'
    elif 28 <= bmi < 32:
        status = '轻度肥胖'
    else:
        status = '重度肥胖(建议咨询医生哦~)'

    return f"你的BMI是 {bmi_display},状态:{status}"

# 测试一下
if __name__ == "__main__":
    try:
        user_height = float(input('请输入你的身高(单位:米,比如1.75):'))
        user_weight = float(input('请输入你的体重(单位:千克,比如70):'))
        print(calculate_bmi(user_height, user_weight))
    except ValueError:
        print('❌ 请输入有效的数字!')

7. 现代 Python 的进阶写法(3.6+ 支持)

如果你的 Python 版本比较新(建议至少3.8,现在最新稳定版都3.13了),可以用这些高级特性让代码更简洁、更Pythonic:

7.1 类型注解(3.6+)

虽然 Python 是动态类型语言,但加上类型注解能让代码更易读,也方便编辑器和静态检查工具(比如 mypy)帮你找 bug。

# 上面BMI例子里已经用过了
def check_age(age: int) -> str:
    if age >= 18:
        return '成年人'
    return '未成年人'

7.2 海象运算符 :=(3.8+)

海象运算符可以在条件判断里同时完成“赋值+判断”,减少重复代码。 比如刚才的00前00后判断,简化成这样:

try:
    if (birth_year := int(input('请输入出生年份:'))) < 2000:
        print('00前')
    else:
        print('00后')
except ValueError:
    print('无效输入')

这里的 (birth_year := int(...)) 既把输入转成整数赋值给了 birth_year,又直接把这个值作为判断条件,一举两得!

7.3 模式匹配 match-case(3.10+)

模式匹配是 Python 3.10 引入的重磅特性,虽然基础场景下和 if-elif-else 差不多,但处理复杂结构(比如列表、字典、类实例)时会非常好用。不过先看个基础年龄判断的例子对比一下:

# if-elif-else 写法
if age >= 18:
    print('成年人')
elif age >= 13:
    print('青少年')
else:
    print('儿童')

# match-case 写法
match age:
    case age if age >= 18:
        print('成年人')
    case age if age >= 13:
        print('青少年')
    case _:
        print('儿童')

这里的 _通配符,相当于 else 的兜底逻辑。


8. 新手必踩的5个常见错误

8.1 忘记加冒号 :

ifelifelse 后面必须加冒号,这是 Python 语法的硬性要求!

# 错误写法
if age >= 18
    print('成年')

# 正确写法
if age >= 18:
    print('成年')

8.2 缩进错误

Python 用缩进表示代码块的归属,缩进不一致(比如有的用2个空格,有的用4个)或者不该缩进的地方缩进了,都会报错!

# 错误写法1:缩进不一致
if age >= 18:
  print('成年')
    print('更新身份证')  # 这里多了2个空格,会报错

# 错误写法2:不该缩进的地方缩进了
if age >= 18:
    print('成年')
    print('更新身份证')
  print('欢迎光临')  # 这里缩进了,但不属于if块,会报错

# 正确写法(统一用4个空格,块内缩进,块外不缩进)
if age >= 18:
    print('成年')
    print('更新身份证')
print('欢迎光临')

8.3 混淆赋值 = 和相等判断 ==

这是所有新手都会犯的低级错误!= 是把右边的值赋给左边的变量,== 是判断左右两边是否相等。

# 错误写法
age = 20
if age = 18:  # 这里会直接报错,因为赋值不能当条件
    print('刚好成年')

# 正确写法
if age == 18:
    print('刚好成年')

8.4 未处理用户输入的类型转换

刚才讲过,input() 返回的是字符串,不能直接用来做数值比较,否则会报错!

# 错误写法
age = input('请输入年龄:')
if age >= 18:  # 字符串和整数不能比较,报错
    print('成年')

# 正确写法(加上int转换和try-except)
try:
    age = int(input('请输入年龄:'))
    if age >= 18:
        print('成年')
except ValueError:
    print('无效输入')

8.5 条件判断顺序错误

刚才的多分支部分重点讲过,一定要把范围更小、更严格的条件放在前面,范围大的放在后面!

# 错误的电影分级顺序
age = 25
if age >= 4:
    print('半票')  # 25岁也满足>=4,直接输出半票了,后面的全跳过
elif age >= 13:
    print('全票')
else:
    print('免票')

# 正确的顺序
if age >= 65:
    print('免票')
elif age >= 13:
    print('全票')
elif age >= 4:
    print('半票')
else:
    print('免票')

总结

Python 的条件判断是控制程序流程的核心,从入门到进阶我们梳理了:

  1. 基础的单分支 if、双分支 if-else、多分支 if-elif-else
  2. 利用“真值/假值”简化代码
  3. 安全处理用户输入
  4. 结合 BMI 计算器的小案例
  5. 现代 Python 的类型注解、海象运算符、模式匹配
  6. 新手必踩的5个坑

通过合理使用这些语法,你已经能写出有“选择能力”的程序啦!下一篇我们会讲循环,让程序有“重复执行能力”~