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的关键字监控及告警
Jul 06 Python
django 解决manage.py migrate无效的问题
May 27 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
django中SMTP发送邮件配置详解
Jul 19 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python中threading和queue库实现多线程编程
Feb 06 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 Python
2021年最新用于图像处理的Python库总结
Jun 15 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
js读取cookie方法总结
2014/10/31 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
js模块加载方式浅析
2017/08/12 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
Python中的__SLOTS__属性使用示例
2015/02/18 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
老海军美国官网:Old Navy
2016/09/05 全球购物
中介业务员岗位职责
2014/04/09 职场文书
学生请假条格式
2014/04/11 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
民政局个人整改措施
2014/09/24 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
三孔导游词
2015/02/05 职场文书
任命书格式范文
2015/09/22 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
python高温预警数据获取实例
2022/07/23 Python