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中with语句的用法
Apr 15 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
在Python中通过threshold创建mask方式
Feb 19 Python
python数据预处理方式 :数据降维
Feb 24 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python else语句在循环中的运用详解
Jul 06 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 UTF8编码内的繁简转换类
2009/07/20 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
Python匹配中文的正则表达式
2016/05/11 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
python常用数据重复项处理方法
2019/11/22 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
do you have any Best Practice for testing
2016/06/04 面试题
户外活动策划方案
2014/03/12 职场文书
难忘的一课教学反思
2014/04/30 职场文书
法定代表人资格证明书
2014/09/11 职场文书
员工年终自我评价
2014/09/14 职场文书
个人剖析材料范文
2014/09/30 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
匿名检举信范文
2015/03/02 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL