Python菜鸟学习手册12----循环对象

什么是循环对象

循环对象是这样一个对象,它包含有一个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

输出结果

100
800
1000

再考虑如下一个生成器:

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)]     #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

上一讲:Python菜鸟学习手册11----异常处理

下一讲:

如果有什么疑问欢迎到我的微信公众号提问~

时间: 2024-08-05 19:29:52

Python菜鸟学习手册12----循环对象的相关文章

Python菜鸟学习手册10----文件的输入与输出

文本文件的读写主要通过open()所构建的文件对象来实现. 基本格式 f = open(文件名,模式) 最常用的模式有: "r"       # 只读 "w"     # 写入                                                               ---->如果文件中已经有内容,会把内容抹掉,如果不存在该文件,会新建文件 "a"      #追加模式                  

Python菜鸟学习手册11----异常处理

介绍 在项目开发中,异常处理是不可或缺的.异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在.异常处理还可以提高程序的容错性. >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: division by zero 上例中输入一除以零触发ZeroDivisionE

Python菜鸟学习手册15----多线程

线程与进程 程序相当于工厂,进程相当于车间,线程相当于工人.在一个工厂中往往有多个车间,在一个车间上有多个工人并行工作. 同车间上的工人共享房间,但是有些房间一次只能容纳一个人,比如厕所.在厕所里有人的时候,其他人不能进入.一个防止他人进入的简单方法,就是门口加一把锁.先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去.这就叫"互斥锁"(Mutual exclusion,缩写 Mutex). 还有些房间,可以同时容纳n个人,如果人数大于n,多出来的人只能在外面等着.这时的解

Python菜鸟学习手册05----控制流

在到目前为止我们所见到的程序中,总是有一系列的语句,Python忠实地按照它们的顺序执行它们.如果你想要改变语句流的执行顺序,该怎么办呢?例如,你想要让程序做一些决定,根据不同的情况做不同的事情,例如根据时间打印"早上好"或者"晚上好". 类似java语言,Python中有三种控制结构--三种控制流语句--if.for和while. 1.if if主要用于条件判断. 1.1 if结构 i = 1 x = 1 if i > 0: #注意后面的冒号必不可少! x

Python菜鸟学习手册06----函数

1.简介 函数是重用的程序段.它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块.这被称为调用函数.我们已经使用了许多内建的函数,比如input()和range(). 2.函数的定义和调用 函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. def sayHi():<span style="white-space:pre"&g

Python快速学习10: 循环的对象及设计 (生活的规律)

前言 系列文章:[传送门] 生活逐渐规律,按时睡觉.今天写博客,明天补时间看会书.慢慢的时间很珍惜 我很喜欢! 时钟就像个循环体,我们将它融入生活. 正文 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式. 灵活的循环方式 (我晚饭后爱上了萨克斯,因为这是生活的一部分.属于我的特殊循环对象,它的按键就像循环方式,然后出来一首美丽的歌曲) 我的萨克斯偶像 循环对象 循环对象是这样一个对象,它包含有一个next()方法(_

Python新手学习基础之循环结构练习

有几个元音字母? 有一个字符串"I learn Python from maya",我们想要查找出它里面的元音字母(aeiou)(其实是找出这几个小写字母),并统计出其元音字符的个数.这个时候我们就可以结合条件语句和循环语句对字符串进行处理了. #sentence是一个字符串,你需要去统计这个字符串的元音字母数 sentence = "I learn Python from mayacoder" #count用来存储元音字母数 count = 0 #在这里写下你的代

Python语言学习前提:循环语句

一.循环语句 1.循环语句:允许执行下一个语句或语句组多次 2. 循环类型 3. 循环控制语句 4. while 循环语句 a.while循环语句:在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务 while 判断条件(condition): 执行语句(statements)...... b. continue 和 break 用法 #! /usr/bin/env python i = 1 while i < 10: i +=1 if i%2 >0: #非双数时跳过输出 conti

python基础学习日志day6-面向对象

什么是面向对象编程 OOP编程是利用"类"和对象来创建各种模型来实现对真实世界的描述. OOP具有可维护性和可扩展性 二:面向对象有那些特性 1)CLASS类:一个类是对拥有相同属性的对象的抽象.类拥有类的属性和类的方法. 2)OBJECT对象:一个对象即是一个类的实例化的实例.这个过程就实例化. 3)Encapsulation封装:在类中对数据的赋值,内部调用对外部是透明. 4)Inheritance继承:一个类可以派生成子类,在这个父类的定义的属性和方法自动被子类继承 5)Poly