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装饰器使用方法实例
Nov 21 Python
pyqt4教程之widget使用示例分享
Mar 07 Python
Python文件与文件夹常见基本操作总结
Sep 19 Python
Python编写一个闹钟功能
Jul 11 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
Python 多维List创建的问题小结
Jan 18 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
Apr 14 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
我的论坛源代码(一)
2006/10/09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
Java如何格式化日期
2012/08/07 面试题
自我鉴定思想方面
2013/10/07 职场文书
出国签证在职证明
2014/01/16 职场文书
保护环境倡议书500字
2014/05/19 职场文书
美食节目策划方案
2014/05/31 职场文书
幼儿教师辞职信
2015/02/27 职场文书
教师节寄语2015
2015/03/23 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python