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实现的简单万年历例子分享
Apr 25 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
python实现简单爬虫功能的示例
Oct 24 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
Python简单的制作图片验证码实例
May 31 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python 中字符串拼接的多种方法
Jul 30 Python
python实现决策树分类
Aug 30 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
Python实现对adb命令封装
Mar 06 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python 解决微分方程的操作(数值解法)
May 26 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
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
Python对象转JSON字符串的方法
2016/04/27 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
python基础教程项目三之万能的XML
2018/04/02 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
介绍一下游标
2012/01/10 面试题
项目投资建议书
2014/05/16 职场文书
十八大标语口号
2014/10/09 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
初三英语教学计划
2015/01/23 职场文书
服务员岗位职责
2015/02/03 职场文书
综合实践活动报告
2015/02/05 职场文书
单位计划生育责任书
2015/05/09 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫