2009-08-28 17 views
49

Rozwiązuję łamigłówkę za pomocą pythona iw zależności od tego, którą układankę rozwiązuję, będę musiał użyć specjalnego zestawu reguł. Jak mogę przekazać funkcję do innej funkcji w Pythonie?Python - Przekazywanie funkcji do innej funkcji

Przykład

def Game(listA, listB, rules): 
    if rules == True: 
     do... 
    else: 
     do... 

def Rule1(v): 
    if "variable_name1" in v: 
     return False 
    elif "variable_name2" in v: 
     return False 
    else: 
     return True 

def Rule2(v): 
    if "variable_name3" and "variable_name4" in v: 
     return False 
    elif "variable_name4" and variable_name1 in v: 
     return False 
    else: 
     return True 

To nie jest po prostu pseudo kod i dlatego specyficzny, ale pojawia się kod do kompilacji, ale trzeba wiedzieć, jak wywołać funkcję Game i czy to jest poprawnie zdefiniowana, ponieważ zostaną włączone przepisy dla Rule1(v) lub Rule2(v).

Odpowiedz

96

Wystarczy przekazać go w jak każdy inny parametr:

def a(x): 
    return "a(%s)" % (x,) 

def b(f,x): 
    return f(x) 

print b(a,10) 
+30

funkcji są przedmiotem pierwszej klasy, w pytona. możesz je przekazać, umieścić w dyktach, listach itp. Po prostu nie podawaj nawiasów po nazwie funkcji. Przykład dla funkcji o nazwie 'mojafunkcja':' mojafunkcja' oznacza samą funkcję, 'mojafunkcja()' oznacza wywołanie funkcji i uzyskanie jej wartości zwracanej. – nosklo

+3

Uwielbiam proste przykłady, po prostu mają sens !!! – mongotop

+0

A co, jeśli funkcja jest metodą na obiekcie i używa właściwości tego obiektu do wykonania swojej pracy? – CpILL

13

funkcję traktował jako zmienną w programie, dzięki czemu można po prostu przekazać je do innych funkcji łatwo:

def test(): 
    print "test was invoked" 

def invoker(func): 
    func() 

invoker(test) # prints test was invoked 
+0

działa to, jeśli test() przyjmuje argumenty? @codeape ?? – Yasasvee

+0

Tak. W powyższym przykładzie funkcja '' invoker'' będzie musiała podać te argumenty podczas wywoływania funkcji. – codeape

7

Wystarczy przekazać go w, tak:

Game(list_a, list_b, Rule1) 

, a następnie Twoja funkcja gry może wyglądać mniej więcej tak (nadal pseudokod):

def Game(listA, listB, rules=None): 
    if rules: 
     # do something useful 
     # ... 
     result = rules(variable) # this is how you can call your rule 
    else: 
     # do something useful without rules 
7

Nazwa funkcji może stać się nazwą zmiennej (i tym samym przekazywana jako argument) poprzez zrzucenie nawiasów. Nazwa zmiennej może stać się nazwą funkcji poprzez dodanie nawiasów.

W swoim przykładzie zrównaj zmienną rules z jedną z funkcji, pomijając nawiasy i wzmiankę o argumencie. Następnie w funkcji game() wywołaj rules(v) z nawiasami i parametrem v.

if puzzle == type1: 
    rules = Rule1 
else: 
    rules = Rule2 

def Game(listA, listB, rules): 
    if rules(v) == True: 
     do... 
    else: 
     do... 
6

Uogólniony podejście

dla przechodzącej zarówno funkcję, a parametry funkcji (na przykład za pomocą tej samej procedury iteracji dla różnych funkcji) rozważyć następujące (python2.x) Przykład:

def test(a, b): 
    '''The function to pass''' 
    print a+b 

def looper(func, **kwargs): 
    '''A basic iteration function''' 
    for i in range(5): 
     # Our passed function with passed parameters 
     func(*tuple(value for _, value in kwargs.iteritems())) 

if __name__ == '__main__': 
    # This will print `3` five times 
    looper(test, a=1, b=2) 

Niektóre wyjaśnienia

  • tuple(i for i in (1, 2, 3)) to generator krotek, tworzący krotkę z pozycji na liście, zestaw, krotkę ...w naszym przypadku wartości od **kwargs
  • * przed tuple() rozpakuje jego zawartość, skutecznie przekazując je jako parametry do przekazany funkcji
  • _ w generatorze jest tylko posiadacz miejsce dla key, ponieważ nie używasz że

Dla python3.x:

  • print(a+b) zamiast print a+b
  • kwargs.items() zamiast kwargs.iteritems()
Powiązane problemy