Kodewick
第 8 课,共 31 课目录

if、elif 和 else

第 8 课,共 31 课 · 第 1 部分 · 基础 · 约 20 分钟

到现在为止,程序里每一行每次都会跑。if 能让程序只在条件成立时才跑某几行,这样程序就能看情况办事:天黑了才点灯,油少了才去添。

if 语句

一个 if 有三部分:if 这个词,一个为真或为假的条件(第 7 课),一个冒号。下面缩进的几行是它的代码块。条件为真,代码块才会跑;跑完接着往下走。

main.py
1oil = 22if oil < 3:3    print("油不多了。")4    print("Wick 去商店买油。")5print("检查完了。")
输出
油不多了。
Wick 去商店买油。
检查完了。

把 oil 改成 5 再运行:缩进的两行跳过了,但「检查完了。」还会显示,因为它没有缩进。

缩进很重要

Python 靠缩进,也就是行首的空格,来看哪几行属于这个 if。别的语言用花括号 { } 做这件事,Python 只看空格。一般缩进 4 个空格,同一个代码块里的每一行都要对齐。

main.py
1oil = 22if oil < 3:3print("油不多了。")
输出
  File "main.py", line 3
    print("油不多了。")
IndentationError: expected an indented block after 'if' statement on line 2

发生了什么: 缩进不对:该空格的地方没空,或者多空了。

IndentationError 的意思是:冒号后面应该有一段缩进的代码块,可是没找到。行首空格多了或少了,也会报同一类错。

小技巧: 在编辑器里按 Tab,会打出 4 个空格。要是自己敲空格,同一个代码块的每一行要保持一样深。

else:另一种情况

else 告诉程序条件不成立时做什么。两个代码块正好跑一个,不会两个都跑。

main.py
1age = int(input("你几岁了?"))2if age >= 18:3    print("你可以在镇上租房子了。")4else:5    print(f"再过 {18 - age} 年再来吧。")
输出
你几岁了?17
再过 1 年再来吧。

else 后面没有条件,它和自己的 if 对齐。

elif:不止两种选择

情况有好几种时,加上 elif(else if 的缩写)。Python 从上往下检查条件,跑第一个为真的那个。后面的都跳过,就算它们也为真。

main.py
1oil = 62if oil == 0:3    print("空了!马上加油。")4elif oil < 5:5    print("快用完了。")6elif oil < 10:7    print("还有一半左右。")8else:9    print("满的。")
输出
还有一半左右。
先猜一猜

这段代码会显示什么?

1score = 952if score >= 50:3    print("及格")4elif score >= 90:5    print("优秀")6else:7    print("再试一次")

组合条件

条件可以是任何返回 True 或 False 的表达式,包括 and、or、not、连写比较和 in。

main.py
1hour = 222is_raining = False3if hour >= 18 and not is_raining:4    print("今晚适合散步。")5if 6 <= hour < 18:6    print("白天")7if "灯" in "路灯":8    print("找到了「灯」。")
输出
今晚适合散步。
找到了「灯」。

这是三个独立的 if,每个都会单独检查。这和 elif 不一样:elif 里只会跑一个分支。

在 if 里用真值

第 7 课讲过,空字符串和零算假。if 正好用得上,可以直接判断一个值:if name: 的意思是「如果 name 不是空的」。

main.py
1name = ""2if name:3    print(f"你好,{name}!")4else:5    print("你没有输入名字。")
输出
你没有输入名字。

这和 input() 很配。现在终于可以在转换之前,根据 .isdigit() 做不同的事了:

main.py
1text = input("有几盏灯?").strip()2if text.isdigit():3    print(f"要点的灯:{int(text)}")4else:5    print(f"「{text}」不是整数。")
输出
有几盏灯?七
「七」不是整数。

嵌套 if

代码块里还可以再放一个 if。每深一层,多缩进 4 个空格。

main.py
1is_dark = True2oil = 13if is_dark:4    if oil > 0:5        print("点灯。")6    else:7        print("没油了。")8else:9    print("等天黑。")
输出
点灯。

两层没问题。再深的话,用 and 或 elif 往往更好读:if is_dark and oil > 0:。

一行写完的选择

只是要在两个值里挑一个时,可以用条件表达式,一行写完:A if 条件 else B,条件为真得到 A,否则得到 B。

main.py
1lamps = 12word = "一盏" if lamps == 1 else "好几盏"3print(f"要点{word}灯")4print("晚上" if lamps > 0 else "白天")
输出
要点一盏灯
晚上

像这样简短的选择就用它。要做的事多了,还是写普通的 if。

常见错误

写错了什么例子会怎样
少了冒号if x > 3SyntaxError
把 == 写成 =if x = 3:SyntaxError
代码块没缩进if x > 3: 下一行 print(x) 顶格写IndentationError
or 后面只写一个值if x == "a" or "b":永远为真

最后一种最隐蔽,因为不会报错。Python 把它读成 (x == "a") or ("b"),而 "b" 是非空字符串,永远算真:

main.py
1answer = "不"2if answer == "好" or "行":3    print("开始点灯!")4if answer == "好" or answer == "行":5    print("只有回答「好」或「行」才会显示这一行。")
输出
开始点灯!

or 两边都要写完整的比较。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

奇数还是偶数

n 能被 2 整除就显示 偶数,否则显示 奇数。

要显示
奇数
exercise1.py
1n = 72# 在这里写
输出
点「运行」或按 Ctrl+Enter
练习 2

灯有多亮

小于 30 显示 暗,30 到 69 显示 正常,70 及以上显示 亮。

要显示
亮
exercise2.py
1level = 702if level < 30:3    print("暗")
输出
点「运行」或按 Ctrl+Enter
练习 3

修好这个判断

对下面这个回答,程序应该显示 请回答 yes 或 no。,可它显示的是 收到。。把条件改对。

要显示
请回答 yes 或 no。
exercise3.py
1answer = "maybe"2if answer == "yes" or "no":3    print("收到。")4else:5    print("请回答 yes 或 no。")
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • if 条件: 只在条件为真时,才跑下面缩进的代码块。
  • 缩进(4 个空格)表示哪几行属于这个 if;缩进不对会报错。
  • 条件为假时跑 else;elif 增加更多情况,只有第一个为真的分支会跑。
  • 条件里可以用 and、or、not、in,也可以像 if name: 这样直接用真值。
  • A if 条件 else B 一行就能在两个值里挑一个。
  • 小心少了冒号、把 == 写成 =,以及 x == "a" or "b"。