第8章 if条件判断
到今天为止,你写的程序都是"一条道走到黑":从上往下,每行都执行。可现实里哪有这种事?下雨要带伞、不下雨不用带;分数够 90 是优秀、够 60 是及格、不够是不及格——程序得会"看情况办事"。今天学的东西就是这个能力:
if条件判断。
if 给程序装上的是一套红绿灯:条件成立,绿灯放行,执行这段代码;条件不成立,红灯亮起,走另一条路。判断的依据,就是你昨天学的比较运算符(比大小)和逻辑运算符(合条件)。学会它,程序才真正开始"智能"——后面的循环、项目,全靠它撑场面。
if 基本结构:先判断,再执行
格式一句话就能说清:if 条件: 冒号结尾,下面缩进一行。
if 条件成立:
做这件事 ← 注意:前面有 4 个空格(缩进)!
条件就是你昨天学的比较或逻辑表达式(结果一定是 True / False)。条件为 True,缩进的代码执行;为 False,缩进的代码跳过,直接走后面的代码。
这种"条件成立才执行"的结构,术语叫分支结构(branch)。程序跑到 if 就像走到岔路口,往左还是往右,由条件说了算。
score = 95
if score >= 60:
print("及格了!") # 条件成立(95 >= 60 是 True),这行执行
print("程序结束") # 没有缩进,不属于 if,无论如何都执行
# 条件不成立的情况
score = 40
if score >= 60:
print("及格了!") # 条件不成立(False),这行被跳过
print("程序结束") # 这行照常执行
三个要点:
- 冒号不能丢:
if score >= 60:结尾的:是固定的,丢了直接语法报错。 - 只有缩进的代码属于 if:缩进的代码才是"条件成立时要做的事"。不缩进的代码和 if 无关,无论条件如何都会执行。缩进写错是最经典的坑,下面专门讲。
- 条件要能得出布尔值:
if score >= 60:是表达式;也可以if is_adult:直接放布尔变量。
if / else 双分支:非此即彼
很多情况只有两种结果:要么 A,要么 B。下雨带伞、不下雨不带;偶数、奇数;成年、未成年。这种用 if + else(否则):
if 条件成立:
做 A
else:
做 B ← 条件不成立时走这里
else 不用写条件,它的意思是"前面的 if 不成立,就轮到我了"。注意 if 和 else 要对齐(都顶格),下面的代码都缩进。
age = int(input("请输入年龄:"))
if age >= 18:
print("你成年了,可以进网吧了(开玩笑的)")
else:
print("你还未成年,先回去写作业")
# 奇偶判断:用 % 2 看余数
num = int(input("请输入一个整数:"))
if num % 2 == 0:
print(f"{num} 是偶数")
else:
print(f"{num} 是奇数")
两个容易写错的地方:else 后面没有条件、没有括号,写 else (条件) 是错的,else 后面只有冒号;if 和 else 必须顶格对齐——else 缩进了,Python 会认为它属于别的代码块,报缩进错误。
双分支是"非此即彼":条件成立走 if,不成立走 else,永远不会两个都走。一个数不是偶数就一定是奇数,这就是典型双分支。
第一次写双分支的人最容易漏掉 else——其实只写 if 也能跑,只是条件不成立时什么都不做。要不要加 else,取决于"不成立时要不要有动作"。
if / elif / else 多分支:一路问到底
情况多于两种怎么办?用 elif(else if 的缩写,意思是"否则如果")。它像一连串的问句,从上往下逐个检查,遇到第一个成立的就执行,后面的都不再看了:
if 条件1:
情况1
elif 条件2:
情况2
elif 条件3:
情况3
else:
兜底(都不满足时)
经典例子:成绩等级。90 以上优秀,80~90 良好,60~80 及格,60 以下不及格——4 种情况,一路问下来。
score = int(input("请输入分数:"))
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格,加油!")
# 看个细节:为什么不用把范围写全?
# 第 2 个 elif 能执行,说明前面的 score >= 90 是 False,
# 也就是 score < 90,所以写 score >= 80 就够了,不用写 80 <= score < 90。
这里最关键的一点是顺序:elif 从上往下问,第一个成立的执行完,后面全跳过。所以范围大的条件要放后面,范围小的放前面——如果先把 score >= 60 放第一个,95 分只会打印"及格"。
考试里最常见的改错题也出在这里:把 elif 的顺序打乱,让 95 分输出"及格"。你能一眼看出问题在哪,这一节就算过关了。
另外两件事:elif 是 elif,不是 elseif、不是 else if(别的语言才那么写);else 只能有一个,必须写在最后面当"兜底",想再加判断,应该改用 elif。
缩进:if 的灵魂
缩进(indent)就是代码开头的空格。Python 靠缩进判断"哪些代码属于谁",同一层次的代码必须缩进一致(标准是 4 个空格,也就是按一次 Tab 键)。这有点像写作文的分段:段首空两格,读者才知道哪里是新的段落。
往深了说,缩进就是 Python 的"花括号"——别的语言用 {} 圈代码块,Python 用缩进。所以缩进不是排版美观问题,是语法问题,错了程序根本跑不起来。
规则就三条:
if/elif/else冒号后换行,下一行必须缩进,否则报IndentationError。- 同一块缩进的代码行,空格数必须一样多。
if、elif、else这几个关键词本身必须顶格对齐(缩进一样)。
# 正确写法:同一层次缩进一致
age = 20
if age >= 18:
print("成年了") # 4 个空格
print("可以考驾照") # 也是 4 个空格,和上一行同属 if
else:
print("未成年")
# 错误写法(下面这些都会报错或逻辑错乱,别这么写):
# if age >= 18:
# print("成年了") # 缩进错误:IndentationError
#
# if age >= 18:
# print("a") # 有的 2 个空格
# print("b") # 有的 4 个空格:缩进不一致,报错
新手在这里栽跟头的特别多,几条实操建议:
- 写完
if ...:回车后,编辑器通常会自动缩进,别手动删掉空格。 - 缩进要统一:不要一会儿用 Tab、一会儿用空格。VSCode 里按一下 Tab 就是 4 个空格,全程用 Tab 键即可。
- 要取消缩进就按
Shift + Tab,别一个个删空格,容易删多删少。
一个 if 里判断多个条件
一个 if 里可以同时判断多个条件,把昨天的 and / or / not 用进来。这就像过安检:"带身份证 且 体温正常"才能进站,两个条件一起查。
# 场景一:安检——两个条件都要满足(and)
has_id = True
temperature = 36.5
if has_id and temperature <= 37.3:
print("放行进站")
else:
print("请配合检查")
# 场景二:周末判断(or)
day = input("今天是星期几?")
if day == "周六" or day == "周日":
print("休息日,出去玩!")
else:
print("工作日,去上课")
# 场景三:范围判断(两个条件夹击)
age = int(input("请输入年龄:"))
if age >= 18 and age <= 60:
print("你是青壮年")
else:
print("不在这个年龄段")
# 场景四:not 取反(不满足才执行)
is_rain = False
if not is_rain:
print("不下雨,不用带伞")
常见套路:年龄范围 if 18 <= age <= 60 也能写,但更推荐 if age >= 18 and age <= 60,读起来直接;二选一的情况,比如 if 天气 == "下雨" or 天气 == "下雪":——or 连接两个条件,满足其一即可。
三个注意点:
and/or连接的是完整条件:if age >= 18 and <= 60是错的(第二个条件缺了变量,语法错误)。- 字符串比较用
==:day == "周六"判断文字相等,注意中文引号、全角符号都不要混进代码。 - 条件太长怎么办?一行写不下可以拆开,先算好存进变量:
is_ok = a and b,再if is_ok:,代码更好读。
if 里套 if:先过大门,再进小门
if 里面还能再写 if,叫嵌套 if(nested if),就像"先过大门,再进小门":第一层条件成立,才轮到看第二层。用它的场景是层层筛选:先判断是不是成年人,是的话再判断年龄在哪个区间。
age = int(input("请输入年龄:"))
if age >= 18:
print("你是成年人")
if age >= 60:
print("而且是老年人")
else:
print("但还不是老年人")
else:
print("你是未成年人")
# 运行示例(输入 65):
# 你是成年人
# 而且是老年人
嵌套 if 和"elif 连排"的区别:elif 是"同层多项选一",嵌套是"一层套一层"。能用 elif 解决的问题尽量用 elif,嵌套写多了容易乱。这一节先说三个注意点:
- 内层 if 的缩进比外层多:外层 4 空格,内层 8 空格(编辑器会自动续一层)。缩进层级越多越容易乱,别套超过两层。
- 内层的 else 匹配最近的 if:Python 的规则是"就近配对"——内层
else跟内层if配对,不是外层。看代码时靠缩进确认配对关系。 - 能不用嵌套就别用:先想能不能用
and合并条件。比如上面例子合并成if age >= 60:一个条件就够了。嵌套越多,bug 藏得越深。
随堂练习
-
练习一(奇偶判断):输入一个整数,输出它是奇数还是偶数。 提示:
num % 2 == 0是偶数,else就是奇数。别忘了int()转换。 -
练习二(成绩等级四档):输入分数,输出 优秀(>=90)/ 良好(>=80)/ 及格(>=60)/ 不及格。用 if / elif / else 写。 提示:从高到低写条件,先判断 90,再 80,再 60,最后 else 兜底。写完用 95、85、65、45 分别试一遍。
-
练习三(周末判断):输入星期几(1~7 的数字),输出"上课"还是"休息"。 提示:6 和 7 是休息日,其余上课。
if day == 6 or day == 7或if day >= 6都可以,想想哪种更稳妥。 -
练习四(进阶:闰年判断):判断一个年份是不是闰年。规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。 提示:能整除就是余数为 0:
year % 4 == 0。两个大条件用or连接:(year % 4 == 0 and year % 100 != 0) or year % 400 == 0。用 2000(闰年)、1900(不是)、2024(是)验证。 -
★ 练习五(进阶:登录模拟):模拟一个简单登录:预设
correct_user = "admin"、correct_pwd = "123456",用input收用户名和密码,两个都对输出"登录成功",否则输出"用户名或密码错误"。 提示:两个判断用and组合。这已经是一个"真实程序"的样子了,想想为什么提示语不告诉用户"到底是用户名错还是密码错"(为了安全)。
卡住了?让 AI 搭把手
场景:多分支判断写乱了,想让 AI 讲思路
提示词:我是 Python 零基础学生,今天学 if / elif / else。
我有一个成绩等级判断的问题:90 以上优秀、80 以上良好、60 以上及格、以下不及格。
为什么 elif 的顺序很重要?如果把"大于 60"写在第一个,90 分会输出什么?
请用大白话解释,不要给完整代码。
场景:缩进报错,想让 AI 帮忙检查
提示词:我是 Python 零基础学生,我的 if 代码报错
"IndentationError: expected an indented block"。
下面是我的代码:[粘贴你的代码]。请告诉我哪里缩进错了,
并解释 Python 的缩进规则,不要直接改我的代码。
常见报错速查
| 报错信息 | 什么意思 | 怎么办 |
|---|---|---|
IndentationError: expected an indented block |
if 冒号后面没缩进,或缩进丢失 | 冒号后换行的代码必须缩进(4 空格),检查每个 if 块 |
IndentationError: unexpected indent |
有多余的缩进,不该缩进的缩进了 | 检查是不是按多了空格,非 if 块的代码要顶格 |
SyntaxError: invalid syntax(冒号问题) |
条件后忘了冒号,或 else 后面写了条件 |
if 条件: 和 else: 结尾必须有冒号,else 后不写条件 |
SyntaxError: expected ':' |
少了冒号 | 检查 if / elif / else 行结尾 |
| 逻辑正确但结果不对(如 95 分只显示及格) | 条件顺序错了,范围大的写前面了 | 把条件按"从严格到宽松"排序,大范围的放后面 |
TypeError: '<' not supported between instances of 'str' and 'int' |
输入没转 int 就直接比大小 | input 返回字符串,先 int(input(...)) 再比较 |
收个尾
今天学的判断,让程序从"一条道走到黑"变成了"会看情况办事":if 单分支、if/else 双分支(非此即彼)、if/elif/else 多分支(从上往下,命中即止),再加上缩进这个"灵魂"和 and / or / not 的组合。
明天学循环——让程序重复干活:打印 1 到 100、九九乘法表,都用得上。今天学会的是"判断一次",明天学的是"重复 N 次",两者合起来,你就能写出真正的程序了。临走前把今天最容易被扣分的地方再背一遍:冒号结尾、缩进 4 空格、if/elif/else 顶格对齐、条件从严格到宽松。