将函数应用于参数列表的排列

时间:2015-01-02 21:10:50

标签: python

我需要使用n个参数和n个值列表的函数,并将该函数应用于每个可能的参数排列。我查看了itertools并且没有一个函数是正确的。以下是我的尝试。谁能解释我做错了什么?感谢。

def CrossReference(f, *args): 
   result = []
    def inner(g, *argsinner):
        rest = argsinner[1:]
        a = argsinner[0]
        if type(a) is not list:
            a = [a]
        for x in a:
            h = partial(g, x)         
            if len(rest) > 0:
                inner(h, rest)
            else:        
               result.append(h())        
    inner(f, args)
    return result

以下是我的示例测试和错误:

def sums(x,y,z):
    return x+y+z

CrossReference(sums, [1,2,3], 4, [5,6,7])

回溯(最近一次呼叫最后一次):文件"",第1行, 在文件"",第13行, 在CrossReference File"",第12行,在内部 TypeError:sums()只需3个参数(给定1个)

2 个答案:

答案 0 :(得分:2)

问题在于您调用inner功能的方式。您将函数头定义为:

def inner(g, *argsinner):

但你称你的功能如下:

inner(f, args)

inner(h, rest)

这意味着你最终会得到一个包含你的args元组的元组(monotuple?)。您可以将函数定义更改为:

def inner(g, argsinner):

或将您的来电更改为:

inner(h, *rest)

答案 1 :(得分:0)

def sums(x,y=0,z=0):
   return x+y+z

def apply(fn,*args):
    for a in args:
        try:
           yield fn(*a)
        except TypeError:
           try:
              yield fn(**a)
           except TypeError:
              yield fn(a)

print list(apply(sums,[1,2,3], 4, [5,6,7]))

是你可以做到的一种方式(不是唯一的方法)