正文
本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,generator使用中的注意事项。
generator基础
在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator function, 调用这个generator function返回值是一个generator。这根普通的函数调用有所区别,For example:
def gen_generator(): yield 1 def gen_value(): return 1 if __name__ == '__main__': ret = gen_generator() print ret, type(ret) #<generator object gen_generator at 0x02645648> <type 'generator'> ret = gen_value() print ret, type(ret) # 1 <type 'int'>
从上面的代码可以看出,gen_generator函数返回的是一个generator实例,generator有以下特别:
- 遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
- 能过多次进入、多次返回,能够暂停函数体中代码的执行
下面看一下测试代码:
>>> def gen_example():
... print 'before any yield'
... yield 'first yield'
... print 'between yields'
... yield 'second yield'
... print 'no yield anymore'
...
>>> gen = gen_example()
>>> gen.next() # 第一次调用next
before any yield
'first yield'
>>> gen.next() # 第二次调用next
between yields
'second yield'
>>> gen.next() # 第三次调用next
no yield anymore