⌨️ 第四章 流程图与算法
📄 一句话概括

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 分不会同时被判成【良】。

二、写条件的两条铁律

  1. 分支要【不重叠、不遗漏】:上面的链式判断把 60~80、80~90 挡板逐级收紧;如果乱写 if score >= 60 放最前,90 分也只会得【及格】——顺序即逻辑;
  2. 复合条件用逻辑运算捆: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 的最大来源)。

六、常见误区

  1. 【用三个独立 if 代替 elif 链没问题】——错。独立 if 会逐个判断、可能连续命中(打两个标签);elif 命中即停。多选一必须 elif。
  2. 【三元运算符能让代码更高级】——错。三元是【二选一取值】的专用工具;嵌套两层的 a if x else (b if y else c) 读起来比 if-else 费劲一倍。
  3. 【条件里的 = 和 == 差别不大】——致命错。回收 3-5:赋值与比较两副面孔,C 家族里 if (x = 0) 编译通过、逻辑全毁。
自测三问(点开对答案) 1. **if/elif/else 链的执行顺序?** 答:从上往下逐个判断,命中即执行并跳过其余——所以条件顺序本身就是逻辑的一部分。 2. **什么时候适合三元运算符?** 答:在两个候选值里二选一【赋值】的场景;涉及多个动作或条件复杂时用完整 if-else 更可读。 3. **成绩判断若把 if score >= 60 放到 elif 链最前面会怎样?** 答:90 分也命中它直接得【及格】——后面的分支永远轮不到;挡板条件必须从高到低排。

相关笔记