Замыкания в Python
Под замыканием (англ. closure) подразумевают функцию вместе со всеми внешними переменными, которые ей доступны.
В Python чаще всего, говоря "замыкание функции", имеют ввиду не саму эту функцию, а именно ее внешние переменные.
Пусть у нас есть следующая функция
outer
, в которой объявлена
переменная i
и внутренняя функция
inner
. В ней к i
будет прибавляться
единица. Чтобы переменная i
корректно работала,
добавляем к ней инструкцию
nonlocal
:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Теперь давайте положим внешнюю функцию
в переменную res
и вызовем ее
с круглыми скобками:
res = outer()
res() # выведет 1
Давайте несколько раз вызовем res
.
После выполнения кода каждый раз
счетчик i
будет увеличиваться
на единицу:
res() # выведет 2
res() # выведет 3
res() # выведет 4
Однако здесь есть важный нюанс -
каждый вызов функции outer
будет увеличивать свой счетчик.
Давайте первый вызов outer
запишем
в переменную res1
, а второй
вызов - в переменную res2
.
Затем последовательно выведем их
в консоль:
res1 = outer()
res1() # выведет 1
res1() # выведет 2
res1() # выведет 3
res2 = outer()
res2() # выведет 1
res2() # выведет 2
res2() # выведет 3
Дан следующий код:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Скажите, что выведется в консоль.
Сделайте функцию, каждый вызов которой будет вызывать следующее число Фибоначчи.
Сделайте функцию, которая будет выдавать случайное целое число в промежутке, но так, чтобы два раза подряд не было одинаковых.