2017-03-02 4 views
1

Wie verwendet man einen Funktionsnamen als Parameter in Python? Zum Beispiel:Wie übergebe ich eine Liste von Funktionsnamen als Parameter?

def do_something_with(func_name, arg): 
    return func_name(arg) 

wo 'func_name' könnte 'mean', 'std', 'Art' usw.

Zum Beispiel sein:

import numpy as np 
func_list = ['mean', 'std'] 

for func in func_list: 
    x = np.random.random(10) 
    print do_something_with(func, x) 

und natürlich das Ergebnis sollte eine erfolgreiche Anwendung von 'mean' und 'std' auf meinem Array 'x'.

+7

übergeben Sie stattdessen eine Liste von Funktionen. 'func_list = [np.mean, np.std]' –

+2

Mögliches Duplikat von [Python - Übergeben einer Funktion in eine andere Funktion] (http://stackoverflow.com/questions/1349332/python-passing-a-function-into- eine andere Funktion) (obwohl der Großteil der tatsächlichen Frage irrelevant ist, sind die Grundfrage und die Antworten gültig) –

Antwort

5

Wie in den Kommentaren vorgeschlagen, übergeben Sie Funktionsobjekte in einer Liste an Ihre Funktion und rufen Sie sie auf. Dies wird nicht nur mit numpy arbeiten, aber mit allen Python-Funktionen:

import numpy as np 
func_list = [np.mean, np.std] 

for func in func_list: 
    x = np.random.random(10) 
    print func(x) 

Sicherstellen, dass die Funktionsaufrufe, die alle die gleiche Art und Weise arbeiten, das heißt x als ersten Parameter.

oben Das ist ziemlich ähnlich, wie Funktion Umbenennung funktioniert:

import time 

another_sleep = time.sleep 
another_sleep(1) # Sleep for one second 

Sie erstellen ein Funktionsobjekt (time.sleep) und weisen Sie auf eine Variable (another_sleep). Jetzt können Sie es mit dem Namen der Variablen (another_sleep(1)) aufrufen.

4

Tadhg McDonald-Jensens Lösung ist richtig, weil Funktion in Python erstklassig ist. Auch ich habe eine andere Idee:

from operator import methodcaller 

import numpy as np 


func_list = ['mean', 'std'] 
for func in func_list: 
    x = np.random.random(10) 
    f = methodcaller(func, x) 
    result = f(np) 
    print(result) 

Sie operator.methodcaller für einige Fälle verwenden können.

+1

das ist interessant! Vielen Dank! –

Verwandte Themen