web-dev-qa-db-fra.com

Python - Passage d'une fonction à une autre fonction

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).

80

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)
131
John Millikin

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
21
Piotr Czapla

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
  • le * 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 cela

Pour python3.x:

  • print(a+b) au lieu de print a+b
  • kwargs.items() au lieu de kwargs.iteritems()
10
ryanjdillon

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

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...
8
Ken