Python if语句

理解条件测试后,就可以开始编写if语句了。if语句有很多种,选择使用哪种取决于要测试的条件数。前面讨论条件测试时,列举了多个if语句示例,下面更深入地讨论这个主题。

简单的if语句

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

if conditional_test:
    do something

在第1行中,可包含任何条件测试,而在紧跟在测试后面的缩进代码块中,可执行任何操作。如果条件测试的结果为True,Python就会执行紧跟在if语句后面的代码;否则Python将忽略这些代码。

假设有一个表示某人年龄的变量,而你想知道这个人是否够投票的年龄,可使用如下代码:

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

在(1)处,Python检查变量age的值是否大于或等于18;答案是肯定的,因此Python执行后面缩进的print语句:

You are old enough to vote!

在if语句中,缩进的作用与for循环中相同。如果测试通过了,将执行if语句后面所有缩进的代码行,否则将忽略它们。

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 yong to vote.")
    print("Please register to vote as soon as you turn 18!")

如果(1)处的条件测试通过了,就执行第一个缩进的print语句块;如果测试结果为False,就执行(2)处的else代码块。这次age小于18,条件测试未通过,因此执行else代码块中的代码:

Sorry, you are too yong 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岁收费5美元;
  • 18岁(含)以上收费10美元。

如果只使用一条if语句,如何确定门票价格呢?下面的代码确定一个人所属的年龄段,并打印一条包含门票价格的消息:

age = 12
if age < 4:
    print("You admission cost is $0.")
elif age < 18:
    print("Your admission cost is $5.")
else:
    print("Your admission cost is $10.")

在这个示例中,第一处测试的结果为False,因此不执行其代码块。然而,第二个测试的结果为True(12小于18),因此将执行其代码块。输出为一个句子,向用户指出了门票价格:

Your admission cost is $5.

只要年龄超过17岁,前两个测试就都不能通过。在这种情况下,将执行else代码块,指出门票价格为10美元。

为让代码更简洁,可不在if-elif-else代码块中打印门票价格,而只在其中设置门票价格,并在它后面添加一条简单的print语句:

age = 12
if age < 4:
    price = 0
elif age < 18:
    price = 5
else:
    price = 10
print("Your admission cost is $" + str(price) + ".")

这些代码的输出与前一个示例相同,但if-elif-else结构的作用更小,它只确定门票价格,而不是在确定门票价格的同时打印一条消息。除效率更高外,这些修订后的代码还更容易修改:要调整输出消息的内容,只需修改一条而不是三条print语句。

使用多个elif代码块

可根据需要使用任意数量的elif代码块,例如,假设前述游乐场要给老年人打折,可再添加一个条件测试,判断顾客是否符合打折条件。下面假设对于65岁(含)以上的老人,可以半价(即5美元)购买门票:

age = 12
if age < 4:
    price = 0
elif age < 18:
    price = 5
elif age < 65:
    price = 10
else:
    price = 5
print("Your admission cost is $" + str(price) + ".")

这些代码大都未变。第二个elif代码块通过检查确定年龄不到65岁后,才将门票价格设置为全票价格——10美元。请注意,在else代码块中,必须将所赋的值改为5,因为仅当年龄超过65(含)时,才会执行这个代码块。

省略else代码块

Python并不要求if-elif结构后面必须有else代码块。在有些情况下,else代码块很有用;而在其他一些情况下,使用一条elif语句来处理特定的情形更清晰:

age = 12
if age < 4:
    price = 0
elif age < 18:
    price = 5
elif age >= 65: #(1)
    price = 5
print("Your admission cost is $" + str(price) + ".")

(1)处的elif代码块在顾客的年龄超过65(含)时,将价格设置为5美元,这比使用else代码块更清晰些。经过这样的修改后,每个代码块都仅在通过了相应的测试时才会执行。

else是一条包罗万象的语句,只要不满足任何if或elif中的条件测试,其中的代码就会执行,这可能会引入无效甚至恶意的数据。如果知道最终要测试的条件,应考虑使用一个elif代码块来代替else代码块。这样,你就可以肯定,仅当满足相应的条件时,你的代码才会执行。

测试多个条件

if-elif-else结构功能强大,但仅适合用于只有一个条件满足的情况:遇到通过了的测试后,Python就跳过余下的测试。这种行为很好,效率很高,让你能够测试一个特定的条件。

然而,有时候必须检查你关心的所有条件。在这种情况下,应使用一系列不包含elif和else代码块的简单if语句。在可能有多个条件为True,且你需要在每个条件为True时都采取相应措施时,适合使用这种方法。

下面再来看前面的比萨店示例。如果顾客点了两种配料,就需要确保在其比萨中包含这些配料:

requested_toppings = ['mushrooms', 'extra cheese', 'coolcou']
if 'mushrooms' in requested_toppings: #(1)
    print("Adding mushrooms.")
if 'pepperoni' in requested_toppings: #(2)
    print("Adding pepperoni.")
if 'extra cheese' in requested_toppings: #(3)
    print("Adding extra cheese.")
print("\nFinished making your pizza!")

我们首先创建了一个列表,其中包含顾客点的配料。(1)处的if语句检查顾客是否点了配料蘑菇(’mushrooms’),如果点了,就打印一条确认消息。(2)处检查配料辣香肠(’pepperoni’)的代码也是一个简单的if语句,而不是elif或else语句;因此不管前一个测试是否通过,都将进行这个测试。(3)处的代码检查顾客是否要求多加芝士(’extra cheese’);不管前两个测试的结果如何,都会执行这些代码。每当这个程序运行时,都会进行这三个独立的测试。

在这个示例中,会检查每个条件,因此将在比萨中添加蘑菇并多加芝士:

Adding mushrooms.
Adding extra cheese.

Finished making your pizza!

如果像下面这样转而使用if-elif-else结构,代码将不能正确地运行,因为有一个测试通过后,就会跳过余下的测试:

requested_toppings = ['mushrooms', 'extra cheese', 'coolcou']
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’,它通过了,因此将在比萨中添加蘑菇。然而,Python将跳过if-elif-else结构中余下的测试,不再检查列表中是否包含’extra cheese’和’pepperoni’。其结果是,将添加顾客点的第一种配料,但不会添加其他的配料:

Adding mushrooms.

Finished making your pizza!

总之,如果你只想执行一个代码块,就使用if-elif-else结构;如果要运行多个代码块,就使用一系列独立的if语句。

赞(0)

评论 抢沙发

评论前必须登录!