Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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,我尝试编写一个函数func\u apply(func\u name,**kwargs),它接收列表中的func\u name和参数值,然后将参数逐个应用到func\u name,收集结果并作为列表返回。我需要这个高阶函数func\u apply主要用于抽象语法,因为我的应用程序通常需要将不同的参数值应用于不同的函数,并批量收集结果 def my_minus(x,y): return x-y def my_divd(a,b): return a/b def func_apply

我尝试编写一个函数
func\u apply(func\u name,**kwargs)
,它接收列表中的
func\u name
和参数值,然后将参数逐个应用到
func\u name
,收集结果并作为列表返回。我需要这个高阶函数
func\u apply
主要用于抽象语法,因为我的应用程序通常需要将不同的参数值应用于不同的函数,并批量收集结果

def my_minus(x,y):
    return x-y

def my_divd(a,b):
    return a/b

def func_apply(func_name, **kwargs):
    '''apply the parameter in kwargs one by one to func_name,
       collect and return result in a list.
       for example: 
         func_apply(my_minus, x=[2, 4, 5, 7], y=[1, 4, 3, 9]) will return [1,0,2,-2], 
         func_apply(my_divd,  a=[2, 4, 5, 7], b=[1, 4, 3, 9]) will return [2,1,1.66,0.77]
    '''
    # the codes

那么,如何编写
函数应用

您可以使用
zip
列表理解

kwargs
在这里是一个dict,因为dict没有任何固定的顺序,所以您可能需要首先根据键获得一个值的排序列表

>>> from __future__ import  division   # not required in py3.x
def func_apply(func_name, **kwargs):
    vals = [kwargs[key] for key in sorted(kwargs)] #sort the keys lexicographically
    return [func_name(*x) for x in  zip(*vals)]
... 
>>> func_apply(my_minus, x=[2, 4, 5, 7], y=[1, 4, 3, 9])
[1, 0, 2, -2]
>>> func_apply(my_divd,  a=[2, 4, 5, 7], b=[1, 4, 3, 9])
[2.0, 1.0, 1.6666666666666667, 0.7777777777777778]

您可以使用
zip
列表:

kwargs
在这里是一个dict,因为dict没有任何固定的顺序,所以您可能需要首先根据键获得一个值的排序列表

>>> from __future__ import  division   # not required in py3.x
def func_apply(func_name, **kwargs):
    vals = [kwargs[key] for key in sorted(kwargs)] #sort the keys lexicographically
    return [func_name(*x) for x in  zip(*vals)]
... 
>>> func_apply(my_minus, x=[2, 4, 5, 7], y=[1, 4, 3, 9])
[1, 0, 2, -2]
>>> func_apply(my_divd,  a=[2, 4, 5, 7], b=[1, 4, 3, 9])
[2.0, 1.0, 1.6666666666666667, 0.7777777777777778]

谢谢你的密码。问题是func_name可能需要不同数量的参数。例如:def my_cal(a、b、c):返回a/b-c。然后硬代码返回[func_name(x,y)表示zip中的x,y(*vals)]不适用于这种情况。@bigbug解决方案已更新。使用
func\u name(*x)
,利用序列解包的优势。是的,漂亮简洁的解决方案。感谢首先对kwarg进行排序的巧妙技巧,因为我花了很多时间来找出如何匹配和构造参数名(x=2,y=1等)并传递给func_名称。更一般的解决方案(例如,支持函数
my_divd(y,x)
)将涉及
Signature.bind()
来自
检查
模块(仅限Py3,或借助PyPi的
funcsigs
模块)。感谢您的代码。问题是func_name可能需要不同数量的参数。例如:def my_cal(a、b、c):返回a/b-c。然后硬代码返回[func_name(x,y)表示zip中的x,y(*vals)]不适用于这种情况。@bigbug解决方案已更新。使用
func\u name(*x)
,利用序列解包的优势。是的,漂亮简洁的解决方案。感谢首先对kwarg进行排序的巧妙技巧,因为我花了很多时间来找出如何匹配和构造参数名(x=2,y=1等)并传递给func_名称。更一般的解决方案(例如,支持函数
my_divd(y,x)
)将涉及
Signature.bind()
来自
检查
模块(仅限Py3,或借助PyPi的
funcsigs
模块)。