>>> from env_helper import info; info()
页面更新时间: 2020-11-19 21:00:03
操作系统/OS: Linux-4.19.0-11-amd64-x86_64-with-debian-10.6 ;Python: 3.7.3

2.7. 更复杂的条件

这就是你需要知道的有关if语句的全部知识。下面来说说条件本身,因为它们是有条件执行 中最有趣的部分。

2.7.1. 比较运算符

在条件表达式中,最基本的运算符可能是比较运算符,它们用于执行比较。下表对比较运算符做了总结。

表 Python比较运算符

表 达 式

描 述

x == y

x 等于y

x < y

x小于y

x > y

x大于y

x >= y

x大于或等于y

x <= y

x小于或等于y

x != y

x不等于y

x is y

x和y是同一个对象

x is not y

x和y是不同的对象

x in y

x是容器(如序列)y的成员

x not in y

x不是容器(如序列)y的成员

对不兼容的类型进行比较

从理论上说,可使用 <<= 等运算符比较任意两个对象x和y的相对大小,并获得一个真值, 但这种比较仅在 xy 的类型相同或相近时(如两个整数或一个整数和一个浮点数)才有意义。

将整数与字符串相加毫无意义,检查一个整数是否小于一个字符串也是一样。奇怪的是,在Python 3之前,竟然可以这样做。 不过即便你使用的是较旧的Python版本,也应对这类 比较敬而远之,因为结果是不确定的,每次执行程序时都可能不同。 在Python 3中,已经不允许这样比较不兼容的类型了。

与赋值一样,Python也支持链式比较:可同时使用多个比较运算符,如0 < age < 100。 有些比较运算符需要特别注意,下面就来详细介绍。

2.7.2. 相等运算符

要确定两个对象是否相等,可使用比较运算符,用两个等号(==)表示。

>>> "foo" == "foo"
True
>>> "foo" == "bar"
False

两个等号?为何不像数学中那样使用一个等号呢?相信你很聪明,自己就能够明白其中的原 因,但这里还是试试一个等号吧。

"foo" = "foo"
SyntaxError: can't assign to literal

一个等号是赋值运算符,用于修改值,而进行比较时你可不想这样做。

2.7.3. is:相同运算符

这个运算符很有趣,其作用看似与==一样,但实际上并非如此。

>>> x = y = [1, 2, 3]
>>> z = [1, 2, 3]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False

在前几个示例中,看不出什么问题,但最后一个示例的结果很奇怪: xz 相等,但 x is z 的结果却为 False。 为何会这样呢?因为 is 检查两个对象是否相同(而不是相等)。 变量 xy 指向同一个列表,而 z 指向另一个列表(其中包含的值以及这些值的排列顺序都与前一个列表相同)。 这两个列表虽然相等,但并非同一个对象。

这好像不可理喻?请看下面的示例:

>>> x = [1, 2, 3]
>>> y = [2, 4]
>>> x is not y
True
>>> x = [1, 2, 3]
>>> y = [2, 4]
>>> del x[2]
>>> y[1] = 1
>>> y.reverse()

在这个示例中,我首先创建了两个不同的列表 xy 。如你所见, x is not y (与x is y相反) 的结果为 True,这一点你早已知道。 接下来,我稍微修改了这两个列表,现在它们虽然相等,但 依然是两个不同的列表。

>>> x == y
True
>>> x is y
False

显然,这两个列表相等但不相同。

总之, == 用来检查两个对象是否相等,而 is 用来检查两个对象是否相同(是同一个对象)。

警告

不要将 is 用于数和字符串等不可变的基本值。鉴于Python在内部处理这些对象的方式, 这样做的结果是不可预测的。

2.7.4. in:成员资格运算符

运算符in与其他比较运算符一样,它也可用于条件表达式中。

>>> name = input('What is your name? ')
>>> if 's' in name:
>>>     print('Your name contains the letter "s".')
>>> else:
>>>     print('Your name does not contain the letter "s".')
What is your name? Tom
Your name does not contain the letter "s".

2.7.5. 字符串和序列的比较

字符串是根据字符的字母排列顺序进行比较的。

>>> "alpha" < "beta"
True

虽然基于的是字母排列顺序,但字母都是Unicode字符,它们是按码点排列的。

>>> "🙉🙈🙉" < "🙉🙊🙉"
True

实际上,字符是根据顺序值排列的。要获悉字母的顺序值,可使用函数ord。这个函数的作 用与函数chr相反:

>>> ord("🙉")
128585
>>> ord("🙊")
128586
>>> chr(128584)
'🙈'

这种方法既合理又一致,但可能与你排序的方式相反。例如,涉及大写字母时,排列顺序就 可能与你想要的不同。

>>> "a" < "B"
False

一个诀窍是忽略大小写。为此可使用字符串方法 lower(),如下所示:

>>> "a".lower() < "B".lower()
True
>>> 'FnOrD'.lower() == 'Fnord'.lower()
True

其他序列的比较方式与此相同,但这些序列包含的元素可能不是字符,而是其他类型的值。

>>> [1, 2] < [2, 1]
True

如果序列的元素为其他序列,将根据同样的规则对这些元素进行比较。

>>> [2, [1, 4]] < [2, [1, 5]]
True