| Day 4 | 条件判断:布尔值与 if / elif / else |

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:(混用不括号) → 问题:andor 优先,实际含义和你以为的可能不同 → 正确写法: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 blockif 下面忘了缩进if 下一行按 Tab 或 4 个空格再写代码
SyntaxError: invalid syntaxif 条件后面忘了写冒号 :检查是不是 if x > 5: 少了冒号
SyntaxError: cannot assign to literal== 写成了 =判断相等用 === 只用于赋值
IndentationError: unexpected indent某行多缩进了,Python 判断不出来历检查每行缩进是否一致(要么全 Tab,要么全空格)
TypeError: '>' not supported between instances of 'str' and 'int'拿字符串和数字比较先用 int() / float() 把输入转成数字
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇