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)
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
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.*
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 verwendenFür python3.x
:
print(a+b)
anstelle von print a+b
kwargs.items()
anstelle von kwargs.iteritems()
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
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...