一直没有搞懂yield关键字是干什么的,今天看到了一篇名为"a generator-based XML reader"的文章,中间的程序有用到了yield,于是决定把它弄懂。
yield最早是在python2.2中被引入的,该版本必须Enable generator才能使用yield,在后来的python2.3中把generator的默认改为Enabled。也就是说不用使用from __future__ import generators。引入这个新关键字的原因是,生产者函数(Producer Function)在必须保留函数状态的时候,不得不把回调函数(Callback Function)作为生产者函数的参数传入,这样增加了编写程序的难度和程序本身的效率。
在函数体中使用了yield关键字的,被称为发生器函数(Generator Function)。该函数和普通函数不同的是,被调用的时候只是传进函数的参数,而并不执行任何函数体的代码。真正的执行是在,发生器的迭代器(Generator Iterator)调用了.next()方法以后才开始,直到遇到yield(这时函数体的局部状态将全部保留,包括局部变量,内部堆栈,instruction pointer,并将yield后面的expr_list返回给调用它的迭代器)或者return(发生器函数的return不能返回任何值,没有什么原因,只是目前python只作了这样的实现),或者函数体本身的结束,这次执行才被终止。
可爱的Python有一些简单的介绍:http://www-900.ibm.com/developerWorks/cn/linux/sdk/python/charm-20/index.shtml