生成器对象的send方法
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="{"err":0,"msg":"ok","data":[]}"></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 + " ";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语句的返回值。这样说起来比较抽象,看下面的例子。
- def MyGenerator():
- value = (yield 1)
- value = (yield value)
- gen = MyGenerator()
- print gen.next()
- print gen.send(2)
- 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)
输出的结果如下
- 1
- 2
- Traceback (most recent call last):
- File ”test.py”, line 18, in <module>
- print gen.send(3)
- 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方法会报错。例如
- gen = MyGenerator()
- print gen.send(2)
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
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)
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方法相关推荐
- python特性(八):生成器对象的send方法
生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...
- Python-特殊方法(迭代器,生成器,内建方法,运算符重载)
Python是一门独特的语言,力求简洁,它甚至不像某些语言(如Java)提供接口语法,Python语言采用的是"约定"规则,它提供了大量具有特殊意义的方法,这些方法有些可以直接使用 ...
- 详解Python生成器函数和生成器对象的原理和用法
包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数.yield语句与return语句的作用相似,都是用来从函数中返回值.与return语句不同的是,return语句一旦执行会立刻 ...
- Python生成器对象send()方法用法
关于生成器基本用法请参考详解Python生成器函数和生成器对象的原理和用法 >>> def f(): yield from 'abcdefg' #使用yield表达式 ...
- python 生成器 send_python(可迭代对象,迭代器,生成器及send方法详解)
一.可迭代对象 对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象, 像列表,元祖,字典等都是可迭代对象 可使用isinstance(obj,Iterable)方法判断 1 from ...
- Python生成器next方法和send方法区别详解
yield的语法规则是: 在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行.当没有可继续next( ...
- Python生成器的send方法、递推函数、匿名函数及常用内置函数
1.生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 1.1 什么是send方法? send方法相当于高级的next方 ...
- python生成器 send()方法
用途:使用方法send()重置生成器的生成序列. send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值. 例:producer()通过send方法给xie()发送任务: def ...
- ret php,php生成器的send方法详解,php yield send
[一].基本用法 首先看看官方对send方法的解释:Sets the return value of the yield expression and resumes the generator (u ...
最新文章
- java风控系统规则引擎_如何设计一套规则引擎系统
- python3: print()函数:def,end关键字介绍
- 查看Linux系统版本的几种方法
- python限制输入长度_Python if语句问题,控制密码长度问题,求大神解救。
- CentOS6.5安装perl5.0(tar压缩包方式),有错误you may have to set your dynamic library LD_LIBRARY_PATH
- opencv精要(3)-win下codelite的opencv配置
- CentOS下Apache环境支持GBK编码解决网页乱码问题
- SpringMVC-开启静态资源访问权限
- java jinternalpanel_java swing中JPanel的布局问题
- 双亲委派模型与 Flink 的类加载策略
- 大数据和人工智能体系图
- linux终端清除命令,清除Linux终端的6个命令
- LogViewer_2
- 十大著名黑客-----凯文-米特尼克
- [转]用python来开发webgame服务端(4)
- DICOM世界观·第二章:[2]像素操作
- win10 1809版本手动安装WSL和ubuntu 18.04
- 小程序模板网站平台_小程序模板平台哪个好
- AWS免费账号取消步骤
- m73p黑苹果_M93P一次性拔草小主机,黑苹果,软路由。
热门文章
- 【归档】设Ue是R上的偶函数集合,Uo是R的奇函数集合,证明R^R = Ue与Uo的直和
- hive-分析、窗口函数的使用
- 中望3D 2021“草图”之“使用先前平面”
- 计算机机房交接班记录,监控室值班交接班制度
- [C语言]字符图案:从键盘输入一个正整数n(代表行数),打印如下n行图案。注意第一行左侧不留空白,从第二行开始,每行左侧增加1个空格。请使用数组实现。***** ***** *****
- WPF UI框架界面开发教程(十二)
- 生信学习——R语言小作业-中级(附详细答案解读)
- 面试准备(知识点总结等)【中移物联网-算法岗】
- PDF文件怎么加密?推荐3种方法给你
- 1108_3 H31s数组排列的下一个元素