条件判断
这是什么:条件判断 = 让程序按情况选择走哪条路的语法,用 if / elif / else 分叉。
为什么用:有了变量,程序能记住数据了,但它还只会从上到下"傻跑"。不能判断,程序就分不清「考满分」和「不及格」该怎么处理。
如何用:本章拿一个分数变量开刀,写出三分支的 if / elif / else,看它在终端里做出反应。
if / elif / else
score = 85
if score >= 90:
print("优秀!")
elif score >= 60:
print("及格,继续加油")
else:
print("要补考了……")
print("程序结束")
你会看到:
及格,继续加油
程序结束
Python 从上往下挨个检查条件:命中一个就执行它下面的缩进块,后面的分支全部跳过;一个都不中才轮到 else 兜底。elif 可以写任意多个,else 最多一个、也可以不写。
缩进不是排版,是语法
if 下一行开头那 4 个空格不是为了让代码好看——Python 靠缩进判断"哪些代码属于这个 if":
score = 95
if score >= 90:
print("优秀!") # 缩进了:条件成立才执行
print("查完成绩了") # 没缩进:不属于 if,永远执行
你会看到:
优秀!
查完成绩了
同一个代码块的缩进必须一致,官方推荐 4 个空格(VS Code 里按 Tab 会自动帮你变成空格)。该缩不缩、不该缩乱缩,都会报 IndentationError。
比较运算符与 and / or / not
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 3 == 3 |
True |
!= |
不等于 | 3 != 4 |
True |
> / < |
大于 / 小于 | 2 > 5 |
False |
>= / <= |
大于等于 / 小于等于 | 5 >= 5 |
True |
and |
并且,两边都成立才成立 | age >= 18 and has_ticket |
双真才真 |
or |
或者,一边成立就成立 | is_vip or has_coupon |
单真即真 |
not |
取反 | not True |
False |
组合起来用:
age = 20
has_ticket = True
if age >= 18 and has_ticket:
print("欢迎进场")
else:
print("不能进场")
你会看到:
欢迎进场
两个新手大坑:= 是赋值,== 才是比较,条件里写错意思全变;另外条件里的引号、括号同样必须用英文符号。
嵌套要节制
if 里面还能再套 if,但套到第三层,读代码的人(包括三天后的你自己)就开始晕了。能用 and 合并的条件就别嵌套,让每个 if 保持"一眼能看懂"的体量。
记忆口诀
if 打头、elif 补刀、else 兜底;命中即收工,缩进定归属。
⚠️ 新手翻车现场
翻车一:if 下面忘了缩进
score = 85
if score >= 60:
print("及格")
IndentationError: expected an indented block after 'if' statement on line 2
逐行分析:第 1 行 score = 85 没毛病;第 2 行 if score >= 60: 也没毛病,行尾冒号的意思是"下面归我管";毛病出在第 3 行——print("及格") 顶格写,冒号后 Python 正等一个缩进的代码块,却等来一行没缩进的代码,它当即判定你忘了缩进,抛出 IndentationError: expected an indented block(期待一个缩进块),还指出问题在 line 2 的 if 身上。Python 怎么发现的?它把缩进当语法读,还没运行任何代码、光读到第 3 行就拦下了。
修复:给 print 补上 4 个空格缩进。以后写 if、循环、函数,冒号下一律缩进,让缩进成为肌肉记忆。
翻车二:混进了中文标点
score = 85
if score >= 60:
print("及格")
SyntaxError: invalid character ':' (U+FF1A)
逐行分析:第 1 行、第 3 行都正常,第 2 行行尾的冒号是中文全角的 :,不是英文半角的 :。人眼看着几乎一样,Python 却按字符编码严格较真——它读到 U+FF1A 这个"陌生符号",直接报 SyntaxError: invalid character,还把符号和编码指给你看。为什么能发现?语法检查发生在运行之前,任何非法字符都过不了第一关。
修复:删掉中文冒号,换成英文冒号。举一反三:引号、逗号、括号同理——报 invalid character 就去抓中文标点,输入法切回英文再写代码。
❓ 常见问题
Q1:条件里把 == 写成 =,报错长什么样?
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
= 是赋值,== 才是比较——条件位置写个赋值语句,语法上直接不合法。新一点的 Python 会在报错里直接追问 Maybe you meant '=='.(见上,你是想写 == 吗),照它说的改就行。举一反三:以后见到 invalid syntax,先检查运算符和标点是不是写错或写串了。
Q2:elif 的顺序有讲究吗?
有,条件是从上往下挨个检查的,顺序错了会拦错人:
score = 95
if score >= 60:
print("及格") # 95 分也会先命中这档!
elif score >= 90:
print("优秀") # 永远轮不到
你会看到 及格。
原因:95 分从第一档开始查,score >= 60 就成立了,直接命中"及格"收工——宽泛的条件排在前面,等于把后面的精确条件全挡在门外。
修复:范围严的条件放前面,成绩档从大到小排(先 >= 90 再 >= 60),让最挑剔的关卡先挑人。
举一反三:折扣先判"超级 VIP"再判"普通会员",年龄分段先判"婴幼儿"再判"成人"——凡"档位式"条件,都是窄的在前、宽的在后。
Q3:写两个 if 和写 if + elif,有什么区别?
score = 95
if score >= 90:
print("优秀")
if score >= 60:
print("及格")
你会看到:
优秀
及格
两行都打印了!因为每个 if 都是独立的关卡,都要挨个检查:95 分两关全过。换成 elif,它们就成了同一关的三条岔路,命中一条立刻收工,只打印 优秀。什么时候用哪套?互斥的档位(成绩档、年龄段)用 elif;各自独立的开关("发及格通知"和"发奖学金通知"可以同时发生)用并列 if。
Q4:可以只有 if,不写 elif 和 else 吗?
可以,而且很常见。没有 else 时条件不成立就静默跳过,程序继续往下走:
score = 95
if score >= 90:
print("优秀!")
print("查分结束") # 不属于 if,永远执行
你会看到:
优秀!
查分结束
什么时候才需要 else?"不中时得有个说法"再写(比如提示补考)。反过来,把"什么都不做"也强行塞进 else 分支,反而画蛇添足。
🎯 什么时候用它
- 登录与权限校验:密码对不对(
==)、是不是 VIP(and/or)、未成年拦截——你每天登录的每个 App,背后都是成串的 if 在把关。 - 业务门槛判断:满 300 减 50(金额比较)、库存为零不能下单、余额不足提示充值——产品需求里写"规则"二字的地方,翻译成代码就是条件判断。
- 游戏与流程分支:血量归零就 Game Over、答对加分继续、答错扣一命——程序的"剧情走向"全靠 if 分岔。
动手改
- 把
score分别改成 59、60、95 跑三遍,观察各走哪条路 - 加一档
elif score >= 80:打印"良好"——想想它为什么要放在>= 90后面 - 写
temp = 37.5,用条件判断打印"发烧"(大于等于 37.3)还是"正常"
下一章:循环,把重复的活全交给电脑 🐸