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
>>> 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