0.
(1)
(a)iterable 可迭代(对象) 能力属性
指一个对象能够一次返回它的一个成员,for i in a_list 而不需要通过下标完成迭代。
例子包括所有序列类型(list, str, tuple), 以及 dict, file, 还包括定义了 __iter__() 或 __getitem__() 方法的类实例。
(b)iterator 迭代器 具体实现
代表数据流的对象。重复调用迭代器的 next() (python3为 __next__()) 方法将依次返回流中的项。当没有更多可用数据时,将抛出 StopIteration 异常。
(c)两者关系 iterator = iter(iterable)
使用可迭代对象时,通常不需要调用 iter() 或亲自处理迭代器对象。for 语句会自动创建一个临时未命名变量,以便在循环期间保存迭代器。
(2) 名叫 generator 生成器 的 iterator 迭代器:通过某种算法“生成”一系列数据,通过 for 循环 或 next() 逐个返回数据。
(a)简单算法:list comprehension 列表生成式直接返回完整列表,generator expression 生成器表达式返回名叫 generator 生成器 的 iterator 迭代器。
In [84]: [i**2 for i in range(10) if i % 2 == 0] Out[84]: [0, 4, 16, 36, 64] In [85]: (i**2 for i in range(10) if i % 2 == 0) Out[85]: <generator object <genexpr> at 0x000000000A284CA8> In [86]: [i**2 for i in range(10) if i % 2 == 0] Out[86]: [0, 4, 16, 36, 64] In [87]: gen = (i**2 for i in range(10) if i % 2 == 0) In [88]: gen Out[88]: <generator object <genexpr> at 0x000000000A3AE510> In [89]: gen.next() Out[89]: 0 In [90]: gen.next() Out[90]: 4 In [91]: for i in gen: ...: print i ...: 16 36 64 In [92]: gen.next() --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-92-b2c61ce5e131> in <module>() ----> 1 gen.next() StopIteration: