普通函数和生成器函数的区别是什么?

2 投票
2 回答
784 浏览
提问于 2025-04-17 21:02

我正在尝试理解下面的方法。

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”暂停的地方继续执行。xrangerange 函数的内置生成器版本。因为 range 返回的是一个列表,而 xrange 是按需生成数字的,所以 xrange 在内存使用上更有效率。

4

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

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

现在在第二次调用 next() 时,生成器会从它上次停止的地方继续运行:

>>> next(gen)
1

撰写回答