if、elif 和 else
到现在为止,程序里每一行每次都会跑。if 能让程序只在条件成立时才跑某几行,这样程序就能看情况办事:天黑了才点灯,油少了才去添。
if 语句
一个 if 有三部分:if 这个词,一个为真或为假的条件(第 7 课),一个冒号。下面缩进的几行是它的代码块。条件为真,代码块才会跑;跑完接着往下走。
1oil = 22if oil < 3:3 print("油不多了。")4 print("Wick 去商店买油。")5print("检查完了。")
油不多了。 Wick 去商店买油。 检查完了。
把 oil 改成 5 再运行:缩进的两行跳过了,但「检查完了。」还会显示,因为它没有缩进。
缩进很重要
Python 靠缩进,也就是行首的空格,来看哪几行属于这个 if。别的语言用花括号 { } 做这件事,Python 只看空格。一般缩进 4 个空格,同一个代码块里的每一行都要对齐。
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 告诉程序条件不成立时做什么。两个代码块正好跑一个,不会两个都跑。
1age = int(input("你几岁了?"))2if age >= 18:3 print("你可以在镇上租房子了。")4else:5 print(f"再过 {18 - age} 年再来吧。")
你几岁了?17 再过 1 年再来吧。
else 后面没有条件,它和自己的 if 对齐。
elif:不止两种选择
情况有好几种时,加上 elif(else if 的缩写)。Python 从上往下检查条件,跑第一个为真的那个。后面的都跳过,就算它们也为真。
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("再试一次")
95 >= 50 为真,所以第一个代码块跑了,后面的分支全都跳过。想得到「优秀」,要先检查更严的条件:把 score >= 90 放到最上面。
组合条件
条件可以是任何返回 True 或 False 的表达式,包括 and、or、not、连写比较和 in。
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 不是空的」。
1name = ""2if name:3 print(f"你好,{name}!")4else:5 print("你没有输入名字。")
你没有输入名字。
这和 input() 很配。现在终于可以在转换之前,根据 .isdigit() 做不同的事了:
1text = input("有几盏灯?").strip()2if text.isdigit():3 print(f"要点的灯:{int(text)}")4else:5 print(f"「{text}」不是整数。")
有几盏灯?七 「七」不是整数。
嵌套 if
代码块里还可以再放一个 if。每深一层,多缩进 4 个空格。
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。
1lamps = 12word = "一盏" if lamps == 1 else "好几盏"3print(f"要点{word}灯")4print("晚上" if lamps > 0 else "白天")
要点一盏灯 晚上
像这样简短的选择就用它。要做的事多了,还是写普通的 if。
常见错误
| 写错了什么 | 例子 | 会怎样 |
|---|---|---|
| 少了冒号 | if x > 3 | SyntaxError |
把 == 写成 = | if x = 3: | SyntaxError |
| 代码块没缩进 | if x > 3: 下一行 print(x) 顶格写 | IndentationError |
or 后面只写一个值 | if x == "a" or "b": | 永远为真 |
最后一种最隐蔽,因为不会报错。Python 把它读成 (x == "a") or ("b"),而 "b" 是非空字符串,永远算真:
1answer = "不"2if answer == "好" or "行":3 print("开始点灯!")4if answer == "好" or answer == "行":5 print("只有回答「好」或「行」才会显示这一行。")
开始点灯!
or 两边都要写完整的比较。
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。
奇数还是偶数
✓n 能被 2 整除就显示 偶数,否则显示 奇数。
奇数
1n = 72# 在这里写
灯有多亮
✓小于 30 显示 暗,30 到 69 显示 正常,70 及以上显示 亮。
亮
1level = 702if level < 30:3 print("暗")
修好这个判断
✓对下面这个回答,程序应该显示 请回答 yes 或 no。,可它显示的是 收到。。把条件改对。
请回答 yes 或 no。
1answer = "maybe"2if answer == "yes" or "no":3 print("收到。")4else:5 print("请回答 yes 或 no。")
这一课学会了
if 条件:只在条件为真时,才跑下面缩进的代码块。- 缩进(4 个空格)表示哪几行属于这个
if;缩进不对会报错。 - 条件为假时跑
else;elif增加更多情况,只有第一个为真的分支会跑。 - 条件里可以用
and、or、not、in,也可以像if name:这样直接用真值。 A if 条件 else B一行就能在两个值里挑一个。- 小心少了冒号、把
==写成=,以及x == "a" or "b"。