【发布时间】:2011-07-22 02:23:47
【问题描述】:
有谁知道 send() 在递归使用时如何与生成器一起使用?我希望将值传递给当前生成器,然后可以将其传递给递归生成器......但似乎不是这样?一些示例代码:
def Walk(obj):
recurse = (yield obj)
if not recurse:
print 'stop recurse:', recurse
return
if isinstance(obj, list):
print 'is list:', obj
for item in obj:
print 'item loop:', item
walker = Walk(item)
for x in walker:
print 'item walk:', x
recurse = (yield x)
print 'item walk recurse:', recurse
walker.send(recurse)
root = ['a', ['b.0', ['b.0.0']]]
walker = Walk(root)
for i, x in enumerate(walker):
print i, x
print 'send true'
walker.send(True)
所需的输出应该是每个级别递归的每个值:
0 ['a', ['b.0', ['b.0.0']]]
1 'a'
2 ['b.0', ['b.0.0']]
3 'b.0'
4 ['b.0.0']
5 'b.0.0'
最终发生的是:
0 ['a', ['b.0', ['b.0.0']]]
send true
is list: ['a', ['b.0', ['b.0.0']]]
item loop: a
item walk: a
item walk recurse: None
stop recurse: None
看起来recurse = (yield) 的内循环不等待发送值。或者其他的东西。还不清楚内循环recurse 值是如何得到None 的;它的调用者确实调用了send()。
最终,目标基本上是递归遍历树结构,但让最顶层的调用者能够指定何时不递归到子结构中。例如,
walker = Walk(root)
for node in walker:
if CriteriaMet(node):
walker.send(True)
else:
walker.send(False)
【问题讨论】:
-
还有其他人想起
(cdr(car(cdr(cdr(cdr(car(car lst)))))))吗?
标签: python recursion generator