2016-07-22 1 views
3

Недавно я начал изучать Python 3.5.1 и в настоящее время экспериментирую с выражениями lambda. Я попытался настроить простой метод ниже.Почему возвращение этого выражения лямбда приводит к строке?

def sum_double(a, b): 
    return lambda a, b: a+b if a != b else (a+b)*2, a, b 

Все это предполагается сделать, это вернуть сумму a и b, и в два раза их сумма, если a равно b, но вместо этого я получаю вывод, который выглядит следующим образом.

Код:

print(sum_double(1, 2)) 
print(sum_double(2, 3)) 
print(sum_double(2, 2)) 

Выход:

(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 1, 2) 
(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 2, 3) 
(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 2, 2) 

я это делаю не так? Почему это происходит, и как я могу использовать выражение лямбда для достижения желаемой функциональности, если это возможно?

+0

Почему вы используете лямбда здесь? Лямбда - это функция, поэтому вы возвращаете функцию из своей функции. –

+1

@MorganThrapp Это [функции полностью вниз] (https://en.wikipedia.org/wiki/Turtles_all_the_way_down)! –

+0

@MorganThrapp Просто вижу, что я могу и не могу сделать с лямбдами, чтобы полностью понять их и их поведение. – pianoisland

ответ

2

Ну, вы не вызывая функцию lambda и в качестве такого возвращаемого значения является кортеж определенной lambda функции и значения a и b.

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

return (lambda a, b: a+b if a != b else (a+b)*2)(a, b) 

И это прекрасно работает:

print(sum_double(1, 2)) 
3 

print(sum_double(2, 2)) 
8 
+1

Спасибо, это сработало! Я приму ваш ответ, когда истечет время. – pianoisland

+1

Для справок в будущем: Это ** не **, как предполагается использование лямбда-выражений. В этом конкретном случае вы завершаете свою функциональность двумя избыточными вызовами функций. Либо полностью опустите лямбду, либо прямо назначьте лямбда-функцию переменной sum. – mhoff

+1

@MichaelHoff полностью согласен. Я никогда не возражал против использования, поскольку ОП утверждал, что он экспериментировал с лямбдами, и, экспериментируя, вы, как правило, можете попробовать любую дурацкую вещь. –

2
sum_double = lambda a, b: a+b if a != b else (a+b)*2 

lambda сам определяет функцию. A def не требуется.

В вашем случае напечатан кортеж, состоящий из возвращенной функции, a и b.