📄 一句话概括
if 是流程图里那个菱形落到代码上的样子:条件成立走这条、不成立走那条——三元运算符则是它压缩到一行的速写,专治【二选一取个值】的小场面。
📝 本节和前面几节的关系
4-1 画了菱形,这一篇写菱形的代码。回收 3-5 的比较运算符(菱形里写的条件全是它)和 3-2 的逻辑运算(多个条件用 and/or 捆起来塞进同一个菱形)。
一、if 与 else:二选一的岔路
score = 75
if score >= 60:
print("及格") # 条件为 True 才执行
else:
print("不及格")
执行逻辑与流程图严格对应:条件为真走 if 体、为假走 else 体,两条路最后汇合。多级岔路用 elif(C/Java 写 else if)串成【多选一】:
if score >= 90:
grade = "优"
elif score >= 80:
grade = "良"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
从上往下依次问,命中即走、后面的全跳过——所以 90 分不会同时被判成【良】。
二、写条件的两条铁律
- 分支要【不重叠、不遗漏】:上面的链式判断把 60~80、80~90 挡板逐级收紧;如果乱写
if score >= 60放最前,90 分也只会得【及格】——顺序即逻辑; - 复合条件用逻辑运算捆:
if 18 <= age <= 65 and has_ticket:一个菱形问完两件事(区间写法连表示【并且】的 and 都省了)。
三、三元运算符:一行速写
只是【二选一取值】时,整套 if-else 太隆重:
status = "及格" if score >= 60 else "不及格" # Python 三元
# C/C++/Java 写法: status = score >= 60 ? "及格" : "不及格";
print(status)
适用边界:只取值(选一个数/一个字符串)用三元;要执行动作(打印、改多个变量)老老实实写 if-else——压缩可读性换来的紧凑,过头就是天书。
四、动手 Demo:多级岔路与三元速写
score = 75
if score >= 90:
grade = "优"
elif score >= 80:
grade = "良"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
print(grade) # 及格
status = "及格" if score >= 60 else "不及格"
print(status) # 及格
age, has_ticket = 20, False
print("可入场" if age >= 18 and has_ticket else "不可入场") # 不可入场
看到什么算成功:及格、及格、不可入场。
读结果:75 落进第三个分支(前两个条件 75 不够、第三个够)——elif 是逐级放行;最后一行演示【两个条件用一个菱形问】:年龄够但没票,and 一票否决。
五、30 秒实验
把上面 score = 75 改成 100 再跑:grade 仍是【优】——再改成 60:得【及格】而不是【不及格】。边界值 60/80/90 每个都试一遍是分支代码的体检套餐(边界错位是分支 bug 的最大来源)。
六、常见误区
- 【用三个独立 if 代替 elif 链没问题】——错。独立 if 会逐个判断、可能连续命中(打两个标签);elif 命中即停。多选一必须 elif。
- 【三元运算符能让代码更高级】——错。三元是【二选一取值】的专用工具;嵌套两层的
a if x else (b if y else c)读起来比 if-else 费劲一倍。 - 【条件里的
=和==差别不大】——致命错。回收 3-5:赋值与比较两副面孔,C 家族里if (x = 0)编译通过、逻辑全毁。
自测三问(点开对答案)
1. **if/elif/else 链的执行顺序?** 答:从上往下逐个判断,命中即执行并跳过其余——所以条件顺序本身就是逻辑的一部分。 2. **什么时候适合三元运算符?** 答:在两个候选值里二选一【赋值】的场景;涉及多个动作或条件复杂时用完整 if-else 更可读。 3. **成绩判断若把 if score >= 60 放到 elif 链最前面会怎样?** 答:90 分也命中它直接得【及格】——后面的分支永远轮不到;挡板条件必须从高到低排。- ☐ 下一节(4-3 循环)
相关笔记
- 流程图 —— 菱形的图纸形态
- C++ 4.2 · 判断语句 —— 同一套逻辑在 C++ 的语法
- 树莓派 6-4 · Python 流程控制 —— Python 分支的更多细节
- ⌨️ 编程原理 · 索引 —— 全课路线图