列表(二):操作列表
1、遍历整个列表(使用for循环)
我们经常需要遍历列表的所有元素,对列表的每个元素执行相同的操作。例如,在游戏中,可能需要将每个界面元素平移相同的距离;对于包含和数字的列表,可能需要对每个元素执行相同的统计计算;在网站中,可能需要显示文章列表中的每个标题。需要对列表中的每个元素执行相同的操作,可以使用Python中的for循环。
假设我们有一个魔术师名单,需要将其中的每个魔术师的名字都打印出来。为此,我们可以分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过使用for循环,可让Python去处理这些问题。
第二行我们使用了for循环,这行代码让Python从列表magicians中取出一个名字,并将其存储在变量magician中。最后,我们让Python打印前面存储到变量magician中的名字。这样,对于列表中的每个名字,Python都将重复执行第二行和第三行处的代码。
- 深入地研究循环
循环这种概念很重要,因为它是让计算机自动的完成重复工作的常见方式之一。例如:在前面循环魔术师的名字中使用的简单循环:
(1)Python将首先的读取其中的第一行代码:for magician in magicians;这行代码让Python获取列表magicians中的第一个值(‘alice’),并将其存储到变量magician中;
(2)接下来,Python读取下一行代码:print(magician),他让Python打印magician的值,依然是‘alice’,鉴于该列表还包含其他的值,Python返回到循环的第一行:for magician in magicians。Python将获取列表中的下一个名字:‘david’,并将其存储到变量magician中,再执行下面的这行代码print(magician)。
(3)Python再次打印变量magician的值,当前为‘david’.接下来,Python再次执行整个循环,对列表的最后一个值'carolia'进行处理。至此,列表中没有其他的值了,因此Python接着执行程序的下一行代码。在整个示例中,for循环后面没有其他的代码,因此程序就此结束。
注:对列表中的每个元素,都将执行循环指定的步骤,而不管列表包含多少元素,如果列表包含一百万个元素,Python就重复的执行指定的步骤一百万次,且通常速度非常快。
- 在for循环中执行更多的操作
在for循环中,可对每个元素执行任何操作,扩展之前的示例,对于每位魔术师,都打印一条消息,指出他的表演太精彩了:
在for循环中,想包含多少行代码都可以。在代码行for magician in magicians后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。因此,可以对列表中的每个值执行任意次数的操作。
比如下面再添加一行代码,告诉每位魔术师,我们期待他的下一次表演:
由于两条print语句都缩进了,因此它们都将针对列表中的每位魔术师执行一次。print语句中的换行符“\n”在每次迭代结束后都插入一个空行,从而整洁地将针对各位魔术师的消息编组:
- 在for循环结束后执行一些操作
for循环结束后通常需要提供总结性输出或接着执行程序必须完成的其他任务。
在for循环后面,没有缩进的代码都只执行一次,而不会重复执行。比如打印一条向全体魔术师致谢的消息,感谢他们的精彩表演。想要在打印给各位魔术师的消息后面打印一条给全体魔术师的致谢消息,需要将相应的代码放在for循环后面,且不缩进:
因为第三条print语句没有缩进,因此只执行一次。
比如:我们可能使用for循环来初始化游戏——遍历角色列表,将每个角色都显示到屏幕上;再在循环后面添加一个不缩进的代码块,在屏幕上绘制所有角色后显示一个play now的按钮。
2、避免缩进错误
Python根据缩进来判断代码行与前一个代码行的关系。在前面的示例中,向各位魔术师显示消息的代码行是for循环的一部分,因为他们缩进了。Python使用缩进让代码更易读;简单的说,他要求你使用缩进让代码整洁而结构清晰。在较长的程序中,我们会看到缩进程度各不相同的代码块。
- 忘记缩进
对于位于for语句后面且属于循环组成部分的代码行,一定要缩进。如果我们忘记缩进,Python会提醒你,Python没有找到期望缩进的代码块时,会让我们知道哪行代码有问题。通常,将紧跟在for语句后面的代码行缩进,可消除这种缩进错误。
- 忘记缩进额外的代码行
有时候,循环能够运行而不会报告错误,但结果可能会出乎意料,可能是一个逻辑错误,而不是语法错误,Python不会报错。
- 不必要的缩进
不必要的缩进也会分为逻辑错误和语法错误,如果是语法错误,Python则会提示你出现错误。
- 遗漏了冒号
需要注意for语句的末尾需要有一个冒号,如果没有冒号,将会导致语法错误,因为Python不知道你意欲何为。这种错误虽然易于消除,但是并不那么容易被发现。
3.、创建数值列表
需要存储一组数字的原因有很多,例如:在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经度和纬度)组成的集合。
列表非常适用于存储数字集合,而Python提供了很多工具,可帮助你高效地处理数字列表。明白如何有效地使用这些工具后,即便列表包含数百万个元素,我们编写的代码也能运行的很好。
- 使用函数range()
Python函数range()能让你轻松地生成一系列数字,例如,可以像下面这样使用函数range()来打印一系列的数字:
上述代码好像应该打印数字1~5,但实际上他不会打印5,在整个示例中,range()只是打印数字1~4,这就是我们在编程语言中经常看到的差一行为的结果。
函数range()让Python从你指定的第一个值开始数,并达到你指定的第二个值后停止,因此输出不包含第二个值。要打印1~5,需要使用range(1,6)
- 使用range()创建数字列表
要创建数字列表,可使用函数list()将range()的结果直接转换为列表。如果将range()作为list()的参数,输出将为一个数字列表。
比如,要将之前的一列数字转换为一个数字列表,可使用list():
使用range()时,还可以指定步长,例如下面的代码打印1-10内的偶数:
使用函数range()几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个整数的平方呢?在Python中,两个星号(**)表示乘方运算。例如:
首先,我们创建了一个空列表[];接下来,使用函数range()让Python遍历1~10的值。在循环中,计算当前值的平方,并将结果存储到变量square 中。然后,将新计算得平方值附加到列表squares末尾(.append函数,就是在列表末尾添加数据)。循环结束后,打印列表squares。
优化:为了让代码更加的简洁,可以不使用临时变量square,而直接将每个计算得到的值附加到列表末尾:
- 对数字列表执行简单的统计计算
有几个专门用于处理数字列表的Python函数。例如,我们可以轻松地找出数字列表的最大值,最小值和总和:
- 列表解析
之前介绍的生成列表squares的方式包含三四行代码,而列表解析只需要编写一行代码就能生成这样的列表。列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在整个示例中,表达式为value**2,它计算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。请注意,这里的for语句中末尾没有冒号。
4、使用列表的一部分
- 切片
列表的部分元素,Python称之为切片。要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,需要指定索引0~3,这将输出分别为0、1和2的元素。例如:
我们也可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4:
如果你没有指定第一个索引,Python将自动从列表开头开始:
要让切片终止于列表末尾,也可以使用类似的语法。例如,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:
如果你要输出名单上的最后三名队员,可使用切片players[-3:].
- 遍历切片
如果要遍历列表的部分元素,可在for循环中使用切片。在下面的示例中,我们遍历前三名队员,并打印他们的名字:
- 复制列表
我们会经常需要根据既有列表来创建全新的列表,下面来介绍复制列表的工作原理:要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]).这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
例如,假设有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中包含一位朋友所喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建这个列表:
5、元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
- 定义元组
元组看起来犹如列表,但使用圆括号而不是方括号来标示。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
例如,如果有一个大小不应该改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:
- 遍历元组中的所有值
像列表一样,也可以使用for循环来遍历元组中的所有值:
- 修改元组变量
虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:
6、设置代码格式
- 每级缩进都使用四个空格。对你使用的文本编辑器进行设置,使其在你按Tab键时都插入四个空格。
- 每行都不要超过80个字符。对你使用的编辑器进行设置,使其在第80个字符处显示一条垂直参考线。
- 不要在程序文件中过多地使用空行。