学径 LearnPath

CAICP-E · Python 编程基础

先过这关,再过那关

选择里面再做选择。

讲解模式

这一节要学会什么

#what

上一课会把两个条件用 and 拼在一行。有时这样太短。 失败了,不知道是哪一关没过。

if 写在 if 里面。 这叫 嵌套

外层先问第一关。过了,再问第二关。 缩进 再往右一层。 里面要比外面多空 4 格,一共 8 格。

你还会比较:什么时候用嵌套,什么时候用 elif。

这一课还不学 for。先把两层门走熟。

先进大门,再选教室

#hook

到学校先看大门开不开。开了,再问去哪个教室。 门没开,后面的选择都不用问。

进科技馆也一样。先问年龄够不够。 够了,再问票带了没有。

复杂事情要拆开问。一关一关过。

嵌套的路口

如果觉得有点难 先在纸上画两层箭头。 外层一个问题,内层一个问题。 再翻译成 if。

如果已经会了 写校门两道关。 年龄不够说年龄。 没票说补票。

if 里面再写 if

#explore-nest

先过校门,再问里面的事。

看这段代码:

python
age = 12
has_ticket = True

if age >= 6:
    if has_ticket:
        print("可以进馆")
    else:
        print("请先买票")
else:
    print("年龄不够")

外层先问年龄。够了,再问有没有票。 不够,直接说年龄不够。不会再问票。

外校门问年龄,里窗口问票

缩进变成两层。外层的句子空 4 格。 内层的句子再空 4 格,一共 8 格。还是每次加 4 个空格。

读的时候从外往里。先看大门,再看小门。

has_ticket = False 时呢?年龄够,进入内层。 没有票,走内层的 else。打印:请先买票

第一关没过,走不到第二关。

第一关没过就走不到第二关

什么时候嵌套,什么时候 elif

#explore-vs

elif 适合:同一件事的几条路。分数是优秀、及格,还是加油。 灯是绿、黄,还是红。问的是同一类问题,答案互相排斥。

嵌套适合:过了这关,才需要问下一关。大门开了,才问教室。 年龄够了,才问票。第一关失败,第二关根本不用问。

也可以把条件写成一行:

python
if age >= 6 and has_ticket:
    print("可以进馆")

这样短。但失败时,不知道是年龄还是票。

嵌套的好处是: 能给出更准的提示。年龄不够说年龄。 没票说买票。

所以: 条件简单、只关心过没过,用 and。要分清是哪一关失败,用嵌套。 同一问题的几档答案,用 elif

内层的 else 跟谁?看缩进。 它跟最近的、对齐的那个 if

python
if age >= 6:
    if has_ticket:
        print("可以进馆")
    else:
        print("请先买票")

内层 else 和内层 if 在同一列。所以它回答的是:有没有票。 不是回答年龄。

小项目:成绩房间和校门

#explore-rooms

先过及格线。及格以后,再看是不是优秀。

python
score = 92
if score >= 60:
    print("及格了")
    if score >= 90:
        print("还是优秀")
    else:
        print("继续保持")
else:
    print("还要加油")

92 会打印两行: 及格了 还是优秀

这回本来就要说两句。先说有没有及格,再说够不够优秀。 和第 9 课三档只走一条不是同一种。

把 92 改成 70。只打印:及格了,继续保持 因为进了外屋,没进里屋的优秀房。

外屋及格,里屋优秀

再写校门两道关。

python
age = 12
has_ticket = False
if age >= 6:
    if has_ticket:
        print("请进")
    else:
        print("补票")
else:
    print("年龄不够")

12 岁够了,进入第二关。没票,打印:补票

两层、三层刚刚好。套到四五层,眼睛会晕。 每层只问一件事。写完用手指描一遍缩进。 同一层必须对齐。

这节课我学会了

#review

记住这些:

  1. 嵌套就是选择里再选择。
  2. 先问外层,成立再问内层。
  3. 内层再空 4 格,一共 8 格。
  4. 同一问题的几档,用 elif。过关再问下一关,用嵌套。
  5. else 跟着最近的、对齐的 if

试着在心里跑一遍:

python
age = 12
has_ticket = False
if age >= 6:
    if has_ticket:
        print("请进")
    else:
        print("补票")

年龄够,进入内层。没票,打印:补票

下一课才把重复交给电脑。先让两层门各管各的。

试一试

#evaluate

看完就来检查一下。选错了也可以再想。

单选题

嵌套会打印什么

age = 12,has_ticket = False。外层 if age >= 6,内层 if has_ticket 打印进馆,否则打印买票。结果是?

单选题

谁先问

嵌套分支时,一般应该怎样读代码?

单选题

什么时候用 elif

成绩分成优秀、及格、加油三档,更适合哪种写法?

多选题

关于嵌套分支

下列说法正确的有哪些?可以多选。

可多选

未登录时不会保存学习进度