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之入门(四)运算
May 27 Python
Python中编写ORM框架的入门指引
Apr 29 Python
python实现在sqlite动态创建表的方法
May 08 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
Python正则表达式和re库知识点总结
Feb 11 Python
python hough变换检测直线的实现方法
Jul 12 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
python中pow函数用法及功能说明
Dec 04 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中__get()和__set()的用法实例详解
2013/06/04 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Node.js异步I/O学习笔记
2014/11/04 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
javascript实现无法关闭的弹框
2016/11/27 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
Python中实现结构相似的函数调用方法
2015/03/10 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
本科毕业生自我鉴定
2013/11/02 职场文书
项目申请汇报材料
2014/08/16 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL