Замыкания

Модуль 1: Python Core
8 уровень , 2 лекция
Открыта

3.1 Знакомство с замыканиями

Замыкание — это функция, которая захватывает переменные из своей окружающей области видимости, даже после того, как эта область видимости завершила своё выполнение. Это означает, что замыкание может «помнить» значения переменных из своей внешней области видимости и продолжать работать с ними, даже когда эта область больше не активна.

Чтобы понять, как работают замыкания, рассмотрим следующий пример:


def outer_function(x):
    def inner_function(y):
        return x + y

    return inner_function
    
closure = outer_function(10)
print(closure(5))  # Вывод: 15

Давайте разберемся, что здесь написано:

Внешняя функция (outer_function): Эта функция принимает аргумент x и определяет внутреннюю функцию inner_function, которая принимает аргумент y и возвращает сумму x и y. Функция inner_function не вызывается внутри outer_function, а только объявляется.

Внутренняя функция (inner_function): Эта функция возвращается из outer_function и сохраняет у себя внутри ссылку на значение x, которое было передано outer_function.

Замыкание: Переменная closure становится замыканием, которое «помнит» значение x (в данном случае, 10) и может использовать его при вызове.

Обычно никто с первого раза не может нормально работать с замыканиями. Так что давайте попробуем прокачать ваше понимание замыканий на примерах.

3.2 Примеры использования замыканий

Создание функции-генератора

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


def make_counter():
    count = 0

    def counter():
        nonlocal count
        count += 1
        return count

    return counter
    
counter = make_counter()
print(counter())  # Вывод: 1
print(counter())  # Вывод: 2
print(counter())  # Вывод: 3

Объяснение:

Функция-генератор (make_counter): Эта функция создает переменную count и возвращает внутреннюю функцию counter, которая увеличивает значение count и возвращает его.

Замыкание: Функция counter сохраняет состояние переменной count и может изменять его при каждом вызове.

Создание функции с конфигурацией

Замыкания могут быть использованы для создания функций с предварительно определенной конфигурацией.


def make_multiplier(factor):
    def multiplier(x):
        return x * factor

    return multiplier
    
double = make_multiplier(2)
triple = make_multiplier(3)
    
print(double(5))  # Вывод: 10
print(triple(5))  # Вывод: 15

Объяснение:

Функция-конфигуратор (make_multiplier): Эта функция принимает множитель factor и возвращает внутреннюю функцию multiplier, которая умножает входное значение на factor.

Замыкания: Функции double и triple являются замыканиями, которые сохраняют свои собственные значения factor и используют их для умножения.

Фильтрация данных с параметрами

Замыкания могут быть полезны для создания фильтрующих функций с параметрами.


def make_filter(threshold):
    def filter_func(value):
        return value > threshold
        
    return filter_func
    
filter_above_10 = make_filter(10)
data = [5, 10, 15, 20]
filtered_data = list(filter(filter_above_10, data))
print(filtered_data)  # Вывод: [15, 20]

Объяснение:

Функция-фильтр (make_filter): Эта функция принимает пороговое значение threshold и возвращает внутреннюю функцию filter_func, которая проверяет, превышает ли значение порог.

Замыкание: Функция filter_func сохраняет значение threshold и использует его для фильтрации данных.

3.3 Плюсы и минусы замыканий

Преимущества использования замыканий

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

Гибкость: Замыкания могут быть использованы для создания функций с определенной конфигурацией или поведением, что делает код более гибким и адаптируемым.

Функциональное программирование: Замыкания являются важной концепцией в функциональном программировании, позволяя создавать функции высшего порядка и другие функциональные конструкции.

Ограничения и потенциальные проблемы

Несмотря на множество преимуществ, замыкания имеют и свои ограничения:

Использование памяти: Замыкания могут удерживать ссылки на объекты, которые больше не используются, что может привести к утечкам памяти.

Сложность отладки: Замыкания могут усложнить отладку кода, так как состояния переменных могут быть неочевидны.

2
Задача
Модуль 1: Python Core, 8 уровень, 2 лекция
Недоступна
Генератор.
Генератор.
2
Задача
Модуль 1: Python Core, 8 уровень, 2 лекция
Недоступна
Замыкание.
Замыкание.
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Maksym Уровень 22
24 октября 2025
Решения задач аналоличное примерам с лекции👏
Vlad Уровень 15
14 октября 2025
Лекция сгенерированная по одному запросу:"Что такое замыкания?" Тандем Нейросеть + Рерайтер
shinobi Уровень 19
28 июля 2025
Ребят. решил у нейронки без всякого контекста спросить что такое замыкание и как работает, и он мне слету дал два примера, знаете какие?

def make_counter():
    count = 0
    def counter():
        nonlocal count # Объявляем, что count - это не локальная переменная, а переменная внешней функции
        count += 1
        return count
    return counter

counter1 = make_counter()
print(counter1()) # 1
print(counter1()) # 2

counter2 = make_counter() # Создаем новый независимый счетчик
print(counter2()) # 1
print(counter1()) # 3 (первый счетчик продолжает работать независимо)
И

def make_multiplier(x):
    # 'x' - это переменная внешней функции make_multiplier
    def multiplier(n):
        # 'multiplier' - это внутренняя функция
        # Она использует 'x' из внешней функции
        return x * n
    return multiplier # Внешняя функция возвращает внутреннюю функцию
Если в курс по джаве была вложена душа, то в курс по питону.... Что там вложили, можете сами додумать)
Ksenia Уровень 14
29 июля 2025
купила курс в надежде на крутые задачи, как в джаве, но... может быть, дальше будет лучше?
shinobi Уровень 19
29 июля 2025
Будем проверять, но пока, чем дальше - тем больше халтуры. С джавой ни в какое сравнение.
Анастасия Радостная Уровень 24 Expert
3 июня 2025
Что я только что прочитала? Что я тут делаю? Кто я? /поддерживаю всех, кто, как и я, ничего не понял/
Егор Уровень 22
12 апреля 2025
Ааааа, все. Это я дурной. Если вдруг кто так же в ступор встанет (что маловероятно) с последними двумя пунктами второй задачи, то поясняю. Вам нужно создать список с любыми значениями, прописать несколько функций фильтров с разными значениями и применить эти функции фильтры к этому списку значений Я просто настолько сглупил, что 7 раз переписывал, потому что не понял суть, хотя все работает
Егор Уровень 22
12 апреля 2025
использовать их для фильтрации списка данных, выводя результат на экран. Из второй задачи ничего не понял из этого условия. Нужен список как list или имеется ввиду просто создать как бы список из функций, или создать список, который принимает функции с различными параметрами в себя и затем вывести список
Zlyden Уровень 49
5 марта 2025
Проверку условий второй задачи снова блондинка писала. Где в условиях требование использовать +1 для счетчика? "counter() вызван только два раза, надо вызвать его больше одного раза" - задача не принята.
Zlopyhatel Уровень 0
23 февраля 2025
Как обычно: в первой задаче в условии нигде не сказано, что нельзя использовать переменные при вызове функции, но в ошибку это выдают. В чем смысл запускать два одинаковых счетчика, которые считают одно и то же? Спасибо нейросетям, они объяснили, как это работает
SWK Уровень 26
1 апреля 2025
Дык, проверяет тоже нейросеть. 🤣
Николай Уровень 17
18 февраля 2025
Мдя. Задачи уровня, скопируй сверху код - вниз.👎
Ivan Уровень 59
10 мая 2025
>Задачи уровня, скопируй сверху код - вниз. Задача готовит нас к типичным трудовым будням. Многие современные программисты и такого не умеют. А если и знают про стаковерфлоу, то умудряются копировать сниппеты кода из вопроса, а не из правильного ответа.
Олексій Єрмак Уровень 25
25 января 2025
Полезная информация: filter(function, iterable) Механизм работы следующий: функция filter() разбивает переданный итерируемый объект на элементы и передает каждый их них в функцию (function), которая возвращает значение (True, False или что-то другое: число, строка и т.д.). Filter оценивает полученное значение и, если оно True (не именно равно ‘True’, а вообще истинно), добавляет его в итератор, если нет, то нет. Результатом работы является объект — итератор, содержащий только элементы, которые при фильтрации получили значение True.