5.2 条件测试

每条if 语句的核心都是一个值为TrueFalse 的表达式,这种表达式被称为条件测试 。Python根据条件测试的值为True 还是False 来决定是否执行if 语句中的代码。如果条件测试的值为True ,Python就执行紧跟在if 语句后面的代码;如果为False ,Python就忽略这些代码。

5.2.1 检查是否相等

大多数条件测试都将一个变量的当前值同特定值进行比较。最简单的条件测试检查变量的值是否与特定值相等:

  1. >>> car = 'bmw'
  2. >>> car == 'bmw'
  3. True
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

我们首先使用一个等号将car 的值设置为'bmw' (见❶),这种做法你已见过很多次。接下来,使用两个等号(== )检查car 的值是否为'bmw' 。这个相等运算符 在它两边的值相等时返回True ,否则返回False 。在这个示例中,两边的值相等,因此Python返回True

如果变量car 的值不是'bmw' ,上述测试将返回False

  1. >>> car = 'audi'
  2. >>> car == 'bmw'
  3. False
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

一个等号是陈述;对于❶处的代码,可解读为“将变量car 的值设置为'audi' ”。两个等号是发问;对于❷处的代码,可解读为“变量car 的值是'bmw' 吗?”。大多数编程语言使用等号的方式都与这里演示的相同。

5.2.2 检查是否相等时不考虑大小写

在Python中检查是否相等时区分大小写,例如,两个大小写不同的值会被视为不相等:

  1. >>> car = 'Audi'
  2. >>> car == 'audi'
  3. False
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

如果大小写很重要,这种行为有其优点。但如果大小写无关紧要,而只想检查变量的值,可将变量的值转换为小写,再进行比较:

  1. >>> car = 'Audi'
  2. >>> car.lower() == 'audi'
  3. True
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

无论值'Audi' 的大小写如何,上述测试都将返回True ,因为该测试不区分大小写。函数lower() 不会修改存储在变量car 中的值,因此进行这样的比较时不会影响原来的变量:

  1. >>> car = 'Audi'
  2. >>> car.lower() == 'audi'
  3. True
  4. >>> car
  5. 'Audi'
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  

在❶处,我们将首字母大写的字符串'Audi' 存储在变量car 中;在❷处,我们获取变量car 的值并将其转换为小写,再将结果与字符串'audi' 进行比较。这两个字符串相同,因此Python返回True 。从❸处的输出可知,这个条件测试并没有影响存储在变量car 中的值。

网站采用类似的方式让用户输入的数据符合特定的格式。例如,网站可能使用类似的测试来确保用户名是独一无二的,而并非只是与另一个用户名的大小写不同。用户提交新的用户名时,将把它转换为小写,并与所有既有用户名的小写版本进行比较。执行这种检查时,如果已经有用户名'john' (不管大小写如何),则用户提交用户名'John' 时将遭到拒绝。

5.2.3 检查是否不相等

要判断两个值是否不等,可结合使用惊叹号和等号(!= ),其中的惊叹号表示 ,在很多编程语言中都如此。

下面再使用一条if 语句来演示如何使用不等运算符。我们将把要求的比萨配料存储在一个变量中,再打印一条消息,指出顾客要求的配料是否是意式小银鱼(anchovies):

toppings.py

  1. requested_topping = 'mushrooms'
  2. if requested_topping != 'anchovies':
  3. print("Hold the anchovies!")
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

❶处的代码行将requested_topping 的值与'anchovies' 进行比较,如果它们不相等,Python将返回True ,进而执行紧跟在if 语句后面的代码;如果这两个值相等,Python将返回False ,因此不执行紧跟在if 语句后面的代码。

由于requested_topping 的值不是'anchovies' ,因此执行print 语句:

  1. Hold the anchovies!
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  

你编写的大多数条件表达式都检查两个值是否相等,但有时候检查两个值是否不等的效率更高。

5.2.4 比较数字

检查数值非常简单,例如,下面的代码检查一个人是否是18岁:

  1. >>> age = 18
  2. >>> age == 18
  3. True
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

你还可以检查两个数字是否不等,例如,下面的代码在提供的答案不正确时打印一条消息:

magic_number.py

  1. answer = 17
  2. if answer != 42:
  3. print("That is not the correct answer. Please try again!")
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

answer17 )不是42 ,❶处的条件得到满足,因此缩进的代码块得以执行:

  1. That is not the correct answer. Please try again!
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  

条件语句中可包含各种数学比较,如小于、小于等于、大于、大于等于:

  1. >>> age = 19
  2. >>> age < 21
  3. True
  4. >>> age <= 21
  5. True
  6. >>> age > 21
  7. False
  8. >>> age >= 21
  9. False
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  

if 语句中可使用各种数学比较,这让你能够直接检查关心的条件。

5.2.5 检查多个条件

你可能想同时检查多个条件,例如,有时候你需要在两个条件都为True 时才执行相应的操作,而有时候你只要求一个条件为True 时就执行相应的操作。在这些情况下,关键字andor 可助你一臂之力。

1. 使用and 检查多个条件

要检查是否两个条件都为True ,可使用关键字and 将两个条件测试合而为一;如果每个测试都通过了,整个表达式就为True ;如果至少有一个测试没有通过,整个表达式就为False

例如,要检查是否两个人都不小于21岁,可使用下面的测试:

  1. >>> age_0 = 22
  2. >>> age_1 = 18
  3. >>> age_0 >= 21 and age_1 >= 21
  4. False
  5. >>> age_1 = 22
  6. >>> age_0 >= 21 and age_1 >= 21
  7. True
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  

在❶处,我们定义了两个用于存储年龄的变量:age_0age_1 。在❷处,我们检查这两个变量是否都大于或等于21;左边的测试通过了,但右边的测试没有通过,因此整个条件表达式的结果为False 。在❸处,我们将age_1 改为22,这样age_1 的值大于21,因此两个测试都通过了,导致整个条件表达式的结果为True

为改善可读性,可将每个测试都分别放在一对括号内,但并非必须这样做。如果你使用括号,测试将类似于下面这样:

  1. (age_0 >= 21) and (age_1 >= 21)
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  

2. 使用or 检查多个条件

关键字or 也能够让你检查多个条件,但只要至少有一个条件满足,就能通过整个测试。仅当两个测试都没有通过时,使用or 的表达式才为False

下面再次检查两个人的年龄,但检查的条件是至少有一个人的年龄不小于21岁:

  1. >>> age_0 = 22
  2. >>> age_1 = 18
  3. >>> age_0 >= 21 or age_1 >= 21
  4. True
  5. >>> age_0 = 18
  6. >>> age_0 >= 21 or age_1 >= 21
  7. False
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  

同样,我们首先定义了两个用于存储年龄的变量(见❶)。由于❷处对age_0 的测试通过了,因此整个表达式的结果为True 。接下来,我们将age_0 减小为18;在❸处的测试中,两个测试都没有通过,因此整个表达式的结果为False

5.2.6 检查特定值是否包含在列表中

有时候,执行操作前必须检查列表是否包含特定的值。例如,结束用户的注册过程前,可能需要检查他提供的用户名是否已包含在用户名列表中。在地图程序中,可能需要检查用户提交的位置是否包含在已知位置列表中。

要判断特定的值是否已包含在列表中,可使用关键字in 。来看你可能为比萨店编写的一些代码;这些代码首先创建一个列表,其中包含用户点的比萨配料,然后检查特定的配料是否包含在该列表中。

  1. >>> requested_toppings = ['mushrooms', 'onions', 'pineapple']
  2. >>> 'mushrooms' in requested_toppings
  3. True
  4. >>> 'pepperoni' in requested_toppings
  5. False
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  

在❶处和❷处,关键字in 让Python检查列表requested_toppings 是否包含'mushrooms''pepperoni' 。这种技术很有用,它让你能够在创建一个列表后,轻松地检查其中是否包含特定的值。

5.2.7 检查特定值是否不包含在列表中

还有些时候,确定特定的值未包含在列表中很重要;在这种情况下,可使用关键字not in 。例如,如果有一个列表,其中包含被禁止在论坛上发表评论的用户,就可在允许用户提交评论前检查他是否被禁言:

banned_users.py

  1. banned_users = ['andrew', 'carolina', 'david']
  2. user = 'marie'
  3. if user not in banned_users:
  4. print(user.title() + ", you can post a response if you wish.")
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  

❶处的代码行明白易懂:如果user 的值未包含在列表banned_users 中,Python将返回True ,进而执行缩进的代码行。

用户'marie' 未包含在列表banned_users 中,因此她将看到一条邀请她发表评论的消息:

  1. Marie, you can post a response if you wish.
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  

5.2.8 布尔表达式

随着你对编程的了解越来越深入,将遇到术语布尔表达式 ,它不过是条件测试的别名。与条件表达式一样,布尔表达式的结果要么为True ,要么为False

布尔值通常用于记录条件,如游戏是否正在运行,或用户是否可以编辑网站的特定内容:

  1. game_active = True
  2. can_edit = False
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

在跟踪程序状态或程序中重要的条件方面,布尔值提供了一种高效的方式。

动手试一试

5-1 条件测试 :编写一系列条件测试;将每个测试以及你对其结果的预测和实际结果都打印出来。你编写的代码应类似于下面这样:

  1. car = 'subaru'
  2. print("Is car == 'subaru'? I predict True.")
  3. print(car == 'subaru')
  4.  
  5. print("\nIs car == 'audi'? I predict False.")
  6. print(car == 'audi')
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  • 详细研究实际结果,直到你明白了它为何为TrueFalse

  • 创建至少10个测试,且其中结果分别为TrueFalse 的测试都至少有5个。

5-2 更多的条件测试 :你并非只能创建10个测试。如果你想尝试做更多的比较,可再编写一些测试,并将它们加入到conditional_tests.py中。对于下面列出的各种测试,至少编写一个结果为TrueFalse 的测试。

  • 检查两个字符串相等和不等。

  • 使用函数lower() 的测试。

  • 检查两个数字相等、不等、大于、小于、大于等于和小于等于。

  • 使用关键字andor 的测试。

  • 测试特定的值是否包含在列表中。

  • 测试特定的值是否未包含在列表中。