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

2024-03-29 01:11:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我将解释这个例子,因为这样更容易描述:

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

例如,X=3,我们有:

Var1=list("a","b")
Var2=list("c","d")
Var3="e"

所有这些都在一个列表中: ListOfVariables=[Var1,Var2,Var3]

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

^{pr2}$

这里的目标是让函数使用所有输入变量运行,如果其中一个是列表,它必须为列表中的每一项执行该函数。所以我们想要的结果是调用所有函数,如下所示:

^{3}$

到目前为止,我使用了一个helper函数来识别Var1、Var2和Var3,但是我的大脑没有太多的递归可预测性,因此无法定义这个HelperFunction,例如:

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次,如下所示:

^{3}$

目的是使用输入中的所有变量,但在函数需要的相应位置使用它们。 更具体地说,helper_函数(变量列表)的逻辑过程是:

Var1是一个列表,因此,我将不得不循环它的contains并运行函数(),但这些只是函数的第一个参数!在

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

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

这就是我们得到想要的:

^{3}$

非常感谢你,我只是自己搞不懂!在


Tags: the函数inhelper列表for数量item
3条回答

如果我理解正确的话,那么进一步概括这个问题:您希望在参数中所有元素的乘积上迭代函数;非列表参数应该被视为只包含它们自身的列表。使用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)

如果需要处理列表,则需要递归过程。在

这就是你要找的东西吗?在

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

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

如果我没弄错的话,你不知道需要多少个参数,但是你希望在它们上运行一个函数。如果是这样,您希望使用*来定义一个未知数量的参数,这些参数将被视为一个列表。那么这只是一个条件,比如:

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

是这样吗?在

相关问题 更多 >