美文网首页BigData
python特性:生成器对象的send方法

python特性:生成器对象的send方法

作者: 我爱学python | 来源:发表于2019-08-04 15:27 被阅读21次

生成器对象是一个迭代器。但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法。这些方法,主要是用于外部与生成器对象的交互。本文先介绍send方法。

send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值。这样说起来比较抽象,看下面的例子。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def MyGenerator():
value = (yield 1)
value = (yield value)

gen = MyGenerator()
print gen.next()
print gen.send(2)
print gen.send(3)

输出的结果如下

1
2
Traceback (most recent call last):
File "test.py", line 18, in <module>
print gen.send(3)
StopIteration

上面代码的运行过程如下。
当调用gen.next()方法时,python首先会执行MyGenerator方法的yield 1语句。由于是一个yield语句,因此方法的执行过程被挂起,而next方法返回值为yield关键字后面表达式的值,即为1。

当调用gen.send(2)方法时,python首先恢复MyGenerator方法的运行环境。同时,将表达式(yield 1)的返回值定义为send方法参数的值,即为2。这样,接下来value=(yield 1)这一赋值语句会将value的值置为2。继续运行会遇到yield value语句。因此,MyGenerator方法再次被挂起。同时,send方法的返回值为yield关键字后面表达式的值,也即value的值,为2。

当调用send(3)方法时MyGenerator方法的运行环境。同时,将表达式(yield value)的返回值定义为send方法参数的值,即为3。这样,接下来value=(yield value)这一赋值语句会将value的值置为3。继续运行,MyGenerator方法执行完毕,故而抛出StopIteration异常。

总的来说,send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互。但是需要注意,在一个生成器对象没有执行next方法之前,由于没有yield语句被挂起,所以执行send方法会报错。例如

gen = MyGenerator()
print gen.send(2)

上面代码的输出为

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
Traceback (most recent call last):
File "test.py", line 16, in <module>
print gen.send(2)
TypeError: can't send non-None value to a just-started generator

当然,下面的代码是可以接受的

gen = MyGenerator()
print gen.send(None)

因为当send方法的参数为None时,它与next方法完全等价。但是注意,虽然上面的代码可以接受,但是不规范。所以,在调用send方法之前,还是先调用一次next方法为好。

相关文章

  • python特性:生成器对象的send方法

    生成器对象是一个迭代器。但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法。这些...

  • python 生成器 send()方法简介

    生成器内有一个方法send,可再次传入一个值。 上面那句可能听不懂,但是不要紧,我们先来看看代码, 代码分析,在M...

  • 2019-07-02

    使用send唤醒生成器 如果一创建生成器就send会报错,因为没有yield,也没有ret去接收,但是可以send...

  • 协程

    生成器语法 yield 一个对象返回这个对象 暂停这个函数等待下次next重新激活 send与yield的切换...

  • Python生成器源码剖析

    生成器是个什么鬼? 生成器(Generator)在python2.3时成为python的标准特性,因此也多加了一个...

  • 协程

    从yield说起 当生成器执行到yield的时候,通过send方法向生成器传递一个值,生成器在收到传进来的值之后,...

  • Python协程详解:从yield/send到yield fro

    Python中的协程发展历史分为三个阶段: 最初的生成器变形yield/send 引入@asyncio.corou...

  • python-复盘-从yield/send到yield from

    Python中的协程大概经历了如下三个阶段: 最初的生成器变形yield/send 引入@asyncio.coro...

  • 理解Python协程:从yield/send到yield fro

    Python中的协程大概经历了如下三个阶段: 最初的生成器变形yield/send 引入@asyncio.coro...

  • Python中的三个”黑魔法“与”骚操作“

    本文主要介绍Python的高级特性:列表推导式、迭代器和生成器,是面试中经常会被问到的特性。因为生成器实现了迭代器...

网友评论

    本文标题:python特性:生成器对象的send方法

    本文链接:https://www.haomeiwen.com/subject/jmlydctx.html