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.


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

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.


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


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

2
  1. Tak, jest to dozwolone.
  2. Używasz tej funkcji jak każdej innej: anotherfunc(*extraArgs)

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!


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.


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

def y(a):
    return a

y(x(1))

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.


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ą
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.