Fonction Python comme argument de fonction?

116

Une fonction Python peut-elle être un argument d'une autre fonction?

Dire:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

Donc, ce sont essentiellement deux questions:

  1. Est-ce autorisé du tout?
  2. Et si c'est le cas, comment utiliser la fonction à l'intérieur de l'autre fonction? Aurais-je besoin d'utiliser exec (), eval () ou quelque chose comme ça? Jamais eu besoin de jouer avec eux.

BTW, extraArgs est une liste / tuple des arguments d'un autrefunc.

a7664
la source

Réponses:

138

Une fonction Python peut-elle être un argument d'une autre fonction?

Oui.

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

Pour être plus précis ... avec divers arguments ...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>
Manuel Salvadores
la source
extraArgs peut-il aussi être une fonction? si oui, comment l'appelez-vous?
Aysennoussi
@sekai Oui, extraArgs peut aussi être une fonction.
Manuel Salvadores
3
où est-ce documenté?
4dc0
32

Voici une autre façon en utilisant *args(et le cas échéant), **kwargs:

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

Production

hello dude
world

Notez que function, *args, **kwargsdoivent être dans cet ordre et doivent être les derniers arguments à la fonction appelant la fonction.

sabujp
la source
3
Plus d'informations sur * args & ** kwargs peuvent être trouvées ici pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

Les fonctions en Python sont des objets de première classe. Mais la définition de votre fonction est un peu décalée .

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
Ignacio Vazquez-Abrams
la source
4

Bien sûr, c'est pourquoi python implémente les méthodes suivantes où le premier paramètre est une fonction:

  • map (function, iterable, ...) - Applique une fonction à chaque élément d'itérable et renvoie une liste des résultats.
  • filter (function, iterable) - Construit une liste à partir des éléments de iterable pour lesquels la fonction renvoie true.
  • réduire (function, iterable [, initializer]) - Appliquer la fonction de deux arguments de manière cumulative aux éléments de l'itérable, de gauche à droite, afin de réduire l'itérable à une seule valeur.
  • lambdas
Artsiom Rudzenka
la source
2
  1. Oui, c'est permis.
  2. Vous utilisez la fonction comme vous le feriez pour n'importe quelle autre: anotherfunc(*extraArgs)
sepp2k
la source
2
  1. Oui. En incluant l'appel de fonction dans votre / vos argument (s) d'entrée, vous pouvez appeler deux (ou plus) fonctions à la fois.

Par exemple:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

Lorsque vous appelez myfunc, vous faites ceci:

myfunc(anotherfunc(inputarg1, inputarg2))

Cela imprimera la valeur de retour d'un autrefunc.

J'espère que cela t'aides!

Arial
la source
2

Fonction à l'intérieur de la fonction: nous pouvons également utiliser la fonction comme paramètre.

En d'autres termes, nous pouvons dire qu'une sortie d'une fonction est également une référence pour un objet, voir ci-dessous comment la sortie de la fonction interne fait référence à la fonction extérieure comme ci-dessous.

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

le résultat sera .. 14

J'espère que cela t'aides.

Temizzi
la source
1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
Richard Hayman-Joyce
la source
2
Pensez à ajouter quelques explications à votre réponse.
HMD
Vous ne passez pas la fonction comme argument ici, mais plutôt la valeur de retour.
Bob Bobster
1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

Je pense que ce serait un échantillon plus approprié. Maintenant, ce que je me demande, c'est s'il existe un moyen de coder la fonction à utiliser dans la soumission d'argument à une autre fonction. Je crois qu'il y en a en C ++, mais en Python, je ne suis pas sûr.

Boris Epstein
la source
1

Les décorateurs sont très puissants en Python car ils permettent aux programmeurs de passer une fonction en argument et peuvent également définir une fonction dans une autre fonction.

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

Production

  • C'est à l'intérieur de la fonction avant l'exécution
  • Je suis fonction d'argument
Usman Gani
la source