zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
    new和delete2
    new和delete1
    new和delete4
    new和delete3
    new(placement new)
    用例图中的Actor(参与者)一定是人吗?
    二维数组的函数参数传递
    二维指针动态创建二维数组(C/C++)
    OOD的五项基本原则——SOLID
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8159393.html
Copyright © 2011-2022 走看看