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使用7z解压软件备份文件脚本分享
Feb 21 Python
python实现进程间通信简单实例
Jul 23 Python
python实现监控linux性能及进程消耗性能的方法
Jul 25 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
python lxml中etree的简单应用
May 10 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
Python 使用多属性来进行排序
Sep 01 Python
Python使用正则实现计算字符串算式
Dec 29 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 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里得到前天和昨天的日期的代码
2007/08/16 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
Javascript基础教程之for循环
2015/01/18 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
Less 安装及基本用法
2018/05/05 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
全面了解python字符串和字典
2016/07/07 Python
python 内置函数filter
2017/06/01 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
python 如何停止一个死循环的线程
2020/11/24 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
个性与发展自我评价
2014/02/11 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
行政专员求职信范文
2014/05/03 职场文书
村庄绿化方案
2014/05/07 职场文书
工伤私了协议书范本
2014/11/24 职场文书
交流会主持词
2015/07/02 职场文书
倡议书怎么写?
2019/04/11 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js