Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-根据函数句柄输入正确数量的变量_Python - Fatal编程技术网

python-根据函数句柄输入正确数量的变量

python-根据函数句柄输入正确数量的变量,python,Python,我有一个变量列表和一个函数对象,我想根据函数分配正确数量的变量 def sum2(x,y): return x + y def sum3(x,y,z): return x + y + z varList = [1,2,3] 因此,如果f=sum2,我希望它调用varList的前2个元素,如果f=sum3,则用函数的3个元素调用它。您可以使用默认初始化,您应该记住可以传递到此函数的最大变量数。然后创建一个具有该数量的参数的函数,但用0初始化它们,因为a+0=a(如果缺少某些参

我有一个变量列表和一个函数对象,我想根据函数分配正确数量的变量

def sum2(x,y):
    return x + y

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

varList = [1,2,3]

因此,如果f=sum2,我希望它调用varList的前2个元素,如果f=sum3,则用函数的3个元素调用它。

您可以使用默认初始化,您应该记住可以传递到此函数的最大变量数。然后创建一个具有该数量的参数的函数,但用0初始化它们,因为
a+0=a
(如果缺少某些参数,它将替换为
0
,这不会影响结果。)

def sum2(x,y):
    return x + y

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

varList = [1,2,3]
但是,如果使用4个以上的参数调用该函数,则会引发错误语句

正如@CoryKramer在评论中所建议的,您还可以将
varlist=[1,2,3,4]
作为参数传递:

print sum1(*varlist)
>>> 10

请记住
len(varlist)
应小于定义的参数数量。

使用
检查
模块如下:

import inspect
n2 = len(inspect.getargspec(sum2)[0])
n3 = len(inspect.getargspec(sum3)[0])
sum2(*varList[0:n2])
sum3(*varList[0:n3])

getargspec
返回一个4元组的
(args、varargs、关键字、默认值)
。因此,如果您的所有参数都是显式的,即不是*或**参数,则上述代码可以工作。如果您有一些,请相应地更改代码。

您可以检查f是否是带有
is
关键字的函数

def sum2(x, y):
    return x + y

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

varList = [1, 2, 3]

f = sum2

if f is sum2:
    sum = f(varList[0], varList[1])
    print('Sum 2: ' + str(sum))
    # Prints: 'Sum 2: 3'


f = sum3

if f is sum3:
    sum = f(varList[0], varList[1], varList[2])
    print('Sum 3: ' + str(sum))
    # Prints: 'Sum 3: 6'

如果您总是返回所有传递参数的总和,那么这可以在单个函数中完成

def sum1(*args):
    return sum(args)
这只是利用位置参数,因为您似乎不需要显式设置单个值。它也比提供的解决方案更灵活,因为您不需要提前知道可以接收的最大参数数

一些例子:

>>> print sum1(1, 2, 3)
6
>>> print sum1(1)
1
>>> print sum1(-1, 0, 6, 10)
15
一般解决办法:

要获取参数的数目,可以使用f.func_code.co_argcount,然后从列表中传递正确的元素:

defsum2(x,y):
返回x+y
def sum3(x、y、z):
返回x+y+z
varlist=[2,5,4]
[sum2,sum3]中f的[f(*varlist[:f.func_code.co_argcount])]
>> [7, 11]
一系列功能:

def two(l):
    return l[0] + l[1]

def three(l):
    return l[0] * l[1] + l[2]

funcs = {2:two, 3:three}

l = [1, 2, 3]

print len(l)

print funcs[len(l)](l)

你所说的
f=sum2
是什么意思?这两个功能在各个方面都是相同的吗?或者它们是否包含用于相同结果的不同实现?