如何使用python中的动态函数递归地使用所有动态输入?

如何使用python中的动态函数递归地使用所有动态输入?,python,function,nested,Python,Function,Nested,我将解释这个例子,因为它更容易用这种方式描述: 假设我们有一个数量不确定的变量,可以是列表或字符串 例如,X=3,我们有: Var1=list("a","b") Var2=list("c","d") Var3="e" 所有这些都在一个列表中: ListOfVariables=[Var1,Var2,Var3] 然后我们有一个函数(我们事先不知道这个函数,但它使用了与我们相同数量的X个变量)在这些变量上运行 def Function(Var1,Var2,Var3) print Var1

我将解释这个例子,因为它更容易用这种方式描述:

假设我们有一个数量不确定的变量,可以是列表或字符串

例如,X=3,我们有:

Var1=list("a","b")
Var2=list("c","d")
Var3="e"
所有这些都在一个列表中: ListOfVariables=[Var1,Var2,Var3]

然后我们有一个函数(我们事先不知道这个函数,但它使用了与我们相同数量的X个变量)在这些变量上运行

def Function(Var1,Var2,Var3)
    print Var1
    print Var2
    print Var3
这里的目标是使函数与所有输入变量一起运行,如果其中一个是列表,它必须为列表中的每个项执行函数。所以想要的结果是调用所有函数,如下所示:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)
Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)
到目前为止,我正在使用一个助手函数来识别Var1、Var2和Var3,但我的大脑没有太多的递归可预测性,因此无法定义这个助手函数,例如:

def HelperFunction():
    for item in ListOfVariables:
        if type(item).__name__=='list':
            #This one will be done as a "for", so all the items in this list are executed as input (Var1 and Var2 in the example)
        else:
            #This item doesnt need to be included in a for, just execute once (Var3 in the example)
我知道这可以用python来完成,但我无法在脑海中编写我所需要的函数,它的复杂度比我的“大脑模拟器”能够模拟python还要高=(

非常感谢你的帮助


回答后编辑: 非常感谢您的回答,但我不确定提议的解决方案是否解决了问题。 如果我们运行:

helper_function(ListOfVariables)
那么helper_函数应该调用函数“function”4次,如下所示:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)
Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)
其目的是使用输入中的所有变量,但在函数所需的相应位置。 更具体地说,helper_函数(ListOfVariables)的逻辑过程是:

Var1是一个列表,因此,我必须循环遍历它的contains并运行函数(),但这些将只是函数的第一个参数

Var2是一个列表,因此,我还将循环,其中项仅是函数()的第二个参数

Var3是单个项,因此,对于其他两个循环,该值将被指定为常量

这就是我们获得期望的结果的方式:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)
非常感谢你,我自己就是搞不懂

def recurse_me(my_list):
    if not isinstance(my_list,(list,tuple)):
        print "Unexpected Arg! not a list!!:",my_list
    for item in my_list:
        if isinstance(item,(list,tuple)):
            print "Recursive Call! recurse_me(%s)"%item
            recurse_me(item)
         else:
            print "Normal:",item

不确定这是否是你想要的,但我想是的,这就是你想要的吗

def helper_function(my_list):
    for item in my_list:
        if isinstance(item, basestring):
            do_something(item)
        else:
            helper_function(item)

如果列表中的项是字符串,则对其运行函数。如果不是,则只需再次调用该项的帮助函数,因为它接受任何包含字符串的任意列表。

为什么不直接使用参数

def func(*vars):
  for var in vars:
    dostuff_with_var(var)

dostuff\u with_var
中,您可以检查类型并相应地执行操作。

如果我理解正确,您不知道需要多少参数,并且希望在这些参数上运行函数。如果是这样,您希望使用
*
来定义未知数量的参数,这些参数将被视为列表。这只是一个条件例如:

def some_name(*args):
    for arg in args:
        if isinstance(arg, list):
            some_name(*arg)
        if isinstance(arg, str):
            print arg

是吗?

如果我理解正确,那么进一步概括一下问题:您希望在参数中所有元素的乘积上迭代函数;非列表参数应被视为仅包含其自身的列表。使用
itertools
模块,并将其视为迭代而不是迭代递归过程简化了事情:

import itertools

def combine(*args):
    lists = [arg if isinstance(arg, list) else [arg] for arg in args]
    for a, b, c in itertools.product(*lists):
        Function(a, b, c)

Var1=["a","b"]
Var2=["c","d"]
Var3="e"

combine(Var1, Var2, Var3)

如果您需要处理列表列表,那么您需要一个递归过程。

我认为您最好检查列表或元组的递归,并在else中执行dou_某事…如果列表中的一项是int(例如)虽然这会爆炸+1,因为如果他只有字符串和列表支持答案,这会起作用,这很接近,但在我的测试中,没有按预期运行,更多关于编辑问题的详细信息。非常感谢。答案更新,参数的数量是已知的,但它们可能是列表或单个参数。目标是使函数按照答案编辑中的详细说明,递归地使用所有参数。非常感谢,非常感谢,这样做了!所以..你..希望它获取变量并对三个给定参数之间的每个现有组合运行
函数
。正确吗?是的,我相信这就是John spong answer所做的。实际上,已测试并正在运行g现在:)