Как читать или интерпретировать лямбда в лямбда - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь понять вложенные лямбды:

f = lambda x, y: y(y(x))
g = lambda x : lambda y: x(y)
print( f(lambda x: x+1, g) (4) )

Мне сказали, что в этом коде напечатано "5".Чем это объясняется, и как следует разобрать (4) в последней строке?

Из моего понимания лямбды, если

h = lambda a, b : a+b

я знаю, что print(h(1,2)) даст3 как a = 1, b = 2 и продолжить с a + b = 1 + 2 = 3

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

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

f = lambda i, j: j(j(i))
g = lambda x: lambda y: x(y)

Теперь f(lambda x: x+1, g) эквивалентно:

h = (lambda i, j: j(j(i)))(lambda x: x+1, g)

Здесь функция используется какАргумент.Это нормально, так как функции являются первоклассными объектами в Python и могут передаваться таким образом.Таким образом, оценивая это:

h = g(g(lambda x: x+1))

Но g ничего особенного, он просто берет функцию и применяет ее к аргументу.Это можно рассматривать как функцию «идентичности» с функцией в качестве аргумента.Вы можете избавиться от g в целом.Итак, у нас есть:

h = (lambda x: x+1)

Другими словами, h просто добавляет единицу к любому входу.

0 голосов
/ 01 октября 2018

h = lambda x: x+1 - это функция, которая возвращает на 1 больше, чем переданное ей значение.
Это эквивалентно:

def h(x):
    return x+1


f = lambda x, y: y(y(x)) - это функция, которая принимает значение и функцию в качестве пары аргументов и оценивает функцию (функцию (значение)).
Это эквивалентно:

def f(x, y):
    return y(y(x))


g = lambda x: lambda y: x(y) - функция декоратора, которая возвращает новую функцию на основе переданной ей функции.

Это эквивалентно:

def g(x):
    def new_func(y):
        return x(y)
    return new_func



заданные лямбда-выражения,

f = lambda x, y: y(y(x))
g = lambda x : lambda y: x(y)


выражение для оценки

   f(lambda x: x+1, g) (4)

это уменьшает до

=> g(g(lambda x: x+1)) (4)

, теперь обратите внимание, что g (g (лямбда-x: x + 1)) возвращает функцию g (лямбда-x: x + 1)

=> g(lambda x: x+1) (4)

теперь здесьg (лямбда x: x + 1) снова возвращает функцию (x + 1)

=> (x+1) (4)

, это оценивается как 4 + 1, т.е. 5

=> 5
0 голосов
/ 01 октября 2018

f(lambda x: x+1, g) в конечном итоге возвращает другую функцию. Эта функция затем вызывается с 4 в качестве аргумента для получения окончательного результата 5.


Пусть h = lambda x: x + 1, потому что это становится беспорядком, чтобы отследить иначе.

Сначала мы применяем f к h и g.

f(h, g)(4) == (lambda x,y: y(y(x))(h, g)(4)
           == g(g(h))(4)

Затем мы оценим внутренний вызов на g:

g(g(h))(4) == g((lambda x: lambda y: x(y))(h))(4)
           == g(lambda y: h(y))(4)
           == g(h)(4)

Последний шаг является примером eta сокращений , для использования термина из лямбда-исчисления: функция, которая применяет вторую функцию к аргументу, эквивалентна самой второй функции.

Наконец,мы снова вычисляем g(h) таким же образом, что в итоге приводит нас к выражению, которое не включает передачу функции в качестве аргумента, и позволяет получить окончательный ответ.

g(h)(4) == (lambda y: h(y))(4)
        == h(4)
        == (lambda x: x + 1)(4)
        == 4 + 1
        == 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...