控制流
你已经知道了单条指令的基本知识。程序就是一系列指令。但编程真正的力量不仅在于运行(或“执行”)一条接一条的指令,就像周末的任务清单那样。根据表达式求值的结果,程序可以决定跳过指令,重复指令,或从几条指令中选择一条运行。实际上,你几乎永远不希望程序从第一行代码开始,简单地执行每行代码,直到最后一行。“控制流语句”可以决定在什么条件下执行哪些 Python 语句。
这些控制流语句直接对应于流程图中的符号,我将提供示例代码的流程图。下图展示了一张流程图,内容是如果下雨怎么办。按照箭头构成的路径,从开始到结束:
在流程图中,通常有不止一种方法从开始走到结束。计算机程序中的代码行也是这样。流程图用菱形表示这些分支节点,其他步骤用矩形表示。开始和结束步骤用带圆角的矩形表示。
但在学习流程控制语句之前,首先要学习如何表示这些 yes 和 no 选项。同时你也需要理解,如何将这些分支节点写成 Python 代码。要做到这一点,让我们先看看布尔值、比较操作符和布尔操作符。
布尔值
虽然整型、浮点型和字符串数据类型有无数种可能的值,但“布尔”数据类型只有两种值:True 和 False。Boolean(布尔)的首字母大写,因为这个数据类型是根据数学家 George Boole 命名的。在作为 Python 代码输入时,布尔值 True 和 False不像字符串,两边没有引号,它们总是以大写字母 T 或 F 开头,后面的字母小写。
在交互式环境中输入下面内容,其中有些指令是故意弄错的,它们将导致出错信息:
像其他值一样,布尔值也用在表达式中,并且可以保存在变量中。如果大小写不正确,,或者试图使用 True 和 False 作为变量名,Python 就会给出错误信息。
比较操作符
“比较操作符”比较两个值,求值为一个布尔值。下表列出了比较操作符:
操作符 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
这些操作符根据给它们提供的值,求值为 True 或 False。现在让我们尝试一些操作符,从==和!=开始:
如果两边的值一样, ==(等于)求值为 True。如果两边的值不同, !=(不等于)
求值为 True。 == 和 != 操作符实际上可以用于所有数据类型的值
请注意,整型或浮点型的值永远不会与字符串相等。表达式 42 == '42’求值为False 是因为,Python 认为整数 42 与字符串’42’不同。
另外,<、>、<=和>=操作符仅用于整型和浮点型值。
布尔操作符
3 个布尔操作符(and、or 和 not)用于比较布尔值。像比较操作符一样,它们将这些表达式求值为一个布尔值。让我们仔细看看这些操作符,从 and 操作符开始。
二元布尔操作符
and 和 or 操作符总是接受两个布尔值(或表达式),所以它们被认为是“二元”操作符。如果两个布尔值都为 True,and 操作符就将表达式求值为 True,否则求值为 False。在交互式环境中输入某个使用 and 的表达式,看看效果。
“真值表”显示了布尔操作符的所有可能结果:
表达式 | 求值为 |
---|---|
True and True | True |
True and False | False |
False and True | False |
False and False | False |
另外,只要有一个布尔值为真,or 操作符就将表达式求值为 True。如果都是 False,所求值为 False:
可以在 or 操作符的真值表中看到每一种可能的结果:
表达式 | 求值为 |
---|---|
True or True | True |
True or False | True |
False or True | True |
False or False | False |
not 操作符
和 and 和 or 不同,not 操作符只作用于一个布尔值(或表达式)。not 操作符求值为相反的布尔值:
就像在说话和写作中使用双重否定,你可以嵌套 not 操作符,虽然在真正的程序中并不经常这样做。
下表展示了 not 的真值表:
表达式 | 求值为 |
---|---|
not True | False |
not False | True |
混合布尔和比较操作符
既然比较操作符求值为布尔值,就可以和布尔操作符一起,在表达式中使用。
回忆一下,and、or 和 not 操作符称为布尔操作符是因为,它们总是操作于布尔值。虽然像 4 < 5 这样的表达式不是布尔值,但可以求值为布尔值。在交互式环境中,尝试输入一些使用比较操作符的布尔表达式:
计算机将先求值左边的表达式,然后再求值右边的表达式。知道两个布尔值后,它又将整个表达式再求值为一个布尔值。你可以认为计算机求值(4 < 5)和(5 < 6)的过程,如图:
也可以在一个表达式中使用多个布尔操作符,与比较操作符一起使用:
和算术操作符一样,布尔操作符也有操作顺序。在所有算术和比较操作符求值后,Python 先求值 not 操作符,然后是 and 操作符,然后是 or 操作符。
控制流的元素
控制流语句的开始部分通常是“条件”,接下来是一个代码块,称为“子句”。在开始学习具体的 Python 控制流语句之前,我将介绍条件和代码块。
条件
你前面看到的布尔表达式可以看成是条件,它和表达式是一回事。“条件”只是在控制流语句的上下文中更具体的名称。条件总是求值为一个布尔值,True 或 False。控制流语句根据条件是 True 还是 False,来决定做什么。几乎所有的控制流语句都使用条件。
代码块
一些代码行可以作为一组,放在“代码块”中。可以根据代码行的缩进,知道代码块的开始和结束。代码块有 3 条规则:
- 缩进增加时,代码块开始
- 代码块可以包含其他代码块
- 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了