106 votes

Python - Passer une fonction dans une autre fonction

Je suis en train de résoudre une énigme à l'aide de python et, selon l'énigme que je suis en train de résoudre, je devrai utiliser un ensemble spécial de règles. Comment puis-je passer une fonction dans 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

Il s'agit juste d'un pseudo-code et donc non spécifique mais j'ai réussi à compiler le code mais j'ai besoin de savoir comment appeler la fonction. Game et s'il est correctement défini puisque les règles seront changées pour l'un ou l'autre Rule1(v) o Rule2(v) .

171voto

John Millikin Points 86775

Il suffit de le passer 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)

29voto

Piotr Czapla Points 8626

Traitez les fonctions comme des variables dans votre programme afin de pouvoir les passer facilement à d'autres fonctions :

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

17voto

shootingstars Points 774

Pour passer à la fois une fonction, et tout argument à la fonction :

from typing import Callable    

def looper(fn: Callable, n:int, *args, **kwargs):
    """
    Call a function `n` times

    Parameters
    ----------
    fn: Callable
        Function to be called.
    n: int
        Number of times to call `func`.
    *args
        Positional arguments to be passed to `func`.
    **kwargs
        Keyword arguments to be passed to `func`.

    Example
    -------
    >>> def foo(a:Union[float, int], b:Union[float, int]):
    ...    '''The function to pass'''
    ...    print(a+b)
    >>> looper(foo, 3, 2, b=4)
    6
    6
    6       
    """
    for i in range(n):
        fn(*args, **kwargs)

En fonction de ce que vous faites, il pourrait être judicieux de définir une decorator ou peut-être utiliser functools.partial .

10voto

Ian Clelland Points 15066

Il suffit de le passer, comme ça :

Game(list_a, list_b, Rule1)

et votre fonction de jeu pourrait ressembler à ceci (toujours en 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

10voto

Ken Points 31

Un nom de fonction peut devenir un nom de variable (et donc être passé comme argument) en laissant tomber les parenthèses. Un nom de variable peut devenir un nom de fonction en ajoutant les parenthèses.

Dans votre exemple, mettez en équation la variable rules à l'une de vos fonctions, en omettant les parenthèses et la mention de l'argument. Ensuite, dans votre game() invoquer la fonction rules( v ) avec les parenthèses et le v paramètre.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X