总关系图
容器包括哪些
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循环的时候内部原理
什么是迭代器
那么什么是迭代器呢?任何具有next()方法的对象都是迭代器,对迭代器调用next()方法可以获取下一个值。而至于它使如何产生这个值的,跟它能否成为一个迭代器并没有关系。
生成器
-任意生成器都是迭代器(反过来不成立)
-任意生成器,都是一个可以延迟创建值的工厂
生成器类型
生成器函数以及生成器表达式(yield)
iter函数内部实现
- 检查对象是否实现了 iter 方法,如果实现了就调用它,获取
一个迭代器。 - 如果没有实现 iter 方法,但是实现了 getitem 方法,
Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。 - 如果尝试失败,Python 抛出 TypeError 异常,通常会提示“C object
is not iterable”(C 对象不可迭代),其中 C 是目标对象所属的类。 - 任何 Python 序列都可迭代的原因是,它们都实现了 getitem 方
法。其实,标准的序列也都实现了 iter 方法,因此你也应该这么
做。之所以对 getitem 方法做特殊处理,是为了向后兼容,而未
来可能不会再这么做
参考
《流畅的python》