3.4 if...elseif...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',赋值给resultelse部分不执行。
  • 如果条件为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>=90False,因此跳过语句print('A')。第二个条件grade>=80也是False,语句print('B')也被跳过。第三个条件grade>=70True,因此执行语句print('C')。然后跳过if...elif...else语句中的所有剩余代码。if...elif...else语句的执行速度比单独执行多个if语句的速度更快,因为当条件为True时,会立即终止测试。

else是可选项

if...elif...else语句中的else是可选项。包含else可以使代码处理不满足任何条件的值。当没有elseif...elif语句中的条件全部都为False时,程序不会执行任何语句套件,而是直接执行if...elif语句后的下一条语句。如果在if...elif语句中包含else,则必须把它放在最后一个elif之后;否则,会引发SyntaxError

逻辑错误

代码段[16]中错误地使用缩进是一个非致命逻辑错误的示例。这个代码段可以执行,但会产生错误的结果。如果脚本中存在致命的逻辑错误,会引发异常(例如尝试除以0会引发ZeroDivisionError),Python会显示回溯,然后终止脚本。交互模式中的致命错误仅终止当前代码段,然后IPython会等待下一个输入。