a
в вашем примере присвоено значение 11.
Подумайте об определении лямбда-функции как "когда дан вход, верните это".Вы можете назвать входные данные как угодно, поэтому давайте назовем это x.lambda x : x + 1
означает «учитывая ввод, который мы будем вызывать x
: return x + 1
».
У вас есть дополнительный слой функции, возвращающей лямбду, но если мы разобьем его, цельmyfunc
для динамического генерирования лямбда-функции.Когда вы вызываете myfunc(3)
, то, что вы теперь имеете в своих руках, является лямбда-функцией, которая выглядит следующим образом: lambda a : a * 3
.Это то, что содержит переменная mytripler
.Если вы print(mytripler)
, вы увидите что-то вроде этого: <function myfunc.<locals>.<lambda> at 0x...>
, который говорит вам, что это какая-то лямбда-функция.mytripler
содержит функцию, а не значение.
Что делает эта лямбда-функция?Там написано «дан один входной параметр, который мы назовем a
: return a * 3
».
Что вы делаете с функциями?Вы звоните им!И отправьте любые параметры вместе со звонком.Сколько параметров принимает наша лямбда-функция?Однако многие переменные предшествуют двоеточию в определении лямбда-функции, в данном случае одно: a
.И поэтому мы вызываем лямбду, хранящуюся в mytripler
, отправляя ей один параметр: mytripler(11)
.11 является входом лямбда-функции, которая сначала присваивается a
и возвращает a * 3 -> 33
.
. Вы можете иметь лямбда-функцию, которая принимает 2 входа, которые мы будем называть x
и y
: adder = lambda x, y : x + y
Что делает эта лямбда?Он говорит: «учитывая 2 входа, которые мы назовем x
и y
: вернуть их сумму».Как вы это называете?Вы должны вызвать adder
с двумя параметрами: adder(2,3)
возвращает 5
.2
присваивается x
, 3
присваивается y
, и функция возвращает их сумму.
Что если мы вызовем adder(1)
?TypeError: <lambda>() missing 1 required positional argument: 'y'
Из этого вы можете видеть, что Python знает, сколько входных параметров ожидает лямбда-функция из своего определения, и не может работать без предварительного получения всех необходимых параметров.