1. 从零理解条件判断为什么程序需要“做选择”如果你刚接触 Python可能已经写了不少这样的代码定义变量、做运算、打印结果。你会发现程序一直从上往下走每条语句都执行一遍像流水线一样一成不变。但真实的开发场景里程序必须根据不同情况做出不同反应——比如登录时判断用户名和密码是否匹配、购物时判断库存是否足够、游戏里判断角色生命值是否为 0。这时候就需要条件判断也就是大家常说的 if else 语句。用一句大白话来说if else 就是给程序装上“大脑”满足某个条件就走这条路不满足就走另一条路。它是编程里第一个真正让代码“活起来”的知识点也是后续学习循环、函数、异常处理的基石。你可以把它理解成生活中过马路时的判断“绿灯亮了就走红灯亮了就停。”Python 里的 if else 做的事情一模一样只不过它判断的对象是程序里的数据。这篇内容适合完全零基础的新手也适合写过几行代码但逻辑总是绕不清楚的人。我会先从最基础的条件概念讲起然后一步步拆解 if、else、elif 的用法再结合实际案例演示完整的代码写法最后把新手最容易踩的坑和排查技巧一个个列出来。全程用大白话讲配代码示例不需要任何前置知识跟着敲一遍就能上手。2. 条件判断的核心布尔值与比较运算2.1 条件判断的本质是“真或假”if 语句要判断的东西本质上只有两个结果真True或假False。在 Python 里这两个值被称为布尔值bool是所有条件判断的基础。你不需要刻意去记概念只需要记住一个画面if 后面跟着一个表达式Python 会先计算这个表达式得到一个布尔值。如果是 True就执行缩进里的代码如果是 False就跳过。这里有一个很重要的点Python 里不是只有 True 和 False 这两个值能表示真假。实际上任何值都可以被当作“真”或“假”来用这叫做真值测试。比如整数 0、空字符串 、空列表 []、None 都被视为 False而其他非零数字、非空字符串、非空列表都被视为 True。新手很容易在这里踩坑——你以为某个变量的值是空的所以不会执行但 Python 的判断结果可能和你想象的不一样。# 真值测试示例 if 0: print(这段不会执行因为 0 被视为 False) if 1: print(这段会执行因为 1 被视为 True) if : print(空字符串是 False这段不会执行) if hello: print(非空字符串是 True这段会执行)2.2 比较运算符判断的“计量工具”条件判断最常见的写法是把两个值放在一起比较。Python 提供的比较运算符有下面这些运算符含义示例结果等于5 5True!不等于5 ! 3True大于7 3True小于7 3False大于等于7 7True小于等于3 4True这里最容易搞混的是和。新手经常把判断相等写成赋值比如if score 100:运行后会直接报错。记住一个口诀是“给变量装值”是“问两个值是否相等”。这两种运算符的使用场景完全不同写代码的时候多看一眼能省不少排查时间。除了比较运算符还有三个逻辑运算符and、or、not。它们用来组合多个条件。and要求所有条件都为真才执行就像“今天不下雨并且是周末我才能出去玩”or只要一个条件为真就执行就像“我带了现金或者带了手机都能付钱”not则是取反把 True 变成 False把 False 变成 True。age 25 has_ticket True # 两个条件同时满足 if age 18 and has_ticket: print(可以入场) # 至少一个条件满足 if age 12 or has_ticket: print(可以进入儿童区或凭票入场) # 取反判断 if not has_ticket: print(请先购票)3. if 的基本用法最简单的单分支判断3.1 从一条 if 开始写起先看最简单的场景只有一个条件满足就执行不满足就什么都不做。这叫做单分支判断代码结构长这样score 85 if score 60: print(考试及格了恭喜)运行结果会打印“考试及格了恭喜”。整个过程是Python 先计算score 60得到 True于是执行下面缩进的那行代码。如果 score 改成 40条件变成 False整个 print 语句就会被跳过程序直接结束。关键点在缩进。Python 用缩进来划分代码块缩进的部分属于 if 语句管辖。标准是用 4 个空格或者一个 Tab。我建议你统一用 Tab 或统一用 4 个空格不要混用否则运行时会报IndentationError。很多编辑器会自动把 Tab 转成空格但不同工具行为可能不一样踩过坑的人都知道缩进问题是新手报错最多的原因之一。3.2 如果没有缩进会怎样有些人刚开始写的时候会这样if score 60: print(考试及格了)运行后会直接报IndentationError: expected an indented block。这个错误的意思是“这里需要一个缩进的代码块。”Python 靠缩进区分层级不像其他语言用花括号。这一点既是 Python 的特色也是新手最容易不习惯的地方。我的建议是写 if 语句的时候按完冒号直接回车编辑器会自动缩进然后你再写代码基本不会出错。如果 if 后面的代码块里有多条语句它们必须缩进到同一层级score 92 if score 60: print(考试及格了恭喜) print(继续加油保持好成绩)这样两条 print 都会执行。如果第二条 print 没有缩进那它就不属于 if 管辖无论条件是否满足都会执行——这种隐蔽的逻辑错误比报错更难发现因为 Python 不会提醒你。4. if else 双分支条件不满足时也有出路4.1 给代码加上“否则”的分支单分支只能处理“满足条件”的情况不满足就什么都不做。但很多场景需要两个明确的分支条件为真做一件事条件为假做另一件事。这时候就用else。score 45 if score 60: print(考试及格了恭喜) else: print(没及格需要补考哦)这段代码的流程是如果 score 大于等于 60打印“及格”否则也就是小于 60打印“没及格”。else不需要跟任何条件它管的是所有“if 条件不成立”的情况。通俗点说if是“如果”else是“否则”两个分支二选一必走一个。这里有个新手容易钻牛角尖的问题else 能再接条件吗比如“否则如果分数等于 60 分整”答案是直接用elif而不是写else if。这也是下一节要讲的内容。记住一条规律else后面不能跟条件它是兜底的如果你想细分多个条件用elif。4.2 配套写法要点与缩进细节写 if else 的时候else的缩进必须和对应的if对齐。比如score 45 if score 60: print(考试及格了恭喜) else: print(没及格需要补考哦)if和else都在最左边对齐它们的代码块各自缩进。如果 else 的缩进比 if 少一格或多一格轻则报错重则变成完全不同的逻辑。我见过不少同学把 else 写进了 if 的缩进块里结果变成条件满足时先打印提示再执行 else 的内容——这跟原本想表达的意思完全不一样了。另一个常见问题是忘记写冒号。if和else后面都要有一个英文冒号写成if 条件:和else:冒号表示“下面的缩进代码块属于我”。漏掉冒号解释器会直接报语法错误。这种错误多出现几次很快就会养成条件反射写完 if 条件回车之前先检查冒号有没有打上。5. elif 多重判断应对两个以上的分支5.1 场景引入成绩等级评定现实里很少有“只有两种情况”的判断。比如根据考试成绩给出等级90 分以上是优秀80 到 89 是良好70 到 79 是中等60 到 69 是及格60 以下是不及格。这种多分支场景就需要elif。elif 是“else if”的缩写意思很直白否则再判断另一个条件。score 85 if score 90: print(优秀) elif score 80: print(良好) elif score 70: print(中等) elif score 60: print(及格) else: print(不及格)运行这段代码会输出“良好”。因为 score 是 85第一个条件 85 90 不成立进入 elif 判断 85 80成立于是打印“良好”后续的 elif 和 else 都不会再检查。这个“短路机制”很重要一旦某个条件匹配成功剩下的分支全部跳过。5.2 elif 的执行顺序与逻辑陷阱新手理解 elif 时最容易犯的错是把条件的先后顺序搞反。举个例子把条件顺序倒过来写score 85 if score 60: print(及格) elif score 90: print(优秀)这时候 85 分只会输出“及格”因为第一个条件 85 60 已经成立了后面的 elif 根本不会被检查。这不是 Python 的 bug而是程序设计问题——条件判断是从上往下逐条匹配的先到的先赢。所以写多重判断时尽量让条件范围从大到小排列先筛高分再筛中分最后兜底或者从窄到宽排先筛特定区间再往两边覆盖逻辑上不能重叠混淆。另一个常见问题是条件覆盖不全。比如忘了写 else那么当所有条件都不满足时程序什么都不做也不会报错。这有时候是故意的有时候是遗漏。我的建议是只要逻辑上必然有一个分支要执行就一定要写 else 兜底如果你不确定是否有遗漏先用 else 打一个提示比如else: print(未匹配到任何条件)可以帮你尽早发现问题。elif 可以写很多层但实际开发里超过四五个分支就该考虑用字典映射或模式匹配来替代了。过于冗长的 if elif 链可读性差维护起来也痛苦——这是后话新手阶段能理清三五个分支已经够用。6. 嵌套 if条件里套条件6.1 什么时候需要嵌套现实中的规则往往不是一层判断就能说完的。比如电商平台的下单逻辑用户必须先登录才能下单登录之后还要判断库存是否充足库存充足的话再判断余额是否够支付。这种层层递进的关系用嵌套 if 最直观。所谓嵌套就是 if 里面再写一个 if。is_logged_in True stock_count 10 balance 200 price 150 if is_logged_in: if stock_count 0: if balance price: print(下单成功) else: print(余额不足) else: print(库存不足) else: print(请先登录)这段代码的执行路径是最外层判断是否登录如果不满足直接跳到最外层 else 打印“请先登录”如果满足进入第二层判断库存再进入第三层判断余额。每一层缩进逐渐加深逻辑层级一目了然。6.2 嵌套的利与弊嵌套 if 的好处是逻辑直观符合人类的思考方式一层一层往下拆。它的坏处是嵌套层数太多时代码缩进会变得非常深阅读起来像“箭头金字塔”前后逻辑难以对应。比如三层还可以接受五层以上就基本没法维护了。有一个原则叫“早返回”尽量把不满足的条件提前拦截掉减少嵌套深度。上面那段代码可以改成这样if not is_logged_in: print(请先登录) elif stock_count 0: print(库存不足) elif balance price: print(余额不足) else: print(下单成功)这种写法用 elif 把“分支出口”提前暴露出来每层只做一个判断减少了缩进深度可读性高了不少。实际项目中我推荐优先用这种扁平化写法只有逻辑上确实需要多层关联的时候才用嵌套。还有一种情况会强制你用嵌套第二个判断成立与否只在对第一个判断结果有意义时才检查。比如游戏里只有角色存活才能检查它是否处于无敌状态角色已经死亡了检查无敌状态就没有意义。这种强依赖关系用嵌套更自然。新手阶段建议先把扁平写法练熟再根据实际场景决定要不要嵌套。7. if 与 input() 结合写出能交互的程序7.1 让用户输入数据并参与判断到目前为止我们写的条件判断都是拿写死的变量比较。实际使用中最常见的需求是程序先问用户一个问题然后根据用户的回答决定输出什么。Python 里用内置函数input()获取用户输入默认拿到的是字符串类型。age input(请输入你的年龄) age int(age) # 把字符串转成整数 if age 18: print(你已成年可以进入) else: print(你还未成年不能进入)这里有一个隐藏的细节input()返回的一定是字符串如果你拿它和数字比较Python 会报类型错误。比如age 18如果 age 是字符串类型 20Python 在 Python 3 中会直接抛出TypeError: not supported between instances of str and int。解决办法是先用int()转换。7.2 用户输入判断的实战案例登录检查把上一节的知识综合一下写一个简单的年龄分级程序print(欢迎来到内容分级系统) age_input input(请输入你的年龄) # 防御性编程用户可能输入非数字 if age_input.isdigit(): age int(age_input) if age 18: print(可以访问所有内容) elif age 12: print(可以访问青少年内容) else: print(只能访问儿童内容) else: print(请输入合法的数字)这里用到了isdigit()方法判断用户输入是否全是数字防止用户乱输入导致程序崩溃。这属于“防御性编程”的第一步实际开发里用户输入永远是不能信任的。对一个新手来说能想到这一点已经很优秀了——很多人写了好几个月代码仍然会假设用户一定输入正确的东西然后被一顿乱输入搞崩程序。input() 的各种边界情况值得多琢磨。用户输入了空格、输入了负数、输入了超大的数字、输入了小数这些情况你的程序都应该能正常处理而不是直接报错。条件判断本身不复杂复杂的是把它放在真实场景里面对各种意外输入还能稳得住。8. 组合条件and、or、not 的实战用法8.1 用 and 处理“多个条件同时满足”前面简单介绍过逻辑运算符这里详细展开因为条件组合是 if 语句用得最多的进阶操作。场景活动报名要求年龄在 18 到 60 岁之间并且必须出示健康码。用 and 连接两个条件age 25 has_health_code True if 18 age 60 and has_health_code: print(报名成功) else: print(不符合报名条件)Python 支持链式比较18 age 60这个写法等价于age 18 and age 60可读性更好。这也是 Python 的特色语法之一其他很多语言不支持。逻辑顺序上and的优先级高于or但为了保险起见多条件组合时建议用括号明确分组。8.2 用 or 处理“多选一”的判断场景只有 VIP 会员或者消费满 500 元才能免运费。or 只要一个条件满足就够了is_vip True total_spent 320 if is_vip or total_spent 500: print(免运费) else: print(需要支付运费)8.3 not 的妙用反转判断结果not 最常见的用法是检查“某个条件不成立”。比如判断文件是否存在如果不存在则创建file_exists False if not file_exists: print(文件不存在正在创建...)这种写法比if file_exists False:更简洁也更符合 Python 的风格。在条件判断里写 False或 True属于冗余写法直接利用真值就行。同样是判断空列表cart [] if cart: # 如果不是空列表 print(购物车里有商品) else: print(购物车是空的)用直接的值做判断代码更清爽。这是新手进阶的一道坎一开始会觉得写成if cart []更明白但其实if cart就是最地道的 Python 写法因为空列表是真值为 False 的典型例子。8.4 条件组合的优先级陷阱and、or、not三者有优先级notandor。比如a True b False c True # 写法一 result a or b and not c # not c 先算得到 Falseb and False 得到 Falsea or False 得到 True # 写法二加了括号 result (a or b) and not c # a or b 得到 Truenot c 得到 FalseTrue and False 得到 False两种写法结果完全不同。新手阶段记不住优先级没关系但一定要养成加括号的习惯。括号不仅让解释器明白你的意图也让读你代码的人包括未来的你自己一目了然。宁可多写几层括号也不要靠记优先级来猜。9. 实战项目开发一个简易的“成绩分析助手”9.1 需求设计为了把所有知识点串起来这里做一个综合小项目。需求是用户输入一个分数程序输出对应的评价包括等级、是否合格、是否需要额外辅导。功能点涉及基本 if、elif、else、组合条件、用户输入、输入校验、循环优化。第一步先把需求拆解输入合法性检查。分数必须是数字且必须在 0 到 100 之间否则报错退出。然后按分数区间分等级90 以上优秀80-89 良好70-79 中等60-69 及格60 以下不及格。如果不及格额外提示需要补课。9.2 第一版实现串联全部知识点score_str input(请输入考试分数0-100) if not score_str.isdigit(): print(输入不合法请输入一个非负整数) else: score int(score_str) if 0 score 100: if score 90: level 优秀 qualified True elif score 80: level 良好 qualified True elif score 70: level 中等 qualified True elif score 60: level 及格 qualified True else: level 不及格 qualified False print(f你的等级是{level}) if qualified: print(恭喜你已经合格) else: print(很遗憾你需要补课) else: print(分数必须在 0 到 100 之间)这段代码综合了输入校验、嵌套判断、多分支、组合逻辑。运行流程是先判断输入是否数字然后判断分数是否在合法范围再按区间定等级最后根据是否合格给出额外提示。9.3 第二版优化用退出条件拦截非法输入第一版用了嵌套第二版改成“早返回”风格逻辑更扁平score_str input(请输入考试分数0-100) if not score_str.isdigit(): print(输入不合法请输入一个非负整数) exit() score int(score_str) if score 0 or score 100: print(分数必须在 0 到 100 之间) exit() if score 90: level 优秀 elif score 80: level 良好 elif score 70: level 中等 elif score 60: level 及格 else: level 不及格 print(f你的等级是{level}) if level 不及格: print(很遗憾你需要补课) else: print(恭喜你已经合格)第二版把校验逻辑提前处理掉剩下的是干净的分支判断。这种写法在实际开发里更受欢迎原因很简单每个 if 只负责一件事不需要一层套一层地猜逻辑。对新手来说两个版本都值得敲一遍感受一下代码组织方式的不同。9.4 进一步延展让程序支持多次输入程序只能运行一次每次都要重新打开体验很差。可以用while True循环包住主体做一个连续判断的版本——虽然循环是下一个知识点但提前感受一下也没坏处while True: score_str input(请输入考试分数0-100输入 q 退出) if score_str.lower() q: print(程序退出) break if not score_str.isdigit(): print(输入不合法请重新输入) continue score int(score_str) if score 0 or score 100: print(分数必须在 0 到 100 之间) continue if score 90: level 优秀 elif score 80: level 良好 elif score 70: level 中等 elif score 60: level 及格 else: level 不及格 print(f你的等级是{level}) if level 不及格: print(很遗憾你需要补课) else: print(恭喜你已经合格)这个版本里非法输入不会导致程序退出而是提示后继续循环。break用于跳出循环continue用于跳过当前循环。等真正学到 while 循环时你会发现这个 Demo 已经把循环和条件判断完美结合了。因为exit()会直接杀死程序在循环里用exit()不太好换成break或continue更合适。这些都是实战中会踩到的细节提前知道能省不少功夫。10. 新手最容易踩的坑与排查技巧10.1 等号与赋值混用这是出现频率最高的问题。if score 100:会导致语法错误因为是赋值不能出现在条件表达式里。我的排查建议是检查所有条件判断里的“等于”确认都写成了。人的思维惯性是写一个等号表示“是不是相等”但 Python 里要两个等号。这个坑几乎每个人都踩过踩过一次之后基本就能记住了。10.2 冒号遗漏if、elif、else后面都必须带英文冒号。漏掉冒号解释器会在那一行报SyntaxError: invalid syntax。排查时重点看冒号有没有写以及是不是英文状态下的冒号——中文冒号虽然长得差不多但 Python 不认识。在中文输入法下写代码这是高危操作我也中过招。建议写完条件后顺手检查一下标点符号是不是英文。10.3 缩进不一致Python 对缩进极其敏感。同一个代码块里的语句必须使用相同的缩进方式不能这段用 Tab下段用空格——表面看着对齐了解释器还是会报错。这是新手妥协得最多的问题。解决办法在代码编辑器的设置里把 Tab 键自动替换成 4 个空格一劳永逸。主流编辑器如 VS Code、PyCharm 都有这个选项。10.4 条件顺序导致的逻辑错误多重 elif 判断时条件顺序不同结果可能完全不同。前面讲过 85 分被判断成“及格”的例子。排查技巧当你觉得某个等级一直不对时把打印语句插到每个分支里看实际走了哪条路。这种方式叫“打点调试”比盯着代码猜快得多。10.5 类型不匹配input()返回字符串拿字符串和数字比较会报 TypeError。排查技巧打印出变量的类型用print(type(变量))。如果是 str 类型先转成 int。另外要注意input()返回的数字字符串和整数 18 比较时Python 不会像有些语言那样自动转换它只做严格类型比较。这个坑在最开始提过但值得再说一次因为它真的非常常见。10.6 条件判断里的常见错误速查表错误类型错误示例正确写法报错信息或后果赋值误用if x 5:if x 5:SyntaxError缺少冒号if x 5if x 5:SyntaxError缩进错误if x 5:\nprint(x)if x 5:\n print(x)IndentationError类型不匹配age input()age int(input())TypeError条件顺序错if 分60: else if 分90先写 90 再写 60逻辑错误中文符号if x 5:if x 5:SyntaxError忘记嵌套缩进多层 if 时只缩进一层每层多缩进 4 空格逻辑错误或 IndentationError用 比较浮点数if 0.1 0.2 0.3用 abs(差) 0.0001逻辑错误最后一条值得展开说说。Python 里0.1 0.2的结果并不精确等于0.3而是约等于0.30000000000000004。直接比较会得到 False这种浮点数精度问题在金融计算里尤其要命。如果真的要比较浮点数用误差范围判断abs((0.1 0.2) - 0.3) 1e-9这个该避的坑也帮你提前排掉了。11. 进阶建议从会写到写得好11.1 优先用扁平结构替代深层嵌套前面已经提过“早返回”的概念这里再细化一下。判断逻辑优先处理错误情况和边界情况把正常业务流程留在最后主流程的缩进深度始终保持在两层以内。这种风格让代码的可维护性大幅提升团队合作时读代码的效率也高很多。11.2 用字典替代冗长的 elif 链如果你是按分支给某个变量赋值可以用字典加get()方法替代level_map { 90: 优秀, 80: 良好, 70: 中等, 60: 及格, } score 85 level 不及格 for threshold in [90, 80, 70, 60]: if score threshold: level level_map[threshold] break这种写法在处理映射关系时可读性更好但新手阶段不强求。先把 if elif 用熟练理解“顺序匹配”和“短路”机制后续学习字典会更容易。11.3 条件判断里不要堆太多逻辑一个 if 后面别写太长的组合条件。如果条件超过三四个建议拆成独立的布尔变量取个有意义的名字再参与 if 判断is_weekend day in (周六, 周日) has_weather_ok not is_rainy and not is_stormy is_available not has_meeting if is_weekend and has_weather_ok and is_available: print(去公园野餐)这样做的效果是把复杂的逻辑拆成几个小步骤每一行都容易理解排查问题也能迅速定位到具体条件。条件判断本身不复杂真正复杂的是把一堆乱七八糟的业务规则清晰表达出来而拆变量就是最简单有效的辅助手段。11.4 多写多练是唯一的捷径if else 属于“一看就会一写就错”的知识点。建议把文中的代码示例挨个手敲一遍尤其是我给的几个出错示例敲完再改成正确写法体会一下报错时的感觉。然后试着独立完成几个小题目比如判断闰年、判断奇偶数、比较三个数大小并排序、模拟自动售货机找零。这些题目都会用到 if else写一遍比看十遍印象深刻得多。我个人在实际教学里发现大部分学员学到这里都会经历一个“从懵到通”的转折点。前面几节学变量、学数据类型感觉都还好一到条件判断就卡住了——因为这是第一次真正动脑写逻辑。卡住不要紧把文中的代码多抄两遍再改着玩很快就会建立条件判断的直觉。这类例子我见过太多了只要坚持下来后面学循环、学函数都会顺得多。祝写得开心。