迭代: 程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止。
for循环可以用于python中任何序列类型。包括列表、元组、字符串。
如:
迭代器和解析
for循环甚至比这更为通用:可用于任何可迭代的对象。实际上,对python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及map的内置函数等。

在python中,如果对象是实际保存的序列,或者可以在迭代工具环境中(如for环境)一次产生一次结果的对象,就看做是可迭代的。

文件迭代器
在文件中,已打开文件对象有个方法名为readline,可以一次从一个文本中读取一行文本,每次调用readline方法时,就会进入到下一列。到达文件末尾时,就会返回空字符串,跳出循环。
迭代器和解析
文件也有一个方法,名为__next__,差不多有相同的效果:每次调用时,就会返回文件中的下一行。唯一值得注意的区别在于,到达文件末尾时,__ next__会引发内置的StopItration异常,而不是返回字符串。

迭代器和解析
这个接口就是python中所谓的迭代协议,有__next__ 方法的对象会前进到下一个结果,而在一系列结果的末尾时,则会引发StopItretion。在python中任何这类对象都认为是可迭代的。任何这类对象也能以for循环或其他迭代工具遍历,因为所有迭代工具内部工作起来都是在每次迭代中调用__next__,并且捕捉StopItration异常来确定何时离开。

手动迭代:iter和next
为了支持手动迭代代码(用较少的录入),python3还提供了一个内置函数next,它会自动调用一个对象的__next__方法。给定一个可迭代对象X,调用next(X)等同于 X.__ next__(),但前者简单很多。

迭代器和解析
从技术角度来讲,迭代协议还有一点值得注意。当for循环开始时,会通过它传给iter内置函数,以便从可迭代对象中获得一个迭代器,返回的对象含有需要的next方法。

迭代器和解析
最初的一步对于文件来说不是必需的,因为文件对象就是自己的迭代器。文件有自己的__next__方法,因此不需要像这样返回一个不同的对象。

迭代器和解析
列表以及其他很多的内置对象,不是自身的迭代器,因为它们支持多次打开迭代器。对于这样的对象,我们必须调用iter来启动迭代。

迭代器和解析

列表解析
Python 的强大特性之一是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个元素应用一个函数,从而将一个 list 映射为另一个 list。
列表解析,又叫列表推导式( list comprehension)
列表解析比 for 更精简,运行更快,特别是对于较大的数据集合
列表解析可以替代绝大多数需要用到 map和 filter的场合

与for循环一起使用,列表解析是最常应用迭代协议的环境之一

如遍历一个列表,使用range来修改它
迭代器和解析
用列表解析表达式为:
迭代器和解析

直接结果相同的,但是代码更少,并且运行更快。

l = [ x + 10 for x in l ]

列表解析写在一个方括号中,因为它们最终是构建一个新的列表的一种方式。它们以我们组成的一个任意的表达式开始,该表达式使用我们所组成的一个循环变量(x+10)。这后边跟着我们现在应该看做是一个for循环头部的部分,它声明了循环变量,以及一个可迭代对象( for x in l )。

相关文章: