Funkcja Pythona jako argument funkcji?

116

Czy funkcja Pythona może być argumentem innej funkcji?

Mówić:

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

To są zasadniczo dwa pytania:

  1. Czy to w ogóle dozwolone?
  2. A jeśli tak, jak mam użyć tej funkcji w drugiej funkcji? Czy musiałbym użyć exec (), eval () czy czegoś takiego? Nigdy nie musiałem z nimi zadzierać.

BTW, extraArgs to lista / krotka argumentów innej funkcji.

a7664
źródło

Odpowiedzi:

138

Czy funkcja Pythona może być argumentem innej funkcji?

Tak.

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

Mówiąc dokładniej ... z różnymi argumentami ...

>>> 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
źródło
czy extraArgs mogą być również funkcją? jeśli tak, jak to nazywasz?
Aysennoussi
@sekai Tak, extraArgs też może być funkcją.
Manuel Salvadores
3
gdzie to jest udokumentowane?
4dc0
32

Oto inny sposób użycia *args(i opcjonalnie) **kwargs:

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

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

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

Wynik

hello dude
world

Należy zauważyć, że function, *args, **kwargsmają być w tym celu i muszą być ostatnie argumenty do funkcji wywoływania funkcji.

sabujp
źródło
3
Więcej informacji o * args i ** kwargs można znaleźć tutaj pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

Funkcje w Pythonie to obiekty pierwszej klasy. Ale twoja definicja funkcji jest trochę błędna .

def myfunc(anotherfunc, extraArgs, extraKwArgs):
  return anotherfunc(*extraArgs, **extraKwArgs)
Ignacio Vazquez-Abrams
źródło
4

Jasne, dlatego python implementuje następujące metody, w których pierwszym parametrem jest funkcja:

  • map (function, iterable, ...) - Zastosuj funkcję do każdego elementu iterowalnego i zwróć listę wyników.
  • filter (function, iterable) - Skonstruuj listę z tych elementów iterowalnych, dla których funkcja zwraca true.
  • redukuj (funkcja, iterowalna [, inicjalizator]) - Zastosuj funkcję dwóch argumentów łącznie do elementów iterowalnych, od lewej do prawej, tak aby zredukować iterowalność do pojedynczej wartości.
  • lambdy
Artsiom Rudzenka
źródło
2
  1. Tak, jest to dozwolone.
  2. Używasz tej funkcji jak każdej innej: anotherfunc(*extraArgs)
sepp2k
źródło
2
  1. Tak. Włączając wywołanie funkcji do argumentu / argumentów wejściowych, możesz wywołać dwie (lub więcej) funkcje jednocześnie.

Na przykład:

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

Dzwoniąc do myfunc, robisz to:

myfunc(anotherfunc(inputarg1, inputarg2))

Spowoduje to wydrukowanie wartości zwracanej przez anotherfunc.

Mam nadzieję że to pomoże!

Arial
źródło
2

Funkcja wewnątrz funkcji: możemy również użyć funkcji jako parametru.

Innymi słowy, możemy powiedzieć, że wynik funkcji jest również odniesieniem do obiektu. Zobacz poniżej, w jaki sposób dane wyjściowe funkcji wewnętrznej odnoszą się do funkcji zewnętrznej, jak poniżej.

def out_func(a):

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

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

wynik będzie ... 14

Mam nadzieję że to pomoże.

Temizzi
źródło
1
def x(a):
    print(a)
    return a

def y(a):
    return a

y(x(1))
Richard Hayman-Joyce
źródło
2
Zastanów się nad dodaniem wyjaśnienia do swojej odpowiedzi.
HMD
Nie przekazujesz tutaj funkcji jako argumentu, zamiast tego zwracasz wartość.
Bob Bobster,
1
def x(a):
    print(a)
    return a

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

y(x, 1)

Myślę, że byłaby to bardziej odpowiednia próbka. Teraz zastanawiam się, czy istnieje sposób na zakodowanie funkcji do użycia w ramach przesyłania argumentów do innej funkcji. Wydaje mi się, że jest w C ++, ale w Pythonie nie jestem pewien.

Boris Epstein
źródło
1

Dekoratory są bardzo potężne w Pythonie, ponieważ pozwalają programistom przekazywać funkcję jako argument, a także mogą definiować funkcję wewnątrz innej funkcji.

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

Wynik

  • To jest wewnątrz funkcji przed wykonaniem
  • Jestem funkcją argumentową
Usman Gani
źródło