Замыкания в 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()
Скажите, что выведется в консоль.
Сделайте функцию, каждый вызов которой будет вызывать следующее число Фибоначчи.
Сделайте функцию, которая будет выдавать случайное целое число в промежутке, но так, чтобы два раза подряд не было одинаковых.