`
lantian_123
  • 浏览: 1368488 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Python yield 生成器

 
阅读更多

 

yield:生成器

任何使用yield的函数都称之为生成器,如:

def count(n):
    while n > 0:
        yield n   #生成值:n
        n -= 1

 

另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器。

使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next()方法返回序列值。

c = count(5)
c.next()
>>> 5
c.next()
>>>4

 

生成器函数只有在调用next()方法的时候才开始执行函数里面的语句,比如:

def count(n):
    print "cunting"
    while n > 0:
        yield n   #生成值:n
        n -= 1

 

在调用count函数时:c=count(5),并不会打印"counting"只有等到调用c.next()时才真正执行里面的语句。每次调用next()方法时,count函数会运行到语句yield n处为止,next()的返回值就是生成值n,再次调用next()方法时,函数继续执行yield之后的语句(熟悉Java的朋友肯定知道Thread.yield()方法,作用是暂停当前线程的运行,让其他线程执行),如:

def count(n):
    print "cunting"
    while n > 0:
        print 'before yield'
        yield n   #生成值:n
        n -= 1
        print 'after yield'

 

上述代码在第一次调用next方法时,并不会打印"after yield"。如果一直调用next方法,当执行到没有可迭代的值后,程序就会报错:

Traceback (most recent call last): File "", line 1, in StopIteration

所以一般不会手动的调用next方法,而使用for循环:

for i in count(5):
    print i,

 

实例: 用yield生成器模拟Linux中命令:tail -f | grep python 用于查找监控日志文件中出现有python字样的行。

import time
def tail(f):
    f.seek(0,2)#移动到文件EOF,参考:[seek](http://docs.python.org/2/library/stdtypes.html?highlight=file#file.seek)
    while True:
        line = f.readline()  #读取文件中新的文本行
        if not line:
            time.sleep(0.1)
            continue
        yield line

def grep(lines,searchtext):
    for line in lines:
        if searchtext in line:
            yield line

 

调用:

flog = tail(open('warn.log'))
pylines = grep(flog,'python')
for line in pylines:
    print line,

 

用yield实现斐波那契数列:

def fibonacci():
    a=b=1
    yield a
    yield b
    while True:
        a,b = b,a+b
        yield b

 

调用:

for num in fibonacci():
    if num > 100:
        break
    print num,

 

yield中return的作用:
作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中return 某个值,包括None值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的return,表示结束该语句。
通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:

def read_file(path):
    size = 1024
    with open(path,'r') as f:
        while True:
            block = f.read(SIZE)
            if block:
                yield block
            else:
                return

 

如果是在函数中return 具体某个值,就直接抛异常了

>>> def test_return():
...      yield 4
...      return 0
...
  File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator

 

与yield有关的一个很重要的概念叫**协程**,下次好好研究研究。

参考:
http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
《Python 参考手册》

0
2
分享到:
评论
1 楼 wanglei8 2013-04-24  
Looks good 
Awesome explaination for Python yield generator.

相关推荐

    Python yield生成器和return对比代码实例

    总结来说,Python的`yield`关键字和生成器提供了一种高效、内存友好的迭代方式,特别适用于处理大量数据流。与`return`相比,`yield`的优势在于它可以保存函数状态并在后续调用中恢复执行,这在需要分步处理或延迟...

    Python中yield返回生成器的详细方法.pdf

    在Python编程语言中,`yield`关键字是用来创建生成器(generator)的重要工具,它与`return`类似但有所不同。生成器是一种特殊的迭代器,能够节省内存资源,因为它们不一次性生成所有值,而是按需生成。这篇文档主要...

    举例详解Python中yield生成器的用法

    Python中的`yield`关键字是用来创建生成器(generator)的关键元素,生成器是一种特殊的迭代器,它们允许我们在需要时逐个生成结果,而不是一次性生成所有结果,从而节省内存资源,尤其适用于处理大量数据或无限序列...

    python参数生成器

    在Python编程语言中,参数生成器是一种非常实用的工具,特别是在处理大量数据或者需要动态生成参数的场景下。参数生成器通常通过生成器函数来实现,这种函数在执行时不会一次性生成所有结果,而是每次调用`yield`...

    详解Python3中yield生成器的用法

    任何使用yield的函数都称之为生成器,如: def count(n): while n &gt; 0: yield n #生成值:n n -= 1   另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解...

    python列表生成式与列表生成器的使用

    Python中的列表生成式和列表生成器是两种不同的数据生成方式,它们在处理大量数据时具有重要的作用,特别是在节省内存资源方面。列表生成式简洁高效,而列表生成器则更加节省内存,适合处理大数据集。 **列表生成式...

    Python yield 使用浅析

    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibonacci)數...

    python3.6生成器yield用法实例分析

    - 而使用yield生成器,它不会一次性把所有值计算出来,而是按需生成,即每次产生一个值,并且返回,直到没有更多值产生。这种方式可以显著减少内存的消耗。 3. yield的实现方式和使用示例: ```python def test(n):...

    Python生成器深度指南:高效迭代与懒加载技巧

    生成器是Python中处理迭代数据的强大工具。它们提供了一种高效的方式来逐个产生值,而不是一次性生成所有值。通过本文的介绍,你应该对如何在Python中使用生成器有了更深入的理解。掌握生成器的使用,将有助于你编写...

    python-yield用法详解.pdf

    在Python编程语言中,`yield`关键字是一个非常强大的特性,它使我们能够轻松地创建生成器(generators)。生成器是一种特殊的迭代器,可以让你在一个函数执行过程中保存当前的状态,并在下一次调用时恢复到之前的...

    学学Python_48类的成员07 实现生成器

    在Python编程语言中,生成器(Generator)是一种特殊的迭代器,它通过`yield`语句实现,能够让我们在运行时动态地生成序列,而无需一次性将所有数据存储在内存中。这种方式大大节省了内存资源,尤其对于处理大量数据...

    Python中生成器和yield语句的用法详解

    但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是“生成器和yield关键字”。我猜这对大多数新手Python程序员也是如此。 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字。...

    Python生成器共7页.pdf.zip

    Python生成器是Python编程语言中的一个强大特性,它允许开发者创建迭代器,而无需显式地定义`__iter__`和`__next__`方法。生成器在内存管理上非常高效,因为它们按需生成值,而不是一次性生成所有数据。这在处理大量...

    05-python-迭代器-生成器-with语句和上下文管理器-修饰符

    在Python编程语言中,迭代器、生成器、with语句和上下文管理器以及修饰符是四个非常重要的概念,它们在处理数据流和资源管理时起着关键作用。以下是关于这些知识点的详细解释: 1. **迭代器**: - 迭代器是一种...

    Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例

    以上内容详细介绍了Python生成器、迭代、yield关键字以及send()传参的相关知识点,并通过具体的代码示例来说明了它们的使用方法和技巧。通过学习这些内容,可以更加深入地理解Python语言的高级特性,提高编程效率和...

    Python generator生成器和yield表达式详解

    在Python编程中,生成器(generator)和yield表达式是两个非常重要的概念,它们是迭代器协议的实现方式之一,使得程序员能够以更加高效和节省内存的方式处理数据流。 首先,我们来了解迭代器(Iterator)和可迭代...

Global site tag (gtag.js) - Google Analytics