Python3.可迭代对象_迭代器_生成器
迭代之于Python如同矩阵之于MATLAB,在Python中很多的操作都是基于迭代去做的,比如常用的readline函数、range函数、for语句、in语句等等。
而大多数情况下,可迭代对象和迭代器这两个概念是混用的,不过初学者了解两者间的区别一是方便根据具体需求进行取舍,再者可以对Python世界中的对象、方法、函数有个具体的“感觉”。
迭代器是可迭代对象,可迭代对象包括迭代器。
如下:
>>> a = [1, 2, 3, 4] # a是列表,显然是可迭代对象
>>> a.__next__() # 可迭代对象列表a不具有__next__方法,不是迭代器
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
a.__next__()
AttributeError: 'list' object has no attribute '__next__'
>>> b = iter(a) # b是iter函数返回的a的迭代器
>>> c = a.__iter__() # c是对象a调用__iter__方法返回的迭代器
>>> b is c # 非迭代器的可迭代对象a,每次都只能获得它的“崭新”迭代器
False
>>> b.__next__() # 迭代器b的__next__方法返回下一个元素
1
>>> next(b) # next函数等效于调用了对象b的__next__方法
2
>>> for x in b: print(x) # 迭代器是可迭代对象
3
4
>>> next(c)
1
>>> d = c.__iter__() # 等效于d = c
>>> c is d # 迭代器有__iter__方法,调用该方法返回自身
True
>>> next(d)
2
>>> next(c)
3
总结:
- 迭代器具有__next__和__iter__方法;可迭代对象具有__iter__方法。
- 可以理解为迭代器是对可迭代对象的描述,每次只提供可迭代对象的下一个元素;非迭代器的可迭代对象老老实实地在内存中存储了每一个元素,每次想取哪个元素就取哪个。
- 迭代器可以通过list、tuple等函数强制取出所有元素变成列表、元组等非迭代器的可迭代对象;非迭代器的可迭代对象可以通过iter函数或__iter__方法返回其迭代器。
生成器的迭代器是其本身,并且是单次迭代器
# 待续,生成器待展开
# 本文基于Python3