本页面仅用于内容预览,不包含动画交互效果
讲义加载中,请耐心等待……
Python 编程:从入门到实践Python 编程:从入门到实践(第三版)(第三版)Teacher Name / Email1
与《Python 编程:从入门到实践(第三版)》一书配套使用讲义中的文本及绘图采用署名-非商业性使用-相同方式共享协议CC BY-NC-SA 4.0进行许可引用的网络图片附有超链接,可用于访问来源讨论、意见、答疑、勘误、更新:https://github.com/scruel/pcc_3e_slides作者:@Scruel Tao关于本讲义关于本讲义2
55 ifif 语句语句5.1 一个简单的示例5.2 条件测试5.3 if 语句5.4 使用 if 语句处理列表5.5 设置 if 语句的格式5.6 小结3
5.15.1 一个简单的示例一个简单的示例下面的示例将会遍历列表,并以首字母大写的方式打印其中的汽车名,特殊地以全大写的形式打印 'bmw'cars = ['audi', 'bmw', 'subaru', 'toyota']for car in cars: if car == 'bmw': print(car.upper()) else: print(car.title())运行结果AudiBMWSubaruToyota4
5.25.2 条件测试条件测试条件测试表达式:一个值为 True False 的表达式Python 根据条件测试的值来决定是否执行 if 语句中的代码True5
5.25.2 条件测试条件测试条件测试表达式:一个值为 True False 的表达式Python 根据条件测试的值来决定是否执行 if 语句中的代码False条件测试条件测试的值6
5.25.2 条件测试:相等条件测试:相等条件测试表达式:一个值为 True False 的表达式Python 根据条件测试的值来决定是否执行 if 语句中的代码我们使用相等运算符(用 == 表示)来判断两侧是否相等:代码使用了常见小技巧:在比较时忽略大小写car = 'Audi'print(car == 'audi')print(car.lower() == 'audi')运行结果FalseTrue7
5.25.2 条件测试:不等条件测试:不等条件测试表达式:一个值为 True False 的表达式Python 根据条件测试的值来决定是否执行 if 语句中的代码我们使用不等运算符(用 != 表示)来判断两侧是否不相等:car = 'Audi'print(car != 'audi')print(car.lower() != 'audi')运行结果TrueFalse8
5.25.2 条件测试:数值比较条件测试:数值比较条件测试表达式:一个值为 True False 的表达式Python 根据条件测试的值来决定是否执行 if 语句中的代码我们使用关系运算符(小于、小于等于、大于、大于等于)来比较数值:>>> age = 19>>> age < 21>>> age <= 21>>> age > 21>>> age >= 21运行结果TrueTrueFalseFalse9
5.25.2 条件测试:布尔运算条件测试:布尔运算andor 关键字:用于布尔运算,分别表示和/或。>>> age_0 = 22>>> age_1 = 18>>> age_0 >= 21 and age_1 >= 21>>> age_0 >= 21 or age_1 >= 21运行结果FalseTrue10
5.25.2 条件测试:布尔运算条件测试:布尔运算not 关键字:用于布尔运算,表示非。in 关键字:用于检查特定值是否在集合中。requested_toppings = ['mushrooms', 'onions']print('mushrooms' in requested_toppings)print('pepperoni' in requested_toppings)print()print('mushrooms' not in requested_toppings)print('pepperoni' not in requested_toppings)运行结果TrueFalseFalseTrue11
5.25.2 条件测试:布尔运算条件测试:布尔运算布尔表达式:条件测试的别名,结果不是 True 就是 False布尔值变量:存储布尔表达式结果的变量game_active = Truecan_edit = False12
5.25.2 条件测试:布尔运算条件测试:布尔运算布尔表达式:条件测试的别名,结果不是 True 就是 False布尔值变量:存储布尔表达式结果的变量布尔值通常用于记录条件,如游戏是否正在运行等game_active = screen_active and not game_pausedcan_edit = admin_user or owner_user13

上面的两个例子:

- 如果屏幕是激活的(screen_active = True),且游戏没有被暂停(game_paused = False),那么游戏被视为是激活的(game_active = True)

- 如果用户既不是管理员(admin_user = False)也不是所有者(owner_user = False),那么就不能编辑(can_edit = False)

5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理之前的条件测试均为假的情况。age = 17if 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!")14
5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理之前的条件测试均为假的情况。age = 17if 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!")运行结果Sorry, you are too young to vote.Please register to vote as soon as you turn 18!15
5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理之前的条件测试均为假的情况。16

如果 if 语句处的条件为 True,即测试通过,就执行第一组缩进的代码块(灰色)

如果测试的结果为 False,就执行第二组缩进的代码块(else 后的)

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

5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理 if elif 的条件均为假的情况。elif:可有零个或多个,当 if 的条件为假时,依次检查处理。age = 17if age < 4: print("Your admission cost is $0.")elif age < 18: print("Your admission cost is $25.")else: print("Your admission cost is $40.")运行结果Your admission cost is $25.17

elif: 即 else if 的缩写形式,python 偏好在无歧义的地方多使用缩写形式,能少打一些字符。

5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理 if elif 的条件均为假的情况。elif:可有零个或多个,当 if 的条件为假时,依次检查处理。1218

1 处的 if 测试检查一个人是否未满 4 岁,2 处的 elif 代码行其实是另一个 if 测试,它仅在前面的测试未通过时才会运行。

在这里,由于这个人不小于 4 岁,因此第一个条件测试未通过。

程序接着判断,由于这个人未满 18 岁,因此第二个条件测试通过了,Python 打印相应的消息,并跳过 else 代码块。

5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理 if elif 的条件均为假的情况。elif:可有零个或多个,当 if 的条件为假时,依次检查处理。age = 25if age < 4: print("Your admission cost is $0.")elif age < 18: print("Your admission cost is $25.")else: print("Your admission cost is $40.")运行结果Your admission cost is $40.19
5.35.3 ifif 语句语句依次检查每个条件测试,选择执行首个为真或 else 中的子块代码。else:可有零个或一个,处理 if elif 的条件均为假的情况。elif:可有零个或多个,当 if 的条件为假时,依次检查处理。20

当用户年满 18 岁时,前两个条件测试都不能通过。在这种情况下,将执行 else 代码块,指出门票价格为 40 美元。

5.35.3 ifif 语句:测试多个条件语句:测试多个条件我们当然也可以创建多个 if 块,来检查想要检查的所有条件:requested_toppings = ['mushrooms', 'extra cheese']if 'mushrooms' in requested_toppings: print("Adding mushrooms.")if 'pepperoni' in requested_toppings: print("Adding pepperoni.")if 'extra cheese' in requested_toppings: print("Adding extra cheese.")print("\nFinished making your pizza!")运行结果Adding mushrooms.Adding extra cheese.Finished making your pizza!21
5.35.3 ifif 语句:测试多个条件语句:测试多个条件比较一下,如果使用 elifrequested_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!")22
5.35.3 ifif 语句:测试多个条件语句:测试多个条件比较一下,如果使用 elifrequested_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!")运行结果Adding mushrooms.Finished making your pizza!23
5.4.15.4.1 检查特殊元素检查特殊元素我们在本章开始时的例子中,已经尝试过处理特殊值 'bmw'24
5.4.15.4.1 检查特殊元素检查特殊元素下面我们继续披萨店的例子,来特殊处理当火腿用完时的情况:requested_toppings = ['mushrooms', 'ham']for requested_topping in requested_toppings: if requested_topping == 'ham': print("Sorry, we are out of ham right now.") else: print(f"Adding {requested_topping}.")print("\nFinished making your pizza!")运行结果Adding mushrooms.Sorry, we are out of ham right now.Finished making your pizza!25
5.4.25.4.2 确定列表非空确定列表非空我们可以将列表名用作条件表达式这个表达式只有当列表至少包含一个元素时才为 Truerequested_toppings = []if requested_toppings: for requested_topping in requested_toppings: print(f"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?26

将数值 0、空值 None、空字符串“”、空列表[]、空元组()、空字典{} 用作条件表达式时,Python 都会返回 False。

5.4.35.4.3使用多个列表使用多个列表来一点复杂的例子,我们通过两个列表来分别表示店内可用的配料,和顾客请求的配料,并根据情况告知顾客制作披萨的过程:available_toppings = ['mushrooms', 'ham', 'cheese']requested_toppings = ['mushrooms', 'cookies', 'cheese']for requested_topping in requested_toppings: if requested_topping in available_toppings: print(f"Adding {requested_topping}.") else: print(f"Sorry, we don't have {requested_topping}.")print("\nFinished making your pizza!")27

首先定义一个列表,其中包含比萨店供应的配料。(当然了,如果比萨店供应的配料是固定的,也可以使用一个元组来存储它们。)

然后创建另一个列表,其中包含顾客点的配料,注意其中包含了一个比萨店不存在的配料 'french fries'。

接下来,遍历顾客点的配料列表。在这个循环中,对于顾客点的每种配料,我们都会通过箭头处 if 语句块来检查它是否在披萨店供应的配料列表中。

如果答案是肯定的,就将其加入比萨,否则打印一条消息,告诉顾客不供应这种配料。

5.4.35.4.3使用多个列表使用多个列表来一点复杂的例子,我们通过两个列表来分别表示店内可用的配料,和顾客请求的配料,并根据情况告知顾客制作披萨的过程:运行结果Adding mushrooms.Sorry, we don't have cookies.Adding extra cheese.Finished making your pizza!通过寥寥几行代码,我们高效地处理了一种真实的情形!28
5.55.5 编码建议编码建议在条件测试方面,建议在运算符两边各添加一个空格:age = 10if age < 4: print("...")elif age < 18: print("...")elif age < 40: print("...")age=10if age<4: print("...")elif age<18: print("...")elif age<40: print("...")可读性更好29
5.65.6 小结小结学习了如何编写条件测试。学习了编写简单的 if 语句、if-else 语句和 if-elif-else 语句。学习了如何使用 for 循环高效处理列表元素,处理特殊元素。再次学习了在代码格式方面提出的建议。在下一章中,我们将学习字典的相关知识,并且将字典于列表和 if 语句结合起来使用,以模拟现实世界中的更多情形。30
课后拓展课后拓展练习书中的动手试一试学习数值的连续比较运算符了解什么是流程图可选拓展尝试书写嵌套的 if 判断语句学习 Python 中的三目运算符写法了解逻辑判断的短路机制学习模式匹配(match-case)的语法31

可选拓展建议配合阅读《流畅的 Python》等进阶书籍