web-dev-qa-db-fra.com

Fonction Python en tant qu'argument de fonction?

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, ceci est essentiellement deux questions:

  1. Est-ce permis du tout?
  2. Et si c'est le cas, comment utiliser la fonction dans 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 de anotherfunc.

86
a7664

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 différents 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
>>>
103

Voici un autre moyen d'utiliser *args (et aussi éventuellement), **kwargs:

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

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

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

Sortie

hello dude
world

Notez que function, *args, **kwargs doivent être dans cet ordre et doivent être les derniers arguments de la fonction qui appelle la fonction.

28
sabujp

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

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
16

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

  • map (fonction, iterable, ...) - Applique une fonction à chaque élément de iterable et renvoie une liste des résultats. 
  • filter (function, iterable) - Construit une liste à partir des éléments des iterables pour lesquels function renvoie true.
  • reduction (function, iterable [ initializer]) - Applique la fonction de deux arguments de manière cumulative aux éléments de iterable, de gauche à right, afin de réduire l'iterable à une valeur unique.
  • lambdas
4
Artsiom Rudzenka
  1. Oui. En incluant l'appel de fonction dans votre argument d'entrée/s, vous pouvez appeler deux fonctions (ou plus) à la fois. 

Par exemple:

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

Lorsque vous appelez myfunc, vous procédez comme suit:

myfunc(anotherfunc(inputarg1, inputarg2))

Cela affichera la valeur de retour de anotherfunc. 

J'espère que cela t'aides! 

2
Arial
  1. Oui, c'est permis.
  2. Vous utilisez la fonction comme vous le feriez avec une autre: anotherfunc(*extraArgs)
2
sepp2k

Fonction dans la fonction: nous pouvons aussi utiliser la fonction comme paramètre.

En d'autres termes, nous pouvons dire qu'une sortie d'une fonction est aussi une référence pour un objet. Voir ci-dessous comment la sortie d'une fonction interne fait référence à la fonction externe 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. 

0
Temizzi
def x(a):
    print(a)
    return a

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

y(x, 1)

Je pense que cela constituerait un exemple plus approprié .. Maintenant, je me demande s’il existe un moyen de coder la fonction à utiliser dans la soumission d’arguments à une autre fonction. Je crois qu’il en existe en C++, mais en Python, je ne suis pas sûr.

0
Boris Epstein
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
0