Замыкания

Модуль 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 лекция
Недоступна
Замыкание.
Замыкание.
Комментарии (18)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Pan Game Уровень 64
12 мая 2026
Я так и не понял, что это упрощает и какой это имеет практический смысл
Serghei Morari Уровень 18
16 марта 2026
def make_filter(threshold): def filter_func(value): return value > threshold return filter_func filter_1 = make_filter(10) filter_2 = make_filter(17) list_to_filter = (1,2,34,5,6,777,45,32,76,11,4,32,13) print(list(filter(lambda x: filter_1(x), list_to_filter))) print(list(filter(lambda x: filter_2(x), list_to_filter)))
Анатолий Уровень 63
30 января 2026
❤️
Maksym Уровень 22
24 октября 2025
Решения задач аналоличное примерам с лекции👏
Vlad Уровень 1
14 октября 2025
Лекция сгенерированная по одному запросу:"Что такое замыкания?" Тандем Нейросеть + Рерайтер
shinobi Уровень 20
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 Уровень 20
29 июля 2025
Будем проверять, но пока, чем дальше - тем больше халтуры. С джавой ни в какое сравнение.
Anonymous #1 Уровень 1
20 февраля 2026
переменную из трех букв
Анастасия Радостная Уровень 24 Expert
3 июня 2025
Что я только что прочитала? Что я тут делаю? Кто я? /поддерживаю всех, кто, как и я, ничего не понял/
Егор Уровень 22
12 апреля 2025
Ааааа, все. Это я дурной. Если вдруг кто так же в ступор встанет (что маловероятно) с последними двумя пунктами второй задачи, то поясняю. Вам нужно создать список с любыми значениями, прописать несколько функций фильтров с разными значениями и применить эти функции фильтры к этому списку значений Я просто настолько сглупил, что 7 раз переписывал, потому что не понял суть, хотя все работает
Егор Уровень 22
12 апреля 2025
использовать их для фильтрации списка данных, выводя результат на экран. Из второй задачи ничего не понял из этого условия. Нужен список как list или имеется ввиду просто создать как бы список из функций, или создать список, который принимает функции с различными параметрами в себя и затем вывести список
Zlyden Уровень 2
5 марта 2025
Проверку условий второй задачи снова блондинка писала. Где в условиях требование использовать +1 для счетчика? "counter() вызван только два раза, надо вызвать его больше одного раза" - задача не принята.