Memahami lambda dengan python dan menggunakannya untuk meneruskan banyak argumen

90

Setelah membaca semua yang dapat saya temukan di lambda, saya masih tidak mengerti bagaimana membuatnya melakukan apa yang saya inginkan.

Setiap orang menggunakan contoh:

lambda x, y : x + y

Mengapa Anda perlu menyatakan keduanya xdan ysebelum :? Juga bagaimana Anda membuatnya mengembalikan banyak argumen?

sebagai contoh:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

Ini bekerja dengan baik. Tetapi kode berikut tidak:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

Ini menghasilkan kesalahan:

TypeError: () tidak mengambil argumen (1 diberikan)

Talisin
sumber

Jawaban:

136

Mengapa Anda perlu menyatakan 'x' dan 'y' sebelum ':'?

Karena lambda (secara konseptual) sama dengan fungsi, hanya ditulis sebaris. Contoh Anda setara dengan

def f(x, y) : return x + y

hanya tanpa mengikatnya ke nama seperti f.

Juga bagaimana Anda membuatnya mengembalikan banyak argumen?

Cara yang sama seperti dengan suatu fungsi. Lebih disukai, Anda mengembalikan tupel:

lambda x, y: (x+y, x-y)

Atau daftar, atau kelas, atau apa pun.

Masalah dengan self.entry_1.bindharus dijawab oleh Demosthenex.

phipsgabler.dll
sumber
2
Untuk benar-benar mendapatkan yang paling sedikit darinya, Anda dapat mencoba beberapa pemrograman fungsional, yang merupakan pengalaman yang luar biasa ketika Anda mulai memahaminya, dan mungkin akan membuat Anda menjadi programmer yang lebih baik. </propaganda>
phipsgabler
3
Anda adalah tuhan saya dan propaganda Anda adalah roti harian saya. Namun, saya mencoba menerapkannya pada tupel: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))dan tampaknya tidak berhasil. Tolong, selamatkan jiwaku dari kabut program prosedural
Revolucion for Monica
@RevolucionforMonica Sedikit terlambat membalas, tapi berikut adalah contoh kode REPL Python 3 tentang cara melakukannya: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net
11

Saya yakin bind selalu mencoba mengirim parameter peristiwa. Mencoba:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

Anda menerima parameter dan tidak pernah menggunakannya.

Demosthenex
sumber
Ya ampun, saya telah mengerjakannya begitu lama dan kemudian saya mendapatkan jawaban yang berfungsi dalam 1 menit datar ... Btw, tahukah Anda mengapa hal-hal berjalan di depan titik dua?
Talisin
2
Karena mereka adalah parameter fungsi .
phipsgabler
3
Anda juga dapat mencoba "event = None" untuk memberikan nilai default, kemudian fungsi tersebut dapat digunakan untuk mengikat dan tombol.
Demosthenex
5

Mengapa Anda perlu menyatakan keduanya xdan ysebelum :?

Karena ini adalah definisi fungsi dan perlu mengetahui parameter apa yang diterima fungsi tersebut, dan dalam urutan apa. Itu tidak bisa hanya melihat ekspresi dan menggunakan nama variabel di dalamnya, karena beberapa dari nama itu Anda mungkin ingin menggunakan nilai variabel lokal atau global yang ada, dan bahkan jika itu dilakukan, ia tidak akan tahu apa urutannya. harus mengharapkan untuk mendapatkannya.

Pesan kesalahan Anda berarti bahwa Tk memanggil lambda Anda dengan satu argumen, sedangkan lambda Anda ditulis untuk tidak menerima argumen. Jika Anda tidak membutuhkan argumen, terima saja dan jangan gunakan. ( Demosthenex memiliki kodenya , saya akan mempostingnya tetapi dipukuli untuk itu.)

kindall
sumber
Terima kasih untuk penjelasannya. Saya pikir saya akhirnya memahami ini.
Talisin
3

Mengapa Anda perlu menyatakan 'x' dan 'y' sebelum ':'?

Anda sebenarnya dalam beberapa situasi (ketika Anda hanya memiliki satu argumen) jangan meletakkan x dan y sebelum ":".

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

tapi aku di lambda akan terikat oleh nama, jadi,

>>> flist[0]()
2
>>> flist[2]()
2
>>>

berbeda dari yang mungkin Anda inginkan.

AlbertoAndreotti
sumber