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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python3 读取Excel表格中的数据
Oct 16 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
python 实现线程之间的通信示例
Feb 14 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
Python Selenium截图功能实现代码
Apr 26 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
聊一聊python常用的编程模块
May 14 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(三)
2012/03/22 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
Python中static相关知识小结
2018/01/02 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
Ajax和javascript的区别
2013/07/20 面试题
国贸专业自荐信范文
2014/03/02 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
村庄绿化方案
2014/05/07 职场文书
文明礼仪标语
2014/06/13 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
党员身份证明材料
2015/06/19 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
vue实现登陆页面开发实践
2022/05/30 Vue.js