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设计模式编程的代理模式与抽象工厂模式
Jan 16 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Python玩转PDF的各种骚操作
May 06 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
利用Python校准本地时间的方法教程
Oct 31 Python
python实现手势识别的示例(入门)
Apr 15 Python
Python编程编写完善的命令行工具
Sep 15 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
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
Jquery实现的角色左右选择特效
2014/05/21 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
Python中变量交换的例子
2014/08/25 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
python实现简单图书管理系统
2019/11/22 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
Python super()方法原理详解
2020/03/31 Python
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
十佳班主任事迹材料
2014/01/18 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
一年级评语大全
2014/04/23 职场文书
社会实践评语
2014/04/28 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
五年级学生期末评语
2014/12/26 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书