首先,我们要讨论的三个对象:可迭代对象(iterables)、迭代器(iterator),生成器(generator)。
可迭代对象是每次可以返回一个元素的对象,如list,典型的可迭代对象。
事实上我们用到的很多内置函数,都会返回一个迭代器,如enumerate,zip。迭代器是一种表示数据流的对象,列表只是可迭代对象,不是迭代器,因为他不是数据流。迭代器用iter()函数得到:
list1=[1,2,3,4]
list2=iter(list1)
print(next(list2))
print(next(list2))
>>>1
>>>2
生成器,是用来创造迭代器的一种简单方式,但不是唯一方式。生成器函数如下:
def range(x):
i=0
while i<x:
yield i
i+=1
该函数就是一个生成器函数,注意有yield是生成器函数的标志。调用它
range(4)就会返回一个生成器(generator):
type(range(4))
>>> <class 'generator'>
for i in range(4):
print(i)
注意:遍历了生成器元素之后,它里面就没有元素了,再用list(range(4))它返回的只能是一个空列表,[ ].
也可以用以下式子得到生成器:
get_data = (i for i in range(10))
print(type(get_data))
>>> <class 'generator'>
遍历它来得到其中的元素(只能遍历一次)。
迭代器也具有同样的性质,里面的元素只能用一次:
如图,把迭代器b变成list后,再去迭代它,什么都没有得到。
即使不打印list(b),只要它list化了,迭代器b里面就已经没有元素了,所以运行结果为空。
如图,如果先迭代,再打印list(b),则它没有元素,得到的是空列表。
注意即使迭代器b里面没有元素了,它仍是迭代器:
可以看到b的元素迭代完之后,得到的只能说空列表,然而b还是那个迭代器(iterator),它的地址没有变,只是里面没有元素了。