从python中的函数列表中选择函数子集

从python中的函数列表中选择函数子集,python,Python,我有一个列表:mylist=[1,2,5,4,7,8] 我已经定义了许多在这个列表上运行的函数。例如: def mean(x): ... def std(x): ... def var(x): ... def fxn4(x): ... def fxn5(x): ... def fxn6(x): ... def fxn7(x): ... 现在,我得到了一个要应用于mylist的函数名列表 例如:fxnOfInterest=['mean','std','var','fxn6'] 调用这些函数的最具

我有一个列表:
mylist=[1,2,5,4,7,8]
我已经定义了许多在这个列表上运行的函数。例如:

def mean(x): ...
def std(x): ...
def var(x): ...
def fxn4(x): ...
def fxn5(x): ...
def fxn6(x): ...
def fxn7(x): ...
现在,我得到了一个要应用于mylist的函数名列表

例如:
fxnOfInterest=['mean','std','var','fxn6']


调用这些函数的最具Python风格的方法是什么?

我认为没有Python风格的方法™ 解决问题的方法。但在我的代码中,这是一种非常常见的情况,因此我编写了自己的函数:

def applyfs(funcs, args):
    """
    Applies several functions to single set of arguments. This function takes
    a list of functions, applies each to given arguments, and returns the list
    of obtained results. For example:

        >>> from operator import add, sub, mul
        >>> list(applyfs([add, sub, mul], (10, 2)))
        [12, 8, 20]

    :param funcs: List of functions.
    :param args:  List or tuple of arguments to apply to each function.
    :return:      List of results, returned by each of `funcs`.
    """
    return map(lambda f: f(*args), funcs)
在您的情况下,我将使用以下方式:

applyfs([mean, std, var, fxn4 ...], mylist)
请注意,实际上不必使用函数名(例如,在PHP4中必须使用函数名),在Python中,函数本身就是可调用的对象,可以存储在列表中

编辑:

或者,如果使用列表理解而不是
map
,可能会更具python风格:

results = [f(mylist) for f in [mean, std, var, fxn4 ...]]

您可以使用
eval

mylist = [1,2,5,4,7,8]
fxnOfInterest = ['mean', 'std', 'var', 'fxn6']
for fn in fxnOfInterest:
    print eval(fn+'(mylist)')

您可以通过以下方式按函数名称获取函数:

map(globals().get, fxnOfInterest)
然后在其上循环并将其应用于列表:

[func(mylist) for func in map(globals().get, fxnOfInterest)]

试试这个例子,我觉得没有什么比这个更像蟒蛇了, 我称之为函数调度器

dispatcher={'mean':mean,'std':std,'var':var,'fxn4':fxn4}
try:
    for w in fxnOfInterest :
        function=dispatcher[w]
        function(x)
except KeyError:
    raise ValueError('invalid input')
每个时间函数将根据
dispatcher
字典获取值,
当你在罗马时,你确实喜欢罗马人

即,手动映射它们。但这是不必要的,因为Python有许多自省的方法——最好的答案是“向上投票”。如果有必要检查所提供的名称是否引用了可调用的add
if hasattr(func,“\uuu call”
,将其添加到列表理解中(在python 3上使用
callable(func)