Как лямбда-функция получает свое значение? - PullRequest
0 голосов
/ 02 января 2019

Просматривая учебник по W3Schools Python, я озадачен их примером лямбды.

Откуда берется значение для переменной "а"? Конечно, «a» - это лямбда, но откуда она получает значение?

def myfunc(n):
  return lambda a : a * n

mytripler = myfunc(3)

print(mytripler(11))

Если я сам вызываю print (myfunc (3)), я получаю сообщение об ошибке. Функция работает, только если функция ВЫЗВАНА другой функцией. Откуда лямбда-а знает об этом?

Боюсь, мне не хватает чего-то очень фундаментального в лямбда-функциях.

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Что делает myfunc(3), так это назначает 3 для n, а затем это значение используется в лямбда-выражении. Таким образом, выражение становится 3*a. Ваша лямбда-функция имеет независимую переменную a. Когда вы return lambda a : a * n, ваш mytripler теперь действует как объект (функция), аргумент которого равен a, а действие заключается в вычислении a*3. Наконец, когда вы звоните

mytripler(11)

вы присваиваете 11 своей независимой переменной a, таким образом получая 33

0 голосов
/ 02 января 2019

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 знает, сколько входных параметров ожидает лямбда-функция из своего определения, и не может работать без предварительного получения всех необходимых параметров.

0 голосов
/ 02 января 2019

Лямбды - это просто краткие ссылки для полных объявлений.Это делает ваш пример функционально идентичным этому:

def myfunc(n):
  def inner(a):
    return a * n
  return inner

Лямбда - это функция, и когда вы вызываете ее, вы предоставляете ей аргумент (в данном примере - a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...