web-dev-qa-db-de.com

Python - Übergeben einer Funktion an eine andere Funktion

Ich löse ein Rätsel mit python und je nachdem, welches Rätsel ich löse, muss ich einen speziellen Satz von Regeln verwenden. Wie kann ich eine Funktion in eine andere Funktion in Python übergeben?

Beispiel

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

Dies ist nur ein Pseudocode und daher nicht spezifisch, aber ich erhalte den Code zum Kompilieren, aber ich muss wissen, wie die Funktion Game aufgerufen wird und ob sie korrekt definiert ist, da die Regeln entweder für Rule1(v) oder Rule2(v).

Übergeben Sie es einfach wie jeden anderen Parameter:

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

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

print b(a,10)
131
John Millikin

Behandeln Sie die Funktion in Ihrem Programm als Variable, damit Sie sie einfach an andere Funktionen übergeben können:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked
21
Piotr Czapla

Ein verallgemeinerter Ansatz

Beachten Sie zum Übergeben einer Funktion und der Parameter an die Funktion (z. B. Verwenden derselben Iterationsroutine für verschiedene Funktionen) das folgende Beispiel (python2.x):

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 __== '__main__':
    # This will print `3` five times
    looper(test, a=1, b=2)

Eine Erklärung

  • Tuple( i for i in (1, 2, 3)) ist ein Tupel-Generator, der aus den Elementen einer Liste, eines Sets, eines Tupels ... in unserem Fall aus den Werten von **kwargs ein Tupel erstellt.
  • das * vor dem Tuple() entpackt seinen Inhalt und übergibt ihn effektiv als Parameter an die übergebene Funktion
  • _ Im Generator ist nur ein Platzhalter für key, da wir das nicht verwenden

Für python3.x:

  • print(a+b) anstelle von print a+b
  • kwargs.items() anstelle von kwargs.iteritems()
10
ryanjdillon

Gib es einfach so weiter:

Game(list_a, list_b, Rule1)

und dann könnte deine Spielfunktion ungefähr so ​​aussehen (immer noch Pseudocode):

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
8
Ian Clelland

Ein Funktionsname kann ein Variablenname werden (und daher als Argument übergeben werden), indem die Klammern entfernt werden. Ein Variablenname kann durch Hinzufügen der Klammern zu einem Funktionsnamen werden.

Setzen Sie in Ihrem Beispiel die Variable rules einer Ihrer Funktionen gleich, ohne die Klammern und die Erwähnung des Arguments. Rufen Sie dann in Ihrer Funktion game()rules( v ) mit den Klammern und dem Parameter v auf.

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

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