☰
Python条件判断入门:if else用法详解与实战案例
2026/10/21 16:17:09 网站建设 项目流程

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 是字符串类型 "20",Python 在 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三者有优先级:not>and>or。比如:

a = True b = False c = True # 写法一 result = a or b and not c # not c 先算,得到 False;b and False 得到 False;a or False 得到 True # 写法二(加了括号) result = (a or b) and not c # a or b 得到 True;not c 得到 False;True 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,写一遍比看十遍印象深刻得多。

我个人在实际教学里发现,大部分学员学到这里都会经历一个“从懵到通”的转折点。前面几节学变量、学数据类型,感觉都还好,一到条件判断就卡住了——因为这是第一次真正动脑写逻辑。卡住不要紧,把文中的代码多抄两遍,再改着玩,很快就会建立条件判断的直觉。这类例子我见过太多了,只要坚持下来,后面学循环、学函数都会顺得多。祝写得开心。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询