Можете ли вы объяснить замыкания (как они связаны с Python)? - PullRequest
75 голосов
/ 17 августа 2008

Я много читал о замыканиях и думаю, что понимаю их, но, не затуманив картину для себя и других, я надеюсь, что кто-то сможет объяснить замыкания максимально кратко и четко. Я ищу простое объяснение, которое могло бы помочь мне понять, где и почему я хотел бы использовать их.

Ответы [ 13 ]

0 голосов
/ 17 апреля 2018

мы все использовали декораторы в python. Они являются хорошими примерами, демонстрирующими функции замыкания в python.

class Test():
    def decorator(func):
        def wrapper(*args):
            b = args[1] + 5
            return func(b)
        return wrapper

@decorator
def foo(val):
    print val + 2

obj = Test()
obj.foo(5)

здесь окончательное значение 12

Здесь функция-обертка может получить доступ к объекту func, потому что обертка - это «лексическое замыкание», она может обращаться к своим родительским атрибутам. Вот почему он может получить доступ к объекту func.

0 голосов
/ 20 сентября 2013

Для меня «замыкания» - это функции, которые способны запомнить среду, в которой они были созданы. Эта функциональность позволяет вам использовать переменные или методы внутри замыкания, иначе вы не сможете их использовать, потому что их больше нет или они недоступны из-за области действия. Давайте посмотрим на этот код в ruby:

def makefunction (x)
  def multiply (a,b)
    puts a*b
  end
  return lambda {|n| multiply(n,x)} # => returning a closure
end

func = makefunction(2) # => we capture the closure
func.call(6)    # => Result equal "12"  

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

0 голосов
/ 18 сентября 2008

Лучшее объяснение закрытия, которое я когда-либо видел, было объяснение механизма. Это произошло примерно так:

Представьте, что ваш программный стек представляет собой вырожденное дерево, в котором у каждого узла есть только один дочерний элемент, а единственный конечный узел является контекстом выполняемой в данный момент процедуры.

Теперь ослабьте ограничение на то, что у каждого узла может быть только один дочерний элемент.

Если вы сделаете это, у вас может быть конструкция ('yield'), которая может возвращаться из процедуры без отбрасывания локального контекста (т. Е. Она не выталкивает ее из стека при возврате). В следующий раз, когда процедура вызывается, вызов выбирает старый кадр стека (дерева) и продолжает выполняться там, где он остановился.

...