python 生成器可以使用递归吗?

Can a python generator use recursion?

>>> def gen(num):
...     print "inside \n"
...     if num < 10:
...         gen(num +1)
...     yield num
... 
>>> x = gen(1)
>>> for i in x:
...     print i
... 
inside

1
>>> 

为什么里面只打印一次?我以为它会被打印很多次。

您只创建了递归生成器,您从未对其进行迭代。如果您不向生成器询问值,它将永远不会执行。

添加一个循环并产生递归调用的结果:

def gen(num):
    print "inside"
    if num < 10:
        for recursive_result in gen(num + 1):
            yield recursive_result
    yield num

这会产生:

>>> def gen(num):
...     print "inside"
...     if num < 10:
...         for recursive_result in gen(num + 1):
...             yield recursive_result
...     yield num
... 
>>> x = gen(1)
>>> for i in x:
...     print i
... 
inside 
inside 
inside 
inside 
inside 
inside 
inside 
inside 
inside 
inside 
10
9
8
7
6
5
4
3
2
1

您显然正在使用 Python 2,但如果您要使用 Python 3.3,则可以使用 generator delegation and instead of looping use yield from:

def gen(num):
    print("inside")
    if num < 10:
        yield from gen(num + 1)
    yield num