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中装饰器的使用
Jul 12 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
深入学习Python中的装饰器使用
Jun 20 Python
python简单读取大文件的方法
Jul 01 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python3.5基于TCP实现文件传输
Mar 20 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
Python中np.random.randint()参数详解及用法实例
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
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
php实现递归的三种基本方式
2020/07/04 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
PHP实现文件上传与下载
2020/08/28 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
js实现日历
2020/11/07 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
基于python实现学生信息管理系统
2019/11/22 Python
python自动识别文本编码格式代码
2019/12/26 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
退货证明模板
2015/06/23 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题