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

    <div class="article_manage clearfix"><div class="article_l"><span class="link_categories">标签:<a href="http://www.csdn.net/tag/python" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">python</a><a href="http://www.csdn.net/tag/%e8%bf%ad%e4%bb%a3%e5%99%a8" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">迭代器</a><a href="http://www.csdn.net/tag/yield" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">yield</a></span></div><div class="article_r"><span class="link_postdate">2017-02-21 19:57</span><span class="link_view" title="阅读次数">148人阅读</span><span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span><span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('python%e7%89%b9%e6%80%a7%ef%bc%88%e5%85%ab%ef%bc%89%ef%bc%9a%e7%94%9f%e6%88%90%e5%99%a8%e5%af%b9%e8%b1%a1%e7%9a%84send%e6%96%b9%e6%b3%95','56293173');return false;" title="收藏">收藏</a></span><span class="link_report"> <a href="#report" onclick="javascript:report(56293173,2);return false;" title="举报">举报</a></span></div>
</div>
<div class="embody" style="display:none" id="embody"><span class="embody_t">本文章已收录于:</span><div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
</div>
<style type="text/css">        .embody{padding:10px 10px 10px;margin:0 -20px;border-bottom:solid 1px #ededed;                }.embody_b{margin:0 ;padding:10px 0;}.embody .embody_t,.embody .embody_c{display: inline-block;margin-right:10px;}.embody_t{font-size: 12px;color:#999;}.embody_c{font-size: 12px;}.embody_c img,.embody_c em{display: inline-block;vertical-align: middle;               }.embody_c img{               width:30px;height:30px;}.embody_c em{margin: 0 20px 0 10px;color:#333;font-style: normal;}
</style>
<script type="text/javascript">$(function () {try{var lib = eval("("+$("#lib").attr("value")+")");var html = "";if (lib.err == 0) {$.each(lib.data, function (i) {var obj = lib.data[i];//html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";html += ' <a href="' + obj.url + '" target="_blank">';html += ' <img src="' + obj.logo + '">';html += ' <em><b>' + obj.name + '</b></em>';html += ' </a>';});if (html != "") {setTimeout(function () {$("#lib").html(html);                      $("#embody").show();}, 100);}}      } catch (err){ }});
</script><div class="category clearfix"><div class="category_l"><img src="http://static.blog.csdn.net/images/category_icon.jpg"><span>分类:</span></div><div class="category_r"><label onclick="GetCategoryArticles('6128252','hedan2013','top','56293173');"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Python<em>(11)</em></span><img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display: inline;"><img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display: none;"><div class="subItem" style="display: none;"><div class="subItem_t"><a href="http://blog.csdn.net/hedan2013/article/category/6128252" target="_blank">作者同类文章</a><i class="J_close">X</i></div><ul class="subItem_l" id="top_6128252">                            </ul></div></label>                    </div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>  <div class="bog_copyright">         <p class="copyright_p">版权声明:本文为博主原创文章,转载请注明出处和作者。</p></div>

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

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

[python] view plaincopyprint?
  1. def MyGenerator():
  2. value = (yield 1)
  3. value = (yield value)
  4. gen = MyGenerator()
  5. print gen.next()
  6. print gen.send(2)
  7. print gen.send(3)

def MyGenerator():value = (yield 1)value = (yield value)gen = MyGenerator()
print gen.next()
print gen.send(2)
print gen.send(3)

输出的结果如下

[python] view plaincopyprint?
  1. 1
  2. 2
  3. Traceback (most recent call last):
  4. File ”test.py”, line 18, in <module>
  5. print gen.send(3)
  6. StopIteration

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方法会报错。例如

[python] view plaincopyprint?
  1. gen = MyGenerator()
  2. print gen.send(2)

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

上面代码的输出为

[plain] view plaincopyprint?
  1. Traceback (most recent call last):
  2. File “test.py”, line 16, in <module>
  3. print gen.send(2)
  4. TypeError: can’t send non-None value to a just-started generator

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

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

[python] view plaincopyprint?
  1. gen = MyGenerator()
  2. print gen.send(None)

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

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

document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) var fromjs = ("#fromjs");
    if (fromjs.length > 0) {("#fromjs");if (fromjs.length > 0) {("#fromjs .markdown_views pre").addClass("prettyprint"); prettyPrint(); ('pre.prettyprint code').each(function () {
                var lines =('pre.prettyprint code').each(function () {var lines = (this).text().split('\n').length; var numbering=numbering = ('

  • ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append((this).addClass('has-numbering').parent().append(numbering); for (i = 1; i

生成器对象的send方法相关推荐

  1. python特性(八):生成器对象的send方法

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

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

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

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

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

  4. Python生成器对象send()方法用法

    关于生成器基本用法请参考详解Python生成器函数和生成器对象的原理和用法 >>> def f():     yield from 'abcdefg'     #使用yield表达式 ...

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

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

  6. Python生成器next方法和send方法区别详解

    yield的语法规则是: 在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行.当没有可继续next( ...

  7. Python生成器的send方法、递推函数、匿名函数及常用内置函数

    1.生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 1.1 什么是send方法? send方法相当于高级的next方 ...

  8. python生成器 send()方法

    用途:使用方法send()重置生成器的生成序列. send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值. 例:producer()通过send方法给xie()发送任务: def ...

  9. ret php,php生成器的send方法详解,php yield send

    [一].基本用法 首先看看官方对send方法的解释:Sets the return value of the yield expression and resumes the generator (u ...

最新文章

  1. java风控系统规则引擎_如何设计一套规则引擎系统
  2. python3: print()函数:def,end关键字介绍
  3. 查看Linux系统版本的几种方法
  4. python限制输入长度_Python if语句问题,控制密码长度问题,求大神解救。
  5. CentOS6.5安装perl5.0(tar压缩包方式),有错误you may have to set your dynamic library LD_LIBRARY_PATH
  6. opencv精要(3)-win下codelite的opencv配置
  7. CentOS下Apache环境支持GBK编码解决网页乱码问题
  8. SpringMVC-开启静态资源访问权限
  9. java jinternalpanel_java swing中JPanel的布局问题
  10. 双亲委派模型与 Flink 的类加载策略
  11. 大数据和人工智能体系图
  12. linux终端清除命令,清除Linux终端的6个命令
  13. LogViewer_2
  14. 十大著名黑客-----凯文-米特尼克
  15. [转]用python来开发webgame服务端(4)
  16. DICOM世界观·第二章:[2]像素操作
  17. win10 1809版本手动安装WSL和ubuntu 18.04
  18. 小程序模板网站平台_小程序模板平台哪个好
  19. AWS免费账号取消步骤
  20. m73p黑苹果_M93P一次性拔草小主机,黑苹果,软路由。

热门文章

  1. 【归档】设Ue是R上的偶函数集合,Uo是R的奇函数集合,证明R^R = Ue与Uo的直和
  2. hive-分析、窗口函数的使用
  3. 中望3D 2021“草图”之“使用先前平面”
  4. 计算机机房交接班记录,监控室值班交接班制度
  5. [C语言]字符图案:从键盘输入一个正整数n(代表行数),打印如下n行图案。注意第一行左侧不留空白,从第二行开始,每行左侧增加1个空格。请使用数组实现。***** ***** *****
  6. WPF UI框架界面开发教程(十二)
  7. 生信学习——R语言小作业-中级(附详细答案解读)
  8. 面试准备(知识点总结等)【中移物联网-算法岗】
  9. PDF文件怎么加密?推荐3种方法给你
  10. 1108_3 H31s数组排列的下一个元素