CC++ & Algorithm

Python分支语句嵌套

困难2
语言版本:C++Python
概述:把if、if-else或match-case放到另一个分支里,就像俄罗斯套娃,一层套一层。

分支嵌套:像俄罗斯套娃一样,一层套一层

你有没有玩过俄罗斯套娃?打开一个大娃娃,里面还藏着一个小娃娃,再打开小娃娃,里面还有一个更小的……在Python编程里,有一种叫“分支嵌套”的写法,就跟套娃很像:在一个分支语句(比如 ifif-elsematch-case)的代码块里,再写另一个分支语句。这样就能先判断一个条件,条件成立后再判断另一个条件,一层一层地做决定。

比如,你想判断一个人能不能开车:先看他是不是成年人(≥18岁),如果成年了,再看他有没有驾照。这种“先判断大条件,再判断小条件”的逻辑,用分支嵌套写起来特别清楚。


什么是分支嵌套?

简单说,就是ifelse 的“身体”里,再放一个完整的 if-else。Python 用缩进来区分哪段代码属于哪个分支,嵌套的层次越多,缩进就越多(通常一个缩进是4个空格)。

看一个最经典的例子:检查成年人是否允许开车

age = 20                     # 年龄
has_license = True           # 是否有驾照

if age >= 18:                # 外层if:判断是否成年
    print("你是成年人")
    if has_license:          # 内层if:判断是否有驾照
        print("你可以开车")
    else:
        print("你不能开车,因为没有驾照")
else:                        # 外层else:未成年人
    print("未成年人不能开车")

运行这段代码,会输出:

你是成年人
你可以开车

如果 has_license = False,输出就是:

你是成年人
你不能开车,因为没有驾照

注意:内层的 if-else 缩进了8个空格(两层),这样Python才能知道它属于外层 if 里面的代码块。


为什么要用嵌套?——生活中的例子

你每天穿衣服前,大脑就在做类似的嵌套判断:

例1:今天出门穿什么?

  1. 先判断“天气是否下雨”:
    • 如果下雨,再判断“气温是否低于15度”:
      • 低于15度 → 穿厚外套 + 雨伞
      • 不低于15度 → 穿薄外套 + 雨伞
    • 如果不下雨,再判断“气温是否高于30度”:
      • 高于30度 → 穿短袖
      • 不高于30度 → 穿长袖

写成代码就是:

is_rainy = True          # 是否下雨
temperature = 20         # 温度(摄氏度)

if is_rainy:             # 外层:下雨了
    print("带伞出门")
    if temperature < 15: # 内层:温度低于15度?
        print("穿厚外套")
    else:
        print("穿薄外套")
else:                    # 外层:没下雨
    if temperature > 30: # 内层:温度高于30度?
        print("穿短袖")
    else:
        print("穿长袖")

例2:考试后决定奖励 老师要发奖励:总分大于90分,再根据平时表现决定奖励大小。

score = 95               # 考试成绩
good_behavior = True     # 平时表现是否优秀

if score > 90:           # 外层:总分超过90
    print("你考得很好!")
    if good_behavior:    # 内层:平时表现优秀吗?
        print("奖励你一个游戏机")
    else:
        print("奖励你一个笔记本")
else:
    print("继续努力,下次争取考高分")

嵌套的好处是:一个决定必须依赖前一个决定,就像排队买东西——先排到队伍(外层条件满足),才能看自己钱包里够不够钱(内层条件)。


多层嵌套:套娃可以套很多层

嵌套不只有两层,可以有很多层,但一般建议不超过三层,否则代码会像迷宫一样难懂。来看一个三层嵌套的例子:判断一个数字属于什么类别。

num = 15                     # 要判断的数字

if num > 0:                  # 第一层:正数?
    print("正数")
    if num % 2 == 0:         # 第二层:偶数?
        print("偶数")
    else:
        print("奇数")
    if num > 10:             # 第二层:大于10?
        print("大于10")
else:
    print("非正数")

num=15 时,输出:

正数
奇数
大于10

注意:第二层里面又可以再写 if(比如判断是否大于10),但要注意缩进不能乱。如果你觉得三层以上很乱,可以用 逻辑运算符 andor 把多个条件合并,这样就不需要嵌套了。比如上面的例子可以写成:

if num > 0 and num % 2 == 0:
    print("正偶数")

但有时候嵌套更符合“先判断大条件,再判断小条件”的思维顺序。


嵌套还可以用 match-case(Python 3.10+)

除了 ifmatch-case 也可以嵌套。比如:

day = "周五"                 # 今天是周几
weather = "晴"               # 天气

match day:                   # 外层:匹配星期
    case "周六" | "周日":    # 如果是周末
        print("今天休息")
        match weather:       # 内层:匹配天气
            case "晴":
                print("去公园玩")
            case "雨":
                print("在家看电影")
    case "周五":             # 如果是周五
        print("明天就周末了")
    case _:                  # 其他工作日
        print("上学去")

注意:内层的 match-case 也要缩进正确。


⚠️ 新手最容易犯的错误

  1. 缩进错误:Python靠缩进识别代码块。如果内层 if 少缩进或多缩进,程序会报错或逻辑出错。

    • 正确:内层 if 比外层 if 多缩进4个空格。
    • 错误示例:
      if age >= 18:
          print("成年")
      if has_license:   # 这行少缩进了!变成了外层的一个新if,不是嵌套
          print("有驾照")
      
  2. 忘记写 else:嵌套时你可能只写了 if,忘了处理“不满足”的情况。比如:

    if score > 90:
        if good_behavior:
            print("大奖")
        # 这里没有else,如果good_behavior为False,什么也不输出,可能不符合预期
    
  3. 逻辑颠倒:把内外条件写反了。比如想先判断“有驾照”,再判断“是否成年”,但代码写成了先判断成年再判断驾照,结果未成年人连驾照都没机会判断。

  4. 嵌套层次太深:三层以上读起来很费劲,容易在缩进时数错空格。遇到这种情况,建议用函数或逻辑运算符简化。


完整可运行示例:根据成绩和出勤决定周末安排

小明妈妈规定:如果期中考试分数超过85分,并且本学期出勤率超过90%,就可以去游乐场;如果分数超过85分但出勤率不够,可以去看电影;否则留在家里写作业。

用嵌套写:

score = 88                   # 考试成绩
attendance_rate = 0.95       # 出勤率(0到1之间)

if score > 85:               # 外层:分数超过85
    print("你的成绩达到了标准")
    if attendance_rate > 0.9:  # 内层:出勤率超过90%
        print("奖励:去游乐场玩一天!")
    else:
        print("奖励:看一场电影")
else:                        # 外层不满足
    print("分数不够,不能出去玩")
    if attendance_rate > 0.9:  # 内层:虽然分数不够,但出勤好可以鼓励
        print("但出勤很好,允许周末多玩半小时游戏")
    else:
        print("周末在家写作业")

运行结果(score=88, attendance=0.95):

你的成绩达到了标准
奖励:去游乐场玩一天!

相关知识点指引

  • 基础分支:如果你还不熟悉 if-elsematch-case,先去看看《Python里的if-else:让程序会做选择题》和《match-case:像选择题一样匹配值》这两篇文章。
  • 逻辑运算符:用 andornot 可以把多个条件合并,有时候能避免深层嵌套。比如上面例子可以写成:if score>85 and attendance_rate>0.9: ...
  • 循环嵌套:除了分支嵌套,循环(forwhile)也可以嵌套。学会了分支嵌套,再学循环嵌套会更容易理解“里面再套一层”的结构。

分支嵌套就像给你的程序加上了“多层次思考”的能力,让你能写出更聪明的代码。记住:一层一层来,缩进别马虎;超过三层就考虑简化,别把自己绕晕了。快去试试吧!

例题精讲

1单选题

以下Python代码运行后,输出结果是? x = 3 if x > 0: if x > 5: print("大于5") else: print("不大于5") else: print("非正数")

A大于5
B不大于5
C非正数
D无输出
2单选题

在Python中,关于if...elif...else嵌套,下列说法正确的是?

Aelif可以单独使用,不需要前面的if
B每个if都可以有多个else
C内层if必须与外层if有相同的缩进
D嵌套if可以包含多个elif
3判断题

在Python中,嵌套if语句中的else总是和它最近的未配对的if匹配。

4判断题

在使用嵌套if语句时,内层if的代码块必须比外层if多一个缩进层级。

5填空题
请补全以下代码,根据成绩score(整数)输出等级:90及以上优秀,80-89良好,60-79及格,60以下不及格。要求使用嵌套if。
score = 85
if score >= 60:
    if score >= 90:
        grade = "优秀"
    ___ score >= 80:
        grade = "良好"
    else:
        grade = "及格"
else:
    grade = "不及格"
print(grade)