迭代器:迭代(iterate)意味着重复多次,就像循环那样,像实现了方法 __iter__ 的对象。方法 __iter__ 返回一个迭代器,它是包含方法 __next__ 的对象,而调用这个方法时可不提供任何参数。当你调用方法 __next__ 时,迭代器应返回其下一个值
这是迭代器创建序列的方法:
class TestIterator:
value = 0
def __next__(self):
self.value += 1
if self.value > 10: raise StopIteration #如果在这个方法中没有if条件判断,迭代器将会无限循环下去
return self.value
def __iter__(self):
return self
ti = TestIterator()
print(list(ti))
在很多情况下,都在另一个对象中实现返回迭代器的方法 __iter__ ,并在 for 循环中使用这个对象。但推荐在迭代器中也实现方法 __iter__ (并像刚才那样让它返回 self ),这样迭代器就可直接用于 for 循环中。
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
fibs = Fibs()
for f in fibs:
if f > 1000: #如果没有这条语句,迭代器会无限循环下去
print(f)
break
生成器:包含 yield 语句的函数都被称为生成器
生成器不是使用 return 返回一个值,而是可以生成多个值,每次一个。每次使用 yield 生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。
生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。生成器的函数是由 def 语句定义的,其中包含 yield 。生成器的迭代器是这个函数返回的结果。用不太准确的话说,这两个实体通常被视为一个,通称为生成器
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
nested = [[1,3], [4,3], [2, 5]]
for num in flatten(nested):
print(num)