python yield

来源:互联网 发布:淘宝店铺怎么升级的 编辑:程序博客网 时间:2024/04/29 13:50

在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器

迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开。

使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。

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

 generator 在Python中与迭代器协议的概念联系在一起。yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。

不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效

以生成斐波那契数列为例:

原版遍历巨大的list, 函数在运行中占用的内存会随着参数的增大而增大, 效率不好

def fib(n):    i = 0    a, b = 0, 1    ll = []    while i < n:        ll.append(b)        a, b = b, a + b        i += 1    return llfor e in fib(100):    print e,

yield 版

def fib(n):     i = 0     a, b = 0, 1     while i < n:         yield b         a, b = b, a + b         n += 1

调用 fib(10) 不会执行 fib 函数,而是返回一个 iterable 对象! 在 for 循环执行时,每次循环都会执行 fib 函数内部的代码,执行到 yield b 时,fib 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

利用固定长度的缓冲区来不断读取文件内容

def readfile(fpath):              with open(fpath) as f:        while True:            buf = f.read(1024)            if buf:                yield buf            else:                returnfor i in readfile("about.html"):    print i,


0 0
原创粉丝点击