2015-09-26 2 views
5

У меня есть список: mylist = [1,2,5,4,7,8] Я определил ряд функций, которые работают в этом списке. Например:Выбор подмножества функций из списка функций в python

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']

Самый вещий способ вызвать эти функции?

ответ

6

Я не думаю, что есть способ pythonic ™ решить вопрос. Но в моем коде это довольно распространенная ситуация, поэтому я написал свою собственную функцию для этого:

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 сам является вызываемым объектом и может быть сохранен в списке.

EDIT:

Или, возможно, было бы более вещий использовать список понимание вместо map:

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

Вы можете использовать eval

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

Вы можете получить функции по их именам:

map(globals().get, fxnOfInterest) 

А затем цикл над ними и применить их к списку:

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

отличный ответ, при поддержке. В случае, если необходимо было проверить, что указанное имя относится к вызываемому, добавьте 'if hasattr (func, '__call __')' к пониманию списка (используйте 'callable (func)' на python 3) – Pynchia

0

Попробуйте этот пример, я думаю, что ничто не может быть более вещим, чем это, Я называю это функцией диспетчером.

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 словаря, Когда ты в Риме, поступай, как римляне.

+0

i.e сопоставьте их вручную. Но это не нужно, поскольку у Python есть много способов самоанализа – Pynchia

Смежные вопросы