Apakah mungkin untuk meneruskan fungsi dengan argumen ke fungsi lain dengan Python?
Katakan sesuatu seperti:
def perform(function):
return function()
Tetapi fungsi yang akan dilewati akan memiliki argumen seperti:
action1()
action2(p)
action3(p,r)
def action1(arg1, arg2=None, arg3=None)
, bagaimana Anda bisa memberikan argumen yang ingin Anda berikan ke arg3, misalnya?perform
danaction1
,action2
pada file yang berbeda? @ S.LottInilah tujuan dari lambda:
sumber
Anda dapat menggunakan fungsi parsial dari functools seperti itu.
Juga berfungsi dengan kata kunci
sumber
functools.partial
juga lebih fleksibel jikaperform
perlu menyerahkan parameter lebih lanjutf
. Misalnya, seseorang dapat meneleponperform(partial(Action3, p))
danperform(f)
melakukan sesuatu sepertif("this is parameter r")
.Gunakan functools.partial, bukan lambdas! Dan ofc Perform adalah fungsi yang tidak berguna, Anda dapat menyebarkan fungsi secara langsung.
sumber
(berbulan-bulan kemudian) contoh nyata kecil di mana lambda berguna, sebagian tidak:
katakanlah Anda ingin berbagai penampang 1 dimensi melalui fungsi 2 dimensi, seperti irisan melalui deretan bukit.
quadf( x, f )
mengambil 1-df
dan menyebutnya untuk berbagaix
.Untuk menyebutnya pemotongan vertikal pada y = -1 0 1 dan pemotongan horizontal pada x = -1 0 1,
Sejauh yang saya tahu,
partial
tidak bisa melakukan ini -(Bagaimana cara menambahkan tag numpy, partial, lambda ke ini?)
sumber
Ini disebut fungsi parsial dan setidaknya ada 3 cara untuk melakukan ini. Cara favorit saya adalah menggunakan lambda karena menghindari ketergantungan pada paket tambahan dan paling tidak bertele-tele. Asumsikan Anda memiliki fungsi
add(x, y)
dan Anda ingin meneruskanadd(3, y)
ke beberapa fungsi lain sebagai parameter sehingga fungsi lainnya menentukan nilaiy
.Gunakan lambda
Buat Wrapper Anda Sendiri
Di sini Anda perlu membuat fungsi yang mengembalikan fungsi parsial. Ini jelas jauh lebih bertele-tele.
Gunakan sebagian dari functools
Ini hampir identik dengan yang
lambda
ditunjukkan di atas. Lalu mengapa kita membutuhkan ini? Ada beberapa alasan . Singkatnya,partial
mungkin sedikit lebih cepat dalam beberapa kasus (lihat implementasinya ) dan Anda dapat menggunakannya untuk pengikatan awal vs.sumber
Berikut cara untuk melakukannya dengan penutupan:
sumber