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