Funzione Python come argomento di una funzione?


116

Una funzione Python può essere un argomento di un'altra funzione?

Dire:

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

Quindi queste sono fondamentalmente due domande:

  1. È permesso a tutti?
  2. E se lo è, come si usa la funzione all'interno dell'altra funzione? Avrei bisogno di usare exec (), eval () o qualcosa del genere? Non ho mai avuto bisogno di scherzare con loro.

BTW, extraArgs è una lista / tupla degli argomenti di anotherfunc.


Risposte:


138

Una funzione Python può essere un argomento di un'altra funzione?

Sì.

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

Per essere più precisi ... con vari argomenti ...

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

extraArgs può essere anche una funzione? se è così come lo chiami?
Aysennoussi

@sekai Sì, anche extraArgs può essere una funzione.
Manuel Salvadores

3
dove è documentato?
4dc0

32

Ecco un altro modo utilizzando *args(e anche opzionalmente), **kwargs:

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

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

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

Produzione

hello dude
world

Si noti che function, *args, **kwargsdeve essere in questo ordine e devono essere gli ultimi argomenti della funzione chiamando la funzione.


3
Ulteriori informazioni su * args e ** kwargs possono essere trovate qui pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo


4

Certo, è per questo che python implementa i seguenti metodi in cui il primo parametro è una funzione:

  • map (function, iterable, ...) - Applica la funzione a ogni elemento di iterable e restituisce un elenco dei risultati.
  • filter (function, iterable) - Costruisce un elenco da quegli elementi di iterable per cui la funzione restituisce true.
  • reduce (function, iterable [, initializer]) - Applica la funzione di due argomenti cumulativamente agli elementi di iterable, da sinistra a destra, in modo da ridurre l'iterable a un unico valore.
  • lambda

2
  1. Sì, è permesso.
  2. Utilizzi la funzione come faresti con qualsiasi altra: anotherfunc(*extraArgs)

2
  1. Sì. Includendo la chiamata di funzione negli argomenti di input, è possibile chiamare due (o più) funzioni contemporaneamente.

Per esempio:

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

Quando chiami myfunc, fai questo:

myfunc(anotherfunc(inputarg1, inputarg2))

Questo stamperà il valore di ritorno di anotherfunc.

Spero che questo ti aiuti!


2

Funzione nella funzione: possiamo usare la funzione anche come parametro ..

In altre parole, possiamo dire che l'output di una funzione è anche un riferimento per un oggetto, vedi sotto come l'output della funzione interna fa riferimento alla funzione esterna come sotto ..

def out_func(a):

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

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

il risultato sarà .. 14

Spero che questo ti aiuti.


1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))

2
Considera l'idea di aggiungere qualche spiegazione alla tua risposta.
HMD

Non stai passando la funzione come argomento qui, invece il valore di ritorno.
Bob Bobster

1
def x(a):
    print(a)
    return a

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

y(x, 1)

Penso che sarebbe un campione più appropriato. Ora quello che mi chiedo è se esiste un modo per codificare la funzione da utilizzare all'interno dell'invio dell'argomento a un'altra funzione. Credo che ci sia in C ++, ma in Python non sono sicuro.


1

I decoratori sono molto potenti in Python poiché consentono ai programmatori di passare la funzione come argomento e possono anche definire la funzione all'interno di un'altra funzione.

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

Produzione

  • Questa è all'interno della funzione prima dell'esecuzione
  • Sono funzione argomento
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.