python特性(八):生成器对象的send方法
生成器对象是一个迭代器。但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法。这些方法,主要是用于外部与生成器对象的交互。本文先介绍send方法。
send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值。这样说起来比较抽象,看下面的例子。
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)
上面代码的输出为
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方法为好。
---------------------
作者:汪星人来地球
来源:CSDN
原文:https://blog.csdn.net/hedan2013/article/details/56293173
版权声明:本文为博主原创文章,转载请附上博文链接!
python特性(八):生成器对象的send方法相关推荐
- 生成器对象的send方法
python特性(八):生成器对象的send方法 <div class="article_manage clearfix"><div class="ar ...
- 【Python】简单实现对象的to_string方法
背景 每次定义一个类都要重写__str__方法,重点是如果是一堆属性的话,要拼接一个类似java的to_string方法要累死个人,pycharm好像还没有说能一键生成的功能,所以我需要一个简单的方法 ...
- python 遍历内嵌tuple,python特性语法之遍历、公共方法、引用
一.遍历 通过for...in...的语法结构,我们可以遍历字符串.列表.元组.字典等数据结构. 1.字符串遍历 a_str = "hello world" for char in ...
- 详解Python生成器函数和生成器对象的原理和用法
包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数.yield语句与return语句的作用相似,都是用来从函数中返回值.与return语句不同的是,return语句一旦执行会立刻 ...
- python中不可迭代对象有哪些_python可迭代对象
本身实现了迭代方法的对象称之为可迭代对象,可迭代对象特点: 支持每次返回自己所包含的一个成员的对象: 对象实现了 __iter__ 方法: 所有数据结构都是可迭代对象: for 循环要求对象必须是一个 ...
- Python-特殊方法(迭代器,生成器,内建方法,运算符重载)
Python是一门独特的语言,力求简洁,它甚至不像某些语言(如Java)提供接口语法,Python语言采用的是"约定"规则,它提供了大量具有特殊意义的方法,这些方法有些可以直接使用 ...
- 详解Python中的生成器表达式(generator expression)
生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所 ...
- python的类和对象_Python类与对象实验
一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...
- python 生成器 send_python(可迭代对象,迭代器,生成器及send方法详解)
一.可迭代对象 对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象, 像列表,元祖,字典等都是可迭代对象 可使用isinstance(obj,Iterable)方法判断 1 from ...
最新文章
- VS 远程调试 Azure Web App
- 01 ORA系列:ORA-00904 标识符无效 invalid identifier
- 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行
- IO之StringIO和BytesIO
- Oracle 实验5 视图与索引
- append导致TypeError: 'NoneType' object is not iterable
- adb命令启动activity、service,发送broadcast
- 【电力负荷预测】基于matlab日特征气象因素支持向量机SVM电力负荷预测【含Matlab源码 1612期】
- 一个插排引发的设计思想 (二) 抽象类与接口
- 初识Centos7.5
- 完美解决浏览器主页被hao123劫持,打开浏览器时自动进入hao123主页怎么办
- 《软件设计与实现》 --- 读书笔记
- 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(四)
- python最快多久学会,python学成需要多久
- 《密码朋克:自由与互联网的未来》[澳] 朱利安-阿桑奇
- 大企业邮箱品牌排行中,哪个企业邮箱好用?
- 工作中常用的Linux命令(持续更新)
- CCF NOI1041. 志愿者选拔【sort】
- 转载 - 网站流量UV是什么意思?什么是流量UV?这里告诉你!
- 标注案例分享:自动驾驶图像语义分割丨曼孚科技