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中的对象,方法,类,实例,函数用法分析
Jan 15 Python
python使用pil生成图片验证码的方法
May 08 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
Python重新加载模块的实现方法
Oct 16 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 Python
python-地图可视化组件folium的操作
Dec 14 Python
用Python 执行cmd命令
Dec 18 Python
python OpenCV学习笔记
Mar 31 Python
Django实现翻页的示例代码
May 24 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表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
php数组随机排序实现方法
2015/06/13 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
DWR Ext 加载数据
2009/03/22 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
python 图片验证码代码
2008/12/07 Python
python一键升级所有pip package的方法
2017/01/16 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
在django中,关于session的通用设置方法
2019/08/06 Python
python文件排序的方法总结
2020/09/13 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
护理个人求职信范文
2014/01/08 职场文书
大学生村官工作感言
2014/01/10 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android