Python-Funktion als Funktionsargument?

116

Kann eine Python-Funktion ein Argument einer anderen Funktion sein?

Sagen:

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

Das sind also im Grunde zwei Fragen:

  1. Ist das überhaupt erlaubt?
  2. Und wenn ja, wie verwende ich die Funktion in der anderen Funktion? Würde ich exec (), eval () oder ähnliches verwenden müssen? Ich musste mich nie mit ihnen anlegen.

Übrigens ist extraArgs eine Liste / ein Tupel der Argumente einer anderen Funktion.

a7664
quelle
Siehe auch
alseether

Antworten:

138

Kann eine Python-Funktion ein Argument einer anderen Funktion sein?

Ja.

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

Genauer gesagt ... mit verschiedenen Argumenten ...

>>> 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
quelle
Kann extraArgs auch eine Funktion sein? wenn ja wie nennt man das
Aysennoussi
@sekai Ja, extraArgs kann auch eine Funktion sein.
Manuel Salvadores
3
wo ist das dokumentiert
4dc0
32

Hier ist eine andere Möglichkeit *args(und optional auch) **kwargs:

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

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

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

Ausgabe

hello dude
world

Beachten Sie, dass function, *args, **kwargshaben in dieser Reihenfolge zu sein und haben die letzten Argumente für die Funktion , um die Funktion aufrufen.

sabujp
quelle
3
Weitere Infos zu * args & ** kwargs finden Sie hier pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

Funktionen in Python sind erstklassige Objekte. Aber Ihre Funktionsdefinition ist ein bisschen anders .

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

Sicher, deshalb implementiert Python die folgenden Methoden, bei denen der erste Parameter eine Funktion ist:

  • map (function, iterable, ...) - Wenden Sie die Funktion auf jedes iterable Element an und geben Sie eine Liste der Ergebnisse zurück.
  • filter (function, iterable) - Erstellen Sie eine Liste aus den Elementen von iterable, für die die Funktion true zurückgibt.
  • reduzieren (Funktion, iterierbar [, Initialisierer]) - Wenden Sie die Funktion von zwei Argumenten kumulativ von links nach rechts auf die Elemente von iterierbar an, um das iterierbare Element auf einen einzelnen Wert zu reduzieren.
  • Lambdas
Artsiom Rudzenka
quelle
2
  1. Ja, das ist erlaubt.
  2. Sie verwenden die Funktion wie jede andere: anotherfunc(*extraArgs)
sepp2k
quelle
2
  1. Ja. Durch Einfügen des Funktionsaufrufs in Ihre Eingabeargumente können Sie zwei (oder mehr) Funktionen gleichzeitig aufrufen.

Beispielsweise:

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

Wenn Sie myfunc aufrufen, tun Sie Folgendes:

myfunc(anotherfunc(inputarg1, inputarg2))

Dadurch wird der Rückgabewert einer anderen Funktion gedruckt.

Hoffe das hilft!

Arial
quelle
2

Funktion innerhalb der Funktion: Wir können die Funktion auch als Parameter verwenden.

Mit anderen Worten, wir können sagen, dass eine Ausgabe einer Funktion auch eine Referenz für ein Objekt ist. Sehen Sie unten, wie sich die Ausgabe der inneren Funktion wie unten auf die äußere Funktion bezieht.

def out_func(a):

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

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

das Ergebnis wird sein .. 14

Hoffe das hilft.

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

def y(a):
    return a

y(x(1))
Richard Hayman-Joyce
quelle
2
Bitte erwägen Sie, Ihrer Antwort eine Erklärung hinzuzufügen.
HMD
Sie übergeben hier nicht die Funktion als Argument, sondern den Rückgabewert.
Bob Bobster
1
def x(a):
    print(a)
    return a

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

y(x, 1)

Das denke ich wäre eine passendere Probe. Ich frage mich nun, ob es eine Möglichkeit gibt, die Funktion zu codieren, die innerhalb der Argumentübermittlung an eine andere Funktion verwendet werden soll. Ich glaube, es gibt in C ++, aber in Python bin ich mir nicht sicher.

Boris Epstein
quelle
1

Dekoratoren sind in Python sehr leistungsfähig, da sie es Programmierern ermöglichen, Funktionen als Argumente zu übergeben und Funktionen auch innerhalb einer anderen Funktion zu definieren.

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

Ausgabe

  • Dies ist innerhalb der Funktion vor der Ausführung
  • Ich bin Argumentfunktion
Usman Gani
quelle