Python中yield恐怕是最迷人的特性之一了,不过要想理解到位也需要费点功夫。官方有一份比较详细的介绍,是基于v2.5.2的。虽然较长,不过建议耐心看完。本文只是想说多一些个人理解。
Python支持yield,主要是为了解决C++/Java中常见的回调函数(callback)问题,不得不说,Python的yield方式比callback要优雅得多。
函数体中如果用了yield, 那么它就变成一个函数生成器,而非直接返回值(或对象)的普通函数。确切的说,它返回的是一个迭代器。迭代器的典型用法比如:
for i in iter_01:
print i
这里,如果有C++/Java基础的同学可能更习惯于以下写法:
for i in range(3):
print i
注意:这里range(3)返回的是一个Python列表(list),但是这个列表并不是一般意义上C++/Java那样的数组,python里的列表实现了迭代器, 我们可以打开list的帮助文档:
>>> help(list)
...
__iter__(...)
...
看见了吧,Python的list实际上实现了迭代器。所以请记住,Python里