详情参考https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
range 和 xrange
for i in range(1000): pass
会导致生成一个 1000 个元素的 List
for i in xrange(1000): pass
则不会生成一个 1000 个元素的 List,而是在每次迭代中返回下一个数值,内存空间占用很小。因为 xrange 不返回 List,而是返回一个 iterable 对象。
在Python3中取消了xrange,python3的range就是xrange。python2中,range的返回值是list,这意味着内存将会分布相应的长度的空间给list;python3中返回的是一个对象,并没有将数据完全实例化,所以内存中只有一个对象的空间,对性能优化有帮助。
yield
yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程.