Python yield 使用浅析

yield

但每当执行到一个 yield 语句就会中断,并返回一个迭代值。

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator!

generator 对象具有 next() 方法。

当使用next()遍历玩generator后,会自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

next()方法 - send()方法

next()方法 可以恢复yeild,但也只能恢复yeild。

send()方法 不但能恢复yeild, 还能传值给yeild

应用实例

 例一:生产者消费者模型

def consumer(name):
    print("%s start...." %name)
    while True:
        image = yield
        time.sleep(random.randrange(1,5))
        print("%s is download %s" %(name,image))

def producer(name):
    a = consumer("A")
    b = consumer("B")
    a.__next__()
    b.__next__()
    for i in range(10):
        print("%s start ....." %name)
        a.send(i)
        b.send(i)
        print("%s end ....." % name)
producer("Alex")

 

例二: yield读取文件


yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。

好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:

 def read_file(fpath):
    BLOCK_SIZE = 1024
    with open(fpath, 'rb') as f:
        while True:
            block = f.read(BLOCK_SIZE)
            if block:
                yield block
            else:
                return


以上仅仅简单介绍了 yield 的基本概念和用法,yield 在 Python 3 中还有更强大的用法,我们会在后续文章中讨论。

posted @ 2016-11-06 11:59  Vincen_shen  阅读(369)  评论(0)    收藏  举报