容器,可迭代对象,迭代器,生成器

  • 容器:list,set,dict,甚至str都属于容器。绝大部分容器都是可迭代对象。
  • 可迭代对象
    1. 实现了__iter__()方法的对象,__iter__()返回一个迭代器
    2. 可以通过iter()函数生成一个迭代器(iterator)
  • 迭代器:实现了__iter__()和__next__()的对象
  • 生成器:一个特殊的迭代器,使用方法和迭代器一模一样,只是定义方法不同

verbose:
可迭代的对象:使用 iter 内置函数可以获取迭代器的对象。 如果对象实现了能返回迭代器的 iter 方法, 那么对象就是可迭代的。 序列都可以迭代; 实现了 getitem 方法, 而且其参数是从零开始的索引, 这种对象也可以迭代。
迭代器是这样的对象: 实现了无参数的 next 方法, 返回序列中的下一个元素; 如果没有元素了, 那
么抛出 StopIteration 异常。 Python 中的迭代器还实现了 iter 方法, 因此迭代器也可以迭代。

内置的 iter 函数有以下作用。
(1) 检查对象是否实现了 iter 方法, 如果实现了就调用它, 获取一个迭代器。
(2) 如果没有实现 iter 方法, 但是实现了 getitem 方法, Python 会创建一个迭代器, 尝试按顺序
( 从索引 0 开始) 获取元素。
(3) 如果尝试失败, Python 抛出 TypeError 异常, 通常会提示“C object is not iterable”( C 对象不可迭代) , 其中 C 是目标对象所属的类。

检查对象 x 能否迭代, 最准确的方法是: 调用 iter(x) 函数, 如果不可迭代,
再处理 TypeError 异常。 这比使用 isinstance(x, abc.Iterable) 更准确, 因为 iter(x) 函数会考虑
到遗留的 getitem 方法, 而 abc.Iterable 类则不考虑。

abc.Iterable只能保证对象实现了iter,如果一个对象没有实现iter,但是实现了getitem,这个对象可以返回一个迭代器但是abc.Iterable认为不是。

此外, 也没有办法“还原”迭代器。 如果想再次迭代, 那就要调用
iter(...), 传入之前构建迭代器的可迭代对象。 传入迭代器本身没用, 因为前面说过 Iterator.iter
方法的实现方式是返回实例本身, 所以传入迭代器无法还原已经耗尽的迭代器。
可迭代的对象一定不能是自身的迭代器。 也就是说, 可迭代的对象必须实现 iter 方法, 但不能实现
next 方法。

def func(n):
    yield n*2

g = func(5)
g.next() //10

g.next()
'''Traceback (most recent call last):
  File "", line 1, in 
StopIteration
'''

你可能感兴趣的:(容器,可迭代对象,迭代器,生成器)