Python 中生成器(generator)、Iterator(迭代器)和Iterable(迭代对象)的区别
列表生成式
即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用list(range(1,11)):
>>> list(range(1, 11))
[1,2,3,4,5,6,7,8,9,10]
但如果要生成[1x1,2x2,3x3,...,10x10]怎么做?方法一是循环:
>>> L = []
>>> for x in range(1,11):
... L.append(x*x)
...
>>> L
[1,4,9,16,25,36,49,64,81,100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1, 11)]
[1,4,9,16,25,36,49,64,81,100]
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4,16,36,64,100]
列表生成式也可以用两个变量来生成字典里的元素:

生成器
通过列表生成式,我们可以直接创建一个列表,一边循环一边计算的机制,称为生成器:generator
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

创建生成器最重要的是(),不是其他列表像[]、{}
如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
也可以使用for循环,因为generator也是可迭代对象:

二者的区别很明显:
一个直接返回了表达式的结果列表, 而另一个是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出
最重要的区别是 列表生成式是用[]写的,生成器使用(),可以当做一个对象,引用到其他列表或式子里计算然后进行迭代。
当表达式的结果数量较少的时候, 使用列表生成式还好, 一旦数量级过大, 那么列表生成式就会占用很大的内存,
而生成器并不是立即把结果写入内存, 而是保存的一种计算方式, 通过不断的获取, 可以获取到相应的位置的值,所以占用的内存仅仅是对计算对象的保存
直接可以用作for循环的数据类型有以下几种:
tuple、list、dict、str等,
上述数据类型可以用作for循环的叫做可迭代对象Iterable。可以使用isinstance判断一个对象是否是迭代对象Iterable。
from collections import Iterable#首先导入一个模块

上述只是判断对象是否是可迭代对象而已。
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator迭代器:

小结
凡是可作用于for循环的对象都是Iterable迭代对象类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、tuple、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的
生成器(generator)也是迭代对象(Iterator)

浙公网安备 33010602011771号