Po przeczytaniu wszystkiego, co mogę znaleźć na lambdzie, nadal nie rozumiem, jak zrobić to, co chcę.
Każdy korzysta z przykładu:
lambda x, y : x + y
Dlaczego musisz podać oba x
i y
przed :
? Jak sprawić, by zwracał wiele argumentów?
na przykład:
self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
To działa dobrze. Ale poniższy kod nie:
self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
Daje błąd:
TypeError: () nie przyjmuje argumentów (podano 1)
python
python-3.x
tkinter
Talisin
źródło
źródło
(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))
i wygląda na to, że nie działa. Proszę, ocal moją duszę od mgły programowania proceduralnegoUważam, że bind zawsze próbuje wysłać parametr zdarzenia. Próbować:
self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
Akceptujesz parametr i nigdy go nie używasz.
źródło
Ponieważ jest to definicja funkcji i musi wiedzieć, jakie parametry funkcja akceptuje iw jakiej kolejności. Nie może po prostu spojrzeć na wyrażenie i użyć w nim nazw zmiennych, ponieważ niektóre z tych nazw mogą chcieć użyć istniejących lokalnych lub globalnych wartości zmiennych, a nawet gdyby to zrobił, nie wiedziałby, w jakiej kolejności powinien spodziewać się ich.
Twój komunikat o błędzie oznacza, że Tk wywołuje twoją lambdę z jednym argumentem, podczas gdy twoja lambda jest napisana tak, aby nie akceptowała żadnych argumentów. Jeśli nie potrzebujesz argumentu, zaakceptuj go i nie używaj go. ( Demosthenex ma kod , wysłałbym go, ale zostałem pobity).
źródło
Właściwie możesz w niektórych sytuacjach (kiedy masz tylko jeden argument) nie wstawiać x i y przed ":".
>>> flist = [] >>> for i in range(3): ... flist.append(lambda : i)
ale i w lambdzie będzie związane z imieniem, więc
>>> flist[0]() 2 >>> flist[2]() 2 >>>
różni się od tego, czego możesz chcieć.
źródło