我们在上篇文章给大家介绍了列表的相关操作,主要包括遍历整个列表、创建数字列表以及列表解析,另外还介绍了在Python中经常遇到的错误,并且如何规避这些错误。本文给大家介绍列表的应用以及元组的相关知识,首先介绍列表中的一个重要知识——切片。
我们前面的文章介绍了如何访问单个列表元素,在这部分给大家介绍如何处理列表的所有元素,当然,也可以处理列表中的部分元素,在Python中称之为切片。
要创建切片,可指定要使用的第一个元素的索引和最后一个元素的索引加1.与函数range()
一样,Python在到到达我们指定的第二个索引前面的元素后停止。要输出列表中的第三个元素,需要指定索引0~3
,这将输出分别为0、1和2的元素。以下的示例处理的是一个运动队成员的列表,具体实现如下:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])
我们用print
打印了该列表的一个切片器,其中只包含三名队员。输出也是一个列表,其中包含前三名队员,具体执行效果如下:
我们可以生成列表的任意子集,如果我们想要提取列表的第2~4
个元素,可将起始索引指定为1,并将终止索引指定为4,具体实现如下:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
具体执行的效果如下:
如果我们没有指定第一个索引,Python将自动从列表开头开始:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
由于没有指定起始索引,Python从列表开始提取;具体执行如下:
要让切片终止于列表末尾,也可使用类似的语法。例如:如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引,具体实现如下:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])
Python将返回从第3个元素到列表末尾的所有元素,具体执行效果如下:
无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。前面文章曾经说过,负数索引返回离列表末尾相应距离的元素,因此我们可以输出列表末尾的任何切片。例如,如果我们要输出名单上的最后三名队员,可使用切片players[-3:]:
,具体实现如下:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])
如果要遍历列表的部分元素,可在for
循环中使用切片。在下面的示例中,我们遍历前三名队员,并打印他们的名字,具体实现如下:
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
for player in players[:3]:
print(player.title())
我们通过for
语句遍历整个队员列表,而只遍历前三名队员,具体执行结果如下:
在很多情况下,切片都很有用。例如在编写游戏时,我们可以在玩家退出游戏时将其最终得分加入到一个列表中。然后,为获取该玩家的三个最高分,我们就可以将该列表按降序排列,在创建一个只包含前三个得分的切片。处理数据时,可使用切片来进行批量处理;编写Web
应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。
我们经常需要根据既有列表创建全新的列表。接下来给大家介绍复制列表的工作原理,以及复制列表可提供极大帮助的一种情形。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
例如,假设有一个列表,其中包含我们我们最喜欢的三种食品,而我们还想创建另一个列表,在其中包含一位朋友喜欢的所有食品。不过,我们喜欢的食品,这位朋友都喜欢,因此我们可以通过复制来创建这个列表:
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_foods
的食品列表,然后创建了一个名为friend_foods
的新列表。我们在不指定任何索引的情况下从列表my_foods
中提取一个切片,从而创建了这个列表的副本,再将该副本存储到变量friend_foods
中。打印每个列表后,我们发现它们包含的食品相同:
为核实我们确实有两个列表,下面在每个列表中都添加一种食品,并核实每个列表都记录了相应人员喜欢的食品,具体实现如下:
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
与上一个示例一样,我们首先将my_foods
的元素复制到新列表friend_foods
中。接下来,在每个列表中都添加一种食品:在列表my_foods
中添加cannoli
,而在friend_foods
中添加ice_cream
,最后,打印这两个列表,核实这两种食品包含在正确的列表中,执行结果如下:
我们从运行结果可以看出:cannoli
包含在我们喜欢的食品列表中,而ice_cream
没有。而ice cream
包含在你的朋友列表中,而cannoli
没有。倘若我们只是简单地将my_food
赋给friend_foods
,就不能得到两个列表。我们在不使用的切片的情况下复制列表的情况:
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
这里将my_foods
赋给friend_foods
,而不是将my_foods
的副本存储到friend_foods
。这种语法实际上是让Python将新变量friend_foods
关联到包含在my_foods
中的列表,因此这两个变量都指向同一个列表。鉴于此,当我们将cannoli
添加到my_food
中时,它也将出现在friend_foods
中;同样,虽然ice_cream
好像只被假如到friend_foods
中,但它也会将出现在这两个列表中。输出表明:两个列表是相同的,这并非我们想要的结果,具体执行结果如下:
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的。我们将这些不可变的列表称之为元组。
元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保他们是不能修改的,具体实现如下:
dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
我们首先定义了元组dimensions
,为此我们使用了圆括号而不是方括号。接下来,我们分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同,具体执行效果如下:
下面来尝试修改元组dimensions
中的一个元素,具体实现如下:
dimensions = (200, 50)
dimensions[0] = 520
print(dimensions[0])
print(dimensions[1])
我们试图修改元素的值,结果导致Python返回类型错误的消息。由于试图修改元组的操作是被禁止的,因此Python指定不能给出元组的元素赋值,具体结果如下:
代码试图修改矩形的尺寸时,Python语法报错,确实可以证明元组不支持修改值的。
像列表一样,也可以使用for
循环来遍历元组中的所有值:
dimensions = (200, 50)
for dimension in dimensions:
print(dimension)
就像遍历列表时一样,Python返回元组中所有的元素,具体执行效果一样:
虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组,具体实现如下:
dimensions = (200, 50)
print("Original dimensions")
for dimension in dimensions:
print(dimension)
dimensions = (400, 100)
print("\nModified dimensions:")
for dimension in dimensions:
print(dimension)
我们首先定义一个元组,并将其存储的尺寸打印了出来;接下来,将一个新元组存储的尺寸打印了出来;接下来,将一个新元组存储到变量dimensions
中,然后,打印新的尺寸。这次Python不会报告任何错误,因为给元组变量赋值是合法的;具体执行的结果如下:
相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。
随着我们编写的程序越来越长,有必要了解一些代码格式设置约定。请花时间让我们代码尽可能易于阅读;让代码易于阅读有助于我们掌握程序是做什么的,也可以帮助他人理解我们编写的代码。
为了确保所有人编写的代码的结构都大致一致,Python程序员都遵循一些格式设置约定。学会编写整洁的Python后,就能明白他人编写的Python代码的整体结构——只要他们和我们遵循相同的指南。要成为专业程序员,我们应该从现在开始就要遵循这些指南,以养成良好的习惯。
若要提出Python语言修改建议,需要编写Python改进提案。PEP 8 是古老的PEP 8是最古老的PEP之一,它向Python程序员提供了代码格式设置指南。PEP 8的篇幅很长,但大都与复杂的编程结构相关。
Python格式设置指南的编写者深知,代码被阅读的次数比编写的次数多。代码编写出来后,调试时你需要阅读它;给程序添加新功能时,需要花很长时间阅读代码;与其他程序员分享代码时,这些程序员也阅读它们。
如果一定要在让代码易于编写和易于阅读之间做出选择,Python程序员几乎总是会选择后者。下面的指南可帮助我们从一开始就编写出清晰的代码。
PEP 8建议每级缩进都使用四个空格,这既可提高阅读性,又留下了足够的多级缩进空间。
在字处理文档中,我们常常使用制表符而不是空格来缩进。对于字处理文档来说没,这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑。每款文本编辑器都提供了一种设置,可将输入到制表符转换为指定数量的空格。我们在编写代码时应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入空格而不是制表符。
在程序中混合使用制表符和空格可能导致极难解决的问题。如果我们混合使用了制表符和空格,可将文件中所有制表符转换为空格,大多数编辑器都提供了这样的功能。
很多Python程序员都建议每行不超过80字符。最初制定这样的指南时,在大多数的计算机中,终端窗口每行只能容纳79字符;当前,计算机屏幕每行可容纳的字符多得多,为何还要使用79字符的标准行长呢:这里有别的原因。专业程序员通常会在同一个屏幕上打开多个文件,使用标准行长可以让他们在屏幕上并排打开两三个文件时能同时看到各个文件的完整行。PEP 8还建议注释的行长都不超过72字符,因为有些工具为大型项目自动生成文档时,会在每行注释开头添加格式化字符。
PEP 8中有关行长的指南并非不可逾越的红线,有些小组将最大行长设置99字符。在学习期间,你不用地考虑代码的行长,但别忘了,协作编写程序时,大家几乎都遵守PEP8指南。在大多数编辑器中,都可设置一个视觉标志——通常是一条竖线,让我们知道不能越过的界限在什么地方。
要将程序的不同部分分开,可使用空行。我们应该使用空行来组织程序文件,但也不能滥用;假如我们有5行创建列表的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,我们不应使用三四个空行将他们隔开。
空行不会影响代码的运行,但会影响代码的可行性。Python解释器根据水平缩进情况来解读代码,但不关心垂直间距。
我们在上篇文章给大家介绍了列表的相关操作,主要包括遍历整个列表、创建数字列表以及列表解析,另外还介绍了在Python中经常遇到的错误,并且如何规避这些错误。本文给大家介绍了列表的应用以及元组的相关知识,最后又介绍了在写Python的时候我们应该注意的格式,要具有相应的可读性。Python是一门注重实际操作的语言,它是众多编程语言中最简单,也是最好入门的。当你把这门语言学会了,再去学习java、go以及C语言就比较简单了。当然,Python也是一门热门语言,对于人工智能的实现有着很大的帮助,因此,值得大家花时间去学习。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!