Je résous un casse-tête en utilisant python et, en fonction du casse-tête que je résous, je devrai utiliser un ensemble de règles particulier. Comment puis-je passer une fonction à une autre fonction en Python?
Exemple
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
Ceci est juste un pseudo code et donc pas spécifique mais je reçois le code à compiler mais j'ai besoin de savoir comment appeler la fonction Game
et si elle est correctement définie puisque les règles seront permutées pour Rule1(v)
ou Rule2(v)
.
Il suffit de le transmettre comme n'importe quel autre paramètre:
def a(x):
return "a(%s)" % (x,)
def b(f,x):
return f(x)
print b(a,10)
Traitez la fonction comme variable dans votre programme afin de pouvoir la passer facilement à d’autres fonctions:
def test ():
print "test was invoked"
def invoker(func):
func()
invoker(test) # prints test was invoked
ne approche généralisée
Pour transmettre à la fois une fonction et les paramètres à la fonction (par exemple, en utilisant la même routine d'itération pour différentes fonctions), considérons l'exemple suivant (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)
quelques explications
Tuple( i for i in (1, 2, 3))
est un générateur de Tuple, créant un Tuple à partir des éléments d'une liste, set, Tuple ... dans notre cas, les valeurs de **kwargs
*
situé devant la Tuple()
décompactera son contenu et le transmettra en tant que paramètre à la fonction transmise_
Dans le générateur est juste un espace réservé pour le key
, puisque nous n'utilisons pas celaPour python3.x
:
print(a+b)
au lieu de print a+b
kwargs.items()
au lieu de kwargs.iteritems()
Il suffit de le transmettre, comme ceci:
Game(list_a, list_b, Rule1)
et alors votre fonction de jeu pourrait ressembler à ceci (pseudo-code):
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
Un nom de fonction peut devenir un nom de variable (et donc être passé comme argument) en supprimant les parenthèses. Un nom de variable peut devenir un nom de fonction en ajoutant les parenthèses.
Dans votre exemple, assimilez la variable rules
à l'une de vos fonctions en omettant les parenthèses et la mention de l'argument. Ensuite, dans votre fonction game()
, appelez rules( v )
avec les parenthèses et le paramètre v
.
if puzzle == type1:
rules = Rule1
else:
rules = Rule2
def Game(listA, listB, rules):
if rules( v ) == True:
do...
else:
do...