1. 迭代器
特殊方法__iter__
,是迭代器规则(iterator protocol)的基础。
__iter__
需要返回一个迭代器(iterator),所谓的迭代器就是具有 __next__()
方法(该方法在调用时不需要任何参数)的对象。在调用__next__
方法时,迭代器会返回它的下一个值。如果__next()__
方法被调用,而迭代器没有值可以返回,就会引发一个StopIteration
异常。
class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def __next__(self):
self.a, self.b = self.b, self.a + self.b
return self.a
def __iter__(self):
return self
f = Fibs()
for i in f:
if i > 1000:
break
print(i)
2. 基本生成器
- 对于生成器(generator)对象,
- Python 2.x:g.next()
- Python 3.x:g.__next()
- 生成器的执行流程,在上次返回的 yield 语句处继续执行;
def gen():
i = 0
while True:
i += 1
yield i
for item in gen():
print(item)
if item >= 10:
break
3. 生成器(generator)进阶
创建一个生成器就像创建一个函数一样简单。
我们以一个展开(flatten)嵌套列表(list of lists)为例进行说明:
def flatten(nested):
for sublist in nested:
for elem in sublist:
yield elem
nested = [[1, 2], [3, 4], [5, 6]]
for num in flatten(nested):
print(num)
-
递归生成器
上一节创建的生成器只能处理两层嵌套,问题来了,如果要处理任意层的嵌套怎么办?递归便派上了用场:
def flatten(nested): try: for sublist in nested: for elem in flatten(sublist): yield elem except KeyError: yield nested