• 技术文章 >Python技术 >Python高级

    python生成器中的send()方法和next()方法

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-06-29 09:58:26原创4465
    在异步IO的使用时,generator是最基本的一个实现方法。python生成器有两个主要方法,一个是send一个是next。今天我们来看看两者的用法和联系。在每段代码中,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数后面再次调用next,依次类推。

    这里我们用经典的生产者-消费者模型举个例子(摘自廖雪峰的博客)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    def consumer():

        r = 0

        for i in xrange(3):

            yield r

            r = '200 OK'+ str(i)

     

    c = consumer()

    n1 = c.next()

    n2 = c.next()

    n3 = c.next()

    实际上next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。

    第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有Python yield语句来接收这个值。

    相关推荐:《Python视频教程》

    下面说明下send执行的顺序。先记住,n1 = yield r这句话是从右往左执行的。当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行完yield(对应第4行)后,跳出生成器函数。这个过程中,n1一直没有定义。

    运行到send(1)时,进入生成器函数,此时,将yield r看做一个整体,赋值给它并且传回。此时即相当于把1赋值给n1,但是并不执行yield部分。下面继续从yield的下一语句继续执行,然后重新运行到yield语句,执行后,跳出生成器函数。即send和next相比,只是开始多了一次赋值的动作,其他运行流程是相同的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    def consumer():

        r = 'here'

        while True:

            n1 = yield r   #这里的等式右边相当于一个整体,接受回传值

            if not n1:

                return

            print('[CONSUMER] Consuming %s...' % n1)

            r = '%d00 OK' % n1

     

     def produce(c):

         aa = c.send(None)

         n = 0

         while n < 5:

             n = n + 1

             print('[PRODUCER] Producing %s...' % n)

             r1 = c.send(n)

             print('[PRODUCER] Consumer return: %s' % r1)

         c.close()

     

     c = consumer()

     produce(c)

    运行结果:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [PRODUCER] Producing 1...

    [CONSUMER] Consuming 1...

    [PRODUCER] Consumer return: 100 OK

    [PRODUCER] Producing 2...

    [CONSUMER] Consuming 2...

    [PRODUCER] Consumer return: 200 OK

    [PRODUCER] Producing 3...

    [CONSUMER] Consuming 3...

    [PRODUCER] Consumer return: 300 OK

    [PRODUCER] Producing 4...

    [CONSUMER] Consuming 4...

    [PRODUCER] Consumer return: 400 OK

    [PRODUCER] Producing 5...

    [CONSUMER] Consuming 5...

    [PRODUCER] Consumer return: 500 OK

    Python创建生成器的两种方法

    专题推荐:python 生成器 send
    上一篇:Python创建生成器的两种方法 下一篇:Python中的迭代器是什么

    相关文章推荐

    • Python深浅拷贝是什么• Python创建生成器的两种方法

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网