>>> 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的相对大小,并获得一个真值, 但这种比较仅在
x
和 y
的类型相同或相近时(如两个整数或一个整数和一个浮点数)才有意义。
将整数与字符串相加毫无意义,检查一个整数是否小于一个字符串也是一样。奇怪的是,在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
在前几个示例中,看不出什么问题,但最后一个示例的结果很奇怪: x
和
z
相等,但 x is z
的结果却为 False
。 为何会这样呢?因为
is
检查两个对象是否相同(而不是相等)。 变量 x
和 y
指向同一个列表,而 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()
在这个示例中,我首先创建了两个不同的列表 x
和 y
。如你所见,
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