Python 递归函数
假设我有一个递归函数,可以在列表中创建列表。它返回的内容大致如下:Python 递归函数,python,list,function,recursion,Python,List,Function,Recursion,假设我有一个递归函数,可以在列表中创建列表。它返回的内容大致如下: ['a', ['b', ['c', ['d', []]]], 'z', []] 我们将此列表称为LIST1 然后我有一个函数,它接受这个列表,并为我清理它,基本上删除了z [a,b,c,d] 我可以做的是调用我的第一个函数并接收我的列表,然后(在python shell中)调用LIST1上的清理函数将其转换为LIST2。我想做的是让cleanup在LIST1返回后立即运行,本质上是让cleanup在我的列表生成器函数中运行
['a', ['b', ['c', ['d', []]]], 'z', []]
我们将此列表称为LIST1
然后我有一个函数,它接受这个列表,并为我清理它,基本上删除了z
[a,b,c,d]
我可以做的是调用我的第一个函数并接收我的列表,然后(在python shell中)调用LIST1上的清理函数将其转换为LIST2。我想做的是让cleanup在LIST1返回后立即运行,本质上是让cleanup在我的列表生成器函数中运行
我对如何调用一个改变递归函数结果而不破坏递归函数的函数感到困惑
我不想讨论我的代码的细节,因为它相当复杂,嵌套性很强,但如果您想让我澄清的话,可以问一些问题
如果这有助于将问题形象化,请用更简单的术语来想象它。我有一个返回值的函数,我希望另一个函数对该值进行操作,但在第一个函数中
干杯,我可能遗漏了什么,但是为什么不在递归函数的最终结果上调用cleanup函数呢?乙二醇
result = cleanup(recursive())
除非您提供有关递归函数和清理函数的更多详细信息,否则很难解决您的问题 然而,我设计了一个小例子,可能与您目前正在做的事情类似。正如您所看到的,@Daniel已经提到的,嵌套调用的工作方式确实应该是这样的 这是一个例子 给定 及 所以,正如你所看到的,顺风放松的效果非常好
>>> UnWind(Wind(range(1,10))[0])
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
这就是你想做的吗
import collections
result = ['a', ['b', ['c', ['d', []]]], 'z', []]
def get_result() :
for r in result :
yield r
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
for sub in flatten(el):
yield sub
else:
yield el
def remove_z(l) :
for i in l :
if i != 'z' :
yield i
print [ l for l in remove_z(flatten(get_result()))]
结果是
['a', 'b', 'c', 'd']
“展平”函数来自于此:我尝试了返回清理(resultlist),但没有得到任何结果。很抱歉,它很模糊,但有人批评我的函数嵌套太差,我想知道根据另一个函数的返回值调用另一个函数的一般概念是什么,在后一个函数中。保留递归的未清理版本。调用
cleanup
仅一次,在python提示符下,@Daniel向您展示了这种方式。PS如果您想避免含糊不清,最好的方法是发布一些代码。好的,这是一个完美的示例。我将如何强迫风在风中呼唤放松。
import collections
result = ['a', ['b', ['c', ['d', []]]], 'z', []]
def get_result() :
for r in result :
yield r
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
for sub in flatten(el):
yield sub
else:
yield el
def remove_z(l) :
for i in l :
if i != 'z' :
yield i
print [ l for l in remove_z(flatten(get_result()))]
['a', 'b', 'c', 'd']