1 布尔值 —— 程序判断的「开关」
是什么?为什么学?
布尔值(bool)只有两个:True(真)和 False(假)。而条件表达式就是「会算出一个布尔值的式子」——比如 5 > 3 问「5 大于 3 吗?」,算出来是 True。为什么零基础必学?因为 if 判断的「开关」就是布尔值:条件算出 True 就走这条路,算出 False 就走另一条。先把开关认识清楚,if 就只剩套用格式了。
底层原理
比较运算符(> < == != >= <=)的本质是「提问」,Python 算出答案后返回布尔值。两个细节帮助你理解:
- 布尔值在底层是特殊的整数:
True等价于 1,False等价于 0(这也是if 1:能成立的原因,但实际代码不要依赖它)。 - 字符串也能比较(按字母/字典顺序),
"abc" < "abd"是 True——所以判断不限于数字。
生活类比
布尔值像投票按钮:每个按钮只有「赞成(True)」和「反对(False)」两个选项,没有第三种。条件表达式就是「程序在投票」——5 > 3 投了赞成票(True),5 < 3 投了反对票(False)。if 语句则是看票结果决定走哪扇门。
注意事项总结
1 条件表达式算出来是布尔值:
print(10 > 5) # True:10 大于 5 成立
print(10 < 5) # False:10 小于 5 不成立
print(10 == 10) # True:相等判断成立
print(10 != 10) # False:不相等判断不成立
print("abc" == "abc") # True:字符串也可以比较
运行结果:
True
False
True
False
True
2 把比较结果存进变量:
age = 18
is_adult = age >= 18 # 先把「是否成年」的结果存起来
print(is_adult) # True
变量不仅能存数字、文本,也能存布尔值——之后可以直接用 is_adult 做判断,代码更好读。
易错点
- 错误写法:
if age = 18:(一个等号) → 问题:=是赋值不是判断,语法错误 → 正确写法:if age == 18:两个等号。 - 错误写法:
print("18" == 18)以为结果是 True → 问题:字符串和整数永远不相等,结果是 False → 正确写法:先转换:int("18") == 18。 - 错误写法:
is_ok = yes→ 问题:yes不是 Python 认识的词,报NameError→ 正确写法:布尔值只有True/False(首字母大写)。 - 错误写法:
if x == True:判断「x 为真」 → 问题:能运行但啰嗦,且类型转换容易出 bug → 正确写法:直接if x:(x 为真时执行)。
记忆口诀:比较出布尔,True 真 False 假;判断用双等,赋值用单等。
2 if 语句 —— 条件成立才执行
是什么?为什么学?
if 翻译过来是「如果」:条件成立(True),就执行下面缩进的代码;不成立(False),就跳过。为什么零基础必学?因为它是程序「分岔路口」的第一块路牌——没有 if,程序只能一条路走到黑;有了 if,程序才能真正「做决定」。
底层原理
Python 判断「哪些代码属于 if」靠的是缩进(通常 4 个空格或一个 Tab),而不是像 C/Java 那样用花括号 {}。因为 Python 的设计哲学是「可读性优先」——强制缩进让代码结构一眼可见,不会出现「花括号满天飞、结构全靠数括号」的灾难。
语法结构一句话概括:if 条件: 换行后,缩进的代码是 if 的领地(成立才执行),没缩进的代码不受影响(总会执行)。小结三点:① 条件后面必须有冒号 :;② 缩进的代码是一整块,要执行一起执行、要跳过一起跳过;③ 冒号和缩进缺一不可,否则报 SyntaxError / IndentationError。
生活类比
if 像门禁刷卡:刷卡成功(条件为 True),门打开、你走进去(缩进的代码执行);刷卡失败(条件为 False),门不开,你站在门口——但没刷卡的人(没缩进的代码)不受影响,照常在大厅走动。
注意事项总结
1 if 的结构演示:
score = 60
if score >= 60: # 条件 + 冒号
print("条件成立,缩进代码执行") # 缩进代码 1:属于 if
print("缩进的代码 2") # 缩进代码 2:同样属于 if
print("没缩进的代码:每次都会执行") # 没缩进:不受 if 控制
运行结果:
条件成立,缩进代码执行
缩进的代码 2
没缩进的代码:每次都会执行
缩进相同 = 同属一块,这是 Python 代码块的铁律。
2 条件为假时缩进代码被跳过:
score = 50
if score >= 60:
print("及格了!") # 不会执行
print("这句话每次都执行") # 没有缩进,不受 if 控制
运行结果:
这句话每次都执行
同样的代码只是分数不同,行为就不同——这就是「条件判断」。
易错点
- 错误写法:
if score >= 60(忘写冒号) → 问题:报SyntaxError: invalid syntax→ 正确写法:if score >= 60:冒号必带。 - 错误写法:if 下面顶格写
print("及格了")(忘缩进) → 问题:报IndentationError: expected an indented block→ 正确写法:if 的下一行先缩进(4 个空格或一个 Tab)。 - 错误写法:缩进混用 Tab 和空格 → 问题:看着对齐,Python 报
IndentationError: unexpected indent→ 正确写法:全项目统一用 4 个空格(VS Code 默认配置即可)。 - 错误写法:把「总会执行的代码」也缩进了 → 问题:它被误判成 if 的一部分,条件为假时不会执行 → 正确写法:先想清楚——只有「条件成立才该执行的」才缩进。
记忆口诀:if 后面带冒号,缩进代码归它管;条件为真才执行,为假整块靠边站。
3 if / else —— 二选一
是什么?为什么学?
else 翻译过来是「否则」:if 的条件不成立时,执行 else 下面的代码。if / else 组合就是「二选一」——生活中的及格/不及格、通过/未通过、白天/黑夜,全是二选一。为什么必学?因为它是条件判断的基本盘,把「是/否」两类情况都照顾到,程序才不会「漏掉另一半」。
底层原理
if / else 是一对「互补块」:条件为 True 走 if 块,为 False 走 else 块——两者必走其一,且只走一个。注意 else 后面不写条件、直接跟冒号(else:),因为它的条件就是「if 的条件不成立」,Python 已经知道了。else 要和 if 对齐缩进,表示它们是「同一层」的两个分支。
生活类比
if / else 像宿舍门禁的两种结果:刷卡成功(if 条件 True)→「欢迎回家」;刷卡失败(else)→「请重新刷卡」。门禁系统只会二选一,不会两个都播报,也不会都不播报。
注意事项总结
1 二选一:
score = 50
if score >= 60:
print("及格了!")
else:
print("没及格,继续加油!")
运行结果:
没及格,继续加油!
注意 else 和 if 顶格对齐,且 else 后面直接冒号、没有条件。
2 判断奇偶:
num = 7
if num % 2 == 0:
print(num, "是偶数")
else:
print(num, "是奇数")
运行结果:
7 是奇数
num % 2 是 7 ÷ 2 的余数 1,1 == 0 是 False,所以走 else——余数只有 0(偶数)和 1(奇数)两种可能,是「二选一」的经典应用。
易错点
- 错误写法:
else (score < 60):→ 问题:else 后面不能写条件,报语法错误 → 正确写法:else:直接冒号。 - 错误写法:else 和 if 缩进不一致 → 问题:Python 找不到 else 对应的 if,报
IndentationError/SyntaxError→ 正确写法:else 与 if 严格对齐。 - 错误写法:else 后面忘写冒号
else→ 问题:报SyntaxError: invalid syntax→ 正确写法:else:。 - 错误写法:把 else 也缩进到 if 块里面 → 问题:变成「if 成立才检查 else」,逻辑完全变味 → 正确写法:else 与 if 平级对齐。
记忆口诀:if 不行 else 上,两者只走一条道;else 后面没条件,顶格对齐别忘了。
4 if / elif / else —— 多选一与条件的顺序
是什么?为什么学?
事情不止两种结果怎么办?比如成绩要分「优秀、良好、及格、不及格」四档。这时用 elif(是 “else if” 的缩写,翻译过来是「否则如果」):if 开头,中间若干个 elif,最后可选 else 兜底。为什么必学?因为真实业务全是多档判断——成绩分档、会员分级、天气分类,没 elif 就得写一坨嵌套 if,又乱又容易错。
底层原理
程序会从上到下逐个检查条件:哪个条件先成立,就执行哪段代码,后面的条件一律不再看(这叫作「短路」,第一个命中的就赢了)。所以条件顺序极其重要:把最严格(最难满足)的条件放前面,否则会被前面的宽条件「截胡」。最后一个 else 兜底所有没被命中的情况,可写可不写,但写上更稳。
生活类比
elif 链像成绩发榜时的排名宣读:从第一名(最严格)开始念:「90 分以上——优秀;80 分以上——良好;60 分以上——及格;其余——不及格」。念到你名字的那一刻(第一个命中的条件),后面的名单就不再念了——你不会同时是「优秀」又是「良好」。
注意事项总结
1 多档判断(条件从高到低写):
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
运行结果:
良好
程序从上往下问:85 ≥ 90?否 → 85 ≥ 80?是 → 输出「良好」,后面的 elif/else 不再看。
2 条件顺序很重要(经典陷阱):
score = 95
if score >= 60:
print("及格") # 95 >= 60 先成立,直接输出这句
elif score >= 90:
print("优秀") # 这行永远不会执行!
运行结果:
及格
95 ≥ 60 第一个就成立,后面的「优秀」分支永远轮不到——这就是「截胡」。写多分支时,条件顺序必须精心设计:从最严格到最宽松。(「分数区间」这类有重叠的条件顺序才至关重要;像「晴天/下雨/下雪」这种互斥条件,顺序就不敏感。)
易错点
- 错误写法:
elif score >= 80:写成elif:(忘写条件) → 问题:elif 必须带条件,报SyntaxError→ 正确写法:elif 条件:。 - 错误写法:条件顺序颠倒(先 ≥60 再 ≥90) → 问题:优秀被「及格」截胡,永远出不来 → 正确写法:从严格到宽松:≥90 → ≥80 → ≥60 → else。
- 错误写法:elif 与 if 缩进不对齐 → 问题:结构错乱,报语法错误 → 正确写法:所有 elif、else 与 if 顶格对齐。
- 错误写法:漏掉边界(如没写
>= 60的>=,写成> 60) → 问题:正好 60 分的人落空 → 正确写法:想清楚边界归属,>= 60包含 60 分。
记忆口诀:多分支用 elif,从上到下逐个问;先中先走后面看,严格条件排前面。
5 逻辑组合与嵌套 —— 让判断更有层次
是什么?为什么学?
逻辑组合是用 and / or / not 把多个条件合成一个;嵌套是 if 里面再放一个 if,处理「先过第一关、再看第二关」的流程。为什么零基础必学?因为现实条件从来不是单一维度的——「成年且及格」「VIP 或满 100」「不下雨才出门」;而嵌套是分步判断的自然表达。两者结合,程序才能应对真实世界。
底层原理
三个关键原理:
- and:两边都真才真,只要左边是 False,右边根本不执行(短路求值)。
- or:一边真就真,只要左边是 True,右边根本不执行。
- 优先级:
not>and>or,拿不准就加括号。 - 嵌套:内层 if 缩进在外层 if 的块里,外层条件不成立时,内层整个不参与。嵌套让代码变「深」,超过两层建议改用 and / or 展平,更平更好读。
生活类比
逻辑组合像购物平台的免运费规则:「VIP 或 实付满 100 元免运费」——满足任意一个就免(or);「生鲜 并且 当天送达才保鲜」——缺一个都不行(and);「不下雨才办露天活动」——天气取反(not)。嵌套像机场安检:先查证件(外层 if),过了才查行李(内层 if),第一关没过,第二关根本没机会。
注意事项总结
1 and —— 两边都得成立:
age = 20
score = 88
if age >= 18 and score >= 60:
print("成年且及格,可以毕业")
运行结果:
成年且及格,可以毕业
只要有一边不成立,整体就是 False——把 age 改成 16 试试,什么都不会输出。
2 or —— 一边成立就行:
is_vip = True
amount = 30
if is_vip or amount >= 100:
print("免运费")
运行结果:
免运费
把 is_vip 改成 False、amount 保持 30,条件就变成 False,不会输出。
3 not —— 取反:
is_raining = False
if not is_raining:
print("没下雨,可以出门")
运行结果:
没下雨,可以出门
not is_raining 把 False 取反成 True。翻译成大白话就是「如果不(在下雨)→ 出门」。
4 嵌套 —— 先过第一关,再看第二关:
has_ticket = True
seat = "靠窗"
if has_ticket:
print("检票通过")
if seat == "靠窗":
print("可以看风景")
else:
print("普通座位")
运行结果:
检票通过
可以看风景
外层成立,先输出「检票通过」;接着进入内层 if 判断座位。把 has_ticket 改成 False,内外层都不会执行。
5 嵌套登录 + 用 and 展平:
username = "admin"
password = "123456"
if username == "admin":
if password == "123456":
print("登录成功")
else:
print("密码错误")
else:
print("用户名不存在")
运行结果:
登录成功
两个条件是「且」的关系,可以直接展平写成 if username == "admin" and password == "123456": 一层搞定。能平就不深,是判断代码的审美标准。
易错点
- 错误写法:
if a > 5 or b < 10 and c == 1:(混用不括号) → 问题:and比or优先,实际含义和你以为的可能不同 → 正确写法:if (a > 5) or ((b < 10) and (c == 1)):加括号明确。 - 错误写法:嵌套三层以上还硬写 → 问题:缩进越来越深,代码绕成迷宫 → 正确写法:用 and / or 展平,或拆成多个 if(Day 9 学函数后可进一步封装)。
- 错误写法:内层 if 与外层 if 缩进同级 → 问题:不再是嵌套,变成了「两个独立的 if」,逻辑变味 → 正确写法:内层比外层多缩进一层。
- 错误写法:
if is_raining == False:→ 问题:能运行但绕 → 正确写法:if not is_raining:更直白。
记忆口诀:and 全真 or 一真,not 取反记得清;嵌套别超两层,逻辑组合更省心。
6 动手实践:成绩等级评定器
写一个程序:输入一个 0~100 的分数,输出对应的等级。等级规则:
- 90 及以上:优秀
- 80~89:良好
- 70~79:中等
- 60~69:及格
- 60 以下:不及格
- 输入不在 0~100 时提示「分数不合法」
# 成绩等级评定器
score = int(input("请输入成绩(0~100):"))
if score < 0 or score > 100:
print("分数不合法,请输入 0~100 之间的数字")
elif score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 70:
print("中等")
elif score >= 60:
print("及格")
else:
print("不及格")
试着输入 95、82、76、60、58、-5 运行看看效果——注意 score < 0 or score > 100 用了 or 组合条件处理非法输入,而分数区间用了从高到低的 elif 顺序,两处都是今天学的重点。
今日总结
布尔值只有 True / False;条件表达式会算出一个布尔值
== 判断相等,= 是赋值,两者不能混用
if 条件成立才执行缩进代码;冒号和缩进缺一不可
else 处理「否则」的情况;else 不写条件、与 if 顶格对齐
elif 多分支时,把最严格的条件放前面,防止被截胡
and / or / not 可以组合多个条件;not > and > or,拿不准加括号
嵌套判断适合「先过第一关再看第二关」;超过两层用 and / or 展平
完成「成绩等级评定器」并验证边界输入(0、60、90、100、-5)
| 报错 | 原因 | 修复 |
|---|---|---|
IndentationError: expected an indented block | if 下面忘了缩进 | if 下一行按 Tab 或 4 个空格再写代码 |
SyntaxError: invalid syntax | if 条件后面忘了写冒号 : | 检查是不是 if x > 5: 少了冒号 |
SyntaxError: cannot assign to literal | 把 == 写成了 = | 判断相等用 ==,= 只用于赋值 |
IndentationError: unexpected indent | 某行多缩进了,Python 判断不出来历 | 检查每行缩进是否一致(要么全 Tab,要么全空格) |
TypeError: '>' not supported between instances of 'str' and 'int' | 拿字符串和数字比较 | 先用 int() / float() 把输入转成数字 |