Cierres en Python

Por cierre (closure) se entiende una función junto con todas las variables externas a las que tiene acceso.

En Python, la mayoría de las veces, al decir "cierre de una función", no se refieren a la función misma, sino precisamente a sus variables externas.

Supongamos que tenemos la siguiente función outer, en la cual se declara la variable i y una función interna inner. En ella, a i se le sumará uno. Para que la variable i funcione correctamente, agregamos la instrucción nonlocal:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Ahora pongamos la función externa en la variable res y llamémosla con paréntesis:

pythonres = outer()
res() # mostrará 1

Llamemos res varias veces. Después de ejecutar el código, cada vez el contador i se incrementará en uno:

pythonres() # mostrará 2
res() # mostrará 3
res() # mostrará 4

Sin embargo, aquí hay un matiz importante: cada llamada a la función outer incrementará su propio contador. Pongamos la primera llamada a outer en la variable res1, y la segunda llamada - en la variable res2. Luego mostrémoslas en la consola secuencialmente:

pythonres1 = outer()
res1() # mostrará 1
res1() # mostrará 2
res1() # mostrará 3

res2 = outer()
res2() # mostrará 1
res2() # mostrará 2
res2() # mostrará 3
Задание 1

Se da el siguiente código:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Diga qué se mostrará en la consola.

Задание 2

Cree una función, cada llamada de la cual genere el siguiente número de Fibonacci.

Задание 3

Cree una función que genere un número entero aleatorio en un intervalo, pero de tal manera que no haya dos números iguales consecutivos.