Python程序设计:人工智能案例实践
上QQ阅读APP看书,第一时间看更新

2.7 决策:if语句和比较运算符

条件是一个值为TrueFalse的布尔表达式。下面的代码段判定7是否大于4以及7是否小于4

TrueFalse的首字母都要大写。TrueFalse是Python关键字,使用关键字作为标识符会导致语法错误。

下表列出了Python中的比较运算符

运算符><>=<=具有相同的优先级。运算符==!=具有相同的优先级,但低于><>=<=的优先级。运算符==!=>=<=的两个符号之间不能插入空格,否则会引发语法错误,例如:

如果颠倒运算符中的符号,将!=>=<=写成=!=>=<,也会引发语法错误。

使用if语句做出决策:首次使用脚本

首先介绍一个简单版本的if语句,它根据条件来决定是否执行一条语句(或一组语句)。程序将会读取用户输入的两个整数,并使用6条连续的if语句对它们进行比较,每条语句使用一种比较运算符。如果if语句中的条件为True,则执行相应的print语句;否则直接跳过print语句。

IPython交互模式有利于执行简短的代码段并立即查看结果。但要将多个语句作为一组语句执行,通常会将它们编写为一个脚本存储在以.py(Python的缩写)作为扩展名的文件中,例如本示例的脚本fig02_01.py。脚本也称为程序,有关如何查找和执行本书中的脚本的说明,可以参考1.5节。

每次执行脚本fig02_01.py,6个条件中都会有3个为True。为了说明这一点,执行脚本3次,每次输入两个整数,第一次第一个数较小,第二次两个数相等,第三次第一个数较大,执行的结果会显示在脚本之后。

本书在介绍脚本时,都会首先给出脚本的代码,之后再对脚本的代码进行解释。为方便阅读,会在脚本中显示行号。在IDE中可以设置是否显示行号,行号不是Python代码的一部分。要执行脚本fig02_01.py,转到本章的ch02示例文件夹,然后输入:

    ipython fig02_01.py

如果已经运行了IPython,可以使用下面的命令执行脚本:

注释

第1行以字符井号(#)开头,表示该行的其余部分是注释

为了便于理解,每个脚本都以一条注释语句开始,该条语句的内容为脚本的文件名。注释也可以从一行代码的右端开始,直到该行的末尾。

文档字符串

Style Guide for Python Code建议每个脚本都应该以说明脚本用途的文档字符串开头,例如第2行中的:

对于更复杂的脚本,文档字符串常常包含很多行。在后面的章节中,我们将使用文档字符串来描述自定义的脚本组件,例如新函数和新类型(称为类)。我们还将介绍如何使用IPython的帮助机制访问文档字符串。

空行

第3行是一个空行。使用空行和空格可以使代码更易于阅读。空行、空格和制表符都称为空白。Python忽略了大多数空白,但有些缩进是必不可少的。

将长语句分为多行

第4~5行

向用户显示提示信息。因为提示信息太长,放在一行会影响程序的可读性,因此将它分成两个字符串放在两行。之前介绍过,可以将一个用逗号分隔的列表作为print函数的参数,而print会依次显示列表中的值,并用空格作为值与值之间的分隔。

一般情况下,会将一条语句写在一行上。但如有必要,也可以使用续行符“\”将长语句拆分为多行。Python还允许在括号中拆分长代码行而不使用续行符(如第4~5行)。这是Style Guide for Python Code推荐的拆分长代码行的首选方法。在拆分长代码行时应该始终遵循选择有意义的断点这一原则,例如,在print函数参数中的某个逗号之后或在长表达式中的某个操作符之前。

从用户的输入中读取整数值

第8行和第11行使用内置的inputint函数来提示和读取用户输入的两个整数值。

if语句

第13~14行的if语句:

使用比较运算符“==”来判断变量number1number2的值是否相等。如果相等,则条件为True,第14行将显示一行文本,说明两个值相等。如果后面的if语句的条件为True(第16、19、22、25和28行),则对应的print语句也会显示一行文本。

每个if语句都包含关键字if、要测试的条件和冒号(:),后跟一个缩进的语句块,称为套件。每个套件必须包含一条或多条语句。忘记条件后的冒号(:)是一个常见的语法错误。

套件缩进

Python要求对套件中的语句进行缩进。Style Guide for Python Code推荐使用四个空格作为缩进,本书的代码使用了这种缩进方式。在下一章中我们会看到不正确的缩进可能会导致的错误。

混淆“==”和“=

if语句的条件中使用赋值号(=)而不是相等运算符(==)是一种常见的语法错误。为了避免这种情况的发生,可以将“==”读作“等于”,将“=”读作“被赋值”。在下一章中我们将会看到在赋值语句中误将“=”写作“==”可能会导致的不易察觉的问题。

链式比较

为了检测一个值是否在某个范围内,可以使用链式比较。下面的比较要确定x是否在15的范围内(包括15):

本章介绍的运算符的优先级和结合性

本章介绍的运算符的优先级和结合性如下表所示:

上表按照优先级的降序从上到下列出了本章介绍的运算符。在书写包含多个运算符的表达式时,为了确保它们会按照期望的顺序进行求值,可以参照网址https://docs.python.org/3/reference/expressions.html#operator-prece-dence上的运算符优先级图表。