python进阶教程之循环对象


Posted in Python onAugust 30, 2014

这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念。

循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式。

什么是循环对象

循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误。

当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next()。

假设我们有一个test.txt的文件:

1234

abcd

efg

我们运行一下python命令行:
>>>f = open('test.txt')

>>>f.next()

>>>f.next()

...

不断输入f.next(),直到最后出现StopIteration

open()返回的实际上是一个循环对象,包含有next()方法。而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。这样,我们相当于手工进行了循环。

自动进行的话,就是:

for line in open('test.txt'):

    print line

在这里,for结构自动调用next()方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。

相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活。

迭代器

从技术上来说,循环对象和for循环调用之间还有一个中间层,就是要将循环对象转换成迭代器(iterator)。这一转换是通过使用iter()函数实现的。但从逻辑层面上,常常可以忽略这一层,所以循环对象和迭代器常常相互指代对方。

生成器

生成器(generator)的主要目的是构成一个用户自定义的循环对象。

生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。

下面是一个生成器:

def gen():

    a = 100

    yield a

    a = a*8

    yield a

    yield 1000

该生成器共有三个yield, 如果用作循环器时,会进行三次循环。
for i in gen():

    print i

再考虑如下一个生成器:

def gen():

    for i in range(4):

        yield i

它又可以写成生成器表达式(Generator Expression):
G = (x for x in range(4))

生成器表达式是生成器的一种简便的编写方式。读者可进一步查阅。

表推导

表推导(list comprehension)是快速生成表的方法。它的语法简单,很有实用价值。

假设我们生成表L:

L = []

for x in range(10):

    L.append(x**2)

以上产生了表L,但实际上有快捷的写法,也就是表推导的方式:
L = [x**2 for x in range(10)]

这与生成器表达式类似,只不过用的是中括号。

(表推导的机制实际上是利用循环对象,有兴趣可以查阅。)

练习 下面的表推导会生成什么?

xl = [1,3,5]

yl = [9,12,13]

L  = [ x**2 for (x,y) in zip(xl,yl) if y > 10]

总结

循环对象
生成器
表推导

Python 相关文章推荐
Python中os.path用法分析
Jan 15 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
Sanic框架应用部署方法详解
Jul 18 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
python第三方库学习笔记
Feb 07 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
Python logging日志模块 配置文件方式
Jul 12 Python
k-means & DBSCAN 总结
Apr 27 Python
python进阶教程之循环相关函数range、enumerate、zip
Aug 30 #Python
python进阶教程之函数参数的多种传递方法
Aug 30 #Python
python进阶教程之模块(module)介绍
Aug 30 #Python
Python中的闭包实例详解
Aug 29 #Python
python进阶教程之文本文件的读取和写入
Aug 29 #Python
Python中__call__用法实例
Aug 29 #Python
python进阶教程之词典、字典、dict
Aug 29 #Python
You might like
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
浅谈React高阶组件
2018/03/28 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
python制作一个桌面便签软件
2015/08/09 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Django缓存Cache使用详解
2020/11/30 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
大型晚会策划方案
2014/02/06 职场文书
校园安全广播稿
2014/02/08 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
民族学专业求职信
2014/07/28 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
新年祝酒词大全
2015/08/11 职场文书