Python yield使用方法示例


Posted in Python onDecember 04, 2013

1. iterator
叠代器最简单例子应该是数组下标了,且看下面的c++代码:

int array[10];
for ( int i = 0; i < 10; i++ )
    printf("%d ", array[i]);

叠代器工作在一个容器里(array[10]),它按一定顺序(i++)从容器里取出值(array[i])并进行操作(printf("%d ", array[i])。

上面的代码翻译成python:

 

 array = [i for i in range(10)]
for i in array:
    print i,
 

首先,array作为一个list是个容器,其次list这个内建类型有默认的next行为,python发现这些之后采取的秘密的没被各位看到的动作是:拿出array这丫容器的叠代器,从里面next一下把值给i供for循环主体处置,for把这个值print了。

现在的问题是数据可以做容器叠代,代码可以吗?

2. constructor

怎么把函数变成constructor?  在函数体里有yield就行了!

def gen():
    print 'enter'
    yield 1
    print 'next'
    yield 2
    print 'next again'
for i in gen():
    print i

各位!python看到gen函数里出现yield,知道可以用next了,问题是怎么对代码这个容器玩next?
从容器里拿到iterator的时候它还什么也不是,处在容器入口处,对于数组来说就是下标为-1的地方,对于函数来说就是函数入口嘛事没干,但是万事俱备就欠next。
开始for i in g,next让itreator爬行到yield语句存在的地方并返回值,
再次next就再爬到下一个yield语句存在的地方并返回值,依次这样直到函数返回(容器尽头)。
您一定看出来上面代码的输出是:
enter
1
next
2
next again

3. 使用yield
yield的代码叠代能力不但能打断函数执行还能记下断点处的数据,下次next书接上回,
这正是递归函数需要的。
例如中序遍历二叉树:
(应该是David Mertz写的)

def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x
for n in inorder(tree)
    print n
Python 相关文章推荐
Python实现发送email的几种常用方法
Aug 18 Python
Python常用的爬虫技巧总结
Mar 28 Python
你应该知道的python列表去重方法
Jan 17 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
python数据处理实战(必看篇)
Jun 11 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
Opencv实现抠图背景图替换功能
May 21 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
python新手学习可变和不可变对象
Jun 11 Python
python matplotlib库的基本使用
Sep 23 Python
python函数参数*args**kwargs用法实例
Dec 04 #Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 #Python
Python Web框架Pylons中使用MongoDB的例子
Dec 03 #Python
python将xml xsl文件生成html文件存储示例讲解
Dec 03 #Python
python使用reportlab画图示例(含中文汉字)
Dec 03 #Python
python33 urllib2使用方法细节讲解
Dec 03 #Python
python使用mysqldb连接数据库操作方法示例详解
Dec 03 #Python
You might like
php5 mysql分页实例代码
2008/04/10 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
Python脚本实现网卡流量监控
2015/02/14 Python
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python实现KNN邻近算法
2021/01/28 Python
python保存数据到本地文件的方法
2018/06/23 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
2016猴年春节问候语
2015/11/11 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
详解Python函数print用法
2021/06/18 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript