xy之可迭代对象 vs 迭代器 vs 生成器

总关系图

迭代器vs可迭代对象.png

容器包括哪些

list,
set,fronzenset...
dict, defaultdict, OrderedDict, Counter, …
tuple, namedtuple, …
str

可迭代对象vs 迭代器

>>> x = [1,2,3]
>>> y = iter(x)
>>> z = iter(x)
>>> next(y)
1
>>> next(y)
2
>>> next(z)
1
>>> type(x)
<class 'list'>
>>> type(y)
<class 'list_iterator'>
可迭代的类中,一般实现以下两个方法,__iter__()以及__next()__方法,__iter__()方法返回self。

for循环的时候内部原理

for循环.png

什么是迭代器

那么什么是迭代器呢?任何具有next()方法的对象都是迭代器,对迭代器调用next()方法可以获取下一个值。而至于它使如何产生这个值的,跟它能否成为一个迭代器并没有关系。

生成器

-任意生成器都是迭代器(反过来不成立)
-任意生成器,都是一个可以延迟创建值的工厂

生成器类型

生成器函数以及生成器表达式(yield)

iter函数内部实现

  • 检查对象是否实现了 iter 方法,如果实现了就调用它,获取
    一个迭代器。
  • 如果没有实现 iter 方法,但是实现了 getitem 方法,
    Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。
  • 如果尝试失败,Python 抛出 TypeError 异常,通常会提示“C object
    is not iterable”(C 对象不可迭代),其中 C 是目标对象所属的类。
  • 任何 Python 序列都可迭代的原因是,它们都实现了 getitem
    法。其实,标准的序列也都实现了 iter 方法,因此你也应该这么
    做。之所以对 getitem 方法做特殊处理,是为了向后兼容,而未
    来可能不会再这么做

参考

《流畅的python》

推荐阅读更多精彩内容