Pythian学习笔记6:循环对象

 以前总想着集中时间来学东西,经过这次国庆假期发现这TM根本就不现实啊,还是每天抽点时间,日积月累这样比较好。

一、循环对象

循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式。

循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中),

这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误。

当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,

for循环接收到,就知道循环已经结束,停止调用next()。

二、模拟

假如有一个文件test.txt,内容如下:

123
abc
xyz

现在我们来逐条读取其内容:

f = open("test.txt")
print f.next()
print f.next()
print f.next()
# print f.next() #Traceback...in:...StopIteration

在最后一个注释掉的print f.next()会报错,提示StopIteration

open()返回的实际上是一个循环对象,包含有next()方法。

而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。

这就相当于我们模拟了如下循环:

for line in open("test.txt"):
    print line

or结构自动调用next()方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。

三、生成器

生成器(generator)的主要目的是构成一个用户自定义的循环对象。

生成器的编写方法和函数定义类似,只是在return的地方改为yield。

生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。

当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。

生成器自身又构成一个循环器,每次循环使用一个yield返回的值。

下面是一个生成器:

def gen():
    a = 2
    yield a
    a = a * 2
    yield a
    yield 1024

该生成器共有三个yield, 如果用作循环器时,会进行三次循环。

for i in gen():
    print i

看另一个生成器:

def gen():
    for i in range(4):
        yield i

可以写成生成器表达式的形式:

G = (x for x in range(4))

生成器表达式是生成器的一种简便的编写方式。

四、表推导

表推导(list comprehension)是快速生成表的方法。

例如:

L = []
for b in range(10):
    L.append(b**2)

以上产生了表L,但实际上有快捷的写法,也就是表推导的方式:

L = [b**2 for b in range(10)]
print(L)

输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

又如:

xl = [1,3,5]
yl = [9,12,13]
L  = [ x**2 for (x,y) in zip(xl,yl) if y > 10]
print(L)

输出:

[9, 25]

时间: 2024-12-21 06:31:06

Pythian学习笔记6:循环对象的相关文章

Accelerated C++学习笔记3—<循环和计数>

第2章 循环和计数 本节主要利用改进输出问候语的程序来改进如何支持循环和条件分支的. 1.使用循环输出一个周围带框架框住的问候语,且用户自己提供在框架与问候语之间的空格的个数. <span style="font-family:KaiTi_GB2312;">// lesson2_1.cpp : 定义控制台应用程序的入口点. //功能:使用循环 //时间:2014.5.8 #include "stdafx.h" #include "iostrea

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

Java学习笔记一:对象与存储

1.用引用来操作对象 Java是面向对象的编程语言,一切都能看作是对象,通过引用来完成对对象的操作. // String 是对象,而s对指向这个String对象的引用 String s; 注意:我们是通过对象的引用来操纵对象数据的,如果对象没有关联数据(如没有被初始化),则会出现空引用,报空指针异常:java.lang.NullPointerException 2.数据存储 (1)寄存器:位于CPU内部,是处理最快的区域,但是存储空间有限.Java不能通过程序直接控制. (2)堆栈:位于RAM(

2015 IOS 学习笔记 for循环 方法练习 ——蓝懿教育

今天学习了for循环以及方法,内容有些复杂,不过万变不离其宗 在以后的学习中容易掌握,因为涉及范围广阔,使用率高.所以多加练习后会掌握. ————————for循环—————————— for循环概念: for循环编程语言中的语句之一,用于循环执行.for循环是开界的,它的一般形式为: for(; <<span se-mark="1">条件表达式>; ) 语句: 初始化总是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

Java学习笔记--类和对象

1.介绍面向对象的编程 面向对象是现在主流的编程样例,它替代了以前C语言使用时的"结构体",Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每个函数对于用户而言,都有特殊的功能.程序里面的很多对象都可以直接从公共库里面拿来直接用.不用去研究这些功能怎么去实现的.传统的结构的编程由一系列算法步骤来解决问题.一旦这些步骤确定下来,也要同时确定存储数据的方式.也就是数据结构一开始学习的:算法+数据结构=程序. 先决定算法,再决定使用什么样的结构来存储数

Python学习笔记总结(一)对象和流程语句总结

一.对象类型 1.数字 数字:不可变 2.字符串 字符串:不可原处修改[修改需要创建新的对象],有顺序,支持求长(len),合并(+),重复(*),索引S[0],分片(S[1:3]],成员测试(in),迭代(for); 特有的查找find,替换replace,拆分split;支持list(S)将字符串分解成一个字符列表,tuple(S)将字符串分解成一个字符组成的元组,复制可用分片和copy标准库, 不支持排序sort和删除del(因为不可原处修改) 3.元组 元组:不可以原处修改,有顺序,支持

javascript学习笔记 - 面向对象 理解对象

ECMAScript 中有两种属性:数据属性和访问器属性 一 属性类型 1.数据属性.数据属性有4个描述其行为的特性 [[Configurable]]表示能否通过delete删除属性从而重新定义属性: 能否修改属性: 能否把属性修改为访问器属性.  [[Enumerable]] 表示是否能通过for-in循环进行枚举.  [[Writable]] 表示能否修改属性的值  [[value]] 包含这个属性的值.读取和写入属性值,都是从这个位置来操作  对象字面量初始化时定义的属性,这些特性默认都是

JAVA编程思想学习笔记——第一章 对象导论

搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的集合,它们通过发送消息来告诉彼此所要做的 3.每个对象都由自己的由其它对象所构成的存储 4.每个对象都拥有其类型 5.某一特定类型的所有对象都可以接收同样的信息  单根继承结构 所有的类都继承自单一的基类,Object.在单根集成结构中的所有对象都具有一个公用接口,所以他们归根到底都是相同的基本类型.单根集成