2.7 决策:if
语句和比较运算符
条件是一个值为True
或False
的布尔表达式。下面的代码段判定7
是否大于4
以及7
是否小于4
:
True
和False
的首字母都要大写。True
和False
是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行使用内置的input
和int
函数来提示和读取用户输入的两个整数值。
if
语句
第13~14行的if
语句:
使用比较运算符“==
”来判断变量number1
和number2
的值是否相等。如果相等,则条件为True
,第14行将显示一行文本,说明两个值相等。如果后面的if
语句的条件为True
(第16、19、22、25和28行),则对应的print
语句也会显示一行文本。
每个if
语句都包含关键字if
、要测试的条件和冒号(:
),后跟一个缩进的语句块,称为套件。每个套件必须包含一条或多条语句。忘记条件后的冒号(:
)是一个常见的语法错误。
套件缩进
Python要求对套件中的语句进行缩进。Style Guide for Python Code推荐使用四个空格作为缩进,本书的代码使用了这种缩进方式。在下一章中我们会看到不正确的缩进可能会导致的错误。
混淆“==
”和“=
”
在if
语句的条件中使用赋值号(=
)而不是相等运算符(==
)是一种常见的语法错误。为了避免这种情况的发生,可以将“==
”读作“等于”,将“=
”读作“被赋值”。在下一章中我们将会看到在赋值语句中误将“=
”写作“==
”可能会导致的不易察觉的问题。
链式比较
为了检测一个值是否在某个范围内,可以使用链式比较。下面的比较要确定x
是否在1
到5
的范围内(包括1
和5
):
本章介绍的运算符的优先级和结合性
本章介绍的运算符的优先级和结合性如下表所示:
上表按照优先级的降序从上到下列出了本章介绍的运算符。在书写包含多个运算符的表达式时,为了确保它们会按照期望的顺序进行求值,可以参照网址https://docs.python.org/3/reference/expressions.html#operator-prece-dence上的运算符优先级图表。