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中的私有属性
Aug 21 Python
聊聊Python中的pypy
Jan 12 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
Python字典dict常用方法函数实例
Nov 09 Python
python3访问字典里的值实例方法
Nov 18 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 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 图片上传类代码
2009/07/17 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
javascript调试说明
2010/06/07 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
深入解析Python中的上下文管理器
2016/06/28 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
关于环保的标语
2014/06/13 职场文书
2014年电工工作总结
2014/11/20 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
Python内置的数据类型及使用方法
2022/04/13 Python
Mysql 一主多从的部署
2022/05/20 MySQL