关于python:普通函数和生成器函数有什么区别?

What is the difference between normal function and generator function?

我试图理解以下方法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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函数hits,但如果我把normal()函数赋给fun变量,我看到了打印消息,如normal函数hits。我的问题是why generator() function not hit ?


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

1
2
3
4
>>> gen = generator()
>>> next(gen)
generator function hits
0

现在,在第二个next()呼叫中,发电机将从停止的地方再次运行:

1
2
>>> next(gen)
1


生成器函数在yield处停止,然后再次调用,它将从yield停止的位置恢复。xrange也是range函数的内置生成器版本。由于range返回列表,xrange按需生成数字,内存效率在xrange的一边。