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 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
python清除字符串里非数字字符的方法
Jul 02 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
python批量图片处理简单示例
Aug 06 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
python中super()函数的理解与基本使用
Aug 30 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
python处理中文编码和判断编码示例
2014/02/26 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
python获取中文字符串长度的方法
2018/11/14 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
财政局长自荐信范文
2013/12/22 职场文书
爱情检讨书大全
2014/01/21 职场文书
大学军训感想
2014/02/12 职场文书
党员干部承诺书
2014/03/25 职场文书
优秀护士先进事迹
2014/05/08 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
运动会加油稿20字
2014/11/15 职场文书
红楼梦读书笔记
2015/06/25 职场文书
小学安全教育主题班会
2015/08/12 职场文书
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技