Python学习笔记6:循环对象

时间:2021-10-31 18:42:17

 以前总想着集中时间来学东西,经过这次国庆假期发现这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]