条件测试
每个 if
语句的核心是一个可以评估为 True
或 False
的表达式,称为条件测试。 Python 使用值 True
和 False
来决定是否应该执行 if
语句中的代码。 如果条件测试的计算结果为 True,Python 将执行 if 语句之后的代码。 如果测试的计算结果为 False,Python 将忽略 if 语句之后的代码。
检查是否相等
大多数条件测试将变量的当前值与感兴趣的特定值进行比较。 最简单的条件测试检查变量的值是否等于感兴趣的值:
>>> car = 'bmw'
>>> car == 'bmw'
True
第一行使用单个等号将 car 的值设置为 'bmw' ,正如您已经多次看到的那样。 下一行使用双等号 (==
) 检查 car 的值是否为 'bmw' 。 如果运算符左右两侧的值匹配,则此相等运算符返回 True
,如果不匹配,则返回 False
。 此示例中的值匹配,因此 Python 返回 True
。
当 car 的值不是 'bmw'
时,此测试返回 False
:
>>> car = 'audi'
>>> car == 'bmw'
False
一个等号实际上是一个陈述; 您可能会在这里读到第一行代码 "将 car 的值设置为’audi'" 。 另一方面,双等号提出了一个问题:“汽车的价值是否等于‘宝马’?” 大多数编程语言都以这种方式使用等号。
如何在检查是否相等时忽略大小写
Python 中的相等性测试区分大小写。 例如,大小写不同的两个值不被视为相等:
>>> car = 'Audi'
>>> car == 'audi'
False
如果大小写很重要,这种行为是有利的。 但是如果大小写无关紧要,而只是想测试变量的值,则可以在进行比较之前将变量的值转换为小写:
>>> car = 'Audi'
>>> car.lower() == 'audi'
True
无论值 “Audi” 的格式如何,该测试都将返回 True,因为该测试现在不区分大小写。 lower() 方法不会更改最初存储在 car 中的值,因此您可以在不影响原始变量的情况下进行这种比较:
>>> car = 'Audi'
>>> car.lower() == 'audi'
True
>>> car
'Audi'
我们首先将大写字符串 'Audi' 分配给变量 car。 然后,我们将 car 的值转换为小写并将小写值与字符串 'audi' 进行比较。 这两个字符串匹配,因此 Python 返回 True。 我们可以看到 car 中存储的值并没有受到 lower() 方法的影响。
网站以与此类似的方式对用户输入的数据执行某些规则。 例如,网站可能会使用这样的条件测试来确保每个用户都有一个真正唯一的用户名,而不仅仅是另一个人用户名大写的变体。 当有人提交新用户名时,该新用户名将转换为小写,并与所有现有用户名的小写版本进行比较。 在此检查期间,如果 “john” 的任何变体已在使用中,将拒绝像 “John” 这样的用户名。
检查是否不等
当要判断两个值是否不相等时,可以使用不等运算符(!=
)。 让我们使用另一个 if 语句来检查如何使用不等运算符。 我们将请求的披萨配料存储在一个变量中,然后如果该人没有订购凤尾鱼则打印一条消息:
requested_topping = 'mushrooms'
if requested_topping != 'anchovies':
print("Hold the anchovies!")
此代码将 requested_topping 的值与 'anchovies' 的值进行比较。 如果这两个值不匹配,Python 返回 True 并执行 if 语句后面的代码。 如果两个值匹配,Python 返回 False 并且不运行 if 语句之后的代码。
因为 requested_topping
的值不是 'anchovies'
,所以执行了 print()
函数:
Hold the anchovies!
您编写的大多数条件表达式都会测试是否相等,但有时您会发现测试不等式更有效。
数值比较
测试数值非常简单。 例如,下面的代码检查一个人是否年满 18 岁:
>>> age = 18
>>> age == 18
True
您还可以测试两个数字是否不相等。 例如,如果给定的答案不正确,以下代码会打印一条消息:
answer = 17
if answer != 42:
print("That is not the correct answer. Please try again!")
条件测试通过,因为 answer(17) 的值不等于 42。因为测试通过,缩进代码块被执行:
That is not the correct answer. Please try again!
您也可以在条件语句中包含各种数学比较,例如小于、小于或等于、大于和大于或等于:
>>> age = 19
>>> age < 21
True
>>> age <= 21
True
>>> age > 21
False
>>> age >= 21
False
每个数学比较都可以用作 if 语句的一部分,这可以帮助您检测感兴趣的确切条件。
检查多个条件
您可能希望同时检查多个条件。 例如,有时您可能需要两个条件都为 True 才能采取行动。 其他时候,您可能只满足于一个条件为真。 关键字 and 和 or 可以在这些情况下为您提供帮助。
检查特定的值是否在列表中
要检查两个条件是否同时为 True ,请使用关键字 and
组合两个条件测试; 如果每个测试都通过,则整个表达式的计算结果为 True。 如果任一测试失败或两个测试都失败,则表达式的计算结果为 False。
例如,您可以使用以下测试来检查两个人是否都超过 21 岁:
>>> age_0 = 22
>>> age_1 = 18
>>> age_0 >= 21 and age_1 >= 21 (1)
False
>>> age_1 = 22 (2)
>>> age_0 >= 21 and age_1 >= 21
True
1 | 首先,我们定义两个年龄,age_0 和 age_1。 然后我们检查两个年龄是否都在 21 岁或以上。左侧的测试通过,但右侧的测试失败,因此整个条件表达式的计算结果为 False。 |
2 | 然后我们把 age_1 改成 22 。 age_1 的值现在大于 21,因此两个单独的测试都通过了,导致整个条件表达式的计算结果为 True。 |
为了提高可读性,您可以在各个测试周围使用括号,但这不是必需的。 如果您使用括号,您的测试将如下所示:
(age_0 >= 21) and (age_1 >= 21)
使用 or 检查多个条件
关键字 or
也允许您检查多个条件,但当其中一个或两个单独测试通过时它也通过。 只有当两个单独的测试都失败时,or
表达式才会失败。 让我们再次考虑两个年龄,但这次我们只寻找一个超过 21 岁的人:
>>> age_0 = 22
>>> age_1 = 18
>>> age_0 >= 21 or age_1 >= 21 (1)
True
>>> age_0 = 18 (2)
>>> age_0 >= 21 or age_1 >= 21
False
1 | 我们再次从两个年龄变量开始。 因为 age_0 的测试通过了,整个表达式的计算结果为 True。 |
2 | 然后我们将 age_0 降低到 18。在最终测试中,两个测试现在都失败了,整个表达式的计算结果为 False。 |
检查特定的值是否不在列表中
有时在采取行动之前检查列表是否包含特定值很重要。 例如,您可能想在完成某人在网站上的注册之前检查当前用户名列表中是否已经存在新用户名。 在制图项目中,您可能想要检查提交的位置是否已存在于已知位置列表中。
要查明特定值是否已在列表中,请使用关键字 in
。让我们考虑您可能为比萨店编写的一些代码。 我们将列出客户要求的比萨饼的配料列表,然后检查列表中是否包含某些配料。
>>> requested_toppings = ['mushrooms', 'onions', 'pineapple']
>>> 'mushrooms' in requested_toppings
True
>>> 'pepperoni' in requested_toppings
False
关键字 in
告诉 Python 检查列表 requested_toppings 中是否存在 'mushrooms' 和 'pepperoni'。 这种技术非常强大,因为您可以创建一个基本值列表,然后轻松检查您正在测试的值是否与列表中的某个值匹配。
检查一个值是否不在列表中
其他时候,了解一个值是否不在列表中很重要。 在这种情况下,您可以使用关键字 not
。 例如,考虑禁止在论坛中发表评论的用户列表。 在允许该用户提交评论之前,您可以检查该用户是否已被禁止:
banned_users = ['andrew', 'carolina', 'david']
user = 'marie'
if user not in banned_users:
print(f"{user.title()}, you can post a response if you wish.")
这里的 if
语句读起来很清楚。 如果 user 的值不在列表 banned_users 中,Python 返回 True 并执行缩进的行。
用户 'marie' 不在 banned_users 列表中,因此她看到一条消息,邀请她发表回复:
Marie, you can post a response if you wish.