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.


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

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.


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


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

2
  1. Ja, das ist erlaubt.
  2. Sie verwenden die Funktion wie jede andere: anotherfunc(*extraArgs)

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!


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.


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

def y(a):
    return a

y(x(1))

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.