Розуміння лямбди в python та використання його для передачі декількох аргументів


90

Прочитавши все, що я можу знайти на лямбда, я досі не розумію, як змусити її робити те, що я хочу.

Усі використовують приклад:

lambda x, y : x + y

Чому вам потрібно заявляти як до, так xі yперед :? Також як змусити його повернути кілька аргументів?

наприклад:

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

Це працює чудово. Але наступний код цього не робить:

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

Це дає помилку:

TypeError: () не приймає аргументів (1 подано)

Відповіді:


135

Чому перед ":" потрібно вказувати як "х", так і "у"?

Оскільки лямбда - це (концептуально) те саме, що функція, просто написана в рядку. Ваш приклад еквівалентний

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

просто не прив’язуючи його до імені типу f.

Також як змусити його повернути кілька аргументів?

Так само, як із функцією. Бажано, щоб ви повернули кортеж:

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

Або список, або клас, або що завгодно.

На що self.entry_1.bindмає відповідати, повинен відповісти Demosthenex.


2
Щоб насправді витягти з них щонайменше, ви можете спробувати якесь функціональне програмування, що є приголомшливим досвідом, коли ви починаєте його розуміти, і, мабуть, зробите з вас кращого програміста. </propaganda>
phipsgabler

3
Ти мій бог, а твоя пропаганда - мій хліб щоденний. Проте я намагався застосувати його на кортеж: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))і, здається, це не працює. Будь ласка, врятуй мою душу від туману процедурного програмування
Революція для Моніки

@RevolucionforMonica Трохи пізня відповідь, але ось приклад коду Python 3 REPL, як це зробити: repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

Я вважаю, що bind завжди намагається надіслати параметр події. Спробуйте:

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

Ви приймаєте параметр і ніколи не використовуєте його.


omg, я так довго над цим працював, а потім отримую робочу відповідь через 1 хв. квартиру ... До речі, ти знаєш, чому все відбувається перед товстою кишкою?
Талісін

2
Оскільки вони є параметрами функціонування .
phipsgabler

3
Ви також можете спробувати "event = None", щоб надати йому значення за замовчуванням, тоді функцію можна використовувати для прив'язки та кнопки.
Demosthenex

5

Чому вам потрібно вказати як до, так xі yперед :?

Оскільки це визначення функції, і воно повинно знати, які параметри функція приймає, і в якому порядку. Він не може просто дивитись на вираз і використовувати в ньому імена змінних, тому що для деяких з цих імен ви можете використовувати існуючі локальні або глобальні значення змінних, і навіть якщо він це зробив, він не знатиме, в якому порядку це слід розраховувати отримати їх.

Ваше повідомлення про помилку означає, що Tk викликає вашу лямбда з одним аргументом, тоді як ваша лямбда написана так, що не приймає аргументів. Якщо аргумент вам не потрібен, просто прийміть його та не використовуйте. (У Demosthenex є код , я б його опублікував, але його побили.)


Дякую за пояснення. Я думаю, що нарешті розбираюся в цьому.
Талісін

3

Чому перед ":" потрібно вказувати як "х", так і "у"?

Ви могли б насправді в деяких ситуаціях (коли у вас лише один аргумент) не ставити x та y перед ":".

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

але i в лямбді буде зв'язане іменем, отже,

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

відрізняється від того, що вам може знадобитися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.