在第3章,你学习了如何创建简单的列表,还学习了如何操作列表元素。在本章中,你将学习如何遍历
整个列表,这只需要几行代码,无论列表有多长。循环让你能够对列表的每个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包括包含数千乃至数百万个元素的列表。

4.1 遍历整个列表

你经常需要遍历列表的所有元素,对每个元素执行相同的操作。例如,在游戏中,可能需要将每个界面元素平移相同的距离;对于包含数字的列表,可能需要对每个元素执行相同的统计运算;在网站中,可能需要显示文章列表中的每个标题。需要对列表中的每个元素都执行相同的操作时,可使用Python中的for 循环。
假设我们有一个魔术师名单,需要将其中每个魔术师的名字都打印出来。为此,我们可以分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过使用for 循环,可让Python去处理这些问题。
下面使用for 循环来打印魔术师名单中的所有名字:

image.png

image.png

另外,编写for 循环时,对于用于存储列表中每个值的临时变量,可指定任何名称。然而,选择描述单个列表元素的有意义的名称大有帮助。例如,对于小猫列表、小狗列表和一般性列表,像下面这样编写for 循环的第一行代码是不错的选择:

image.png

4.1.2 在for循环中执行更多操作

在for 循环中,可对每个元素执行任何操作。下面来扩展前面的示例,对于每位魔术师,都打印一条消息,指出他的表演太精彩了。

image.png
本质上我们只是用临时变量把东西取出来了而已。

4.1.3 在for循环结束之后执行一些操作

for 循环结束后再怎么做呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。
在for 循环后面,没有缩进的代码都只执行一次,而不会重复执行。下面来打印一条向全体魔术师致谢的消息,感谢他们的精彩表演。想要在打印给各位魔术师的消息后面打印一条给全体魔术师的致谢消息,需要将相应的代码放在for 循环后面,且不缩进:

image.png

image.png

4.2 避免缩进错误

Python根据缩进来判断代码行与前一个代码行的关系。在前面的示例中,向各位魔术师显示消息的代码行是for 循环的一部分,因为它们缩进了。Python通过使用缩进让代码更易读;简单地说,它要求你使用缩进让代码整洁而结构清晰。在较长的Python程序中,你将看到缩进程度各不相同的代码块,这让你对程序的组织结构有大致的认识。
当你开始编写必须正确缩进的代码时,需要注意一些常见的缩进错误。例如,有时候,程序员会将不需要缩进的代码块缩进,而对于必须缩进的代码块却忘了缩进。通过查看这样的错误示例,有助于你以后避开它们,以及在它们出现在程序中时进行修复。

4.3 创建数值列表

需要存储一组数字的原因有很多,我就不细说了。

4.3.1 使用函数range()

Python函数range() 让你能够轻松地生成一系列的数字。例如,可以像下面这样使用函数range() 来打印一系列的数字:
image.png
image.png

在这个示例中,range() 只是打印数字1~4,这是你在编程语言中经常看到的差一行为的结果。函数range() 让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5)。

4.3.2 使用range()创建数字列表

要创建数字列表,可使用函数list() 将range() 的结果直接转换为列表。如果将range() 作为list() 的参数,输出将为一个数字列表。
在前一节的示例中,我们打印了一系列数字。要将这些数字转换为一个列表,可使用list() :
image.png
image.png

从这里我们可以看出,list()直接就是一个列表,我们只是使用了range来给列表赋值。

使用函数range() 时,还可指定步长。例如,下面的代码打印1~10内的偶数:
image.png
range的第一个参数,确定了起始位置,因为我们要挑出整数,所以我们的起始位置要是2。range的最后一个参数设定的是步长,也应该要是2,每次前进两个单位。

使用函数range() 几乎能够创建任何需要的数字集,例如,如何创建一个列表,其中包含前10个整数(即1~10)的平方呢?在Python中,两个星号(** )表示乘方运算。下面的代码演示了如何将前10个整数的平方加入到一个列表中:
image.png
image.png

4.3.3 对数字列表执行简单的统计运算

image.png

4.3.4 列表解析

前面介绍的生成列表squares 的方式包含三四行代码,而列表解析让你只需编写一行代码就能生成这样的列表。列表解析将for 循环和创建新元素的代码合并成一行,并自动附加新元素。面向初学者的书籍并非都会介绍列表解析,这里之所以介绍列表解析,是因为等你开始阅读他人编写的代码时,很可能会遇到它们。

image.png
image.png

4.4 使用列表的一部分

在第3章中,你学习了如何访问单个列表元素。在本章中,你一直在学习如何处理列表的所有元素。你还可以处理列表的部分元素——Python称之为切片。

4.4.1 切片

要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range() 一样,Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素,要指定索引0~3,这将输出分别为0 、1 和2 的元素。

image.png
image.png

如果你没有指定第一个索引,Python将自动从列表开头开始:
image.png

要让切片终止于列表末尾,也可使用类似的语法。例如,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2 ,并省略终止索引:
image.png

无论列表多长,这种语法都能够让你输出从特定位置到列表末尾的所有元素。本书前面说过,负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片。
例如,如果你要输出名单上的最后三名队员,可使用切片players[-3:]
image.png

4.4.2 遍历切片

如果要遍历列表的部分元素,可在for 循环中使用切片。在下面的示例中,我们遍历前三名队员,并打印他们的名字:
image.png

4.4.3 复制列表

你经常需要根据既有列表创建全新的列表。下面来介绍复制列表的工作原理,以及复制列表可提供极大帮助的一种情形。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:] )。这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
例如,假设有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中包含一位朋友喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建这个列表:
image.png
image.png
image.png

image.png

倘若我们只是简单地将my_foods 赋给friend_foods ,就不能得到两个列表。例如,下例演示了在不使用切片的情况下复制列表的情况:

image.png
image.png

如果只是把my_foods 赋值给 friend_foods 这说明,我们只是把,my_foods的地址赋值给了friend_foods并没有复制一个新的列表,只是做了一个引用传递。

4.5 元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组。

简而言之就是,列表可以改变里面的元素,但是元组不可以。

4.5.1 定义元组

元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。

元组用圆括号,列表用方括号。

例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:

image.png
image.png
下面来尝试修改元组dimensions 中的一个元素,看看结果如何:

image.png
image.png
TypeError : ‘tuple’ object does not support item assignment这里说元组不可以被修改项目

4.5.2 遍历元组中的所有值

像列表一样,也可以使用for 循环来遍历元组中的所有值:
image.png
image.png

4.5.3 修改元组变量

虽然我们不可以改变元组的变量,但我们可以给元组重新赋值。

image.png
image.png

4.6 设置代码格式

Python程序员都遵循一些格式设置约定。学会编写整洁的Python后,就能明白他人编写的Python代码的整体结构——只要他们和你遵循相同的指南。要成为专业程序员,应从现在开始就遵循这些指南,以养成良好的习惯。

4.6.1 格式设置指南

若要提出Python语言修改建议,需要编写Python改进提案 (PythonEnhancement Proposal,PEP)。PEP 8是最古老的PEP之一,它向Python程序员提供了代码格式设置指南。PEP 8的篇幅很长,但大都与复杂的编码结构相关。
Python格式设置指南的编写者深知,代码被阅读的次数比编写的次数多。代码编写出来后,调试时你需要阅读它;给程序添加新功能时,需要花很长的时间阅读代码;与其他程序员分享代码时,这些程序员也将阅读它们。
如果一定要在让代码易于编写和易于阅读之间做出选择,Python程序员几乎总是会选择后者。下面的指南可帮助你从一开始就编写出清晰的代码。

4.6.2 缩进

PEP 8建议每级缩进都使用四个空格,这既可提高可读性,又留下了足够的多级缩进空间。
在字处理文档中,大家常常使用制表符而不是空格来缩进。对于字处理文档来说,这样做的效果很好,但混合使用制表符和空格会让Python解释器感到迷惑。每款文本编辑器都提供了一种设置,可将输入的制表符转换为指定数量的空格。你在编写代码时应该使用制表符键,但一定要对编辑器进行设置,使其在文档中插入空格而不是制表符。
在程序中混合使用制表符和空格可能导致极难解决的问题。如果你混合使用了制表符和空格,可将文件中所有的制表符转换为空格,大多数编辑器都提供了这样的功能。

就是呢,我们要设置好制表符和空格之间的关系,不能搞混了。

4.6.3 行长

很多Python程序员都建议每行不超过80字符。

4.6.4 空行

要将程序的不同部分分开,可使用空行。你应该使用空行来组织程序文件,但也不能滥用;只要按本书的示例展示的那样做,就能掌握其中的平衡。例如,如果你有5行创建列表的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,你不应使用三四个空行将它们隔开。

代码段之间应该空行。