Dominar el alcance de las funciones en Python es clave para entender el comportamiento de un programa a fondo. Cuando ejecutas una función en Python, el lenguaje crea un nuevo "contexto de ejecución". Este contexto es un espacio donde se asignan variables específicas a las que el código dentro de la función puede acceder. Desde el inicio, es importante saber que las variables definidas fuera de este contexto no son accesibles dentro de él, a menos que se declaren como globales o se pasen como argumentos. Esta separación es crucial para mantener la integridad y el control de las variables durante la ejecución del programa.
¿Cómo interpreta Python un código con múltiples funciones?
En Python, el código se lee de arriba a abajo y de izquierda a derecha. Así, cuando se define una función, el intérprete de Python toma nota de sus atributos. Para ilustrar esta idea, considera el siguiente ejemplo donde tenemos dos funciones y variables usadas como argumentos:
deffuncion_uno(arg):defcualquiera_funcion(valor):return valor +5deffuncion_dos(otro_arg):return otro_arg *2 valor = funcion_dos(arg)return cualquiera_funcion(valor)argumento_uno =10resultado = funcion_uno(argumento_uno)print(resultado)# Salida: 25
El programa empieza por definir funcion_uno y posteriormente cualquiera_funcion y funcion_dos. Cuando funcion_uno se invoca con argumento_uno, crea un nuevo contexto de ejecución.
¿Qué son los contextos de ejecución y cómo funcionan?
Dentro de una rutina, al invocar diferentes funciones se crean distintos niveles de contexto. Aquí, cada contexto nuevo actúa como una especie de "capa", cada uno con sus propias variables y espacio de ejecución. Por ejemplo:
Contexto global: Variables y definiciones a nivel del programa.
Contexto de funcion_uno: Variables y definiciones accesibles solo dentro de funcion_uno.
Contexto de funcion_dos: Variables definidas y usadas durante la ejecución de funcion_dos.
Cada vez que una función se invoca, un nuevo "marco" de contexto se apila, y al terminar su ejecución, se desapila, regresando al marco anterior. Este sistema asegura que el programa gestione adecuadamente las variables, evitando conflictos o manipulaciones incorrectas entre distintos niveles de ejecución.
¿Cómo afecta la comprensión del alcance al desarrollo de software?
Entender y manejar los contextos de ejecución no solo te permite escribir un código más eficiente, sino que también te prepara para leer y colaborar en código más complejo de otros ingenieros de software. Significa que puedes anticipar cómo un programa realizará cálculos y respuestas en tiempo de ejecución. Diseñar correctamente las funciones y manejar su alcance permite:
Evitar efectos secundarios no deseados en el código.
Mantener un código más limpio y modular.
Facilitar el mantenimiento y comprensión del código tanto propio como ajeno.
La construcción de un software robusto y escalable se basa en estas prácticas. ¡Sigue adelante, y pronto te encontrarás avanzando hacia el dominio completo como ingeniero de software! Si tienes dudas o recursos que desees compartir, los comentarios son bienvenidos. No te rindas, con cada intento te acercas más a entender en profundidad cómo funcionan los programas en Python.
Woooowwww muchas gracias compañero por este aporte ahora entiendo lo que quería hacer el profesor con las páginas, ahora me queda mas claro el alcance del scope.
hola una forma de visualizar esto que explica el profesor es con herramienta como http://www.pythontutor.com/ aca no solo puedes ver como se ejecuta el codigo en python sino que tiene otros lenguajes de programacion.
El scope o alcance básicamente define las variables, funciones demás a los que una parte del código tiene acceso. El scope va cambiando conforme la ejecución avanza en el programa, por ejemplo, al invocarse una función, el scope actual queda guardado en memoria y se crear un nuevo scope para la función.
Se puede visualizar como esas muñecas rusas que se pueden meter una dentro de otra, de la misma forma hay scopes dentro de un scope dentro de otro scope y así sucesivamente.
Que explicación tan clara, muchas gracias. Para los que estamos empezando estas explicaciones son la gloria porque nos permiten entender lo que no nos queda claro algunas veces. Gracias otra vez 💚
Tengo un año intentanto programar, he hecho cosas siguiendo tutoriales y copiando y pegando líneas de código. Sin embargo, recién comienzo a entender un poco mejor, y cada día un poco más, la estructura lógica y la consecución de acciones que se siguen para saber lo que genera el código. Ha sido dificil, pero es muy satisfactorio cada día entender más.
Imagina que estas sentado en tu laptop jugando y derrepente tu mamá te llama, ella quiere que vayas a comprar fruta, para eso tienes que ir por tu bicicleta y después comprar la fruta. Una vez comprada la fruta guardas tu bicicleta, le entregas la fruta a tu mamá y ahora si puedes seguir jugando.
¿Algo te suena?
A eso se le llama flujo de ejecución y toda pieza de software tiene uno.
La función 1 que llama a la función 2 tendrá que esperar a que la función 2 termine para poder seguir.
En el ejemplo anterior para que la función jugar() pueda terminar primero tiene que resolver ir_con_mama(), a su vez ir_con_mama() llama a la función comprar_fruta().
Una vez que comprar_fruta() acaba, continuamos con ir_con_mama() y una vez acabemos ahí podemos seguir con jugar().
Como yo comprendo el scope es un tema de jurisdicción. Es como las fronteras nacionales. En un hipotético caso dos personas tienen el mismo nombre y número de identificación, pero en nacionalidades distintas. Si uno de ellos viaja al país del otro no puede usar su ID pues no es válida donde va. Se usa entonces un pasaporte que le otorga una identificación diferente.
Asi mismo una variable o funcion "vive" dentro de el scope (nacionalidad) en la que se declara. Sin embargo es posible pasar su valor o funcionalidad a otro scope por parámetros lo que significa darle una nueva identidad limitada al ámbito de la función que la recibe.
Atentos al minuto 7:06.
Ahí se equivoca, lastimosamente. Dice: "Retornamos al contexto de FUNC2"
Cuando en realidad se esta regresando al contexto de FUNC1
Esto puede crear todo un lío en tu cabeza. Así que cuidado
Para entender los diferentes scopes de las variables dentro y fuera de funciones es por ejemplo, imaginar que una función es un taller privado de coches, una carpinteria,etc, y las variables son las herramientas que tienes disponibles en ese taller, si una herramienta no está en tu taller puedes ir a buscarla a la calle( variables globales), pero si tienes esa herramienta en tu taller puedes usarla sin problemas dentro de tu taller( variables locales), pero si la herramienta solo se encuentra en otro taller, tu no puedes usarla. Para entender esto mejor dejo el siguiente enlace:
SPOILER ALERT 👀: Si bien se pueden usar, las buenas practicas de desarrollo prohiben el uso de variables globales, debido a que, en proyectos muy grandes, se podría perder el control de la misma generando bugs difíciles de encontrar.
Buen día a todos, como vi en los comentarios que han quedado algunas dudas respecto al scope, quise hacer mi aporte.
El Scope se puede ver como los permisos que se tiene para acceder a una variable.
Supongamos que tenemos esta función sencilla:
Como resultado tenemos un mensaje "Hola".
Ahora supongamos que dentro de función 1, declaramos función 2, donde queramos agregar 'mundo' a nuestro mensaje, para que al final tengamos, 'Hola mundo':
Eso funcionaria?.... Pues no, aquí es donde entra en juego el scope de las variables y funciones.
El editor mismo marca un error antes de ejecutar (gracias a pylint), que nos dice que la variable mensaje es indefinida. Y si, intentamos igualmente ejecutar nuestro programa, la terminal nos muestra un mensaje como este:
Con un error haciendo referencia que queremos hacer referencia a la variable antes de haberla asignado.
Es aquí donde entonces tú dirás, entonces paso el mensaje como parámetro a la función 2 y listo!... Y en la práctica si lo lograrías pero no como tu creerías que lo estás logrando, que es trabajando siempre sobre 1 misma variable que es mensaje, por la terminal tendría que salir solo nuestro "Hola mundo", pero...:
¿Cuál sería nuestro output en la terminal de este código?
Y es aquí donde a todos nos explota la cabeza, ¿qué paso? ¿por qué ese resultado? "ama aiudaaa".... nos tranquilizamos, respiramos, respiramos, tomamos agüita y una vez calmados, entendemos que paso... y si, es eso que estás pensando... ¡EL SCOPE!.
Resulta que cuando definimos función 2 dentro de función 1, es como que hayamos creado un nuevo espacio donde no se hubiera declarado y asignado nunca de las variables que teníamos en función 1.... es decir dentro de nuestro programa viven 2 variables mensaje, pero independientes cada una de ellas.
Por eso nuestro resultado en la terminal, mostrando 2 mensajes distintos, el contenido de mensaje que indicamos en función 1 sigue intacto, porque dentro de función 2, mensaje fue asignado en una nueva referencia a memoria, donde copio lo que tenía mensaje en función 1 y adicionalmente agrego nuevo contenido.