普通函数和生成器函数的区别是什么?
我正在尝试理解下面的方法。
In [26]: def generator():
....: print 'generator function hits'
....: for i in range(3):
....: yield i
....:
In [27]: def normal():
....: print 'normal function hits'
....: return range(3)
....:
In [28]: gen = generator()
In [29]: type(gen)
Out[29]: generator
In [30]: fun = normal()
normal function hits
In [31]: type(fun)
Out[31]: list
根据上面的代码,我的研究是这样的:26行是 generator()
函数,27行是 normal()
函数。当我把 generator()
函数赋值给 gen 变量时,我没有看到任何打印信息,比如generator 函数被调用了。但是当我把 normal()
函数赋值给 fun 变量时,我看到了打印信息,比如normal 函数被调用了。我的问题是 为什么 generator() 函数没有被调用?
2 个回答
3
生成器函数在遇到“yield”时会暂停,下一次调用时会从“yield”暂停的地方继续执行。xrange
是 range
函数的内置生成器版本。因为 range
返回的是一个列表,而 xrange
是按需生成数字的,所以 xrange
在内存使用上更有效率。
4
因为生成器函数的内容在你调用 next
之前是不会执行的。
>>> gen = generator()
>>> next(gen)
generator function hits
0
现在在第二次调用 next()
时,生成器会从它上次停止的地方继续运行:
>>> next(gen)
1