这一篇会让读者真正感受到,程序里的判断不是只能平着写,有时候还会一层套一层。很多看起来稍微复杂一点的业务逻辑,本质上就是这样搭出来的。
前面你已经学会了两种很重要的判断方式。
一种是最基础的 if。 满足条件,就执行。
另一种是 if...elif...else。 多个条件里,选一个最合适的结果。
可真实程序里,很多判断还会再复杂一点。
比如:
如果用户已经登录, 再判断他是不是管理员。
如果成绩及格了, 再判断是不是优秀。
如果商品有库存, 再判断余额够不够。
你会发现,这类逻辑不是并排展开的, 而是先判断第一层, 进入以后,再判断第二层。
这就是今天要讲的内容:
嵌套判断。
你可以先记住一句最核心的话:
嵌套判断,就是在判断里面继续判断。
一、什么是嵌套判断
先说最直白的理解。
所谓嵌套判断,就是一个 if 代码块里面,又出现了新的 if。
比如:
age = 20if age >= 18: print('你已经成年')if age >= 60: print('你是老年人')
这里就出现了两层判断。
第一层先判断:
年龄是不是大于等于 18
只有这个条件成立, 程序才会进入里面。
进入里面以后, 再判断第二层:
年龄是不是大于等于 60
这就叫嵌套判断。
它不是两个独立判断, 而是“在一个判断内部,再继续判断”。
二、为什么需要嵌套判断
因为很多场景本来就是分层的。
比如你去商场买东西,程序可能要这样判断:
先判断商品有没有库存 如果有库存,再判断你余额够不够 如果余额够,再判断你是不是会员 如果是会员,再给你折扣
你会发现,这不是一个平面判断。 而是一步一步往里走的。
再比如一个学生成绩系统:
先判断是否及格 如果及格,再判断是不是优秀 如果优秀,再判断是不是满分
这些逻辑天然就有层级感。
所以嵌套判断的价值就在这里:
它能把“先过第一关,再进第二关”的逻辑写出来。
三、先看一个最简单的嵌套判断例子
下面这个例子特别适合入门。
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
你可以自己试几组输入。
输入 95,结果会是:
成绩及格成绩优秀
输入 75,结果会是:
成绩及格
输入 40,结果则什么都不会输出。
为什么会这样。
因为程序是这样走的:
先看第一层,score >= 60 成立吗 如果不成立,整个里面都不进 如果成立,先打印“成绩及格”
然后再看第二层,score >= 90 成立吗 如果成立,再打印“成绩优秀” 如果不成立,就结束
这就是最基础的嵌套判断流程。
四、把嵌套判断翻译成人话,你会更容易懂
还是刚才这段代码:
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
你可以直接翻译成:
如果成绩及格, 就先告诉你及格了。 并且在这个前提下,再看看你是不是优秀。
你会发现,嵌套判断其实一点都不神秘。 它只是把现实里的分层思路写出来而已。
也就是说:
第一层判断决定你能不能进门 第二层判断决定你进门以后属于哪种情况
五、嵌套判断最关键的,不是 if 多写一个,而是层级
很多新手第一次看到嵌套判断时,会觉得:
不就是多写了一个 if 吗
表面上确实是。 但真正关键的不是“多一个 if”, 而是它写在谁里面。
来看这两段代码。
第一段,两个独立 if:
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
第二段,嵌套判断:
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
在这个例子里,它们结果看起来差不多。 但逻辑含义并不完全一样。
第一段是两个平行判断。 第二段是先及格,再在及格基础上继续判断优秀。
也就是说,嵌套判断更强调“第二层依赖第一层”。
这个思路以后会越来越重要。
六、嵌套判断特别依赖缩进
因为 Python 本来就是靠缩进表示层级。 一旦进入嵌套判断,缩进会变得更加重要。
比如:
age = 20if age >= 18: print('你已经成年')if age >= 60: print('你是老年人')
这里第二个 if 比第一个 if 里面的普通语句还要再缩进到同一层。 这就表示:
第二个 if 属于第一个 if 的内部。
如果你缩进写乱了,逻辑就会变。
比如下面这种:
age = 20if age >= 18: print('你已经成年')if age >= 60: print('你是老年人')
这就不是嵌套了, 而是两个独立判断。
所以嵌套判断里,缩进不是装饰, 而是结构本身。
七、先做一个“登录后再判断身份”的练习
这个例子特别像真实业务逻辑。
is_login = Trueis_admin = Falseif is_login: print('用户已登录')if is_admin: print('欢迎管理员')
程序逻辑是:
先看用户是否已登录 只有登录了,才有必要继续判断是不是管理员
如果连登录都没有, 后面管理员判断就没有意义。
这就是嵌套判断很典型的使用方式:
先判断大前提 大前提成立后,再判断更细的条件
你也可以自己改几个值试试:
is_login = Falseis_admin = True
看看输出会发生什么变化。
八、嵌套判断很适合“先筛一层,再细分一层”的场景
这是个非常实用的理解方式。
比如:
先判断是否成年 再判断是不是老年人
先判断是否及格 再判断是不是优秀
先判断是否有库存 再判断是否有余额
先判断是否登录 再判断是不是管理员
你会发现,嵌套判断不是为了炫技, 而是因为很多问题本来就带着筛选结构。
先通过一个大条件, 再在通过的人里面继续分。
这种逻辑用嵌套写,特别自然。
九、自己动手做一个年龄分层判断
这个练习很适合现在做。
age = int(input('请输入年龄:'))if age >= 18: print('你已经成年')if age >= 60: print('你属于老年阶段')
你可以输入:
15 25 65
观察结果。
输入 15,什么都不输出。 输入 25,只输出成年。 输入 65,输出成年和老年阶段。
这非常能体现嵌套判断的层级关系。
十、嵌套判断和 if...elif...else 可以一起用
这一点很重要,因为真实程序经常会混合使用。
比如:
先判断是否及格 如果及格了,再判断是优秀还是普通及格 如果没及格,就直接输出不及格
代码可以这样写:
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('等级:优秀')else: print('等级:普通及格')else: print('成绩不及格')
这段代码就把嵌套和 else 结合起来了。
它的逻辑特别清楚:
第一层先看及不及格 及格了,再分优秀和普通 没及格,直接走外层 else
这种写法特别值得你练。
十一、要学会分清“这个 else 是配谁的”
这是嵌套判断里新手最容易乱掉的地方。
比如下面这段:
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('等级:优秀')else: print('等级:普通及格')else: print('成绩不及格')
这里有两个 else。
第一个内层 else,配的是:
if score >= 90:
第二个外层 else,配的是:
if score >= 60:
你怎么判断它们各自配谁。
看缩进。
谁和哪个 if 对齐, 它就是那个 if 的 else。
所以你以后看嵌套判断时,一定不要只看字。 一定要看缩进层级。
十二、先做一个“购物资格”嵌套练习
这个特别贴近实际。
stock = int(input('请输入库存:'))money = float(input('请输入余额:'))price = float(input('请输入商品价格:'))if stock > 0: print('商品有库存')if money >= price: print('余额充足,可以购买')
这个程序的逻辑非常自然:
先看商品有没有库存 如果没有库存,后面根本不用谈买不买 如果有库存,再看余额是否足够
这就是嵌套判断很适合的典型场景。
你可以试试下面几组输入:
库存 10,余额 100,价格 50 库存 10,余额 20,价格 50 库存 0,余额 100,价格 50
看看结果如何变化。
十三、嵌套判断和多个条件并排写,怎么选
这是个特别好的问题。
有些逻辑,你既可以写成嵌套, 也可以写成逻辑运算组合。
比如刚才那个购买资格例子, 你也可以写成:
if stock > 0and money >= price: print('可以购买')
这当然没错。 而且更短。
那为什么还要学嵌套判断。
因为嵌套判断更适合“过程分层”的表达。
比如你想先告诉用户:
商品有库存
然后再告诉他:
余额是否足够
这种场景下,嵌套更清楚。
所以你可以这样理解:
如果你只关心最后一个整体结果, 有时逻辑运算更简洁。
如果你想表达一个分步骤、分层次的判断过程, 嵌套判断更自然。
十四、不要把所有复杂判断都硬写成一行
很多新手一学到逻辑运算,就特别想把所有条件都塞一行。
比如:
if age >= 18and score >= 60and money >= 100and name == '小明':
这样不是不能写, 但一旦逻辑再复杂一点,读起来会非常累。
而嵌套判断有一个好处:
它能把判断拆成一层层的步骤。
比如:
if age >= 18:if score >= 60:if money >= 100: print('满足条件')
虽然代码更长, 但逻辑反而更清晰。
对新手来说,当前阶段宁可稍微长一点, 也要先把思路写清楚。
十五、嵌套不要太深,太深会很难读
这个现在先给你一个意识就够了。
嵌套判断是很有用, 但如果你一层套一层,套到四五层,代码就会开始变得很难看。
比如这种:
if 条件1:if 条件2:if 条件3:if 条件4: print('...')
这就很容易让人看晕。
所以嵌套判断虽然要学, 但也要知道它是有代价的。
你现在先学会两层嵌套最重要。 后面等你学更多写法,再慢慢学怎么把复杂逻辑写得更优雅。
十六、自己动手做一个“先登录再看权限”的小程序
这个练习特别值得做。
username = input('请输入用户名:')password = input('请输入密码:')role = input('请输入身份:')if username == 'admin':if password == '123456': print('登录成功')if role == '管理员': print('欢迎进入后台系统')
这个例子的逻辑是:
先看用户名对不对 用户名对了,再看密码对不对 密码对了,再看身份是不是管理员
这就是非常标准的“层层通过”的嵌套结构。
你可以自己换几组输入试试, 感受一下程序是怎么一层一层往里走的。
十七、嵌套判断里,内层条件不会自己执行
这一点一定要形成直觉。
比如:
score = 40if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
这里虽然 score >= 90 本身也是一个条件, 但它根本没机会单独执行。
因为外层 score >= 60 都没成立, 程序就不会进入里面。
所以你一定要明白:
内层判断不是独立运行的 它的前提是外层先放行
这也是为什么嵌套判断强调层级,而不是只是多写几个 if。
十八、再做一个“输入账号后判断会员等级”的练习
这个也很适合公众号读者自己练。
is_login = input('是否已登录,输入 yes 或 no:')level = input('请输入会员等级:')if is_login == 'yes': print('登录成功')if level == '黄金': print('享受 8 折优惠')elif level == '白银': print('享受 9 折优惠')else: print('享受普通会员优惠')
这个例子很有代表性。 因为它是外层 if,里面又套了一个 if...elif...else。
这正是很多真实程序很常见的写法。
先判断能不能进入下一步 进入后,再做更细的分类
十九、嵌套判断最容易犯的几个错误
第一个错误,缩进写乱。
这会直接导致层级错乱, 最常见的结果就是逻辑和你想的不一样,或者直接报错。
第二个错误,分不清内层 else 和外层 else 对应谁。
这个一定靠缩进看, 谁和哪个 if 对齐,它就属于谁。
第三个错误,把本来独立的条件硬写成嵌套。
不是所有多条件都适合嵌套。 如果两个判断本来互不依赖,写成两个独立 if 反而更清楚。
第四个错误,嵌套太深,自己都看不懂。
你现在先练两层最合适。 别一上来就写特别深的结构。
二十、今天一定要亲手完成的 3 个练习
第一个,成绩分层练习。
score = int(input('请输入成绩:'))if score >= 60: print('成绩及格')if score >= 90: print('成绩优秀')
第二个,购物资格练习。
stock = int(input('请输入库存:'))money = float(input('请输入余额:'))price = float(input('请输入价格:'))if stock > 0: print('商品有库存')if money >= price: print('可以购买')
第三个,登录权限练习。
is_login = Trueis_admin = Falseif is_login: print('用户已登录')if is_admin: print('欢迎管理员')
这三个练习类型不同, 但都非常能帮助你建立嵌套判断的直觉。
二十一、再做一个综合小练习
下面这个练习特别适合做今天的收尾。
需求:
输入学生姓名和成绩 如果成绩及格,输出及格 如果成绩及格且大于等于 90,输出优秀 如果不及格,输出不及格
代码如下:
name = input('请输入姓名:')score = int(input('请输入成绩:'))if score >= 60: print(f'{name},你已及格')if score >= 90: print(f'{name},你的成绩很优秀')else: print(f'{name},继续保持')else: print(f'{name},你还没有及格')
你可以分别输入:
95 75 40
对照结果看程序怎么一层层做判断。
这个例子特别好, 因为它同时包含了:
外层 if...else内层 if...else
层级感会非常明显。
二十二、写在最后
嵌套判断看起来比普通 if 复杂一点, 但它并不是更难的概念。 它只是让程序学会:
第一步判断以后, 在这个结果基础上,再继续判断下一步。
说到底,它很像现实生活里的决策过程。
先看你有没有资格进入下一步 进去了,再看你属于哪一类 再根据这一类,做下一层处理
很多稍微复杂一点的程序, 其实都是这样一层层搭起来的。
所以你现在学的,不只是一个语法技巧。 你是在学程序如何把复杂逻辑拆成一层层可执行的步骤。
这一步特别关键。
本文小结
嵌套判断就是在一个判断里面继续写新的判断。 它特别适合“先过第一层,再判断第二层”的场景。 嵌套判断最关键的是层级,而层级在 Python 里靠缩进表示。 内层判断不是独立运行的,必须在外层条件成立后才会执行。 嵌套判断可以和 if...elif...else 结合使用。 学习嵌套判断最重要的,不是多写一个 if,而是形成“分层决策”的思维。
下篇预告
第 24 篇,我们正式进入循环的第一步。
while 循环入门:让程序重复执行任务
到那一篇,你会真正看到,程序是怎么把“重复做一件事”这件事自动化的。