Python'da lambda'yı anlama ve birden çok argümanı iletmek için kullanma


91

Lambda'da bulabildiğim her şeyi okuduktan sonra, istediğimi nasıl yapacağımı hala anlamıyorum.

Herkes şu örneği kullanır:

lambda x, y : x + y

Neden devlete ikisine de ihtiyacım var xve ydaha önce :? Ayrıca birden çok argüman döndürmesini nasıl sağlıyorsunuz?

Örneğin:

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

Bu gayet iyi çalışıyor. Ancak aşağıdaki kod sağlamaz:

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

Şu hatayı verir:

TypeError: () hiçbir argüman almaz (1 verildi)

Yanıtlar:


138

Neden "x" i ve "y" yi ":" den önce belirtmeniz gerekiyor?

Çünkü bir lambda (kavramsal olarak) bir fonksiyonla aynıdır, sadece satır içi yazılır. Örneğiniz eşdeğerdir

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

gibi bir isme bağlamadan f.

Ayrıca birden çok argüman döndürmesini nasıl sağlıyorsunuz?

Bir işlevde olduğu gibi. Tercihen bir demet döndürürsünüz:

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

Veya bir liste, bir sınıf veya her neyse.

Olan şey self.entry_1.bindDemosthenex tarafından cevaplanmalıdır.


2
Bunlardan gerçekten en az bir kısmını elde etmek için, bazı işlevsel programlamayı deneyebilirsiniz; bu, onu anlamaya başladığınızda harika bir deneyimdir ve muhtemelen sizi daha iyi bir programcı yapacaktır. </propaganda>
phipsgabler

3
Sen benim tanrımsın ve propagandan benim günlük ekmeğim. Yine de, bir demet üzerinde uygulamaya çalıştım: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))ve işe yaramıyor gibi görünüyor. Lütfen, ruhumu prosedürel programlama
sisinden

@RevolucionforMonica Biraz geç cevap, ama işte nasıl yapılacağına dair bir Python 3 REPL kodu örneği: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

Bind'in her zaman bir olay parametresi göndermeye çalıştığına inanıyorum. Deneyin:

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

Parametreyi kabul edersiniz ve asla kullanmazsınız.


Aman Tanrım, bunun üzerinde çok uzun zamandır çalışıyordum ve sonra 1 dakika içinde çalışan bir yanıt alıyorum ... Btw, neden iki nokta üst üste işlerin önüne geçiyor biliyor musun?
Talisin

2
Çünkü bunlar fuction parametreleridir .
phipsgabler

3
Ayrıca varsayılan bir değer vermek için "event = None" deneyebilirsiniz, ardından işlev bağlama ve düğme için kullanılabilir.
Demosthenex

5

Neden devlete ikisine de ihtiyacım var xve ydaha önce :?

Çünkü bu bir işlev tanımıdır ve işlevin hangi parametreleri hangi sırayla kabul ettiğini bilmesi gerekir. Sadece ifadeye bakamaz ve içindeki değişken isimlerini kullanamaz, çünkü bu isimlerden bazıları mevcut yerel veya global değişken değerleri için kullanmak isteyebilirsiniz ve bunu yapsa bile, hangi sırada olduğunu bilemez onları almayı beklemelisiniz.

Hata mesajınız, Tk'nin lambda'nızı bir argümanla çağırdığı, lambda'nız ise hiçbir argüman kabul etmeyecek şekilde yazıldığı anlamına gelir. Eğer argümana ihtiyacınız yoksa, sadece birini kabul edin ve kullanmayın. ( Demosthenex'in kodu var , onu gönderirdim ama dövülmüştüm.)


Açıklama için teşekkürler. Sanırım sonunda bununla başa çıkmaya başladım.
Talisin

3

Neden "x" i ve "y" yi ":" den önce belirtmeniz gerekiyor?

Aslında bazı durumlarda (sadece bir argümanınız olduğunda) x ve y'yi ":" nin önüne koymayın.

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

ama lambdadaki i isme bağlı olacaktır, bu yüzden,

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

isteyebileceğinizden farklı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.