2.2 做出判断的分支
知识点
1.为什么需要分支
顺序结构只能"一条道走到黑",但现实中大量问题需要"根据情况选择做法":
- 成绩 60 分以上算及格,否则不及格;
- 密码正确才允许登录;
- 闰年 2 月 29 天,平年 28 天。
选择结构(分支结构):程序根据条件是否成立,选择执行不同的语句。
流程图特征:出现菱形(判断框),流程线分叉后再汇合,两个出口分别标"是/否"。
2.条件从哪来:关系运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
> | 大于 | 5 > 3 | True |
< | 小于 | 5 < 3 | False |
>= | 大于等于 | 5 >= 5 | True |
<= | 小于等于 | 5 <= 3 | False |
== | 等于 | 5 == 5 | True |
!= | 不等于 | 5 != 3 | True |
两个铁律:
- 判断相等用
==(两个等号),不是=——=是赋值,写if x = 5:会报 SyntaxError; - 关系运算的结果是
bool类型(True/False),不是数字。
注意:>= 与 <= 的顺序不能颠倒,写成 => 或 =< 都是语法错误。
也可以直接判断字符串(按字符编码逐个比较):
print("abc" == "abc") # True
print("abc" == "ABC") # False(区分大小写)
print("apple" < "banana") # True(按首字母编码比较)
3.复合条件:逻辑运算符
| 运算符 | 含义 | 规则 | 示例 |
|---|---|---|---|
| and | 与 | 全真才真,有一个假即假 | x > 60 and x < 80 |
| or | 或 | 一真即真,全假才假 | x < 0 or x > 100 |
| not | 非 | 取反 | not (x == 0) |
真值表(背下来):
| A | B | A and B | A or B | not A |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
优先级:not → and → or;括号可改变顺序,复杂条件一律加括号。
短路求值(Python 特性,考试偶有):
A and B:A 为假时不再计算 B,直接得假;A or B:A 为真时不再计算 B,直接得真。
实用价值:if n != 0 and 100 / n > 5: —— 若 n == 0,后面的除法不会执行,避免除零错误。注意顺序不能反。
Python 的区间写法(易错):数学里的 60 <= x <= 80 在 Python 里可以写成 60 <= x <= 80,但不能写成 x >= 60 and <= 80(少了左边的变量名会报错)。
4.单分支:if
语法格式:
if 条件:
语句块
两条硬性语法要求:
- 条件后面必须有英文冒号
:; - 语句块必须缩进(一般 4 个空格),缩进相同的连续语句属于同一个语句块。
执行流程:条件为 True → 执行语句块;为 False → 跳过,继续执行后面的语句。
# 2-3 判断是否及格
score = int(input("请输入成绩:"))
if score >= 60:
print("及格")
print("程序结束") # 这句话不属于 if 的语句块,无论及格与否都会执行
缩进的本质:Python 用缩进表示"从属关系",而不是用大括号。缩进错了,逻辑就错了,这是 Python 最独特的语法特点。
5.双分支:if-else
语法格式:
if 条件:
语句块1 # 条件成立时执行
else:
语句块2 # 条件不成立时执行
特点:两条路必走其一,且只走一条。
# 2-4 判断奇偶
n = int(input("请输入一个整数:"))
if n % 2 == 0:
print(n, "是偶数")
else:
print(n, "是奇数")
else 后面不能写条件(else: 后面直接冒号),因为它的含义就是"其他所有情况"。
6.多分支:if-elif-else
语法格式:
if 条件1:
语句块1
elif 条件2:
语句块2
elif 条件3:
语句块3
else:
语句块4 # 可省略
执行流程(关键):自上而下依次判断,一旦某个条件成立,执行对应语句块后立即跳出整个结构,后面的条件不再判断。
# 2-5 成绩等级
score = int(input("请输入成绩:"))
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "E"
print("等级:", grade)
为什么这里不用写 score >= 80 and score < 90:因为能走到 elif score >= 80 这一行,说明前面的 score >= 90 已经不成立,所以 score < 90 是隐含条件。这是 elif 最省事也最容易看不懂的地方。
elif 与"多个独立 if"的区别(高频考点):
| 写法 | 行为 | 结果差异 |
|---|---|---|
| if - elif - else | 互斥,只执行一个分支 | 成绩 95 只输出 A |
| 多个并列 if | 每个 if 都独立判断,可能执行多个 | 若写成 if >=60: D 和 if >=90: A,95 分会同时输出 D 和 A |
结论:分段判断一定用 elif;只有"彼此无关的多件事"才用并列 if。
7.嵌套分支
定义:在 if 的语句块中再写一个 if。
用途:需要先判一层、再判一层的问题,如"先判断是否闰年,再判断月份天数"。
# 2-6 判断闰年(能被 4 整除且不能被 100 整除,或能被 400 整除)
year = int(input("请输入年份:"))
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
print(year, "是闰年")
else:
print(year, "不是闰年")
else:
print(year, "是闰年")
else:
print(year, "不是闰年")
同一问题的更简洁写法(用逻辑运算符合并):
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print(year, "是闰年")
else:
print(year, "不是闰年")
嵌套的要点:每深入一层多缩进 4 个空格;嵌套层次不宜超过 3 层,否则可读性差(可考虑用 elif 或函数拆分)。
8.条件表达式(单行 if,可了解)
# 语法:值1 if 条件 else 值2
result = "及格" if score >= 60 else "不及格"
含义:条件成立取值 1,否则取值 2。只能写简单的二选一,复杂逻辑仍应用 if-else。
9.典型应用题型
| 题型 | 判断条件 | 要点 |
|---|---|---|
| 奇偶判断 | n % 2 == 0 | 偶数成立 |
| 正负判断 | n > 0 / n < 0 / n == 0 | 三分支,注意 0 |
| 绝对值 | x < 0 时取 -x | 双分支,0 归入非负 |
| 成绩等级 | 分段 >=90、>=80… | 用 elif,从高到低写 |
| 分段计费(水费、出租车) | 分段函数 | 用 elif,每段算超出部分 |
| 闰年判断 | (y%4==0 and y%100!=0) or y%400==0 | 注意 1900 不是闰年、2000 是 |
| 三角形能否构成 | a+b>c and a+c>b and b+c>a | 三边关系,三个条件同时成立 |
| 最大值(三数) | 两两比较 | 可嵌套,也可用 max() |
| 登录验证 | user == "admin" and pwd == "123456" | 用 and 连接 |
| 字符类别判断 | 比较 ASCII 范围或 isalpha()/isdigit() | 见 3.1 字符编码 |
分段计费示例(出租车:3 km 内 10 元,超出部分每公里 2 元):
km = float(input("行驶里程(km):"))
if km <= 3:
fee = 10
else:
fee = 10 + (km - 3) * 2
print(f"车费 {fee:.2f} 元")
10.易错点清单(考试最爱设的坑)
| 序号 | 错误写法 | 问题 | 正确写法 |
|---|---|---|---|
| 1 | if x = 5: | = 是赋值 | if x == 5: |
| 2 | if x > 5 (无冒号) | 缺冒号,SyntaxError | if x > 5: |
| 3 | if x > 5: 后不缩进 | IndentationError | 语句块缩进 4 空格 |
| 4 | 用中文冒号 : | SyntaxError | 用英文冒号 : |
| 5 | if 60 <= x <= 80 写成 if x >= 60 and <= 80 | 缺变量名 | if 60 <= x <= 80 |
| 6 | 分段判断用多个并列 if | 可能重复输出 | 用 elif |
| 7 | 浮点数直接 == 比较 | 0.1+0.2 == 0.3 为 False | 用 abs(a-b) < 1e-9 |
| 8 | else if | Python 没有这个写法 | elif |
| 9 | 缩进混用 Tab 与空格 | IndentationError | 统一 4 空格 |
| 10 | if score >= 90: 写在 elif score >= 80: 之后 | 顺序错,90 分被判成 B | 条件从严到宽、从高到低排 |
第 10 条要特别强调:多分支的书写顺序决定结果,必须从最严格的条件开始。
11.速查表
| 序号 | 考点 | 结论 |
|---|---|---|
| 1 | 选择结构的流程图符号 | 菱形(判断框),两个出口 |
| 2 | 判断相等 | ==(= 是赋值) |
| 3 | 关系运算结果 | bool(True/False) |
| 4 | and | 全真才真 |
| 5 | or | 一真即真 |
| 6 | not | 取反 |
| 7 | 逻辑优先级 | not → and → or |
| 8 | 短路求值 | and 左假即停;or 左真即停 |
| 9 | 单分支语法 | if 条件: + 缩进语句块 |
| 10 | 双分支 | if … else …,必走其一 |
| 11 | 多分支 | if … elif … elif … else …,互斥只走一个 |
| 12 | elif 的条件可省一半 | 前面的条件已不成立,是隐含条件 |
| 13 | 分段判断必须用 | elif(不是并列 if) |
| 14 | 多分支书写顺序 | 从严到宽、从高到低 |
| 15 | 缩进 | 4 个空格,同缩进属同一语句块 |
| 16 | 闰年条件 | (y%4==0 and y%100!=0) or y%400==0 |
| 17 | 三角形条件 | 任意两边之和大于第三边(三条件 and) |
| 18 | 条件表达式 | A if 条件 else B |
| 19 | 浮点比较 | 不用 ==,用差值小于 1e-9 |
| 20 | 冒号 | 必须是英文冒号 |
12.课堂提示(讲课参考)
- 先画流程图再写代码:成绩等级题让学生先画菱形链,再逐行翻译,
elif的"隐含条件"就自然懂了。 - 现场演示"并列 if"的坑:把
elif全改成if,输入 95 会输出一串等级,学生一下就记住"互斥"这个词。 - 缩进用"俄罗斯套娃"比喻:每进一层多缩 4 格,出层就退回来。
- 闰年题连问三年:1900(不是)、2000(是)、2024(是)——把
%100与%400两个例外讲透。 - 中文冒号现场制造一次错误,并在投影上放大
SyntaxError提示,让学生学会读报错。