普通功能和发电机功能有什么区别?

时间:2014-03-06 03:49:38

标签: python generator

我想了解以下方法,

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变量时我没有看到任何打印消息,如生成器函数命中,但是如果我将normal()函数分配给fun变量,我已经看到了像正常函数命中这样的打印消息。我的问题是why generator() function not hit ?

2 个答案:

答案 0 :(得分:4)

因为在你调用next之前不会执行生成器函数的主体。

>>> gen = generator()
>>> next(gen)
generator function hits
0

现在,在第二次next()调用中,生成器将从它停止的位置再次运行:

>>> next(gen)
1

答案 1 :(得分:3)

发电机功能在收益时停止,然后再次调用它从收益率停止的地方恢复。 xrange也是range函数的内置生成器版本。由于range返回列表,xrange会根据需要生成数字,内存效率位于xrange一侧。