本页面仅用于内容预览,不包含动画交互效果
讲义加载中,请耐心等待……
Python 编程:从入门到实践Python 编程:从入门到实践(第三版)(第三版)Teacher Name / Email1
与《Python 编程:从入门到实践(第三版)》一书配套使用讲义中的文本及绘图采用署名-非商业性使用-相同方式共享协议CC BY-NC-SA 4.0进行许可引用的网络图片附有超链接,可用于访问来源讨论、意见、答疑、勘误、更新:https://github.com/scruel/pcc_3e_slides作者:@Scruel Tao关于本讲义关于本讲义2
44 操作列表操作列表4.1 遍历整个列表4.2 避免缩进错误4.3 创建数值列表4.4 使用列表的一部分4.5 元组4.6 设置代码格式4.7 小结3
4.14.1 遍历整个列表遍历整个列表我们经常需要遍历列表的所有元素,对每个元素执行相同的操作4
4.14.1 遍历整个列表遍历整个列表为此我们可以编写循环代码,来对列表中的每个元素执行相同的操作:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(magician)在第二行中,我们使用了 for 关键字定义了一个循环体5
4.14.1 遍历整个列表遍历整个列表为此我们可以编写循环代码,来对列表中的每个元素执行相同的操作:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(magician)在第二行中,我们使用了 for 关键字定义了一个循环体它能让 Python 从列表 magicians 中依次取出一个个名字,并将取出的名字与变量 magician 相关联6
4.14.1 遍历整个列表遍历整个列表为此我们可以编写循环代码,来对列表中的每个元素执行相同的操作:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(magician)在第二行中,我们使用了 for 关键字来定义了一个循环它能让 Python 从列表 magicians 中依次取出一个个名字,并将取出的名字与变量 magician 相关联在第三行中,我们打出了四个空格作为缩进(indentation7
4.14.1 遍历整个列表遍历整个列表为此我们可以编写循环代码,来对列表中的每个元素执行相同的操作:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(magician)在第二行中,我们使用了 for 关键字来定义了一个循环它能让 Python 从列表 magicians 中依次取出一个个名字,并将取出的名字与变量 magician 相关联在第三行中,我们打出了四个空格作为缩进(indentation然后,让 Python 打印前面赋给变量 magician 的名字运行结果alicedavidcarolina8
4.1.14.1.1 深入研究循环深入研究循环仔细看看这段循环代码,magician 是一个临时变量for magician in magicians: print(magician)9
4.1.14.1.1 深入研究循环深入研究循环仔细看看这段循环代码,magician 是一个临时变量10
4.1.14.1.1 深入研究循环深入研究循环仔细看看这段循环代码,magician 是一个临时变量11
4.1.14.1.1 深入研究循环深入研究循环仔细看看这段循环代码,magician 是一个临时变量12
4.1.14.1.1 深入研究循环深入研究循环仔细看看这段循环代码,magician 是一个临时变量临时变量的名称可以任意指定:for cat in cats:for dog in dogs:for item in list_of_items:for a in cats:for b in dogs:for c in list_of_items:名称的含义清晰了很多含义不清晰?for magician in magicians: print(magician)13

使用单数和复数形式的名称,可帮助你判断代码段处理的是单个列表元素还是整个列表。

4.1.24.1.2 forfor 循环中执行更多的操作循环中执行更多的操作 for 循环中,可以对每个元素执行任意操作只要保持缩进,我们可以在 for 循环中放入多行语句随着书本,我们来看一看些许复杂的例子:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(f"{magician.title()}, that was a great trick!") print(f"I can't wait to see more, {magician.title()}.\n")14

英文不认识可以照打,主要关注语法的学习就行,想知道意思可以随时使用翻译软件翻译

4.1.24.1.2 forfor 循环中执行更多的操作循环中执行更多的操作 for 循环中,可以对每个元素执行任意操作只要保持缩进,我们可以在 for 循环中放入多行语句运行结果Alice, that was a great trick!I can't wait to see more, Alice.David, that was a great trick!I can't wait to see more, David.Carolina, that was a great trick!I can't wait to see more, Carolina.15
4.1.34.1.3 forfor 循环结束后执行一些操作循环结束后执行一些操作我们可以在 for 循环结束后,提供一个总结性输出,或接着执行程序必须完成的其他任务例如我们可以打印一条向全体魔术师致谢的消息,以感谢他们的精彩表演:magicians = ['alice', 'david', 'carolina']for magician in magicians: print(f"{magician.title()}, that was a great trick!") print(f"I can't wait to see more, {magician.title()}.\n")print("Thank you, everyone. That was a great magic show!")16

英文不认识可以照打,主要关注语法的学习就行,想知道意思可以随时使用翻译软件翻译

4.1.34.1.3 forfor 循环结束后执行一些操作循环结束后执行一些操作运行结果Alice, that was a great trick!I can't wait to see more, Alice.David, that was a great trick!I can't wait to see more, David.Carolina, that was a great trick!I can't wait to see more, Carolina.Thank you, everyone. That was a great magic show!17
4.24.2 避免缩进错误避免缩进错误没有正确的缩进magicians = ['alice', 'david']for magician in magicians:print(magician)缩进错误(IndentationError18

图示中左对右错的区别,你能看得出来吗?

4.24.2 避免缩进错误避免缩进错误没有正确的缩进(缩进错误)忘记缩进额外的代码行magicians = ['alice', 'david', 'carolina']for magician in magicians: print(f"{magician.title()}, that was a great trick!")print(f"I can't wait to see more, {magician.title()}.\n")逻辑错误19

本来是想要致谢每一个魔术师,但这段代码只有一个魔术师被致谢了。()

4.24.2 避免缩进错误避免缩进错误没有正确的缩进(缩进错误)忘记缩进额外的代码行(逻辑错误)循环后不必要的缩进magicians = ['alice', 'david', 'carolina']for magician in magicians: print(f"{magician.title()}, ...!") print(f"I can't wait to see more, {magician.title()}.\n") print("Thank you everyone, that was a great magic show!")逻辑错误20
4.24.2 避免缩进错误避免缩进错误没有正确的缩进(缩进错误)忘记缩进额外的代码行(逻辑错误)循环后不必要的缩进(逻辑错误)循环的末尾漏掉了冒号magicians = ['alice', 'david', 'carolina']for magician in magicians print(magician)语法错误(SyntaxError21
4.24.2 避免缩进错误避免缩进错误没有正确的缩进(缩进错误)忘记缩进额外的代码行(逻辑错误)循环后不必要的缩进(逻辑错误)循环的末尾漏掉了冒号(语法错误)22

对于一些错误,Python 通过traceback 提供了修复建议,因此很容易修复。但有些错误解决起来要困难得多,虽然最终的修复方案可能只是修改单个字符。即使你花了很长时间才将一个小问题修复,也不要感到难过,因为有这种遭遇的人比比皆是。

4.34.3 创建数值列表创建数值列表range([start,] end [,step]):生成可迭代的数值列表的表示。代码只打印了数 1 ~ 4这是编程语言中常见的差一行为,输出在指定的第二个值处停止了。要打印数 1 5,需要使用 range(1, 6)第一个参数 start 是可选的:例如 range(6) 将会打印数 0 ~ 5 for value in range(1, 5): print(value)运行结果123423

参数:即函数需要的信息

注:range 的参数范围,也可称为是左闭右开的

4.34.3 创建数值列表创建数值列表range([start,] end [,step]):生成可迭代的数值列表的表示。我们可以创建一个空列表,然后将计算后的数添加到其中。为了代码的清晰简单,中间结果未用临时变量存储squares = []for value in range(1, 11): squares.append(value ** 2)print(squares)运行结果[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]24

value ** 2:计算当前值的平方

你首先应该考虑的是,编写清晰易懂且能完成所需功能的代码,等到审核代码时,再考虑采用更高效的方法。

4.34.3 列表推导式(列表推导式(list comprehensionlist comprehension类似于之前使用循环添加元素的代码,我们还可以利用列表推导式直接生成列表运行的结果是相同的:squares = [value**2 for value in range(1, 11)]print(squares)运行结果[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]暂时不理解没关系,不妨多多对比练习25

注:这里调整了章节顺序,便于比对

4.34.3 数值列表的简单统计计算数值列表的简单统计计算max(lst):取数值列表中的最大值。min(lst):取数值列表中的最小值。sum(lst):对数值列表执行求和计算。digits = [1, 2, 3, 4, 5]print(min(digits))print(max(digits))print(sum(digits))运行结果1515试试创建更多元素再执行统计26

出于版面的限制,本节使用的数值列表都很短,但这里介绍的知识也适用于包含数百万个数的列表。

4.44.4 使用列表的一部分使用列表的一部分切片(slice:处理列表中部分元素的语法我们可以通过在索引中添加冒号(:)来获取部分列表:这表示我们指定获取前三个元素:players = ['charles', 'martina', 'michael', 'florence']print(players[0:3])运行结果['charles', 'martina', 'michael']27
4.44.4 使用列表的一部分使用列表的一部分切片(slice:处理列表中部分元素的语法我们可以通过在索引中添加冒号(:)来获取部分列表:这表示我们指定获取第二和第三个元素:players = ['charles', 'martina', 'michael', 'florence']print(players[1:3])运行结果['martina', 'michael']28
4.44.4 使用列表的一部分使用列表的一部分切片(slice:处理列表中部分元素的语法我们可以通过在索引中添加冒号(:)来获取部分列表,如果没有指定起始索引,Python 将自动从列表开头开始:players = ['charles', 'martina', 'michael', 'florence']print(players[:3])运行结果['charles', 'martina', 'michael']29
4.44.4 使用列表的一部分使用列表的一部分切片(slice:处理列表中部分元素的语法我们可以通过在索引中添加冒号(:)来获取部分列表,类似的,我们也可以省略终止索引:players = ['charles', 'martina', 'michael', 'florence']print(players[2:])运行结果['michael', 'florence']30
4.44.4 使用列表的一部分使用列表的一部分切片(slice:处理列表中部分元素的语法我们可以通过在索引中添加冒号(:)来获取部分列表,我们也可以使用负数索引来进行切片操作:players = ['charles', 'martina', 'michael', 'florence']print(players[-2:])运行结果['michael', 'florence']31
4.44.4 遍历切片遍历切片如果要遍历列表的部分元素,可在 for 循环中使用切片:players = ['charles', 'martina', 'michael', 'florence']print("Here are the first three players on my team:")for player in players[:3]: print(player.title())运行结果Here are the first three players on my team:CharlesMartinaMichael32

箭头处的代码没有遍历整个队员列表,只遍历前三名队

4.44.4 拷贝列表拷贝列表切片操作总是返回列表的拷贝:my_foods = ['pizza', 'falafel', 'carrot cake']friend_foods = my_foods[:]print("My favorite foods are:")print(my_foods)print("\nMy friend's favorite foods are:")print(friend_foods)运行结果My favorite foods are:['pizza', 'falafel', 'carrot cake']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake']33
4.44.4 拷贝列表拷贝列表切片操作总是返回列表的拷贝,所以可以根据原列表创建新列表my_foods = ['pizza', 'falafel', 'carrot cake']friend_foods = my_foods[:]my_foods.append('cannoli')friend_foods.append('ice cream') ...运行结果My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'ice cream']34

经过切片操作,虽然两个列表看起来已经相互独立,但要注意这里的拷贝实际上是浅拷贝,关于深浅拷贝的相关概念,你可以暂时不做了解,但一定要有一个印象。

4.44.4 拷贝列表拷贝列表不使用切片,实际上不能起到拷贝后相互独立的效果:my_foods = ['pizza', 'falafel', 'carrot cake']friend_foods = my_foods # 未使用切片,直接赋值my_foods.append('cannoli')friend_foods.append('ice cream') ...运行结果My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']35

注意:暂时不要考虑这个示例中的细节。当你试图使用列表的副本时,如果结果出乎意料,请确认你是否像第一个示例那样使用切片复制了列表,并了解了浅拷贝的相关概念。

4.54.5 元组(元组(tupletuple元组:不可变的列表,使用圆括号而不是方括号来标识。也可以通过使用 for 循环来遍历元组中的元素无法通过 dimensions[0] = 250 修改元组中的元素,试图这样做的话,你将会得到类型错误(TypeErrordimensions = (200, 50)print(dimensions[0])print(dimensions[1])运行结果2005036

注:事实上,元组不仅仅只是”不可变列表“,它还有很多有用的特性。

4.64.6 设置代码格式设置代码格式一些编码的建议:建议使用 4 个空格作为每级的缩进不要混用制表符(Tab 键)和空格——以避免小组程序员之战37

题外话:美剧《硅谷》中,有一幕关于缩进习惯的不同的闹剧,还是很有意思的

4.64.6设置代码格式设置代码格式一些编码的建议(最终应遵循小组中的大多数):建议使用 4 个空格作为每级的缩进不要混用制表符(Tab 键)和空格(Python 禁止这种行为)常用编辑器支持设置在按下 Tab 键后输入多个空格的自动转换建议将程序不同的部分用空行隔开,但不要插入冗余的空行建议每行不超过 79 个字符更多的格式指南会继续谈到,有兴趣可提前读一读 PEP838

PEP8:https://peps.python.org/pep-0008/

PEP(Python Enhancement Proposals,Python 增强提案),一般面向 Python 核心开发人员和 Python 指导委员会,对于初学者来说,PEP8 是唯一需要了解的提案。

4.74.7 小结小结学习了:如何高效地处理列表中的元素,并使用 for 循环遍历列表。根据缩进来确定程序的结构,避免一些常见的缩进错误。如何创建和操作简单的数值列表。通过切片来使用列表的一部分,以及复制列表。元组的相关知识,以及如何使得代码易于阅读。在下一章中,我们将学习 if 语句,并会结合列表让程序根据特定条件,判断采取相应的措施。39
课后拓展课后拓展练习使用列表推导式回忆字符串的定义,并尝试对它执行 for 循环和切片操作可选拓展大概了解一下了解 PEP PEP8 是什么查询并总结列表相关的常用方法和相关函数,与元组进行区分了解如何自动完成代码的格式化,并了解什么是 EditConfig并尝试配置和使用它了解什么是浅拷贝、深拷贝,如何在 Python 中实现深拷贝40

VS Code 可选代码格式化插件:autopep8