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 初始化多维数组代码
Sep 06 Python
Python中return语句用法实例分析
Aug 04 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
对Python中gensim库word2vec的使用详解
May 08 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
Python列表切片常用操作实例解析
Dec 16 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
Python os和os.path模块详情
Apr 02 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
php学习之数据类型之间的转换介绍
2011/06/09 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
基于php 随机数的深入理解
2013/06/05 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
YII实现分页的方法
2014/07/09 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
动态为事件添加js代码示例
2009/02/15 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
python 域名分析工具实现代码
2009/07/15 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Python函数中的可变长参数详解
2019/09/12 Python
python实现根据文件格式分类
2019/10/31 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
pandas 数据类型转换的实现
2020/12/29 Python
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
个人简历中的自我评价范例
2013/10/29 职场文书
车辆转让协议书
2014/04/15 职场文书
通信工程专业求职信
2014/06/04 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
合作协议书范本
2014/10/25 职场文书
爱国影片观后感
2015/06/18 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android