本文共 1376 字,大约阅读时间需要 4 分钟。
, Python yield 使用浅析
这篇说的很清楚
主要看到FP里面的Lazy Seq概念, 所以想起这个...
包含yield函数就是生成器(generator)
什么是生成器, 用于产生迭代器(iterator), 有什么用?在python里面任何迭代器都可以用list comprehension, 当list来处理
但是对于很大的list和无限list, 你肯定不能事先把list生成出来, 所以我只想在用的时候再去生成...Lazy Sequence的概念
那么yield就是用来方便定义这样的迭代器, 看个Fibonacci的例子.
这个逻辑很简单, 如果你想要这个list, 可以将b append到list里面返回. 问题是这个不是lazy的, 必须执行完才能得到完整的list.
如果list很大, memory可能是issue, 有时也许我只需要前几个...总之就是不灵活def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1
为了灵活, 我们生成个迭代器,这样使用起来就很方便, 可以用for, 也可以手动的next, 需要几个取几个
问题是, 这个代码实现和上面比很复杂, 可以用上面简单的code实现迭代器吗?
class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration()
>>> for n in Fab(5): ... print n ... 1 1 2 3 5
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1
>>> f = fab(5) >>> f.next() 1 >>> f.next() 1 >>> f.next() 2
这个可以用于任何lazy sequence的场景, list和内容非常多, 我想一部分一部分取, 比如读个很大的文件, 或其他的IO, 都可以使用.
本文章摘自博客园,原文发布日期: 2013-02-08
转载地址:http://meqyx.baihongyu.com/