这里需要知道有关if
语句的全部知识。下面来说说条件本身,
因为它们是有条件执行中最有趣的部分。
在条件表达式中,最基本的运算符可能是比较运算符,它们用于执行比较。下表对比较运算符做了总结。
表 达 式 | 描 述 |
---|---|
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。 有些比较运算符需要特别注意,下面就来详细介绍。
要确定两个对象是否相等,可使用比较运算符,用两个等号( ==
)表示。
"foo" == "foo"
True
"foo" == "bar"
False
两个等号?为何不像数学中那样使用一个等号呢?相信自己很聪明,能够明白其中的原因,但这里还是试试一个等号吧。
# "foo" = "foo" #此段代码会报错
一个等号是赋值运算符,用于修改值,而进行比较时可不想这样做。
这个运算符很有趣,其作用看似与 ==
一样,但实际上并非如此。
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在内部处理这些对象的方式, 这样做的结果是不可预测的。
运算符in与其他比较运算符一样,它也可用于条件表达式中。
# name = input('What is your name? ')
name='whh'
if 's' in name:
print('Your name contains the letter "s".')
else:
print('Your name does not contain the letter "s".')
Your name does not contain the letter "s".
字符串是根据字符的字母排列顺序进行比较的。
"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