Hice esta imagen a partir de esta clase, y la página https://www.w3schools.com/PYTHON/python_scope.asp Espero le sirva a alguien
Introducción al pensamiento computacional
Introducción al pensamiento computacional
Introducción al cómputo
Introducción a los lenguajes de programación
Introducción a Python
Preparación de tu computadora
Elementos básicos de Python
Asignación de variables
Cadenas y entradas
Programas ramificados
Iteraciones
Bucles for
Programas numéricos
Representación de flotantes
Enumeración exhaustiva
Aproximación de soluciones
Búsqueda Binaria
Funciones, alcance y abstracción
Funciones y abstracción
Scope o Alcance
Especificaciones del código
Recursividad
Fibonnacci y la Recursividad
Tipos estructurados, mutabilidad y funciones de alto nivel
Funciones como objetos
Tuplas
Rangos
Listas y mutabilidad
Diccionarios
Pruebas y debugging
Pruebas de caja negra
Pruebas de caja de cristal
Debugging
Excepciones y afirmaciones
Manejo de excepciones
Excepciones y control de flujo
Afirmaciones
Conclusiones
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 285
Preguntas 36
Hice esta imagen a partir de esta clase, y la página https://www.w3schools.com/PYTHON/python_scope.asp Espero le sirva a alguien
, 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.
Este tema lo explica muy bien Oscar Barajas en el Curso de Closures y Scope en JavaScript.
Saludos y espero haberles podido ayudar.
Para entender mejor esta parte, les recomiendo que se vean la película inception (2010). ¡Es una forma divertida de entender los contextos!
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
Esto me recordó la película Inception… mindblowing
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:
Hola, armé esta imagen para poder visualizar mejor como estaban fluyendo las variables entre los diferentes scopes. Espero les sirva si tienen dudas.
El Scope lo entiendo como “niveles” o una estructura para leer el codigo
TU TE COMPORTAS COMO UNA FUNCION TODO EL TIEMPO!
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().
def comprar_fruta():
compras_hechas = True
def ir_con_mama():
mandado = False
comprar_fruta()
mandado = True
def jugar():
gta_v = False
ir_con_mama()
gta_v = True
jugar()
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.
Yo lo entiendo como si fuera una Matryoshka.
Esa fue la forma como me la enseñaron en la Universidad.
Tambien les recomiendo mucho este video: https://www.youtube.com/watch?v=-c0h05cluQA
También es bueno aclarar que la identación es muy importante al momento de ordenar funciones ya que si func1 y func2 estuvieran a la misma altura, Python lo leería diferente 😄
Yo lo entiendo como una especie de ovillo de lana. Es decir, tenemos que encontrar la punta del ovillo (la variable o función que da origen al código) para poder entender el código completo después. Para poder encontrarlo tenemos que entender cuando el ‘scope’ o ‘alcance’ de una variable es global o local.
Global: es cuando la variable se declara fuera de las funciones y puede ser usada tanto dentro como fuera de las funciones.
Local: es cuando la variable se declara dentro de una función específica y puede ser usada SOLAMENTE dentro de la función en donde fue declarada.
Eso es lo que entendí yo espero estar en lo correcto.
Allí podemos ver en el código como seria el escope señalado por colores como explica David en el vídeo
Yo lo veo mas que nada como una división de procesos donde el proceso global es el proceso principal, entonces a la hora de leer el código vas dividiendo este proceso principal en pequeños procesos
Es importante que muestren en el vídeo lo que está realizando David en el tablero.
Este post explica con algunos ejemplos:
aunque es en JavaScript es el mismo concepto
Hola
.
He pasado 5 horas en 2 dias entendiendo esta clase, es normal. He tomado la libreta para apuntes haciendo distincion con colores y ayuda
.
Paso a paso, paciencia y exito
Para empezar se puede trabajar con los mismos nombres de variables o funciones, para entender el contexto, y poder hacer la analogía “para empezar”.
Hay que prestar mucha atención para entender esta clase, y es que esto es tan importante para Python, como saber sumar.
[email protected] les comparto un recurso que uso mucho para analizar el Scope de mis programas y bases de datos. Se trata de un programa Open Source llamado DIA que permite crear diagramas fácilmente de forma rápida.
Por ejemplo, he creado un diagrama con el Scope de mi código del reto de la Raíz cuadrada:
Puedes descargarlo en su pagina oficial
Aquí
. Creo que con unos ejemplos de codigo hubiera estado mucho mejor.
Es sencillo de comprender, pero lastima esta clase no este bien
Seria bueno que para los que empiezan hagan ejercicios de ‘Pruebas de escritorio’, esto ayuda a agilizar para leer código y saber como se comporta (Claro que solo es recomendable con ejercicios sencillos ya que en ejercicios complejos seria un infierno jajaja) pero es para aprender.
Interesante este termino, seria chevere conocer una herramienta que ayude a organizar mentalmente un programa mas complejo con mas procesos, pero pensándolo bien pienso que se podría dibujar un diagrama de flujo o un mapa mental.
Este articulo me ayudo a entender mas el concepto. Se los hago saber: https://blog.carreralinux.com.ar/2017/06/alcance-de-las-variables-en-python/
No se ve nada de las áreas coloreadas o dibujadas.
no se ven los colores :c
Aquí pueden encontrar un poco más de información:
https://codingornot.com/ambito-o-scope-en-programacion
Resultado 7
Entiendo el Scope como los componentes de un mecanismo en donde cada uno entra y sale del proceso según lo definido.
Excelente clase! En la web http://www.pythontutor.com/ se puede visualizar de otra manera lo explicado por el profesor.
Es importante conocer que además del contexto global, tenemos un contexto de bloque (que es lo que definimos con las tabulaciones y los :)
.
Por lo tanto, una variable está accesible en el contexto en el que se declare y en todos los contextos de bloque de sus hijos (ya sean funciones, whiles, for’s, etc)
para mi con todo respeto, la forma mas facil de entender esto es la siguiente. Si alguien dice pablo, en mi casa , se refiere a un primo, pero si alguien dice pablo en mi empresa, se refiere a un feje. pero si alguien dice oscar en mi casa, o en mi empresa, se refieren a mi. En este caso, Pablo es una variable/funcion local, y depende de donde estoy. Y Oscar es global y no depende de donde estoy. Saludos
En el siguiente enlace encontrar una explicación muy fácil de entender y con un ejemplo sobre el alcance de variables
En síntesis una variable local vive durante todo el procesamiento del programa una variable loca solo vive dentro de la función definida, la variable global la podemos utilizar en cualquier aparte, la loca solo dentro de la función.
El scope lo entiendo como el área visible dentro del que podemos acceder a la definición de una variable. Dentro de un scope podemos tener anidados otros scope y donde se cumple generalmente (?) estas dos cosas:
Una manera (no se si habrán otras) de crear un scope en python es al declarar una función, es decir, dentro de la función podemos acceder a cualquier variable definida en sus scopes superiores pero estos no pueden acceder a las variables que definamos dentro de la función.
no quedo nada claro
Noto que hace uso de ejemplos en ocasiones muy complejos, para explicar un tema, lo cual dificulta en ocasiones la comprensión.
Si ya están un poco mas familiarizados con python les recomiendo el libro sobre buenas practicas y como funciona python.
“Practices of the python pro” Libro
Con el fin de avanzar en una carrera tan extensa como lo es la programación de computadores, este curso debe ser el inicial y general para todos los lenguajes de programación, en lugar de que en cada lenguaje nos estén ocupando gran parte del curso ensenando algo que ya sabemos, solo con un ejemplo en cada lenguaje ya sabremos como usarlo si algo cambia o la forma de como definir lo.
Notas de la clase
Apuntes
les comparto el zen de python
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Notas de la clase ⚡
Scope o alcance.
global
.#Este es un pequeño programa para mejorar el conocimiento de Scope Global y Scope Local.
print('Bienvenido a la lección de scope o alcance. Aquí trabajaras en tu definición de scope mediante ejercicios sencillos.')
print('Empecemos!!!')
print()
print('En primer lugar empezaremos en el Scope global.')
print()
print('El Scope global tiene:')
while True:
opcion_1 = '1. Una funcion con el nombre saludo'
opcion_2 = '2. Una segunda funcion con el nombre usuario'
opcion_3 = '3. Y una llamada a la funcion saludo'
print(opcion_1);print(opcion_2);print(opcion_3)
print()
print('¿Cuál opcion crees que python tomará primero?(Por favor, inserte un numero)')
opcion = input('Numero: ')
print()
print(f'Usted a elegido la opción {opcion}')
if opcion == '3':
print('Bien hecho, su respuesta es correcta.')
print()
break
else:
print('Esta opcion esta incorrecta. Vuela a intentarlo')
print(f'Ahora que la funcion saludo fue llamada, y recordando que tenemos: {opcion_1}, {opcion_2} y {opcion_3}, ¿en cuál Scope estamos?')
print()
while True:
opcion_1 = '1. Scope global'
opcion_2 = '2. Scope local de la funcion saludo'
opcion_3 = '3. Scope local de la funcion usuario'
print(opcion_1);print(opcion_2);print(opcion_3)
print()
opcion = input('Numero: ')
print()
if opcion == '2':
print('Bien hecho, su respuesta es correcta.')
break
else:
print('Esta opcion esta incorrecta. Vuela a intentarlo')
print()
while True:
print('Ahora, dejeme preguntarle, si desde el Scope local de la función saludo entramos a la función usuario y luego volvemos a la funcion saludo, ¿cuál seria el scope?')
opcion_1 = '1. Scope global'
opcion_2 = '2. Scope local de la funcion saludo'
opcion_3 = '3. Scope local de la funcion usuario'
print(opcion_1);print(opcion_2);print(opcion_3)
print()
opcion = input('Numero: ')
print()
if opcion == '2':
print('Enorabuena, Usted a aprendido un poco más sobre Scope Global y Scope local!!!')
break
else:
print('Esta opcion esta incorrecta. Vuela a intentarlo')```
Un scope puede definirse como un lugar desde el que puedes acceder a tu espacio de nombres sin ningún prefijo. El Scope se puede categorizar como: Ámbito de una función donde se tienen nombres locales. Ámbito de un módulo en el que se tienen variables globales.
Probé la variable mensaje en distintos contextos de ejecución, y con esto me quedó claro lo que se refiere esta clase 😃 . Ojalá les sirvan mis ejemplos:
def funcion1():
return print(mensaje + ' alterno 1')
def funcion2():
def funcion3():
return print(mensaje + ' alterno 2')
funcion3()
def funcion3(mensaje):
return print(mensaje + ' alterno 3')
def funcion4():
mensaje = 'Hola Mundo 2'
def funcion5():
return print(mensaje)
funcion5()
def funcion5():
mensaje = 'Hola'
print(mensaje + ' Mundo 3')
def funcion6(mensaje):
mensaje = mensaje +' Mundo 4'
return print(mensaje)
funcion6(mensaje)
def funcion6(mensaje):
return print(mensaje)
mensaje = 'Hola Mundo 1'
# Ejecutables:
print(mensaje)
# Devuelve Hola Mundo 1. La variable mensaje = 'Hola Mundo 1' (variable global)
funcion1()
# Devuleve Hola Mundo 1 alterno 1 . La variable mensaje = 'Hola Mundo 1' (variable global)
funcion2()
# Devuleve Hola Mundo 1 alterno 2 . La variable mensaje = 'Hola Mundo 1' (variable global)
funcion3(mensaje)
# Devuleve Hola Mundo 1 alterno 3 . La variable mensaje = 'Hola Mundo 1' (variable global)
funcion4()
# Devuleve Hola Mundo 2 . La variable mensaje = 'Hola Mundo 2' (prioridad variable local)
funcion5()
# Devuleve Hola Mundo 3 . La variable mensaje = 'Hola' (prioridad variable local)
# Devuleve Hola Mundo 4 . La variable mensaje = 'Hola' (prioridad variable local)
funcion6('Hola Mundo x')
# Devuleve Hola Mundo x . La variable mensaje = 'Hola Hola Mundo x' (prioridad variable del parametro de la funcion) ```
Lo veo como una casa donde cada habitación tiene unas herramientas y puertas para entrar a las habitaciones continuas o una habitación al anterior y así sucesivamente.
Global Scope es la casa
Cada función es una habitación y lo que se ejecuta a dentro es para lo que sirve esa habitación, cuando hay una función dentro de otra función se puede ver como una habitación que por ejemplo tiene una habitación para hacer música dentro de ella, pero solo se puede acceder estando dentro de la habitación más grande.
Es una analogía que puede explicar el tema de Scope
En esta clase me perdí. No entiendo.
En este sitio en el capítulo de funciones @AlSweigart explica cómo se ejecutan los Frames o Contextos del programa que se está ejecutando, también a través de pythontutor se puede observar gráficamente su funcionamiento.
Al principio es un poco dificil de entender. Yo lo entendí gracias a JavaScript. De esta manera:
.
El scope es la capacidad de una función y/o variable para acceder a datos externos, es decir, datos que no están (o que sí están) dentro de su bloque de código. Esto permite acceder a una variable que fue declarada dentro de otra función, tal como se muestra en los ejemplos de esta clase.
.
Y también realicé un pequeño ejemplo también JS:
Para yo entender el scope hago uso de la teoría de conjuntos, siendo cada bloque de código un subconjunto del conjunto U.
Este aporte lo vi en la sección de comentarios, por si es que no lo encuentran les paso esta página http://www.pythontutor.com/visualize.html#mode=display la cual de ayuda a ver Frame by Frame cómo se lee un código en python.
No se ven los colores
Si no me equivoco sale 7
no se ven los colores
No puedo ver los colores de los contextos
No se ven los colores.
Les recomiendo el curso de Closures y Scope para profundizar mejor link: https://platzi.com/clases/scope/
Excelente clase, fundamental el entender esta parte
Creo que las funciones hacen que el codigo sea mas ordenado, no es tan facil de aplicar, manejar y comprender pero es muy util.
el escope parece un juego de matrushkas
Yo creo que todo esto se puede asimilar como variables globales y locales. Rectifiquen si me equivoco
Yo lo entiendo, como los diferentes ámbitos o dominios que son tocados en cada una de las funciones, que son utilizadas en un programa.
Se entendió perfecto!
Comunidad, buenas noches, alguien por favor me puede explicar con valores como se ejecutaría esta función y cual seria el resultado?
He tratado de entender de diferentes formas pero no ha sido posible 😦
para entender mejor el scope pienso que seria con JavaScript
¿por que si ponemos
print(func1 (un_arg, cualquier_func))
no nos muestra el valor de un_arg pero si el valor de cualquier_func ?
Una acotación; la variable un_arg
puede ser alcanzada por cualquier función.
De igual manera, cualquier variable declarada dentro de func1
, puede ser alcanzada por func2
.
Un ejemplo con la variable a
, declarada dentro de func1
:
def func1(un_arg,una_func):
a="Prueba Scope"
def func2(otro_arg):
print(a)
return otro_arg*2
valor = func2(un_arg)
return una_func(valor)
un_arg = 1
def cualquier_func(cualquier_arg):
return cualquier_arg + 5
resultado = func1(un_arg,cualquier_func)
print(resultado)
Para comprender un poco mejor, les recomiendo cambiar el “otro_arg * 2” por “otro_arg + 2” y coloquen la sentencia print en func1 del contexto global. Asi podran seguir el procedimiento que explica el profesor y ver un resultado.
genial se entiende perfectamente haciendo el scope
y creo que el truco esta en que hay que reconocer donde enpiesa un codigo y donde termina, dentro de func1an definido func2 y eso lo complica.
pero si lo resuelves lo de adentro de la primera parte y consideras el un_arg=1 entonces la respuesta de la primera parte seria una_funcion (2) donde el valor seria dos.
ahora si concideramos la segunda duncion y incluimos la primera parte y la segunda definicion en el ultimo items
esto nos daria primero.
cualquier_func (valor=2)
y finalizaria con 2 + 5 = 7
esto se puede ver sin realizar programacion. saludos
@RichardLazaro: me perdí en el minuto 7:06 dice que lo ultimo que aremos dentro de la función " func2 " es ejecutar " una_func(valor) " pero "una_func(valor) " esta fuera de la función “func2” @JahzielCabrera: Se equivocó, realmente se referí a func1
En mis primeros acercamientos a la programación (con arduino) me costaba mucho esto del scope. Me costó mucho pero le entendí cuando agarré una libreta y paso a paso fui dandole seguimiento a las variables, linea por linea de programa fui siguiendo el comportamiento de un código hasta que entendí la manera en que los valores iban cambiando. Claro existen muchos métodos para entender un tema tan abstracto pero ese fue el que me funcionó a mi. Mucho éxito!
Para complementar pueden ver esta lectura del Curso Práctico de Python CRUD: https://platzi.com/clases/1378-python-practico/14336-scopes-and-namespaces/
😄
Este nuevo concepto me recuerdo a la composiciones de funciones reales salvo que en este caso le añadimos el concepto de alcance local y global de las variables. Es de aquellos conceptos que merecen un constante estudio , saludos a todos.
Esto es programación funcional.
Aclaraciones:
Contexto de ejecucion:
Contexto Global (variables globales)
Variables definidas directamente en el programa (fuera de cualquier funcion o clase), existen dentro de todo el programa
Contexto Global:
Variables definidas en una funcion o clase, solo existen dentro de este contexto (funcion o clase)
Ejemplo:
valor1=5
valor2=2
def operaciones(valor2,valor3):
suma = valor1 + valor2
resta = valor2 - valor3
return (suma,resta)
multiplicacion = valor1 * valor2
datos=operaciones(4,8)
print(f'suma y resta {datos} multiplicacion {multiplicacion}')
Resultado:
suma y resta (9, -4) multiplicacion 10
Conclusiones:
-valor1, valor2: variables globales: existen en todo el codigo
-valor2, valor3: variables locales solo exixten dentro de la funcion operaciones
-La variable valor1 es valida tanto fuera como dentro de la funcion
-Dentro del contexto funcion, python prioriza las variables locales si tienen el mismo nombre (valor2=4 y no 2) pero no la sobreescribe
-Fuera de la funcion valor2 continua con el valor de 2 a pesar de que anteriormente trabajo con el valor 4 dentro de la funcion.
-Las variables suma y resta solo existen dentro de la funcion (no se pueden llamar fuera de esta)
¿Y en que punto entra self?
Alcance:
-Al ejecutar una funcion python entra a un nuevo contexto de ejecucion
-Cada contexto de ejecucion tiene sus propias variables; no puedes acceder a las variables fuera de su contexto de ejecucion
Lo entiendo más fácil al ver la ubicación del texto, que tan a la izquierda están, creo que Python es muy riguroso en eso y ayuda.
Encontré este recurso https://www.geeksforgeeks.org/scope-resolution-in-python-legb-rule/ que es una regla donde te explica los diferentes alcances que se tienen dentro de Python.
excelente tutor!!
Variables can only reach the area in which they are defined, which is called scope. Think of it as the area of code where variables can be used. Python supports global variables (usable in the entire program) and local variables
https://pythonspot.com/scope/
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.