• Python中协程的实现


    通过关键字yield,可以从生成器中产生值,并返回。我们可以将生成器作为一个生产者来使用。

    在协程中,通过使用关键字yield,还可以让具有yield的程序接收值。此时函数作为消费者,消费我们传入(send)的值。

    协程中,可以把yield作为右值来用。在foo函数中,我们这样写:

    n = yield 

    可以通过send方法来向foo函数发送值,这时,发送的值被foo接收,并存到n里。

    n中的值可以在foo函数中使用

    这样,yield作为右值来使用,就使得foo函数变成了一个消费者

    我们知道,yield关键字用于向调用者返回值。

    当作为右值来使用的时候,yield的作用仍然不变,仍然可以向调用者返回值。

    当在foo函数中也可以这样写:

    n = yield c

    这样实际上将foo函数变成了一个能消费我们传给它的值的生成器

    n 的值与c的值无关。如果非要说相关,只是他们出现在了同一行里,对yield有不同的解读罢了。

    注意区分:n的值是我们send的值,c的值是保留(hold)的上一步的值

    c的值在什么时候返回呢?只要调用者使用next(),或者之前给c赋过值,现在又走到yield c这里了,那么就返回了。

    试着理解下面这段代码:

    def countdown(n):
        print "Counting down from", n
        while n >= 0:
            newvalue = (yield n)
            # If a new value got sent in, reset n with it
            if newvalue is not None:
                n = newvalue
            else:
                n -= 1
    
    c = countdown(5)
    for n in c:
        print n
        if n == 5:
            c.send(3)

    注意这样一个基本事实,就能知道输出是什么:

    for ... in ... 是通过调用next()方法来获取下一个值的,而调用next()方法,相当于send(None)

    输出是:

    Counting down from 5
    5
    2
    1
    0

    协程的启动

    c.next()

    c.send(None)

    协程的关闭

    c.close()

  • 相关阅读:
    2009下半软考信息系统项目管理师,我又没通过。
    批量文件渲染
    Python Trick
    QThread basic
    一个简单的进度条
    js 基础知识回顾
    前端 知识笔记
    jquery 回顾
    Sass 回顾
    css
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8159393.html
Copyright © 2020-2023  润新知