天天看点

Python3.可迭代对象_迭代器_生成器Python3.可迭代对象_迭代器_生成器

Python3.可迭代对象_迭代器_生成器

  迭代之于Python如同矩阵之于MATLAB,在Python中很多的操作都是基于迭代去做的,比如常用的readline函数、range函数、for语句、in语句等等。

  而大多数情况下,可迭代对象和迭代器这两个概念是混用的,不过初学者了解两者间的区别一是方便根据具体需求进行取舍,再者可以对Python世界中的对象、方法、函数有个具体的“感觉”。

  迭代器是可迭代对象,可迭代对象包括迭代器。

如下:

>>> a = [, , , ]  # a是列表,显然是可迭代对象
>>> a.__next__()  # 可迭代对象列表a不具有__next__方法,不是迭代器
Traceback (most recent call last):
  File "<pyshell#18>", line , 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__方法返回下一个元素

>>> next(b)  # next函数等效于调用了对象b的__next__方法

>>> for x in b: print(x)  # 迭代器是可迭代对象



>>> next(c)

>>> d = c.__iter__()  # 等效于d = c
>>> c is d  # 迭代器有__iter__方法,调用该方法返回自身
True
>>> next(d)

>>> next(c)

           

总结:

  • 迭代器具有__next__和__iter__方法;可迭代对象具有__iter__方法。
  • 可以理解为迭代器是对可迭代对象的描述,每次只提供可迭代对象的下一个元素;非迭代器的可迭代对象老老实实地在内存中存储了每一个元素,每次想取哪个元素就取哪个。
  • 迭代器可以通过list、tuple等函数强制取出所有元素变成列表、元组等非迭代器的可迭代对象;非迭代器的可迭代对象可以通过iter函数或__iter__方法返回其迭代器。

生成器的迭代器是其本身,并且是单次迭代器

# 待续,生成器待展开

# 本文基于Python3