python中的递归调用似乎没有下降

时间:2013-06-07 22:00:16

标签: python recursion generator yield

我有一个小功能来压缩列表和元组。递归调用确实被调用,但是......没有任何反应。“没有”我的意思是:没有打印stderr消息,也没有产生结果。这种行为没有意义,所以指针赞赏。 THX!

def flatten(*arr):
  sys.stderr.write("STDERR: arr is %s\n" %list(arr))
  for a in arr:
    if type(a) is list or type(a) is tuple:
      flatten(a)
    else:
      yield a

print list(flatten(['hi there','how are you'],'well there','what?',[1, 23423,33]))

1 个答案:

答案 0 :(得分:2)

您的功能有几个问题。

首先,使用isinstance()来简化序列测试:

for a in arr:
    if isinstance(a, (list, tuple)):

您需要遍历递归flatten()调用以将元素传递给调用者,并将列表作为单独的参数传递(使用*语法,以镜像函数签名):

for sub in flatten(*a):
    yield sub

通过这些更改,发电机可以工作:

>>> def flatten(*arr):
...     for a in arr:
...         if isinstance(a, (list, tuple)):
...             for sub in flatten(*a):
...                 yield sub
...         else:
...              yield a
... 
>>> print list(flatten(['hi there','how are you'],'well there','what?',[1, 23423,33]))
['hi there', 'how are you', 'well there', 'what?', 1, 23423, 33]