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:
def 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:
res = outer()
res() # mostrará 1
Llamemos res varias veces.
Después de ejecutar el código, cada vez el contador
i se incrementará en uno:
res() # 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:
res1 = outer()
res1() # mostrará 1
res1() # mostrará 2
res1() # mostrará 3
res2 = outer()
res2() # mostrará 1
res2() # mostrará 2
res2() # mostrará 3
Se da el siguiente código:
def 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.
Cree una función, cada llamada de la cual genere el siguiente número de Fibonacci.
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.