Как работают лямбды? - PullRequest
       6

Как работают лямбды?

2 голосов
/ 09 декабря 2010

Я изучаю python с помощью учебника на официальном сайте python и наткнулся на этот пример :

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

Откуда x получает его значение?Я не знаком с тем, как работает лямбда, я прекрасно понимаю анонимные функции из javascript, но это поставило меня в тупик.Кто-нибудь хочет пролить свет?Я был бы благодарен.

Ответы [ 8 ]

5 голосов
/ 09 декабря 2010

Учтите это.f - это объект, созданный функцией make_incrementor.

Это лямбда, "анонимная функция".

>>> f= lambda x: x+42
>>> f(10)
52

Значение x обнаружилось, когда мыприменяется f к значению.

4 голосов
/ 09 декабря 2010

Прежде всего, вот перевод на JavaScript:

function makeIncrementor(n) {
    return function (x) {return x + n}
}

Лямбда-выражение состоит из трех частей.

  • Слово lambda (В JavaScriptthe word function)
  • Список параметров (В JavaScript, часть в (...))
  • Некоторое выражение для оценки (В JavaScript, часть в {...}, возвращается автоматически)

В списке параметров указывается часть перед двоеточием.Эти параметры видны в пределах выражения.Независимо от того, к какому выражению оно относится, оно возвращается как результат функции.

В отличие от JavaScript, лямбда-выражение может содержать только одно выражение;Вы не можете создать анонимную многострочную функцию с лямбда-выражением.

1 голос
/ 09 декабря 2010

x получает свое значение из параметра, используемого для вызова f. n получает свое значение из параметра, используемого для вызова make_incrementor.

1 голос
/ 09 декабря 2010

Когда вызывается make_incrementor(), он создает и возвращает функцию lambda в это время.При этом значение аргумента n сохраняется или запоминается в созданном объекте функции.Если вы вызовете его снова с другим n, будет возвращена другая функция.

1 голос
/ 09 декабря 2010

lambda приносит немного лямбда-исчисления в Python.По сути, это то, что происходит: обычно в лямбда-исчислении оператор выглядит примерно так:

sum = add 3 4

Это передаст 3 и 4 в функцию add и сохранит результат вsum.Тем не менее, мы могли бы также написать что-то вроде add 3.Теперь, поскольку add ожидает два аргумента, мы теперь получаем объект (или функцию, если хотите), ожидающий один аргумент.Затем эта функция будет вызывать add с 3 в качестве первого аргумента, и все, что мы передадим в качестве второго аргумента.Теперь мы можем сделать это:

func = add 3
sum = func 4

Это будет эквивалентно предыдущему примеру.Однако теперь вы можете использовать func всякий раз, когда хотите добавить 3 к чему-либо.(Конечно, это не кажется полезным в этом примере, но в более сложных ситуациях это так).

Все это тесно связано с карри , что-то очень важное в большинстве функциональные языки .Если вас интересует лямбда-исчисление и его сходство с обычной математикой, я настоятельно рекомендую вам взглянуть на Haskell .

1 голос
/ 09 декабря 2010

Отказ от ответственности: у меня практически нет опыта работы с Python. Это выходит за рамки моих знаний по Схеме / лямбда-исчислению.

make_incrementor определяет функцию для создания функций. make_incrementor (42) возвращает функцию с x, ограниченным лямбдой, и n со значением 42. Когда вы вызываете функцию f, аргумент f заменяет связанную переменную.

0 голосов
/ 09 декабря 2010

Вот как я понимаю лямбду:

Когда мы пишем x 2 , мы часто путаем две разные идеи.Рассмотрим:

  1. x 2 имеет нечетное число факторов, когда x является целым числом.

  2. x 2 больше, чем x при x> 1.

  3. x 2 имеетпроизводная 2x.

  4. x 2 имеет обратное значение, а именно sqrt (x), для x> 0.

Первые два утверждения о квадрате определенного, но неуказанного числа.В этих утверждениях «x» представляет произвольную единственную вещь, а x 2 представляет отдельную связанную вещь.

Третье и четвертое утверждение о x 2 ,функция.Но это не ясно сообщается в 3. и 4. кроме контекста и общего понимания исчисления.Нам нужно нотационное устройство, чтобы различать x 2 одного (но произвольного) значения и x 2 функции.Устройство также должно сообщить, что это функция из x .Поэтому лямбда изобретена:

"лямбда хх 2 " написана для того, чтобы провести это различие и передать "функцию х, значение которой в х равно х 2 "Лямбда-оператор принимает имя (x) и выражение (x 2 ) и возвращает функцию.Это имеет те же последствия, что и обычное определение функции, за исключением того, что функция не получает имя автоматически.

0 голосов
/ 09 декабря 2010

make_incrementor - это функция, которая возвращает функцию:

def make_incrementor(n):
  return lambda x: x + n 

Когда мы вызываем make_incrementor, мы привязываем параметр 42 к n и возвращаем конкретную функцию:

f = make_incrementor(42) # fill in n at this point and return a function

Эта функция, которую мы вернем, будет выглядеть следующим образом:

lambda(x): x + 42

f связан с возвращаемой функцией, поэтому концептуально f будет выглядеть так:

def f(x):
   return x + 42

Когда мы вызываем f, мы предоставляем значение для x

f(1) # x == 1
f(2) # x == 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...