生成器对象是一个迭代器。但是它比迭代器对象多了一些方法,它们包括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方法相关推荐

  1. 生成器对象的send方法

    python特性(八):生成器对象的send方法 <div class="article_manage clearfix"><div class="ar ...

  2. 【Python】简单实现对象的to_string方法

    背景 每次定义一个类都要重写__str__方法,重点是如果是一堆属性的话,要拼接一个类似java的to_string方法要累死个人,pycharm好像还没有说能一键生成的功能,所以我需要一个简单的方法 ...

  3. python 遍历内嵌tuple,python特性语法之遍历、公共方法、引用

    一.遍历 通过for...in...的语法结构,我们可以遍历字符串.列表.元组.字典等数据结构. 1.字符串遍历 a_str = "hello world" for char in ...

  4. 详解Python生成器函数和生成器对象的原理和用法

    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数.yield语句与return语句的作用相似,都是用来从函数中返回值.与return语句不同的是,return语句一旦执行会立刻 ...

  5. python中不可迭代对象有哪些_python可迭代对象

    本身实现了迭代方法的对象称之为可迭代对象,可迭代对象特点: 支持每次返回自己所包含的一个成员的对象: 对象实现了 __iter__ 方法: 所有数据结构都是可迭代对象: for 循环要求对象必须是一个 ...

  6. Python-特殊方法(迭代器,生成器,内建方法,运算符重载)

    Python是一门独特的语言,力求简洁,它甚至不像某些语言(如Java)提供接口语法,Python语言采用的是"约定"规则,它提供了大量具有特殊意义的方法,这些方法有些可以直接使用 ...

  7. 详解Python中的生成器表达式(generator expression)

    生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所 ...

  8. python的类和对象_Python类与对象实验

    一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...

  9. python 生成器 send_python(可迭代对象,迭代器,生成器及send方法详解)

    一.可迭代对象 对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象, 像列表,元祖,字典等都是可迭代对象 可使用isinstance(obj,Iterable)方法判断 1 from ...

最新文章

  1. VS 远程调试 Azure Web App
  2. 01 ORA系列:ORA-00904 标识符无效 invalid identifier
  3. 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行
  4. IO之StringIO和BytesIO
  5. Oracle 实验5 视图与索引
  6. append导致TypeError: 'NoneType' object is not iterable
  7. adb命令启动activity、service,发送broadcast
  8. 【电力负荷预测】基于matlab日特征气象因素支持向量机SVM电力负荷预测【含Matlab源码 1612期】
  9. 一个插排引发的设计思想 (二) 抽象类与接口
  10. 初识Centos7.5
  11. 完美解决浏览器主页被hao123劫持,打开浏览器时自动进入hao123主页怎么办
  12. 《软件设计与实现》 --- 读书笔记
  13. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(四)
  14. python最快多久学会,python学成需要多久
  15. 《密码朋克:自由与互联网的未来》[澳] 朱利安-阿桑奇
  16. 大企业邮箱品牌排行中,哪个企业邮箱好用?
  17. 工作中常用的Linux命令(持续更新)
  18. CCF NOI1041. 志愿者选拔【sort】
  19. 转载 - 网站流量UV是什么意思?什么是流量UV?这里告诉你!
  20. 标注案例分享:自动驾驶图像语义分割丨曼孚科技

热门文章

  1. 大数据与数据挖掘考试题_北京2020届中考物理出题策略大揭秘!
  2. 2022-2028年中国氧化铟锡薄膜行业市场深度分析及前瞻研究报告
  3. 站在巨人的肩膀上“思考”问题,重在思考而不是拿来主义
  4. SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断
  5. 论文阅读工具ReadPaper
  6. 解读Python的命名空间
  7. CUDA上的量化深度学习模型的自动化优化
  8. Pipe Utilization管道利用率
  9. TSR交通标志检测与识别
  10. TCP/UDP对比总结