Python yield generator

简介:

http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/, 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 


ok, yield登场, 只需要把print换成yield就实现了, 是不是很easy

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

目录
相关文章
|
4月前
|
存储 Python
Python中的yield到底是个什么鬼?
Python中的yield到底是个什么鬼?
Python中的yield到底是个什么鬼?
|
4月前
|
存储 Python
【Python 3】什么时候使用yield而不是return?
本文讨论了Python中`yield`与`return`的使用场景,解释了`yield`在生成器中的应用,允许函数逐步产生值而不必一次性计算并返回整个序列,适合于节省内存的懒加载场景。
48 2
|
5月前
|
存储 大数据 Python
Python中的yield关键字是什么?
`yield`是Python的关键字,用于创建生成器,实现懒惰计算。生成器函数在遇到`yield`时暂停并返回值,状态得以保留,下次迭代时从中断点继续。生成器是迭代器的一种,常用于处理大数据集或无限序列,避免一次性加载所有数据。例如,`simple_generator`函数通过`yield`逐次返回1, 2, 3。生成器函数如`fibonacci_generator`可用于生成斐波那契数列,而生成器表达式则提供了一种简洁的生成值方式,如`(x**2 for x in range(1, 6))`生成平方数。`yield`还可用于创建无限序列、过滤值(如只生成偶数)和实现懒惰计算
108 2
|
5月前
|
大数据 数据处理 Python
Python的生成器(Generator)
【7月更文挑战第2天】
52 1
|
6月前
|
Shell Python
Python教程:return和yield的区别
Python教程:return和yield的区别
73 0
Python教程:return和yield的区别
|
6月前
|
Python
Python yield与实现教程分享
Python yield与实现教程分享
36 0
|
6月前
|
Python 微服务
python yield generator 详细讲解
python yield generator 详细讲解
44 0
|
7月前
|
开发工具 Python
Python中return和yield的区别,面试官不讲武德
Python中return和yield的区别,面试官不讲武德
|
7月前
|
大数据 Python
深入解析Python中的生成器(Generator) 及其高级应用
深入解析Python中的生成器(Generator) 及其高级应用
188 0
|
7月前
|
Python
Python yield 关键字的作用?
Python yield 关键字的作用?
52 0