Замикання в Python

 3257

Замикання в Python – це вкладена функція, яка дозволяє отримати доступ до змінних зовнішньої функції навіть після завершення виконання зовнішньої функції. Перш ніж ми поговоримо про замикання, спочатку розглянемо концепцію вкладених функцій в Python.

Вкладені функції в Python

В Python ми можемо створити функцію всередині іншої функції — це називається вкладеною функцією. Наприклад:

Результат:

Hi John

Тут ми визначили функцію display_name() всередині функції greet(). Функція display_name() є вкладеною функцією. Вкладена функція працює аналогічно до звичайної функції.

Замикання в Python

Замикання — це вкладена функція, яка допомагає отримати доступ до змінних зовнішньої функції навіть після завершення виконання зовнішньої функції. Наприклад:

Результат:

Hi John

Тут ми створили функцію greet(), яка повертає вкладену анонімну функцію. Коли ми викликаємо зовнішню функцію:

Результат її виконання присвоюється змінній message.

На цьому виконання зовнішньої функції завершено, і змінна name має бути знищена. Однак, коли ми викликаємо анонімну функцію, використовуючи:

Ми можемо отримати доступ до змінної name зовнішньої функції (навіть після того, як вона завершила своє виконання).

Це можливо через те, що вкладена функція тепер діє як замикання, яке закриває змінну всередині своєї області видимості навіть після завершення виконання зовнішньої функції.

Розглянемо ще один приклад замикання в Python. Програма для виводу непарних чисел:

Результат:

3
5
7
3

Наступний рядок коду виконує зовнішню функцію calculate() та повертає замикання змінної num:

Саме тому ми можемо отримати доступ до змінної num з функції calculate() навіть після завершення її виконання.

Знову ж таки, коли ми викликаємо зовнішню функцію, використовуючи:

Повертається нове замикання. Отже, при виклику функції odd2() ми отримуємо значення 3.

Коли використовуються замикання?

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

Однак для випадків з великою кількістю атрибутів і методів може бути краща реалізація класу.

Результат:

27
15
30

Підбиваючи підсумки, хотілося б відзначити, що значення, поміщені у функцію-замикання, можна дізнатися. Усі об’єкти функцій мають атрибут __closure__, який повертає кортеж об’єктів, якщо функція є замиканням. Посилаючись на вищенаведений приклад, ми знаємо, що times3 і times5 є функціями-замиканнями.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (12 оцінок, середня: 4,58 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *