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中dict与set的使用
Aug 10 Python
python基础之包的导入和__init__.py的介绍
Jan 08 Python
python图书管理系统
Apr 05 Python
基于Python实现用户管理系统
Feb 26 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
Python多线程正确用法实例解析
May 30 Python
python 下载文件的多种方法汇总
Nov 17 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
python上下文管理器异常问题解决方法
Feb 07 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 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中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
PHP多进程编程实例
2014/10/15 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
php实现上传图片文件代码
2015/07/19 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
laravel学习教程之存取器
2016/07/30 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
对python中的logger模块全面讲解
2018/04/28 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
Python实现最常见加密方式详解
2019/07/13 Python
戴森英国官网:Dyson英国
2019/05/07 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
经济管理毕业生求职信
2014/03/15 职场文书
教师产假请假条范文
2014/04/10 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
入党自荐书范文
2015/03/05 职场文书
蜗居观后感
2015/06/11 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python