2015-01-05 2 views
5

В Python 2 этот код OK:аргументы лямбда распаковывать ошибки

f = lambda (m, k): m + k 

m = [1,2,3,4] 
k = [5,6,7,8] 

print(map(f, zip(m, k))) 

но в Python 3 произошла следующая ошибка:

f = lambda (m, k): m + k 
^ 
SyntaxError: invalid syntax 

Если удалить скобки в лямбда-выражения, то произошла другая ошибка:

TypeError: <lambda>() missing 1 required positional argument: 'k' 

Также подход с кортежем как один аргумент лямбда работает в Python 3, но это не (для чтения):

f = lambda args: args[0] + args[1] 

Как я могу правильно распаковать значения в Python 3?

+0

'map()' применяет 'f' к каждому элементу предоставленного итерабельного; в вашем примере, 'map()' пытается передать '(1, 5)' в вашу функцию, которая принимает два аргумента, но предоставляется только одна, поэтому она терпит неудачу и дает вам ошибку. – dazedconfused

ответ

6

Удаление распаковки кортежа обсуждается в PEP 3113. В принципе, вы не можете сделать это в Python 3. Под заголовком Transition plan, вы видите, что «предложил» способ сделать это в качестве конечного блока кода:

lambda x_y: x_y[0] + x_y[1] 
2

Вы не можете использовать скобки в Python3 распаковывать аргументы в функции лямбда (PEP 3113), попробуйте:

f = lambda m, k: m + k 

Чтобы заставить его работать с вашим кодом, вы должны использовать:

lambda mk: mk[0] + mk[1] 
+0

Работает ли она с картой (f, zip (m, k))? Что касается (я написал) TypeError произошло. – Alexei

+0

@Alexei Тогда вам следует попробовать lambda mk: mk [0] + mk [1] '. Я не смотрел остальную часть вашего кода, прежде чем отправил ответ :) – Maroun

+0

Спасибо за внимание. Я думаю, что это какое-то странное решение в эволюции Python ... – Alexei

0

Или вы можете просто сумма () для добавления номера без распаковки:

f = lambda args: sum(args) 
+0

Спасибо за ваш ответ =) Но это был просто простой пример. На самом деле моя лямбда сложнее. Более того, я думаю, что можно использовать только функцию sum, не будучи обернутой в лямбда. – Alexei

5

вы можете использовать тот же синтаксис, как в Python 2 и Python 3, если вы используете itertools.starmap вместо map который распаковывает элементы кортежа для нас:

>>> from itertools import starmap 
>>> f = lambda m, k: m + k 
>>> list(starmap(f, zip(m, k))) 
[6, 8, 10, 12] 
0

Просто используйте

map(f, m, k) 

Обратите внимание, что f может быть

from operator import add 
map(add, m, k) 
1

Вы можете найти это решение легче читать:

lambda mk: (lambda m,k: m + k)(*mk) 

Кроме того, я бы утверждать, что распаковкой делает это более (1) Pythonic и (2) согласуется с ручной распаковкой аргументов кортежа для с именем функции, требуемые в Python 3 по PEP 3113.

Смежные вопросы