我需要使用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个)
答案 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]))
是你可以做到的一种方式(不是唯一的方法)