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解析xml文件实例分享
Dec 04 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
pycharm修改file type方式
Nov 19 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
python中return如何写
Jun 18 Python
Python实现简单猜数字游戏
Feb 03 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/03/11 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
深入研究React中setState源码
2017/11/17 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
python选择排序算法的实现代码
2013/11/21 Python
Python Flask-web表单使用详解
2017/11/18 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
美工的岗位职责
2013/11/14 职场文书
文明学生事迹材料
2014/01/29 职场文书
英语故事演讲稿
2014/04/29 职场文书
环保小标语
2014/06/13 职场文书
单位工作证明范文
2014/09/14 职场文书
大学生自荐材料范文
2014/12/30 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
MySQL之DML语言
2021/04/05 MySQL
nginx+lua单机上万并发的实现
2021/05/31 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers