Fungsi Python sebagai argumen fungsi?

116

Bisakah fungsi Python menjadi argumen dari fungsi lain?

Mengatakan:

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

Jadi pada dasarnya ini adalah dua pertanyaan:

  1. Apakah diperbolehkan sama sekali?
  2. Dan jika ya, bagaimana cara menggunakan fungsi di dalam fungsi lainnya? Apakah saya perlu menggunakan exec (), eval () atau sesuatu seperti itu? Tidak pernah perlu mengacaukannya.

BTW, extraArgs adalah daftar / tuple argumen fungsi lain.

a7664
sumber

Jawaban:

138

Bisakah fungsi Python menjadi argumen dari fungsi lain?

Iya.

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

Untuk lebih spesifik ... dengan berbagai argumen ...

>>> 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
sumber
bisakah extraArgs menjadi fungsi juga? jika demikian, bagaimana Anda menyebutnya?
Aysennoussi
@sekai Ya, extraArgs juga bisa berfungsi.
Manuel Salvadores
3
di mana ini didokumentasikan?
4dc0
32

Berikut adalah cara lain menggunakan *args(dan juga opsional), **kwargs:

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

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

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

Keluaran

hello dude
world

Perhatikan bahwa function, *args, **kwargsharus agar dan harus argumen terakhir untuk fungsi memanggil fungsi.

sabujp
sumber
3
Info lebih lanjut tentang * args & ** kwargs dapat ditemukan di sini pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo
16

Fungsi dalam Python adalah objek kelas satu. Tapi definisi fungsi Anda agak salah .

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

Tentu, itulah mengapa python mengimplementasikan metode berikut di mana parameter pertama adalah sebuah fungsi:

  • map (function, iterable, ...) - Menerapkan fungsi ke setiap item iterable dan mengembalikan daftar hasil.
  • filter (function, iterable) - Buat daftar dari elemen iterable yang fungsinya mengembalikan true.
  • reduce (function, iterable [, initializer]) - Menerapkan fungsi dari dua argumen secara kumulatif ke item iterable, dari kiri ke kanan, untuk mengurangi iterable menjadi satu nilai.
  • lambdas
Artsiom Rudzenka
sumber
2
  1. Ya, diperbolehkan.
  2. Anda menggunakan fungsi seperti yang Anda lakukan lainnya: anotherfunc(*extraArgs)
sepp2k.dll
sumber
2
  1. Iya. Dengan memasukkan pemanggilan fungsi dalam argumen input Anda, Anda dapat memanggil dua (atau lebih) fungsi sekaligus.

Sebagai contoh:

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

Saat Anda memanggil myfunc, Anda melakukan ini:

myfunc(anotherfunc(inputarg1, inputarg2))

Ini akan mencetak nilai kembalian dari fungsi lain.

Semoga ini membantu!

Arial
sumber
2

Fungsi di dalam fungsi: kita juga bisa menggunakan fungsi sebagai parameter ..

Dengan kata lain, kita dapat mengatakan bahwa output dari suatu fungsi juga merupakan referensi untuk suatu objek, lihat di bawah ini bagaimana output dari fungsi dalam merujuk ke fungsi luar seperti di bawah ini.

def out_func(a):

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

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

hasilnya akan .. 14

Semoga ini membantu.

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

def y(a):
    return a

y(x(1))
Richard Hayman-Joyce
sumber
2
Mohon pertimbangkan untuk menambahkan beberapa penjelasan pada jawaban Anda.
HMD
Anda tidak meneruskan fungsi sebagai argumen di sini, melainkan nilai yang dikembalikan.
Bob Bobster
1
def x(a):
    print(a)
    return a

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

y(x, 1)

Itu menurut saya akan menjadi sampel yang lebih tepat. Sekarang apa yang saya ingin tahu adalah apakah ada cara untuk mengkodekan fungsi untuk digunakan dalam pengiriman argumen ke fungsi lain. Saya yakin ada di C ++, tapi dengan Python saya tidak yakin.

Boris Epstein
sumber
1

Dekorator sangat kuat dalam Python karena memungkinkan pemrogram untuk meneruskan fungsi sebagai argumen dan juga dapat mendefinisikan fungsi di dalam fungsi lain.

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

Keluaran

  • Ini ada di dalam fungsi sebelum eksekusi
  • Saya adalah fungsi argumen
Usman Gani
sumber