• 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句


    【写在前面】为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的《Python编程:从入门到实战》书籍开始吧。有问题欢迎在评论区讨论,互相学习,good good study,day day up!上一篇文章《Python编程:从入门到实战》(第2版)学习笔记 第4章 操作列表。在本章中,你将学习如何使用循环遍历整个列表,适用于任何长度的列表。

    【特别说明】这是第二版的《Python编程:从入门到实战》,书本的Python版本是3.7.2,我自己运行代码的环境是3.7.0,不同Python版本的功能不同。

    来源:《Python编程:从入门到实战》(第2版),侵权删!

    在本章中,你将学习简单的if语句以及创建一系列复杂的if语句应用于列表。

    5.1 一个简单示例

    下面演示了如何使用if语句来处理特殊情形。假设你有一个汽车列表,并想打印每辆汽车的名称。大多数汽车以首字母大写的方式打印,但对于汽车名'bmw'以全大写的方式打印。

    >>> cars = ['audi', 'bmw', 'subaru', 'toyota']

    >>> for car in cars:

    >>>         if car == 'bmw':   #检查当前的汽车名是否是'bmw'

    >>>                 print(car.upper())   #如果是,以全大写的方式打印

    >>>         else:

    >>>                 print(car.title())   #否则以首字母大写打印

    输出:
    Audi
    BMW
    Subaru
    Toyota

    5.2 条件测试

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

    5.2.1 检查是否相等

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

    >>> car = 'bmw'   #使用一个等号将car的值设置为'bmw'

    >>> car == 'bmw'   #使用两个等号(==)检查car的值是否为'bmw'

    True

    这个相等运算符在它两边的值相等时返回True,否则返回False。如果变量car的值不是'bmw',上述测试将返回False:

    >>> car = 'audi'  

    >>> car == 'bmw'  #判断变量car的值是'bmw'吗?

    False

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

    在Python中检查是否相等时区分大小写

    >>> car = 'Audi'

    >>> car == 'audi'

    False

    如果大小写很重要,这种行为有其优点。但如果大小写无关紧要,而只想检查变量的值,可将变量的值转换为小写,再进行比较。函数lower()不会修改存储在变量car中的值:

    >>> car = 'Audi'  #将首字母大写的字符串'Audi'存储在变量car中

    >>> car.lower() == 'audi'  #获取变量car的值并将其转换为小写,再将结果与'audi'进行比较

    True

    >>> car

    'Audi'

    5.2.3 检查是否不相等

    要判断两个值是否不等,可使用惊叹号和等号(!=),有时候检查两个值是否不等的效率更高。

    下面把要求的比萨配料存储在一个变量中,再打印一条消息,指出顾客要求的配料是否是意式小银鱼(anchovies):

    >>> requested_topping = 'mushrooms'

    >>> if requested_topping != 'anchovies':

    >>>         print("Hold the anchovies!")

    if语句的条件将requested_topping的值与'anchovies'进行比较,如果它们不相等,Python将返回True,执行紧跟在if语句后面的代码;如果相等,返回False,不执行紧跟在if语句后面的代码。

    这里不相等,因此执行print语句:

    Hold the anchovies!

    5.2.4 比较数字

    检查数值非常简单,例如检查一个人是否是18岁:

    >>> age = 18

    >>> age == 18

    True

    检查两个数字是否不等:

    >>> answer = 17

    >>> if answer != 42:

    >>>         print("That is not the correct answer. Please try again!")

    因为answer(17)不是42,执行print:

    That is not the correct answer. Please try again!

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

    >>> age = 19

    >>> age < 21

    True

    >>> age <= 21

    True

    >>> age > 21

    False

    >>> age >= 21

    False

    5.2.5 检查多个条件

    你可能想同时检查多个条件,关键字and和or可助你一臂之力。

    1. 使用and检查多个条件

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

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

    >>> age_0 = 22

    >>> age_1 = 18

    >>> age_0 >= 21 and age_1 >= 21  #检查这两个变量是否都大于或等于21,左边是,右边不是

    False

    >>> age_1 = 22   #将age_1改为22

    >>> age_0 >= 21 and age_1 >= 21   #两个测试都通过了

    True

    改善可读性,可将每个测试都分别放在一对括号内,但并非必须这样做:

    (age_0 >= 21) and (age_1 >= 21)

    2. 使用or检查多个条件

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

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

    >>> age_0 = 22  #首先定义了两个用于存储年龄的变量

    >>> age_1 = 18

    >>> age_0 >= 21 or age_1 >= 21    #左侧通过测试

    True

    >>> age_0 = 18

    >>> age_0 >= 21 or age_1 >= 21   #两个测试都没有通过

    False

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

    有时执行操作前必须检查列表是否包含特定的值,可使用关键字in。看一个关于比萨店的代码,首先创建一个列表,其中包含用户点的比萨配料,然后检查特定的配料是否包含在该列表中。

    >>> requested_toppings = ['mushrooms', 'onions', 'pineapple']

    >>> 'mushrooms' in requested_toppings

    True

    >>> 'pepperoni' in requested_toppings

    False

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

    可使用关键字not in确定特定的值未包含在列表中。

    例如有一个列表,包含被禁止发表评论的用户,可在允许用户提交评论前检查他是否被禁言:

    >>> banned_users = ['andrew', 'carolina', 'david']

    >>> user = 'marie'

    >>> if user not in banned_users:

    >>>         print(user.title() + ", you can post a response if you wish.")

    如果user的值未包含在列表banned_users中,Python将返回True。用户'marie'未包含在列表banned_users中,因此她将看到一条邀请她发表评论的消息:

    Marie, you can post a response if you wish.

    5.2.8 布尔表达式

    布尔表达式条件测试的别名,它的结果为True或者False,例如game_active = True和can_edit = False。在跟踪程序状态或程序中重要的条件方面,布尔值提供了一种高效的方式。

    5.3 if 语句

    理解条件测试后,就可以编写if语句。if语句有很多种,选择使用哪种取决于要测试的条件数。

    5.3.1 简单的 if 语句

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

    if conditional_test:

            do something

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

    假设你想知道某人是否够投票的年龄:

    >>> age = 19

    >>> if age >= 18:   #检查变量age的值是否大于或等于18

    >>>         print("You are old enough to vote!")

    if语句条件判断为True,因此执行print语句:

    You are old enough to vote!

    在if语句中,缩进的作用与for循环中相同。

    下面在一个人够投票的年龄时再打印一行输出,问他是否登记了:

    >>> 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,将不会有任何输出。

    5.3.2 if-else 语句

    经常需要在条件测试通过了时执行一个操作,并在没有通过时执行另一个操作;在这种情况下,可使用if-else语句

    >>> age = 17

    >>> if age >= 18:

    >>>         print("You are old enough to vote!")

    >>>         print("Have you registered to vote yet?")

    >>> else:

    >>>         print("Sorry, you are too young to vote.")

    >>>         print("Please register to vote as soon as you turn 18!")

    这次age小于18,条件测试未通过,因此执行else代码块中的代码:

    Sorry, you are too young to vote.
    Please register to vote as soon as you turn 18!

    上述代码之所以可行,是因为只存在两种情形:要么够投票的年龄,要么不够。if-else结构非常适合用于要让Python执行两种操作之一的情形。

    5.3.3 if-elif-else 结构

    经常需要检查超过两个的情形,可使用if-elif-else结构,依次检查每个条件测试,直到遇到通过了的条件测试,将执行紧跟在它后面的代码,并跳过余下的测试。

    很多时候需要考虑的情形都超过两个。例如一个根据年龄段收费的游乐场:

    • 4岁以下免费;
    • 4~18岁收费25美元;
    • 18岁(含)以上收费40美元。

    如果只使用一条if语句,如何确定门票价格呢?

    >>> age = 12

    >>> if age < 4:

    >>>         print("Your admission cost is $0.")

    >>> elif age < 18:

    >>>         print("Your admission cost is $25.")

    >>> else:

    >>>         print("Your admission cost is $40.")

    上述代码这个人不小于4岁,因此第一个测试未通过,但是满足第二个测试未满18岁(12小于18),Python将打印相应的消息,并跳过else代码块。如果if测试和elif测试都未通过,Python将运行else代码块中的代码。输出:

    Your admission cost is $25.

    为让代码更简洁,可以这样做:

    >>> age = 12

    >>> if age < 4:

    >>>         price = 0

    >>> elif age < 18:

    >>>         price = 25

    >>> else:

    >>>         price = 40

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

    上述代码根据人的年龄设置变量price的值。在if-elif-else结构中设置price的值后,一条未缩进的print语句会根据这个变量的值打印一条消息,指出门票的价格。

    这些代码的输出与前一个示例相同,除效率更高外,这些修订后的代码还更容易修改

    5.3.4 使用多个 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(含)时,才会执行这个代码块。

    5.3.5 省略 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("Your admission cost is $" + str(price) + ".")

    最后一个elif代码块在顾客的年龄超过65(含)时,将价格设置为20美元,这比使用else代码块更清晰些。

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

    5.3.6 测试多个条件

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

    有时候必须检查你关心的所有条件。在这种情况下,应使用一系列不包含elif和else代码块的简单if语句。

    下面再来看前面的比萨店示例。

    >>> requested_toppings = ['mushrooms', 'extra cheese']  #创建列表,包含顾客点的配料

    >>> if 'mushrooms' in requested_toppings:   #检查顾客是否点了配料蘑菇('mushrooms')

    >>>         print("Adding mushrooms.")

    >>> if 'pepperoni' in requested_toppings:   #检查配料辣香肠('pepperoni')

    >>>         print("Adding pepperoni.")

    >>> if 'extra cheese' in requested_toppings:  #检查是否要求多加芝士('extra cheese')

    >>>         print("Adding extra cheese.")

    >>>

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

    Adding mushrooms.

    Finished making your pizza!

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

    5.4 使用 if 语句处理列表

    通过结合使用if语句和列表,可完成一些有趣的任务:对列表中特定的值做特殊处理;高效地管理不断变化的情形,如餐馆是否还有特定的食材;证明代码在各种情形下都将按预期那样运行。

    5.4.1 检查特殊元素

    继续看比萨店示例。这家比萨店在制作比萨时,每添加一种配料都打印一条消息。通过创建一个列表,在其中包含顾客点的配料,并使用一个循环来指出添加到比萨中的配料:

    >>> requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']

    >>> for requested_topping in requested_toppings:

    >>>         print("Adding " + requested_topping + ".")

    >>> print("\nFinished making your pizza!")

    输出:

    Adding mushrooms.
    Adding green peppers.
    Adding extra cheese.

    Finished making your pizza!

    如果比萨店的青椒用完了,该如何处理?为妥善地处理这种情况,可在for循环中包含一条if语句:

    >>> for requested_topping in requested_toppings:

    >>>         if requested_topping == 'green peppers':   #检查顾客点的是否是青椒

    >>>                 print("Sorry, we are out of green peppers right now.")

    >>>         else:     #确保其他配料都将添加到比萨中

    >>>                 print("Adding " + requested_topping + ".")

    >>> print("\nFinished making your pizza!")

    输出表明,妥善地处理了顾客点的每种配料:

    Adding mushrooms.
    Sorry, we are out of green peppers right now.
    Adding extra cheese.

    Finished making your pizza!

    5.4.2 确定列表不是空的

    到目前为止,对于处理的每个列表都做了一个简单的假设,即假设它们都至少包含一个元素。但是实际情况不是如此,在运行for循环前确定列表是否为空很重要。

    下面在制作比萨前检查顾客点的配料列表是否为空。如果列表是空的,就向顾客确认他是否要点普通比萨;如果列表不为空,就像前面的示例那样制作比萨:

    >>> requested_toppings = []   #创建了一个空列表

    >>> if requested_toppings:   

    >>>         for requested_topping in requested_toppings:

    >>>                 print("Adding " + requested_topping + ".")

    >>>         print("\nFinished making your pizza!")

    >>> else:

    >>>         print("Are you sure you want a plain pizza?")

    在这里,这个列表为空,因此输出如下:

    Are you sure you want a plain pizza?

    5.4.3 使用多个列表

    顾客的要求往往五花八门,在比萨配料方面尤其如此。如果顾客要在比萨中添加炸薯条,该怎么办呢?可使用列表和if语句

    来看看在制作比萨前如何拒绝怪异的配料要求。下面定义了两个列表,第一个列表包含比萨店供应的配料,而第二个列表包含顾客点的配料。这次对于requested_toppings中的每个元素,都检查它是否是比萨店供应的配料,再决定是否在比萨中添加它:

    >>> available_toppings = ['mushrooms', 'olives', 'green peppers','pepperoni', 'pineapple', 'extra cheese']  #定义了一个包含比萨店供应配料的列表

    >>> requested_toppings = ['mushrooms', 'french fries', 'extra cheese']  #包含顾客点的配料的列表

    >>> for requested_topping in requested_toppings:   #遍历顾客点的配料列表

    >>>         if requested_topping in available_toppings:  #检查它是否包含在供应的配料列表中

    >>>                 print("Adding " + requested_topping + ".")  #将其加入到比萨中

    >>>         else:

    >>>                 print("Sorry, we don't have " + requested_topping + ".") #告诉顾客不供应这种配料

    >>>         print("\nFinished making your pizza!")

    这些代码的输出整洁而详实:

    Adding mushrooms.
    Sorry, we don't have french fries.
    Adding extra cheese.

    Finished making your pizza!

    5.5 设置 if 语句的格式

    本章的每个示例都展示了良好的格式设置习惯。在条件测试的格式设置方面,PEP 8提供的唯一建议是,在诸如==、>=和<=等比较运算符两边各添加一个空格,例如,if age < 4:要比if age<4:好。这样的空格不会影响代码解读,让代码阅读起来更容易。

    5.6 小结

    本章学习了如何编写结果要么为Ture要么为False的条件测试;如何编写简单的if语句、if-else语句和if-elif-else结构;如何在利用高效的for循环的同时,以不同于其他元素的方式对特定的列表元素进行处理。

    说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。 

  • 相关阅读:
    【数据集标注】上古软件LabelImg的保姆级使用教程
    【java实验】在项目中使用Java常用类
    读论文(人真皮成纤维细胞受紫外线辐射引起基因表达动态变化)
    这种动态规划你见过吗——状态机动态规划之股票问题(中)
    贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解
    schtasks windows定时任务参数及常见问题
    字符串匹配——KMP算法
    【Hack The Box】windows练习-- love
    I/O多路复用三种实现
    基于SSM+SpringBoot+Vue的车辆物流管理系统
  • 原文地址:https://blog.csdn.net/csdn_xmj/article/details/126386294