if 语句

了解条件测试后,就可以开始编写 if 语句了。 存在几种不同类型的 if 语句,您选择使用哪种取决于您需要测试的条件数量。 您在有关条件测试的讨论中看到了 if 语句的几个示例,但现在让我们更深入地探讨该主题。

简单的if语句

最简单的 if 语句有一个测试和一个动作:

if conditional_test:
    do something

您可以将任何条件测试放在第一行,然后将几乎任何操作放在测试后的缩进块中。 如果条件测试的计算结果为 True ,Python 将执行 if 语句之后的代码。 如果测试的计算结果为 False ,Python 将忽略 if 语句之后的代码。

假设我们有一个代表一个人年龄的变量,我们想知道这个人是否达到可以投票的年龄。 下面的代码测试这个人是否可以投票:

age = 19
if age >= 18:
    print("You are old enough to vote!")

Python 检查 age 的值是否大于或等于 18。是的,因此 Python 执行缩进的 print() 调用:

You are old enough to vote!

缩进在 if 语句中的作用与它在 for 循环中的作用相同。 如果测试通过,将执行 if 语句后的所有缩进行,如果测试未通过,将忽略整个缩进行块。

在 if 语句之后的块中,您可以拥有任意多行代码。 让我们添加另一行输出,如果这个人已经到了可以投票的年龄,询问这个人是否已经登记投票:

age = 19
if age >= 18:
    print("You are old enough to vote!")
    print("Have you registered to vote yet?")

条件测试通过,并且两个 print() 调用都缩进了,因此打印了两行:

You are old enough to vote!
Have you registered to vote yet?

如果 age 的值小于 18,则该程序不会产生任何输出。

if-else语句

通常,您会希望在条件测试通过时执行一个操作,而在所有其他情况下执行不同的操作。 Python 的 if-else 语法使这成为可能。 if-else 块类似于简单的 if 语句,但 else 语句允许您定义在条件测试失败时执行的一个动作或一组动作。

如果该人已达到可以投票的年龄,我们将显示与之前相同的消息,但这次我们将为未达到投票年龄的任何人添加一条消息:

age = 17
if age >= 18: (1)
    print("You are old enough to vote!")
    print("Have you registered to vote yet?")
else: (2)
    print("Sorry, you are too young to vote.")
    print("Please register to vote as soon as you turn 18!")
1 如果条件测试通过,则执行第一块缩进的 print() 调用。
2 如果测试评估为 False,则执行 else 块。 因为这次 age 小于 18 ,所以条件测试失败,执行 else 块中的代码:
Sorry, you are too young to vote.
Please register to vote as soon as you turn 18!

这段代码之所以有效,是因为它只有两种可能的情况需要评估:一个人要么已经到了可以投票的年龄,要么还没有到可以投票的年龄。 if-else 结构在您希望 Python 始终执行两个可能操作之一的情况下效果很好。 在像这样的简单 if-else 链中,始终会执行两个操作之一。

if-elif-else语句

通常,您需要测试两种以上的可能情况,要评估这些情况,您可以使用 Python 的 if-elif-else 语法。 Python 只执行 if-elif-else 链中的一个块。 它按顺序运行每个条件测试,直到一个通过。 当测试通过时,将执行该测试之后的代码,Python 会跳过其余的测试。

许多现实世界的情况涉及两种以上的可能情况。 例如,考虑一个对不同年龄组收取不同费用的游乐园:

  • 4 岁以下的任何人都可以免费入场。

  • 4 至 18 岁之间的任何人的入场费为 25 美元。

  • 18 岁或以上的任何人的入场费为 40 美元。

我们如何使用 if 语句来确定一个人的录取率? 以下代码测试一个人的年龄组,然后打印入场价格消息:

age = 12
if age < 4: (1)
    print("Your admission cost is $0.")
elif age < 18: (2)
    print("Your admission cost is $25.")
else: (3)
    print("Your admission cost is $40.")
1 if 测试检查一个人是否小于 4 岁。 当测试通过时,会打印一条适当的消息,Python 会跳过其余的测试。
2 elif 行实际上是另一个 if 测试,它仅在前一个测试失败时运行。 在链中的这一点上,我们知道这个人至少 4 岁,因为第一次测试失败了。 如果此人未满 18 岁,则会打印一条适当的消息,Python 会跳过 else 块。
3 如果 if 和 elif 测试都失败了,Python 会运行 else 块中的代码。

在此示例中,if 测试的计算结果为 False,因此不执行其代码块。 但是,elif 测试的计算结果为 True(12 小于 18),因此它的代码被执行。 输出是一句话,告知用户入场费用:

Your admission cost is $25.

任何大于 17 岁的人都会导致前两项测试失败。 在这些情况下,将执行 else 块,入场价格为 40 美元。

与其在 if-elif-else 块中打印入场价格,不如仅在 if-elif-else 链中设置价格,然后在评估链后运行单个 print() 调用会更简洁:

age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
else:
    price = 40

print(f"Your admission cost is ${price}.")

缩进线根据人的年龄设置价格值,如前例所示。 在 if-elif-else 链设置价格后,一个单独的未缩进的 print() 调用使用此值显示一条消息,报告此人的入场价格。

此代码产生与前面示例相同的输出,但 if-elif-else 链的用途更窄。 它不是确定价格并显示消息,而是简单地确定入场价格。 除了效率更高之外,修改后的代码比原来的方法更容易修改。 要更改输出消息的文本,您只需要更改一个 print() 调用,而不是三个单独的 print() 调用。

使用多个elif代码块

您可以在代码中使用任意数量的 elif 块。 例如,如果游乐园要为老年人实施折扣,您可以在代码中再添加一个条件测试来确定某人是否有资格享受老年人折扣。 假设任何 65 岁或以上的人支付正常入场费的一半,即 20 美元:

age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
elif age < 65:
    price = 40
else:
    price = 20

print(f"Your admission cost is ${price}.")

此代码的大部分未更改。 第二个 elif 块现在会检查以确保一个人的年龄小于 65 岁,然后再为他们分配 40 美元的全额录取率。 请注意,else 块中分配的值需要更改为 $20,因为进入该块的唯一年龄是 65 岁或以上的人。

省略else代码块

Python 不需要在 if-elif 链的末尾有一个 else 块。 有时,else 块很有用。 其他时候,使用附加的 elif 语句来捕获感兴趣的特定条件会更清楚:

age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
elif age < 65:
    price = 40
elif age >= 65:
    price = 20

print(f"Your admission cost is ${price}.")

最后的 elif 块在 65 岁或以上时分配 20 美元的价格,这比一般的 else 块更清楚一点。 通过此更改,每个代码块都必须通过特定测试才能执行。 else 块是一个包罗万象的语句。 它匹配特定 if 或 elif 测试不匹配的任何条件,有时可能包含无效甚至恶意数据。 如果您要测试特定的最终条件,请考虑使用最终的 elif 块并省略 else 块。 因此,您会更有信心您的代码只会在正确的条件下运行。

测试多个条件

if-elif-else 链很强大,但只适用于只需要通过一个测试的情况。 一旦 Python 找到一个通过的测试,它就会跳过其余的测试。 这种行为是有益的,因为它很有效并且允许您测试一个特定的条件。 但是,有时检查所有感兴趣的条件很重要。 在这种情况下,您应该使用一系列没有 elif 或 else 块的简单 if 语句。 当多个条件可能为 True 并且您想对每个为 True 的条件采取行动时,此技术很有意义。 让我们重新考虑比萨店的例子。 如果有人点了两种配料的披萨,你需要确保在他们的披萨上包含两种配料:

requested_toppings = ['mushrooms', 'extra cheese']

if 'mushrooms' in requested_toppings:
    print("Adding mushrooms.")
if 'pepperoni' in requested_toppings: (1)
    print("Adding pepperoni.")
if 'extra cheese' in requested_toppings:
    print("Adding extra cheese.")
    
print("\nFinished making your pizza!")
1 我们从包含要求的浇头(食物配料)的列表开始。 第一个 if 语句检查此人是否要求在他们的比萨饼上加蘑菇。 如果是这样,将打印一条消息,确认该浇头。 pepperoni 的测试是另一个简单的 if 语句,而不是 elif 或 else 语句,所以不管前面的测试是否通过,都会运行这个测试。 最后一个 if 语句检查是否需要额外的奶酪(cheese),而不管前两个测试的结果如何。 每次运行该程序时都会执行这三个独立的测试。

因为这个例子中的每个条件都被评估,蘑菇(mushrooms)和额外的奶酪(cheese)都被添加到比萨饼(pizza)中:

Adding mushrooms.
Adding extra cheese.

Finished making your pizza!

如果我们使用 if-elif-else 块,这段代码将无法正常运行,因为代码将在仅通过一次测试后停止运行。 这是它的样子:

requested_toppings = ['mushrooms', 'extra cheese']

if 'mushrooms' in requested_toppings:
    print("Adding mushrooms.")
elif 'pepperoni' in requested_toppings:
    print("Adding pepperoni.")
elif 'extra cheese' in requested_toppings:
    print("Adding extra cheese.")

print("\nFinished making your pizza!")

'mushrooms' 测试是第一个通过的测试,因此将蘑菇添加到比萨饼中。 然而,'extra cheese' 和 'pepperoni' 的值永远不会被检查,因为 Python 不会运行任何超出 if-elif-else 链中通过的第一个测试的测试。 将添加客户的第一个浇头,但将错过所有其他浇头:

Adding mushrooms.

Finished making your pizza!

总之,如果您只想运行一个代码块,请使用 if-elif-else 链。 如果需要运行多个代码块,请使用一系列独立的 if 语句。

自己试试
5-3.Alien Colors #1

想象一个外星人刚刚在游戏中被击落。 创建一个名为 alien_color 的变量,并为其分配一个值“green”、“yellow”或“red”。 编写一个 if 语句来测试外星人的颜色是否为绿色。 如果是,则打印玩家刚刚获得 5 分的消息。 编写该程序的一个版本,通过 if 测试,另一个版本失败。 (失败的版本将没有输出。)

5-4.Alien Colors #2

像练习 5-3 中那样为外星人选择一种颜色,然后编写一个 if-else 链。 如果外星人的颜色是绿色,则打印一条声明,说明玩家刚刚因射击外星人而获得 5 分。 如果外星人的颜色不是绿色,则打印玩家刚刚获得 10 分的声明。 编写该程序的一个版本,运行 if 块,另一个版本运行 else 块。

5-5.Alien Colors #3

将练习 5-4 中的 if-else 链变成 ifelif-else 链。 如果外星人是绿色的,则打印玩家获得 5 分的消息。 如果外星人是黄色的,则打印玩家获得 10 分的消息。 如果外星人是红色的,则打印玩家获得 15 分的消息。 编写这个程序的三个版本,确保每条消息都为相应颜色的外星人打印。

5-6.Stages of Life

写一个 if-elif-else 链,决定一个人的人生阶段。 为变量 age 设置一个值,然后: 如果此人小于 2 岁,则打印此人是婴儿的消息。 如果此人至少 2 岁但小于 4 岁,则打印一条消息,说明此人是蹒跚学步的孩子。 如果此人至少 4 岁但小于 13 岁,则打印此人是小孩的消息。 如果此人至少 13 岁但不到 20 岁,则打印此人是青少年的消息。 如果此人至少 20 岁但小于 65 岁,则打印此人已成年的消息。 如果此人年满 65 岁或以上,则打印此人是长者的消息。

5-7.Favorite Fruit

列出你最喜欢的水果,然后编写一系列独立的 if 语句来检查列表中的某些水果。 列出您最喜欢的三种水果,并将其命名为 favorite_fruits。 写五个 if 语句。 每个人都应该检查某种水果是否在您的清单中。 如果水果在您的列表中,则 if 块应该打印一条语句,例如您真的很喜欢香蕉!