在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(Generator)。一、迭代器(iterator)在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发 StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且 捕捉StopIteration异常来确定何时离开。使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:for line in open("test.txt").readlines(): print line这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。利用file的迭代器,我们可以这样写:for line in open("test.txt"): #use file iterators print line这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。二、生成器(Generator)生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效>>> def g(n): ... for i in range(n): ... yield i **2 ... >>> for i in g(5): ... print i,":", ... 0 : 1 : 4 : 9 : 16 :要了解他的运行原理,我们来用next方法看看:>>> t = g(5) >>> t.next() 0 >>> t.next() 1 >>> t.next() 4 >>> t.next() 9 >>> t.next() 16 >>> t.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。 再来看一个yield的例子,用生成器生成一个Fibonacci数列:def fab(max): a,b = 0,1 while a < max: yield a a, b = b, a+b
>>> for i in fab(20): ... print i,",", ... 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,看到这里应该就能理解生成器那个很抽象的概念了吧~~下面关于Python的文章您也可能喜欢,不妨看看:Linux下Python的安装以及注意事项 http://www.linuxidc.com/Linux/2015-11/124861.htmUbuntu 14.04 下安装使用Python rq模块 http://www.linuxidc.com/Linux/2015-08/122441.htm无需操作系统直接运行 Python 代码 http://www.linuxidc.com/Linux/2015-05/117357.htmCentOS上源码安装Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htmPython脚本获取Linux系统信息 http://www.linuxidc.com/Linux/2013-08/88531.htm在Ubuntu下用Python搭建桌面算法交易研究环境 http://www.linuxidc.com/Linux/2013-11/92534.htmPython 语言的发展简史 http://www.linuxidc.com/Linux/2014-09/107206.htmPython 的详细介绍:请点这里 Python 的下载地址:请点这里 本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126363.htm