Понимание того, как работает закрытие в python

#python #closures

#python #замыкания

Вопрос:

Может кто-нибудь, пожалуйста, помочь мне понять, как работает приведенный ниже код? Цель этого кода состоит в том, чтобы взять два элемента, сделать их парой, функция car возвращает первый элемент, а функция cdr возвращает последний элемент.

У меня возникли проблемы с пониманием того, как именно работает закрытие. Я понимаю, как работает лямбда, но все еще возникают проблемы со следующим:

  1. пошаговый поток этого кода
  2. почему pair(f) принимает только один вход, где он предназначен для приема 2 элементов и превращения их в пару
  3. что означает f(a, b) (почему f перед круглыми скобками?)

Заранее большое вам спасибо!

 def cons(a, b):
    def pair(f):
        return f(a, b)
    return pair

def car(pair):
    return(pair(lambda a,b: a))

def cdr(pair):
    return(pair(lambda a,b: b))



p = cons("a","b")
print(car(p))
  

Комментарии:

1. cons это функция, которая принимает два значения и возвращает функцию. Эта функция принимает один параметр. Предполагается, что этот параметр должен быть функцией ( f ) , которую он вызовет и передаст ей два параметра (те, которые cons были приняты).

Ответ №1:

Первый,

 p = cons("a","b")
  

поскольку in cons возвращает pair , он функционально эквивалентен

 def p(f):
    return f("a", "b")
  

затем,

 print(car(p))
  

Которые развиваются в

 print(p(lambda a,b: a))
  

и это становится

 print((lambda a,b: a)("a", "b"))
  

и становится

 print("a")