
3.4 if...else
和if...elif...else
语句
if...else
语句根据条件是True
还是False
执行不同的套件:

上面的代码段中的条件为True
,因此if
套件显示'Passed'
。需要注意的是,当键入print
('Passed'
)后按Enter键时,IPython会将下一行缩进四个空格。必须删除这四个空格,以便“else:
”套件可以在if
的字母i
下正确对齐。
下面的代码将57
赋值给变量grade
,然后再次执行if...else
语句,执行结果说明,条件为False
时只执行else
的套件:

使用向上和向下箭头键可以在交互式会话的当前代码段中向后或向前导航,按Enter键可以重新执行选中的代码段。现在,我们将grade
赋值为99
,按两次向上箭头键导航到代码段[4]
,然后按Enter键重新执行该代码段。因为每个被执行的代码段都会获得一个新的ID,因此,该代码段将显示为[6]
,如下所示:

条件表达式
有时,if...else
语句中的套件可以根据条件为变量赋不同的值,如下所示:

然后我们可以评估这个变量或者用print
输出这个变量,如下所示:

代码段[8]
的语句可以改写为简洁的条件表达式,如下所示:

上面的代码段中的括号不是必需的,但它们能清晰地表明该语句将条件表达式的值赋给了result
。首先,Python评估条件grade >= 60
:
- 如果条件为
True
,则代码段[10]
将if
左侧表达式的值,即'Passed'
,赋值给result
。else
部分不执行。 - 如果条件为
False
,则代码段[10]
将else
右侧表达式的值,即'Failed'
,赋值给result
。
在交互模式下,还可以直接评估条件表达式,如下所示:

套件中的多条语句
下面的代码中,if...else
语句的else
套件包含两条语句:

上面的代码段中的grade
小于60
,因此else
套件中的两条语句都会被执行。
如果第二个print
没有进行缩进,那么它将不被包含在else
的套件中。因此,无论if
语句的条件是True
还是False
,该条语句都会被执行,这可能会导致错误的输出:

if...elif...else
语句
可以使用if...elif...else
语句测试多种情况。下面的代码段中,等级A
表示grade
大于等于90
,等级B
表示grade
为80~89,等级C
表示grade
为70~79,等级D
表示grade
为60~69,而等级F
表示其他成绩。在这几个条件中,仅执行第一个值为True
的条件控制的操作。代码段[18]
显示结果为C
,因为grade
的值是77
:

第一个条件grade>=90
为False
,因此跳过语句print('A')
。第二个条件grade>=80
也是False
,语句print('B')
也被跳过。第三个条件grade>=70
为True
,因此执行语句print('C')
。然后跳过if...elif...else
语句中的所有剩余代码。if...elif...else
语句的执行速度比单独执行多个if
语句的速度更快,因为当条件为True
时,会立即终止测试。
else
是可选项
if...elif...else
语句中的else
是可选项。包含else
可以使代码处理不满足任何条件的值。当没有else
的if...elif
语句中的条件全部都为False
时,程序不会执行任何语句套件,而是直接执行if...elif
语句后的下一条语句。如果在if...elif
语句中包含else
,则必须把它放在最后一个elif
之后;否则,会引发SyntaxError
。
逻辑错误
代码段[16]
中错误地使用缩进是一个非致命逻辑错误的示例。这个代码段可以执行,但会产生错误的结果。如果脚本中存在致命的逻辑错误,会引发异常(例如尝试除以0会引发ZeroDivisionError
),Python会显示回溯,然后终止脚本。交互模式中的致命错误仅终止当前代码段,然后IPython会等待下一个输入。