Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!
Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount
Замикання
Замикання – це об'єкт функції, який запам'ятовує значення у зовнішніх областях видимості, навіть якщо вони не знаходяться в пам'яті. Розглянемо це поетапно.
По-перше, вкладена функція – це функція, визначена всередині іншої функції. Дуже важливо зазначити, що вкладені функції можуть отримувати доступ до змінних зовнішнього простору. Проте, принаймні у Python, вони є тільки для читання. Однак можна використовувати ключове слово "nonlocal" з цими змінними, щоб їх змінити.
Наприклад:
def transmit_to_space(message):
"Це зовнішня функція"
def data_transmitter():
"Це вкладена функція"
print(message)
data_transmitter()
print(transmit_to_space("Тестове повідомлення"))
Це працює добре, оскільки функція 'data_transmitter' може отримати доступ до 'message'. Щоб продемонструвати використання ключового слова "nonlocal", розгляньте це:
def print_msg(number):
def printer():
"Тут ми використовуємо ключове слово nonlocal"
nonlocal number
number=3
print(number)
printer()
print(number)
print_msg(9)
Без ключового слова nonlocal, виведення було б "3 9", проте з його використанням ми отримуємо "3 3", тобто значення змінної "number" змінюється.
Тепер, як щодо того, щоб повернути об'єкт функції замість виклику вкладеної функції. (Пам'ятайте, що навіть функції є об'єктами. (Це Python.))
def transmit_to_space(message):
"Це зовнішня функція"
def data_transmitter():
"Це вкладена функція"
print(message)
return data_transmitter
І ми викликаємо функцію наступним чином:
def transmit_to_space(message):
"Це зовнішня функція"
def data_transmitter():
"Це вкладена функція"
print(message)
return data_transmitter
fun2 = transmit_to_space("Спаліть Сонце!")
fun2()
Незважаючи на те, що виконання "transmit_to_space()" було завершено, повідомлення збереглося. Ця техніка, при якій дані прикріплені до деякого коду навіть після завершення роботи інших оригінальних функцій, називається замиканням у Python.
ПЕРЕВАГА: Замикання можуть уникнути використання глобальних змінних та забезпечують певну форму приховування даних (наприклад, коли в класі є кілька методів, використовуйте замикання).
Також декоратори в Python широко використовують замикання.
Exercise
Зробіть вкладений цикл і використовуйте замикання в Python, щоб створити функції для отримання функцій множення за допомогою замикань. Тобто, використовуючи замикання, можна створити функції, які створюють функції multiply_with_5() або multiply_with_4() за допомогою замикань.
# your code goes here
multiplywith5 = multiplier_of(5)
multiplywith5(9)
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
multiplywith5 = multiplier_of(5)
print(multiplywith5(9))
test_output_contains("45")
success_msg("Great work!")
This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!