0% encontró este documento útil (0 votos)
18 vistas325 páginas

Python-LOGICA y Ejercicios

El documento aborda la lógica de programación en Python, centrándose en el uso de control de flujo con las palabras clave 'break' y 'continue', así como la importancia de las funciones para la reutilización de código. Se explican conceptos como clausuras y funciones generadoras, que permiten crear entornos encapsulados y producir secuencias de valores, respectivamente. Estas herramientas son fundamentales para desarrollar programas más complejos y eficientes.

Cargado por

daniwd39
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
18 vistas325 páginas

Python-LOGICA y Ejercicios

El documento aborda la lógica de programación en Python, centrándose en el uso de control de flujo con las palabras clave 'break' y 'continue', así como la importancia de las funciones para la reutilización de código. Se explican conceptos como clausuras y funciones generadoras, que permiten crear entornos encapsulados y producir secuencias de valores, respectivamente. Estas herramientas son fundamentales para desarrollar programas más complejos y eficientes.

Cargado por

daniwd39
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 325

Python LOGICA DE

PROGRAMACION

LOGICA DE PROGRAMACION.pdf

README.md

funciones integradas

Python LOGICA DE PROGRAMACION 1


Attachments

Python LOGICA DE PROGRAMACION 2


Python LOGICA DE PROGRAMACION 3
Python LOGICA DE PROGRAMACION 4
Python LOGICA DE PROGRAMACION 5
Python LOGICA DE PROGRAMACION 6
control de flujo con Break y contin:

continu en python podemos controlar el flujo de un bucle usando las


palabras clave de break y de continue empezaremos con el break que se
utiliza para salir de un bucle antes de que termine naturalmente vamos a ver
un ejemplo
for num in Range de 10 If num equivale a 5 vamos a hacer un break y también
haremos aquí un print del número qué va a pasar en este código de aquí si
analizamos bien este bucle veremos que el bucle se va a interrumpir cuando el
número sea igual a 5co If no
— equivale a 5 se va a hacer un break y se va a salir del bucle antes de que
termine naturalmente en este caso no se imprimirá el resto de los números es
decir que el bucle empezará del uno hasta el número cuat porque cuando el
número sea 5 vamos a salir automáticamente de este bucle voy a ejecutar el
código y como veis 01 2 3 y 4
el continue lo que hace es saltar a la siguiente iteración del bucle ignorando el
código restante en la interacción actual entonces forn in Range de 10 Si el
número equivale a c vamos a hacer un —continue es decir no vamos a ejecutar
el print para el número cinco nos vamos a saltar la esta iteración a la siguiente
ignorando este print de aquí que de hecho no es print de de cinco sino PR de
número obviamente de num aquí cuando cuando número sea cinco num sea
cco el código dentro del bucle se va a saltar y python pasará directamente a la
siguiente iteración es decir a cuando num sea 6 si ejecuto esto y de hecho lo
que voy a hacer es para que no se vea esto añadiré un un salto de línea Por
aquí pero tengo que ponerlo así con un String vale como veis a partir de Aquí

Python LOGICA DE PROGRAMACION 7


empieza nuestra iteración de el de este Ford de aquí entonces cuando el
número sea cinco como veis no va a aparecer por pantalla y se va a saltar y no
se va a hacer el print para el número cinco entonces estas dos herramientas
del break y del continue como eh para controlar el flujo son muy útiles cuando
necesitas más control sobre cómo se Ejecutan tus bucles como conclusión del
módulo en este módulo hemos aprendido a usar operadores estructuras
condicionales y bucles. Y cómo controlarlos con breaky contin continu estas
herramientas son fundamentales para crear programas más complejos y
adaptables en un futuro

Qué son las funciones en términos sencillos una función es un bloque de


código que se ejecuta cuando es llamado pero os preguntaréis Por qué son tan
útiles Pues porque nos permiten reutilizar código esto significa que si tienes
una tarea repetitiva en tu programa puedes escribir una función que la realice
por ti en lugar de repetir el mismo código varias veces esto hace que tu código
sea más organizado más eficiente y más fácil de mantener
Por ejemplo si necesites calcular el área de un círculo en varios puntos de tu
programa en lugar de escribir la fórmula de calcular el área varias veces
simplemente vas a crear una función que calcule el área y la vas a llamar
cuando la necesites por ejemplo voy a definir la función de área círculo círculo
que va a recibir el radio perfecto y va a hacer un return de 3 3,14 166 que es el
número pi así por encima por el radio al cuadrado es decir pi por radio al
cuadrado es la definición del área de un círculo voy a ampliar esto un poco así
que imaginad que tenemos que calcular el área de un círculo en diferentes
partes de nuestro código pues simplemente haremos un print de la función
área cálculo eh círculo de un círculo de radio de 5 cm y también de 10 y
además también de 15 en vez de calcular y hacer esta aplicar esta Fórmula en
tres partes distintas de nuestro código podemos Definir la función de área
círculo que a partir del radio nos va a calcular el resultado del área de este
modo si ejecuto el programa como veis se nos calcula el área del círculo dados
estos tres radios diferentes así que en este ejemplo estamos calculando el área
del círculo para diferentes radios sin repetir el mismo cálculo en cada línea de
código con una sola función en este caso área círculo reutilizamos esta parte
de código en todo nuestro Script entonces recuerda que las funciones nos
ayudan a reducir la redundancia y a organizar mejor nuestro código además
pueden hacer que nuestro código sea mucho más fácil de leer y entender

Python LOGICA DE PROGRAMACION 8


Python LOGICA DE PROGRAMACION 9
Python LOGICA DE PROGRAMACION 10
Python LOGICA DE PROGRAMACION 11
Python LOGICA DE PROGRAMACION 12
Python LOGICA DE PROGRAMACION 13
Python LOGICA DE PROGRAMACION 14
Python LOGICA DE PROGRAMACION 15
Python LOGICA DE PROGRAMACION 16
Python LOGICA DE PROGRAMACION 17
Python LOGICA DE PROGRAMACION 18
Usar Context Managers: with open()

Python LOGICA DE PROGRAMACION 19


Leer Archivos Grandes y Crear Logs

Python LOGICA DE PROGRAMACION 20


Python LOGICA DE PROGRAMACION 21
Python LOGICA DE PROGRAMACION 22
Python LOGICA DE PROGRAMACION 23
Python LOGICA DE PROGRAMACION 24
Python LOGICA DE PROGRAMACION 25
Python LOGICA DE PROGRAMACION 26
Python LOGICA DE PROGRAMACION 27
Python LOGICA DE PROGRAMACION 28
Python LOGICA DE PROGRAMACION 29
Python LOGICA DE PROGRAMACION 30
Python LOGICA DE PROGRAMACION 31
Python LOGICA DE PROGRAMACION 32
Python LOGICA DE PROGRAMACION 33
Python LOGICA DE PROGRAMACION 34
Python LOGICA DE PROGRAMACION 35
Python LOGICA DE PROGRAMACION 36
Python LOGICA DE PROGRAMACION 37
Python LOGICA DE PROGRAMACION 38
Python LOGICA DE PROGRAMACION 39
Python LOGICA DE PROGRAMACION 40
Python LOGICA DE PROGRAMACION 41
paquete init_.py para reconocer paquetes

Python LOGICA DE PROGRAMACION 42


¿Qué son los Parámetros * y / en Funciones de Python?

Python LOGICA DE PROGRAMACION 43


Python LOGICA DE PROGRAMACION 44
Clausuras en Python: El Secreto para Funciones con Memoria
Las clausuras y bueno Si alguna vez has oído hablar de ella y te has quedado
pensando qué son exactamente o cómo puedes usarlas para hacer tu código

Python LOGICA DE PROGRAMACION 45


más eficiente eficiente Perdón estás en el lugar correcto Bueno voy a explicar
las clausuras con un código Pero bueno Antes que todo eh tienen que entender
que el concepto de clausura permite crear un entorno encapsulado donde una
función interna que por ejemplo esta función contador que ya lo voy a explicar
tiene acceso a las variables como esta variable de acá es decir tiene acceso a
las variables de una función externa que sería esta función aquí incluso cuando
la la ejecución de esta función externa haya sido finalizado entonces Bueno lo
que vamos a hacer ahora es crear un contador de una forma eficiente y
encapsulada y vamos a ver cómo está este concepto de de clausura y cómo
funciona Okay por ejemplo
vamos a definir una función que se se Llamar generar contador Okay y luego
vamos a crear una variable dentro de esta función que se va a llamar cuenta
que va a ser un una lista básicamente una lista que vamos a inicializar la en
cero el único elemento que va a tener esta lista lo vamos a inicializar en cero y
bueno usamos esta lista para que sea pu ser mutable y podamos modificarla
en el futuro y luego —vamos a definir una función contador que va a ser una
función que está dentro de esta función generar contador en donde vamos a
incrementar en uno eh cada vez que se llama esta función contador vamos a
incrementar en uno el valor de esta variable cuenta del elemento cero Okay y
finalmente vamos a retornar el elemento cero de la variable cuenta y también
vamos a retornar la variable contador cada vez que llamemos a esta variable
esta función Perdón vamos a retornar la función interna contador cada vez que
llamemos a la función externa generar contador Okay quizás suena un poco
complicado pero lo vamos a explicar ejecutando esta función
Entonces vamos a crear un contador primero que se va a llamar mi contador en
donde vamos a llamar la función externa que se llama generar contador Okay
vamos a ejecutar y vamos a hacerlo esto por separado mejor lo tenía aquí junto
Déjenme pegar esto acá vamos a pegar otra vez más ahí sí Perfecto entonces
lo que vamos a hacer ya ejecutamos la función mi contador Entonces qué es lo
que estamos guardando aquí en esta variable estamos guardando lo que me
retorna esta función general contador que es una función llamada contador
Okay entonces cada vez que yo llame a mi Contador me va a aumentar el
contador por ejemplo vamos a llamarlo una vez y va a ser uno es decir pasó de
cero a uno se ejecutó la función contador y me incrementó la cuenta en uno si
la llamo de nuevo me la va a incrementar nuevamente en uno y ahora es dos si
la llamo de nuevo es tres okay Y qué gracia tiene esto También aparte de de
generar este contador Es que puedo generar otro contador independiente por
ejemplo vamos a llamar a otro o generar otra variable que se va llamar otro

Python LOGICA DE PROGRAMACION 46


contador y le vamos a poner como nombre generar contador o sea Perdón le
vamos a poner como nombre otro contador y vamos a llamar a la función
nuevamente a la función externa generar contador y vamos a imprimir y como
ven me imprime uno y lo la gracia de esto es que el otro contador no pierde su
valor anterior entonces si yo nuevamente ejecuto mi contador que es la primera
función que o la primera variable que que llamé va a seguir contando y el otro
también de forma independiente entonces este estaba en tres y el otro estaba
en uno ejecuto y como Ven ahora el primero ahora va en cuatro y el segundo
va en dos como ven no no Perdieron el valor es como que si tuvieran memoria
entonces eh Cuando empiecen a ejecutar esto en sus códigos empiecen a
aplicarlo van a optimizar bastante eh sus proyectos y bueno eh yo lo uso
mucho cuando quiero desarrollar videojuegos por ejemplo uso mucho esto de
acá cuando estoy viendo algún videojuego que hacer Así que bueno vamos
con la siguiente el siguiente ejemplo
vamos a crear una función que se va a llamar función de gener generar aplicar
aplicador de descuento Okay y dentro de esta función bueno Y a esta función
le vamos a entregar un como parámetro el descuento que queremos aplicar y
dentro de esta función vamos a generar un aplicador de descuento y dentro de
la función de adentro o la función interna le vamos a entregar como parámetro
el precio entonces en la función interna vamos a retornar el precio menos el
descuento que sería el precio por el descuento dividido en 100 y la función eh
externa me va a retornar el aplicador de descuento okay O sea vamos a
ejecutar
Esto está demás y luego vamos a crear eh variables la primera va a ser un
descuento del 10% la segunda del 20 y la y la tercera del 5co Entonces vamos
a usar la función generar aplicador de descuento en la primera le vamos a
entregar un 10 como descuento la segunda un 20 y a la tercera un 5% vamos a
ejecutar y como ven ejecuté las tres funciones de forma independiente y
vamos a crear un precio original que se va a ser 100 y a la vamos a aplicarle el
descuento del 10% simplemente Llamando a la variable descuento del 10 y
entregándole el parámetro con el precio original de 100 y lo mismo para la del
20 y para con ambos descuentos descuento del cinco y aquí le vamos a aplicar
el precio con descuento del 20 que es la variable que estamos guardando acá
y tiene un descuento del 20% Entonces vamos a ejecutar esto y vamos a
ejecutar esto de acá

Entonces vamos a ir viendo el precio original va a ser 100 Okay le aplicamos un


precio con descuento del 10% me queda en 90 es decir qué hizo esto precio

Python LOGICA DE PROGRAMACION 47


original 100 pasamos acá el precio original el precio del descuento del 10% del
precio original 100 entonces descuento del 10 descuento del 10 que está acá es
generador de aplicar de descuento del 10 entonces generador de de aplicar de
descuento aquí qui le entrega un 10 el aplicador de descuento de precio
estamos diciendo que el precio es 100 el precio original es 100 por lo tanto me
retorna el descuento que en este caso sería un 10% y me deja el 90 el precio
final lo mismo con el 20% me deja un 80 y luego al precio del 80 le estamos
descontando un 5% y me queda en 76 Okay
Espero se haya entendido este concepto de clausura básicamente me permite
generar funciones eh internas en donde la estoy estoy usando variables de la
función externa y las puedo ir modificando y usando cada vez que yo las llame
de nuevo y puedo ir creando una cierta memoria Por así decirlo como lo que
hicimos acá con el contador así que bueno espero empiecen a ocupar

Python LOGICA DE PROGRAMACION 48


Python LOGICA DE PROGRAMACION 49
Domina las Funciones Generadoras en Python: Guía Completa con Ejemplos

Python LOGICA DE PROGRAMACION 50


Las funciones generadoras son un tipo de iterador o una forma de implementar
iteradores en python y Bueno A diferencia de las funciones normales que
retornan un valor y terminan las funciones generadoras pueden pausar la
ejecución y retomarla en algún periodo de tiempo posterior lo que permite así
producir una secuencia de valores a lo largo del tiempo en lugar de todos los
valores al mismo tiempo vamos a ver un ejemplo bueno eh vamos a tener la
función simple generator que es una función generadora porque utiliza la
palabra yel que es nuestra palabra clave de un generador y que es lo que va
haciendo que cada vez que se define esta función o se llama esta función me
va a generar el valor distinto es decir la primera vez que se ejecute la función
me va a generar el valor un la segunda vez el valor dos y la tercera vez el valor
tres vamos a ejecutar esto y Aquí vamos a hacer un for en donde vamos a
iterar por la función es decir cada vez que se ejecute el for se va a ejecutar la
función y vamos a imprimir el valor vamos a ejecutar y como ven la primera vez
en el for se imprimió el valor uno porque Se generó la primera vez la función
luego se llamó una segunda vez la función y Se generó el valor dos y luego se
llamó nuevamente la función y Se generó el valor tres Okay por ejemplo otro
ejemplo más tenemos eh vamos a definir una función contador que vamos a
tener un máximo vamos a partir de n = 0 Y mientras este n sea menor que el
máximo que le vamos a entregar vamos a generar generar
Perdón un valor n en donde n va a ser igual al n actual + 1 Okay es decir eh
siempre que llamemos a la función contador vamos a aumentar a 1 a n hasta
hasta que la función contador llegue a su máximo Okay vamos a ejecutar esto y
por ejemplo vamos a generar la función contador en donde vamos a poner un
máximo de tres Okay ejecutamos Esto entonces y vamos a imprimir la primera
vez el el la función generadora se pone con la palabra next que es lo que me
dice este next que me me genera el siguiente valor asociado al yel en este caso
vamos a ejecutar la función contador por primera vez y me imprime el cero por
qué Porque n vale cer0 por lo tanto la primera vez que yo ejecuté la función
contador va a valer cer0 una vez que la ejecute de nuevo apriete nuevamente o
imprima nuevamente en next Gen me va a imprimir el valor uno si lo hago de
nuevo me va a imprimir el valor dos y si lo hago una vez más me va a mandar
un error

Por qué Porque el valor era el máximo era tres Entonces yo le dije que mientras
el n sea menor que tres me siga generando datos Y como acá ya llegué al dos
y dos es menor que tres en la siguiente iteración me manda este error entonces
también podemos tratar esto como con un try donde Tratamos de imprimir la
próxima generación de de valor y si no es posible mandamos un un mensaje de

Python LOGICA DE PROGRAMACION 51


excepción en este caso la generación ha terminado Okay otra cosa que vamos
a hacer por ejemplo es leer eh archivos leer archivos grandes Bueno aquí
vamos a leer un archivo y cada línea la vamos a ejecutar o vamos a leer Perdón
dicho cada eh en cada iteración una línea diferente Cuál es la ventaja de esto
que no estoy cargando el archivo completo en memoria sino que estoy
cargando cada una de las líneas en memoria y así no sobrecargo la memoria de
mi computador Okay entonces voy a definir esta función y vamos a leer un
archivo que tengo un txt que está en portugués eh fue lo que encontré más a
mano y vamos a leer el archivo y como ven me lo lee de forma normal pero lo
que hace es en cada iteración en cada iteración me leyó una línea diferente
Okay entonces Espero se haya entendido
Cómo usar estas funciones generadoras Ahora les voy a explicar un poco Por
qué se usan bueno primero es por la eficiencia de memoria cuando trabajamos
con grandes conjunto de datos de datos Perdón cargar todo el conjunto en
memoria puede ser eh totalmente ineficiente y puede provocar no sé que el
computador se te pegue Okay entonces como las funciones generador utilizan
el jet para producir elemento uno a uno solo se necesita tener un elemento en
memoria a la vez O sea no necesitamos tener todo el documento por ejemplo
en la memoria simplemente podemos tener una línea Okay entonces eh
Cuándo es mejor usar un yel por ejemplo por ejemplo cuando estamos
procesando archivos

Grandes como un archivo de texto grande así leemos línea por línea sin cargar
todo el documento en memoria también cuando estamos haciendo streams de
dato en Stream de dato en tiempo real por ejemplo estamos usando algún tipo
de software está entregando log constantemente por lo tanto están llegando en
tiempo real entonces las funciones generadoras pueden procesar cada
elemento a medida que van llegando y por lo tanto no va a mandar un error si
es que en algún momento no encuentra un archivo Okay también si
necesitamos hacer algún programa que genere secuencia infinita también
podemos usar la función yel en donde en cada momento podemos ir iterando
en este esta función y no tengamos que esperar que el que llegue al infinito
porque nunca va a llegar okay Y bueno Esos son los principales uso de la
función yel Espero se entienda lo si tienen alguna duda déjenlo en los
comentarios nos vemos en el siguiente episodio

Python LOGICA DE PROGRAMACION 52


Python LOGICA DE PROGRAMACION 53
Python LOGICA DE PROGRAMACION 54
Domina las Comprensiones de Lista en Python: Mejora tu Código Hoy

ejemplos de comprensiones de lista en donde les voy a explicar cómo


optimizar su código eh En donde vamos a ir reduciendo este código en muy
pocas líneas por ejemplo vamos a generar una lista de los cuadrados de un
número okay Entonces lo normal lo como lo harían Siempre voy agrandar un
poquito acá sería crear por ejemplo una lista vacía que se llama que sea la lista
cuadrado y hacer un for en el rango de Por ejemplo si queremos la los números
cuadrados del 1 al 10 en el rango del 1 hasta el 11 recordar que en python va del
número que le ponemos acá hasta el número anterior a este en este caso sería
del 1 al 10 número anterior al 11 y luego vamos a poner un cuadrado aent y
vamos a multiplicar el I por I es decir en cada iteración me va a calcular el
cuadrado del número en el que vaya en la primero el 1 por un en la segunda
iteración el 2 por 2 y así sucesivamente

Okay vamos a ejecutar esto y luego ejecut damos todo acá y como ven me
entrega los cuadrados del los primeros 10 números del uno al 10 Okay voy a
checar un poquito nuevamente Pero esto lo podemos simplificar con una
comprensión de lista podemos pasar de estas tres líneas de código a esta línea
de código de acá y cómo se hace esto Bueno vamos a crear una variable que
se oba Llamar cuadrado gu baj comp quiere decir de comprensión a poner
igual y para hacer una comprensión de lista tenemos que poner las llaves para
que la la

Perdón esta llaves eh paréntesis cuadrado para decirle que lo que la respuesta
que me tiene que dar es una lista entonces la comprensión de lista lo primero
que le vamos a entregar es el valor que queremos que entregue por cada
iteración en este caso en cada iteración queremos que multiplique I por I luego
le tenemos que poner la iteración en este caso va a ser el for en el rango del 1
al 11 y ya con eso lograríamos nuestro nuestra lista así de simple miren vamos a
ejecutar y como ven logramos el mismo resultado Okay vamos a hacer un

Python LOGICA DE PROGRAMACION 55


segundo ejemplo que es filtrar números pares Entonces por ejemplo vamos a
tener un número del 1 al 10 vamos a crear una lista con los pares una lista bacía
con los númer que se va a llamar pares y luego vamos a iterar en cada uno de
los elementos de la lista números y vamos a poner una condición en donde el
resto de dos es igual a cer es decir es un número par vamos a agregarle ese
número a la lista pares vamos a ejecutar y como ven me entrega una lista pares
con los números pares del 1 al 10 okay Cómo reducimos esto a una en una
comprensión de de lista primero vamos a poner una una variable que se va a
llamar pares comp es igual el el paréntesis cuadrado y acá recuerden lo
primero es lo que nosotros queremos entregar en este caso queremos entregar
el número No queremos calcularle nada al número simplemente queremos
entregarle el número para hacemos el for

Y tenemos el número en números el mismo for de acá pero si necesitamos una


condición y Aquí vamos a poner la condición al final y el resto el resto del
número es decir el resto del número dividido en dos es igual a 0 y lo guarda en
la lista Entonces como Ven aquí ponemos el número que queremos entregar
después el for y después el If el If que estaría acá abajo se ejecutamos y como
ven entrega el mismo resultado Y nuevamente hemos reducido a una línea Lía
de código estas cinco líneas Okay el tercer ejemplo vamos a convertir una una
lista de String en mayúscula como lo haríamos normalmente tendríamos la lista
de los String creamos la lista auxiliar vacía iteramos en palabra cada una de las
palabras y hacemos una pen en donde cada palabra le calculamos o la
transformamos a mayúscula por así eh Mejor dicho así que lo ejecutamos y
como Ven ahora todas las palabras están en mayúscula para hacerla una
compresión de lista ponemos la variable luego el valor que queremos entregar
que en este caso es la palabra pero en mayúscula entonces usamos palabra
punto y la iteración es la misma que acá ejecutamos y como ven nos entrega
exactamente el mismo resultado y finalmente el último ejemplo que vamos a
dar es crear un pares de tuplas a partir de dos listas por ejemplo vamos a tener
Ana Luis y Pedro y sus respectivas edades 30 25 y 40 Lu vamos a crear los
pares de tuplas que sea una variable que se Llamar pares y vamos a iterar en el
rango del tamaño de la lista nombres y para cada iteración vamos a hacer un
vamos a agregarle a pares a la a la lista pares una tupla en donde vamos a
entregarle el nombre y la edad de cada iteración ejecutamos veos cómo queda
esto y como ven me queda en cada iteración me agregó el nombre con su
respectivo edad cómo lo haríamos en la compresión de lista bueno ponemos la
variable en en este caso par bcom paréntesis cuadrado importantísimo y luego
simplemente ponemos la tupla en este caso queremos entregarle los nombres

Python LOGICA DE PROGRAMACION 56


porque iteración los nombres I y las coma Las edades y y luego le pongo la
iteración que es la misma que iría acá ejecutamos y como ven es el mismo
resultado pero mucho más óptimo y reducido a una sola línea así que eso gente
espero les haya gustado le

Python LOGICA DE PROGRAMACION 57


Python LOGICA DE PROGRAMACION 58
Python LOGICA DE PROGRAMACION 59
Guía Completa de la Biblioteca Math en Python para Principiantes

la la librería mat que me permite como ya he dicho anteriormente poder realizar


funciones un poquito más avanzadas funciones matemáticas obviamente para
eso Bueno vamos a importar la librería simplemente importar map no hay que
instalar nada así que bueno importamos má y vamos a hablar primero de las
funciones más básicas de esta librería Como por ejemplo la primera función es
la m. com que básicamente lo que nos entrega son las combinaciones
diferentes que podríamos tener de ciertos datos por ejemplo supongamos que
tenemos distintos tipos de fruta y queremos hacer combinaciones de para un
desayuno es decir No sé tenemos cuatro frutas por ejemplo manzanas
plátanos pera y durazno y queremos ver como Cuántas combinaciones
podemos hacer con la frutas sin repetir ninguna de estas combinaciones de
dos entonces para eso vamos a usar la la librería comp O sea la librería mat la
función com y acá tenemos que poner el número de frutas totales que tenemos
número de elementos totales pueden ser fruta u otro elemento Cuántos
elementos queremos obtener de esto en este caso Serían dos por ejemplo

Python LOGICA DE PROGRAMACION 60


plátano manzana duranno manzana duranno plátano etcétera Okay entonces
Queremos saber cuántas combinaciones podemos tener de esto usamos esta
función después imprimimos las combinaciones y nos va a entregar el
resultado seis Okay otra función más básica es obtener valor absoluto de un
número con el F Apps por ejemplo tenemos la diferencia de dos números que
es 25 - 85 obviamente este

va a dar un número negativo Pero si queremos tener el valor absoluto usamos


el método b pun faps y nos entrega el valor absoluto de esos números También
necesitamos si queremos calcular el factorial de un número que el factorial de
número básicamente es la multiplicación de los números hasta el número que
queremos calcular por ejemplo el factorial de 5 es la multiplicación de Los
números anteriores hasta 5co 1 * 2 * 3 * 4 * 5 entonces para eso usamos el
ma punto factorial ponemos el número al cual le queremos calcular el factorial
y tenemos que el factorial de 5 es 120 1 * 2 2 2 * 3 6 6 * 4 24 y 24 * 5 es 120
la siguiente función es el prod básicamente si tenemos una lista lo que hace la
función prod es multiplicar todos los elementos de la lista Entonces si ponemos
más punto prod nos va a multiplicar 2 * 3 que sería 6 6 * 7 42 Entonces como
ven acá nos da entrega el 42 otra cosa que podemos hacer es truncar números
por ejemplo si tenemos el 1095 y no queremos aproximar a 11 sino que
queremos truncar a 10 en este caso que sea 10 no 95 usamos la función mat
trunk y nos entrega ese resultado okay Bueno ahora vamos a ver funciones de
potencia y logaritmo Por ejemplo si queremos calcular la potencia de un
número elevado a otro número por ejemplo en este caso 2 elevado a 3 2 * 2 4
4 * 2 3 ponemos mat pun po ponemos el número base que en este caso es el
dos y el TR que sería la potencia 2 elevado a 3 y en este caso me va a imprimir
Perdón que lo tenía como macdown tengo que ponerlo como código ahí sí me
va a imprimir el8 perfecto y quiero calcular la la raíz cuadrada o la raíz cúbica
para calcular la raíz cuadrada usamos el sqr entonces la raíz cuadrada por
ejemplo de 16 que es 4 la calculamos como mat sqrt le ponemos el número al
cual le queremos calcular la raíz cuadrada y nos entregaría 4 y para la raíz
cúbica por ejemplo la raíz cúbica de 27 que es 3 3 * 3 9 9 * 3 27 usamos el
mat cbrt y nos entrega la raíz cúbica que en este caso es 3 Si queremos
calcular un logaritmo por ejemplo de cualquier base por ejemplo acá el
logaritmo de logaritmo de 10 cuánto tengo que Elevar a 10 para llegar a 100 en
este caso sería 10 elevado a 2 me da 100 Okay entonces este sería el logaritmo
de 10 entonces este el logaritmo de 100 en base 10 nos entrega el resultado
dos Okay ahora vamos a hablar de funciones trigonométricas la primera es
para calcular el coseno el seno y la tangente de un ángulo Okay entonces por

Python LOGICA DE PROGRAMACION 61


ejemplo imaginemos tenemos un ángulo de 45 gr para transformar este ángulo
en radianes simplemente usamos el má punto radians y le ponemos el ángulo e
y queremos transformar a radianes para calcular el coseno tenemos que
entregar el m. Cos y el ángulo tiene que estar en radianes por eso es
importante la primero la transformación de ángulos normales a radianes lo
mismo que el seno usamos la función sin y para la tangente la función tan Okay
en este caso vamos a imprimir el ángulo como ven el ángulo en radian el
ángulo 45 078 el coseno de 45 Es 071 casi el seno de 45 es 071 también
recordar el coseno y el seno de el ángulo 45 es mismo y la tangente de 45 es
un así que me lo imprime casi uno bueno que tienda infinito que esto es
básicamente uno okay

Por ejemplo para calcular la hipotenusa de un de un triángulo por ejemplo


tenemos un triángulo con Los catetos TR y cuat y queremos calcular si
hipotenusa simplemente usamos el mat punto ipot y ponemos los valores de
los catetos Y en este caso me va a entregar el valor 5 que es el valor de la
hipotenusa de 3 y 4 okay Si queremos cambiar entre grados normales a grado
de radianes tenemos que usar las funciones degree y ma. radians okay Para
eso primero Bueno les voy a enseñar que también usando el matep podemos
obtener el número pi que es 3,14 15 9 12 etcétera entonces por ejemplo si
tenemos un ángulo en radianes que es má punto pi es decir que son 180 gr eh
recordar que que pi representa un ángulo en radianes que es el equivalente en
grados a 180 gr Okay entonces vamos a imaginar que tenemos el ángulo 180 o
Pi y queremos vamos a transformarlos a grados en este caso hacemos más
punto degre le entregamos el ángulo en radianes que en este caso es pi y
vamos a imprimir cuántos grados son los radianes que le estamos entregando
en este caso 3,14 15 180 gr por otro lado para hacer la el cálculo inverso es
decir pasar de 180 gr a a grados radianes a radianes simplemente ponemos los
grados creamos una función o una variable más bien que se llame radianes y
ponemos en mat pun radians y le entregamos los grados que en este caso Son
180 y me va a transformar los grados normales a radianes que en este caso 180
gr son 3,14 15 92 etcétera radianes
Así que eso Bueno hay muchas más funciones eh le creo que explicarle
haberles explicado las principales si quieren saber algo en particular o saber de
alguna librería en particular dejenlo en los comentarios quiero aprovechar el
momento para saludar a los miembros de pago de patreon y con soporte me
ayudan mucho para Seguir generando este tipo de videos Así que muchas
gracias y si tú quieres transformarte en miembro también te invito hacerlo y
con eso me estás ayudando mucho y también agradecer Los Super Thanks O

Python LOGICA DE PROGRAMACION 62


super gracias que me han dejado aquí en YouTube también Muchas gracias por
su aporte también agradecer al miembro del Canal Alberto Díaz Muchísimas
gracias por la confianza y el apoyo también agradecer a Ernesto y Raúl por los
cafecitos que me dieron en coffee Así que muchas gracias t

Python LOGICA DE PROGRAMACION 63


Python LOGICA DE PROGRAMACION 64
Python LOGICA DE PROGRAMACION 65
Python LOGICA DE PROGRAMACION 66
Python LOGICA DE PROGRAMACION 67
Python LOGICA DE PROGRAMACION 68
Python LOGICA DE PROGRAMACION 69
Python LOGICA DE PROGRAMACION 70
la programación modular de forma muy resumida es una forma o técnica de
programar que consiste en Sencillamente realizar divisiones de un programa
grande en diversos módulos o subprogramas en python cuando hablamos de
módulo nos referimos a un archivo de código fuente frecuentemente el tipo de
código fuente va a ser de tipo python con la extensión pun pi pero encontrar
otros tipos de módulos centrémonos primero en los módulos propios de código
python para crear un módulo de este tipo simplemente crea un archivo de texto
con la extensión punto pi como es test. pi y escribe el código que quieras
incluir en este módulo después mediante las importaciones podrás enlazar
todos los módulos de tus programas al enlazar o importar un módulo recibes
acceso a su código como si lo tuvieras escrito en la misma hoja de código esa
es una gran ventaja para no tenerlo todo el código en miles de líneas en un solo
archivo en python tenemos principalmente tres tipos de módulos los escritos
en lenguaje python los que he descrito ahora los integrados en el propio
lenguaje python y los que contienen código de otros lenguajes de
programación que no son python o no son enteramente código python los
módulos propios y de terceros e escritos en código python son los que
escribimos por nuestra cuenta o lo hacen terceras personas están escritos
directamente en código python cualquiera que sepa programar en python
puede escribir uno también tenemos módulos que vienen integrados en python
los conocidos

Como Wild in moduls uno de ellos lo hemos visto en varias ocasiones el


módulo B teins que nos permite usar elementos directamente en el código sin
importar nada un ejemplo de ello es la función len como puedes ver se puede
llamar a la función len que no existe directamente en este archivo pero sí que
está importada por uno de esos módulos integrados Así que no tenemos que
hacer una importación explícita Por aquí si necesitas crear módulos con un
rendimiento superior puedes utilizar un lenguaje de programación más cercano
al Hardware por ponerte un ejemplo de una biblioteca muy conocida te voy a
hablar de npai npai es una biblioteca para utilizar con python que cuenta con
elementos especiales como son los arr en cierto modo son parecidos a las
listas de python pero ofrecen un gran rendimiento en comparación son objetos
de otro tipo no son objetos de tipo list ni se parecen realmente de manera
técnica profundizando en el código Entonces si necesitamos procesar una gran
cantidad de datos u otras tareas que requieran de un mayor rendimiento
podemos optar por utilizar módulos de este tipo que estén escritos en
lenguajes de programación más rápidos con esto no digo que python tenga un
mal rendimiento pero sí que es cierto que con lenguajes de programación como

Python LOGICA DE PROGRAMACION 71


c o c+ Plus podemos obtener un mejor rendimiento por eso ofrece un mayor
rendimiento frente a ciertos elementos como son las listas de python con la
programación modular facilitamos la comprensión del código el mantenimiento
la sencillez los temas de ámbito la depuración la reutilización del código
etcétera

te imaginas tener todo el código de python y sus módulos integrados en un


solo archivo traería muchos problemas y sería poco eficiente por no decir del
tema del espacio de nombres o namespace del cual hablaremos pronto los
módulos de un programa complejo podrán ser probados de manera individual
si ocurre un fallo en uno de ellos solo Tendremos que solucionarlo en dicho
módulo y no tiene por qué dejar de funcionar todo el programa Solo esa parte
por ejemplo tenemos un programa completo que gestiona tareas se van
guardando las tareas pendientes las tareas completadas y ese tipo de cosas
entonces supongamos que tenemos cada una de las tareas que hace este
gestor de tareas en un módulo tenemos un módulo que sirve para eliminar
tareas tenemos otro módulo que sirve para la lógica de crear nuevas tareas y
así con tantas otras cosas que podríamos añadirle a este gestor
Pues supongamos que el módulo de eliminar tareas tiene un fallo entonces
utilizamos el programa Todo funciona bien y cuando intentamos eliminar una
tarea ocurre un error pues ya sabemos como tenemos el código aislado Dónde
tenemos que ir a depurar el código o repararlo vamos al módulo de eliminación
y buscamos solo ahí el fallo después puede ser si este módulo es dependiente
que el fallo provenga de Más allá de otro módulo y ahí empezaríamos a buscar
en ese otro módulo pero si este programa ahora lo planteamos todo en un solo

Python LOGICA DE PROGRAMACION 72


archivo aparte que sería muy pesado ese archivo seguramente si la parte del
minar tareas tiene ese fallo todo Deja de funcionar en el otro planteamiento por
el momento funcionarían los otros módulos podríamos agregar tareas
podríamos modificarlas podríamos marcarlas como completadas etcétera al
empezar a utilizar módulos entramos en el tema de las dependencias mediante
un programa que está estructurado de forma modular

Tenemos que tener en cuenta que se crea cierta dependencia entre unos y
otros elementos dependerá al final de qué forma esté hecho el programa Por
ejemplo si tenemos una calculadora que está formado por un módulo para la
lógica y otro para la interfaz gráfica ambos módulos son dependientes ya que
uno no va a funcionar sin el otro puede ser que la interfaz gráfica funcione
perfectamente ejecute veamos ahí la calculadora con sus botones y que
ciertas operaciones nos funcionen pero luego al hacer por ejemplo una
multiplicación Pues nos de un fallo ahí ya sabemos que tenemos que ir al
módulo donde está la lógica y Buscar la función que hace esta multiplicación
con eso Mira qué rápido podemos solucionar los problemas y esto siempre a
nivel pequeño con Los pequeños programas de ejemplo que os voy mostrando
de momento muy sencillitos hay que ir progresando poco a poco pues son muy
fáciles de ver todos los fallos pero ya veréis que en programas complejos os va
a costar mucho más encontrar ciertos problemas cuando tengáis módulos
funciones decoradoras bucles anidados y elementos que vayan añadiendo
complejidad al código pues verás la importancia que tiene la programación
modular para ir dividiendo todo en partes con sentido común pues lo dicho que
quede claro que el que haya dependencia entre dos módulos no quiere decir
que todo el programa tenga por qué dejar de funcionar habrá casos que sí que
todo deje de funcionar Según como hayas estructurado estos módulos pero en
principio no debería provocar un fallo completo del programa el manejo de
excepciones nos puede venir muy bien para ir indicando al usuario cuando se
cometen fallos sin que el programa deje de funcionar en lugar de sacar algo
como un type error o algo así que le muestre al usuario un mensaje diciéndole
este tipo de dato no es correcto utiliza esto en su lugar le da una pequeña
orientación o si no si es posible hacerlo de fondo con código solucionarle
automáticamente el problema dar una salida alternativa al programa y con las

aserciones podríamos hacer también cierto tipo de acciones para poder


depurar el código donde posiblemente falle pero no nos adelantemos
Porque estos son temas para ver más adelante los veremos en este curso
así que no te quedarás sin saberlo también tienes que tener en cuenta
parte de la dependencia entre módulos o funciones y métodos variables y

Python LOGICA DE PROGRAMACION 73


demás elementos la dependencia de datos que se produce cuando un
módulo necesita acceder a datos externos para realizar su tarea un módulo
o un programa al final podemos

enfocarlo en las dos partes por ejemplo un módulo que lleve una
autenticación de usuarios un login necesitará una base de datos para
funcionar en ese caso se genera una dependencia de datos en estos casos
podríamos brindar caminos alternativos para posibles escen de fallos por
ejemplo tener más de un servidor con respaldo de datos podríamos tener
una base de datos primaria y una réplica una base de datos secundaria a
Esta técnica se le conoce como replicación de datos Y es una excelente
solución ante muchas adversidades con

los datos ya que al igual que tienes que tener una copia de seguridad de
todos tus datos importantes por si falla tu soporte de datos Pues lo mismo
tienes que tener con las bases de datos un buen ejemplo de modularidad
en la vida cotidiana son los smartphones fabricados con módulos un
Smartphone fabricado de esta forma si se estropea algo como el módulo de
carga lo reemplazamos por otro de una forma muy fácil y económica
normalmente no se repara por el bajo coste de este yo he llegado a reparar
el módulo de carga de mi Smartphone por

unos 5 aproximadamente comprando la pieza no el coste de reparación


entonces Claro en este caso no vale la pena reparar esto lo cambias y
subsanar el problema pero qué ocurre con los smartphones que llevan todo
o casi todo integrado de forma única en la placa base por muy barata que
pueda ser la parte a reemplazar Ya hay que desoldar esa parte y soldar una
nueva ya que cambiar la placa entera no sería rentable en python ocurre
igual supón que hacemos un videojuego y vemos que los vehículos que se
generan están teniendo problemas si

tenemos todo el código en un mismo sitio nos costará mucho encontrar el


problema entre miles y miles de líneas de código en cambio si tenemos un
módulo o unos cuantos solo para los vehículos iremos a revisar el fallo en
dichos módulos y si hace falta quitar ese módulo de arriba a abajo y
volverlo a construir porque esté muy mal pues lo hacemos Es más fácil
verdad si tenemos todo el código mezclado ya tendríamos que buscar qué
partes vienen implicadas en el código si las tenemos sorteadas mezcladas
con otras partes y todo se puede volver más

Python LOGICA DE PROGRAMACION 74


complejo pues esta es la comparación que quería hacer por eso lo de los
smartphones los módulos nos dan la posibilidad de reutilizar el código en
diferentes programas esto ahorra mucho tiempo al no tener que reescribir
el mismo código una y otra vez es muy fácil trabajar en equipos y cada uno
trabaja con sus propios módulos también es muy sencillo reutilizar un
módulo de python tantas veces como quieras ya que simplemente tendrás
que indicar una ort ación en tantos programas como lo necesites por
ejemplo podrías crear un

módulo que sirva para leer archivos PDF en un programa cada vez que
necesites Añadir esta funcionalidad a cualquiera de tus programas lo
podrás hacer con una simple importación haces el módulo una vez y ya lo
tienes tienes ahí una pieza fabricada y Lista Para ser reutilizada allá donde
la necesites habrá módulos que serán muy específicos para cierto
programa y no te van a servir pero habrá otros generales como este que te
he dicho que te pueden servir para diferentes programas que al final
necesiten esa función podrías estar

haciendo por ejemplo un sitio web y una aplicación pues ahí podrías utilizar
ese módulo en ambas aplicaciones los módulos dividen el código en partes
más pequeñas lo que hace que sea más fácil y rápido entender Cómo
funciona el programa esto al final Es lógico si tenemos divisiones más
pequeñas de un problema es más fácil de ver cada una de las partes del
problema si no Fíjate en la resolución de ecuaciones matemáticas que te
ocupan una página por delante y otra por detrás sino más pues este tipo de
ecuaciones se

suelen ir resolviendo parte por parte se van simplificando partes para


poder simplificar el problema Pues con los módulos igual los módulos bien
hechos se dedican a cierta tarea específica Esto hace que sea más fácil
realizar cambios en el código sin afectar aot otras partes del programa por
ejemplo tenemos una aplicación que tiene operaciones de edición de
archivos de imagen y supongamos que tiene diferentes opciones como
redimensionar duplicar mejorar calidad cambiar el tono de color etcétera
cada una de estas operaciones

Se podrían manejar desde diferentes módulos dedicados a ellas por lo


tanto si en algún momento Queremos Añadir una nueva funcionalidad al
programa o queremos mejorar una ya existente no Tendremos que tocar
nada más del programa que exactamente la parte deseada sin miedo a
romperlo todo Si en algún momento detectamos algún tipo de fallo en el

Python LOGICA DE PROGRAMACION 75


módulo de por ejemplo redimensión de imágenes Simplemente nos
dirigimos al módulo responsable y analizamos su código sobre el resto no
habrá Por qué tocar nada eso sí siempre

que hayamos implementado los módulos de una forma adecuada gracias a


los módulos podemos construir una organización excelente al poder
fraccionar todo en partes más pequeñas además el uso de módulos
también mejorará el uso de recursos del sistema al tener la posibilidad de
tener parte del Código de un software entre comillas durmiendo a la espera
de necesitar ejecutarse por último quiero que conozcáis la biblioteca
estándar de python si no la conocíais ya se trata de una colección de
módulos integrados que se incluyen

con todas las instalaciones de python los módulos predefinidos que os


había comentado al principio Define elementos como funciones variables
clases que puedes utilizar en tus propios programas tal y como he hecho
aquí con la función len que viene del módulo Wild INS este de aquí esta
página

te la dejo en la descripción si no aquí tienes el enlace por aquí puedes


poner la versión de python que estés utilizando para tener una descripción
específica para tu versión y aquí Puedes ir bajando y encontrarás un
montón de temas más

interesantes y necesarios para poder programar con python es muy


conveniente que tengáis a mano esta referencia ya que tiene cosas que
Vais a necesitar Sí o sí por ejemplo mira Tenemos aquí tipos de secuencia
los objetos list tle Range También tenemos las cadenas de caracteres le
damos a uno de estos y nos da buenas explicaciones de cosas que
necesitamos saber pero como puedes ver son explicaciones bastante
técnicas y difíciles de comprender si ahora mismo te cuesta entender estas
explicaciones no te preocupes porque con el tiempo a

medida que vayas aprendiendo llegarás y dirás Necesito saber qué hace
Case fault Pues aquí ya vendrás leerás Qué hace y simplemente utilizarás
esto en tus programas sin más que de hecho hay explicaciones que son
muy sencillas como estas pero verás que hay otras que son mucho más
complicadas sobre todo si no has oído nunca hablar de esos temas por
ejemplo Nos vamos aquí y si no sabes de qué va esto en absoluto pues
puede ser difícil de entender Espero que no os haya aburrido con tanta
repetición al final he dado bastantes vueltas sobre

Python LOGICA DE PROGRAMACION 76


los mismos conceptos de lo que es al final un módulo pero he querido
repetir de diferentes puntos de vista para que tengáis una buena base en lo
que son los módulos Y cómo funcionan en el siguiente capítulo ya
empezamos con la importación y uso de módulos donde verás cosas como
hacer una importación y Llamar a uno de sus elementos o cómo importar
solo parte de un módulo un elemento concreto o importarlo todo cosas así

el alcance conocido en inglés como scope es la zona del código en el cual


está accesible un elemento concretamente en python existen dos tipos
principales de alcance el alcance global y el alcance local no obstante

también podemos encontrar el tipo de alcance en closing encerrado y el


bild in predefinido Entonces nos encontramos ante la regla lgb se trata de
una forma de denominar a los diferentes niveles de alcances que tiene
python local scope sc global scope y scope en python los siguientes
elementos crean alcance tenemos diferentes alcances a nivel de módulo
clase a nivel de funciones ya sean Def y lambda en las comprensiones
también y en las expresiones generadoras también he de comentar que hay
alcances especiales como el de los bloes except

que contienen una referencia a la excepción generada por una declaración


try en este capítulo no hablaremos sobre las excep lo haremos en la tercera
parte del curso con el fin de entender correctamente lo que es el alcance
primero debes conocer lo que son los name spaces conocidos en español
como espacios de nombres los espacios de nombres son contenedores o
colecciones de identificadores únicos que permiten organizar el código en
áreas evitando así conflictos de nombres los espacios de nombres son
como separadores

tendríamos una caja con diferentes separadores o compartimentos y ahí


podríamos ir organizando diferentes tipos de cosas con el fin de que no se
mezclas todo son temas importantes de organización en python los
espacios de nombres están almacenados en diccionarios lo que quiere
decir que podemos manejarlos también cada módulo tiene sus propios
diccionarios de espacios de nombres a continuación vamos a ver Cómo
acceder a cada tipo de espacio de nombre empecemos por el alcance local
que es el alcance que tiene un elemento dentro de una función

este alcance se aplica también en modo a las clases Aunque debo detallar
que es algo diferente recuerda el encapsulamiento y los tipos de acceso a

Python LOGICA DE PROGRAMACION 77


miembros público protegido y privado con una pequeña trampa podíamos
acceder a estos elementos por lo tanto serían alcanzables y se trata de eso
si algo es alcanzable o no y desde qué punto del código podemos alcanzar
a cierto elemento o no lo podemos hacer debido al alcance local no
podemos acceder a una variable que está dentro de una función en el
siguiente ejemplo la variable

nombre está declarada dentro de la función imprimir nombre si ejecutamos


esto no tenemos ningún problema para acceder a ella pero es que estamos
accediendo desde dentro de la función el problema estará cuando
intentemos acceder a esta función desde fuera

Python LOGICA DE PROGRAMACION 78


aquí podríamos ver la indentación que ten y este sería el alcance local llega
hasta aquí la línea se termina Entonces tenemos por aquí el alcance global
a nivel de módulo pues como puedes ver aquí nombre no está definido
Aunque sí lo está pero está en otro alcance diferente son como dos
dimensiones separadas tendríamos la dimensión local Por así decirlo y la
dimensión global al ejecutarlo veremos ese name error que nos dice que no
está definido lo mismo que nos pone por aquí ahora si queremos Acceder
al diccionario del alcance local lo haremos mediante la función predefinida
de python llamada locals la podemos poner por aquí dentro del alcance
local Y por supuesto fuera también la podemos utilizar pero ahora Ponla
para hacer esta prueba aquí dentro Dentro de este ámbito

Python LOGICA DE PROGRAMACION 79


Este es el diccionario local de esa

función tenemos pares de clave y valor las claves en este caso son las
variables A B y C Que se representan en este diccionario como cadenas de
caracteres y luego tendríamos los valores que son los valores que
almacenan las variables

ten en cuenta que si utilizas esta función locals fuera de una función a nivel
de módulo te va a devolver el diccionario global Aunque que se llame locals
porque el diccionario global es el local a nivel de módulo el alcance global
es el alcance que tienen los elementos que se definen

fuera de cualquier función estos elementos son accesibles incluso desde


dentro de funciones y también bloques de código como los que tienen
condicionales o bucles si ejecutamos este código Qué crees que va a salir
al imprimir nombre en este punto veámoslo nos aparece programación fácil
que es la cadena que tenemos dentro bien Se ha imprimido esto

Python LOGICA DE PROGRAMACION 80


En primera instancia la variable nombre ha sido declarada fuera de la
función lo que le da un alcance global con ello es posible reasignar la
dentro de la función al menos esto parece ser lo que está ocurriendo al
hacer esto estamos realizando una mala práctica No hay fallos pero
estamos liando el código de manera innecesaria para que comprendas el
porqué de lo que estoy diciendo es necesario que habilites o instales la
extensión p lint si no salen estos avisos en inglés al habilitar la extensión
reiniciar visual Studio code en principio no haría falta pero los mensajes
que aparecen en español con error lens Por aquí son los de p Lance los de
p lint no se traducen al menos de momento yo normalmente esta extensión
la tengo deshabilitada porque como puedes ver saca muchas
informaciones que están muy bien pero seguramente os dificultarían más
entender el código con tantos avisos lo que nos interesa para que
comprendas lo que estaba diciendo es esto el Warning este que tenemos
por aquí concretamente nos está indicando lo siguiente redefinición del
nombre nombre el nombre de la variable desde el ámbito exterior la
advertencia concretamente nos dice que tenemos la declaración en la línea
un y que se está redefiniendo en la línea 4 la advertencia nos indica
entonces que estamos redlar no estamos sustituyendo el valor de la misma
variable estamos haciendo una nueva declaración con un nombre idéntico
al de un ámbito exterior el global quiere decir entonces que tenemos una

Python LOGICA DE PROGRAMACION 81


variable nombre en la línea 4 y otra variable en la línea uno que se llama
igual son dos variables diferentes en ningún momento se está haciendo una
reasignación aquí son redeclared definiciones y por eso es una mala
práctica porque ahora tenemos en un mismo código y bastante corto
además dos variables que se llaman igual y es muy

fácil cometer errores con esto ya que dependiendo desde dónde la


llamemos va a utilizarse una variable nombre u otra aquí podríamos poner
para que quede claro variable local y por aquí variable global bien y ahora
vamos a Deshabilitar pint si te molesta todo esto si no Déjalo para tener el
código más limpio vale

Y esto lo pondría por aquí no en el print bien tendríamos ahí local y global
perfecto ahora si hago esto qué ocurrirá cuál se va a imprimir aquí y cuál se
va a imprimir aquí será programación fácil en ambas una tendrá pcm y otra
programación fácil qué será hagan sus apuestas tenemos primero
programación fácil y después PC Master entonces aquí Se imprime el valor
local la variable local más bien y aquí se está imprimiendo la variable global
lo que demuestra que son dos variables diferentes Pues aquí Podrías poner
esto por el print y así sabes lo que se va a imprimir por si quieres dejar
unos apuntes

Python LOGICA DE PROGRAMACION 82


para poder ver el diccionario global Solo tienes que utilizar la fun infida de
python denominada globals sobre el propio módulo aquí mismo estamos en
el alcance a nivel de módulo estamos en un alcance global aquí tenemos
otro diccionario con sus claves y valores cada clave contiene un nombre
del espacio de nombres con su respectivo valor cada nombre siempre tiene
un valor asociado nunca está vacío por ejemplo esto de aquí no tiene un
asociado pero vemos Que sí que lleva algo un noun que al final Aunque

Python LOGICA DE PROGRAMACION 83


represente la ausencia de valor sigue siendo un valor y aquí también
tenemos noun y luego tenemos cosas que tienen valores aparte de noun y
aquí tenemos algo que se ve mucho en python un condicional que se suele
poner que es If name igual a Main Pues por aquí hay una pista de Eso lo
veremos en su momento si quieres Acceder al diccionario de un módulo lo
puedes hacer mediante su nombre y accediendo a la variable especial
llamada dict pondríamos la importación de un módulo cualquiera llamamos
a Random y hacemos referencia a la variable especial dict para imprimir su
diccionario de espacio de nombres la salida en la consola es enorme
porque tenemos muchos nombres

la función predefinida Bars esta que estoy utilizando por aquí devuelve el
atributo dict para un módulo clase instancia o cualquier otro objeto con un
atributo que tenga dict esa variable especial entonces podemos hacer esto
estoy imprimiendo estos tres diccionarios el primero imprime el diccionario
de la propia clase lo estamos haciendo por aquí estoy llamando
directamente a la clase con Bars con esa función ves tenemos esa función
predefinida que lo que quiere es un objeto un atributo con un objeto Pues
yo le paso una clase que es un objeto en Sí también o un objeto instanciado
de esa clase Pues en el caso que sea mientras tengan ese atributo dict con
los dos guiones bajos el que acabas de ver este pues convars lo podemos
devolver así fácilmente sería como una llamada para ver las variables del
objeto y te las pone en un diccionario con sus claves y valores puedes
hacerlo con esta función o bien puedes acceder a la variable dict de cada
elemento mediante la sintaxis mostrada en el ejemplo anterior con los
módulos

Python LOGICA DE PROGRAMACION 84


Python LOGICA DE PROGRAMACION 85
por ejemplo de usuario do pues pondríamos nombre del objeto punto

dict simplemente Bars nos facilita acceder directamente a esto y quizás


hacerlo de una manera más legible la posibilidad de acceder a estos
diccionarios te da una visión de todo el espacio de nombres que envuelve
el elemento por lo tanto para depurar Añadir mejoras o ver simplemente un
resumen de lo que hay nos viene genial

Python LOGICA DE PROGRAMACION 86


el alcance encerrado es un tipo de alcance que permite que una función
anidada función hija como esta de aquí que como puedes ver está
declarada dentro de esta propia función acceda a las variables de la
función que la contiene función padre que sería esta Pues en este caso
puedo imprimir el valor de a y b a está declarado fuera de esta función sin
embargo puedo acceder

Python LOGICA DE PROGRAMACION 87


la palabra reservada Non local se utiliza para trabajar con variables dentro
de funciones anidadas donde la variable no debe pertenecer a la función
interna en este código tengo dos variables diferentes llamadas a son dos
variables por el hecho de encontrarse en alcances distintos si lo
imprimimos podremos comprobarlo aquí me aparece ese 10 hacemos esa
redefinición imprimimos el valor 100 con a y aquí estamos imprimiendo de
la propia función externa que sigue manteniéndose 10 por lo tanto son dos
variables diferentes pero con la palabra reservada Non local puedo
especificar que no se cree una variable local sino que se utilice la de un
ámbito superior vendríamos aquí a la función interna y pondríamos Non
local a el nombre de la variable así le estamos diciendo que no se cree una
variable local Dentro de este ámbito encerrado sino que se utilice la del
ámbito superior esta vez tenemos ahí esa reasignación no redclara primero
a tiene el valor 10 le decimos no me crees una variable local aquí de a Pues
aquí al utilizar a estamos como hemos indicado aquí utilizando esa variable
de fuera por Por tanto se reasigna muy importante que tengáis Clara la
diferencia entre reasignación Y redlara si alguien le queda duda con esto
que me lo diga en los comentarios

Python LOGICA DE PROGRAMACION 88


Python LOGICA DE PROGRAMACION 89
si utilizamos Non local para un nombre de variable que no existe en la
función principal recibiremos un error por falta de enlace por ejemplo le
digo Non local b b no existe en la función principal Entonces me dice no se
ha encontrado ningún enlace para B no local y ahí nos daría un error de
sintaxis no se encontró enlace para el nombre no local B por lo tanto solo
podemos hacer esto con referencias existentes con a No tendríamos
ningún problema podríamos definir el alcance encerrado como un alcance
local dentro de otro alcance local entonces para ver el diccionario
encerrado Solo tienes que acceder a su diccionario local con la función
locals como estoy haciendo en esta línea y aquí tendríamos el alcance

Python LOGICA DE PROGRAMACION 90


local de esta función local encerrado y local simplemente el alcance local el de
aquí es este tenemos ahí su dicción una variable llamada a y luego en el
alcance encerrado tenemos otra variable a con un valor de 100

Python LOGICA DE PROGRAMACION 91


el espacio de nombres While tein o predefinido contiene los elementos
integrados del lenguaje estos están por encima incluso del ámbito global
este espacio de nombres tiene un conjunto de nombres predefinidos que
están disponibles en cualquier programa python sin la necesidad de
importar ningún módulo ni tener referencias explícitas en el propio módulo
para Acceder al diccionario de este espacio de nombres podemos hacerlo
así para que no creas que me lo estoy inventando siempre me gusta darte
pruebas de lo que digo Y además que puedas verlo de una forma tangible
tenemos que utilizar el nombre Wild INS así con los dos guiones bajos
delante y detrás como todos estos elementos especiales de python y
accedemos a su diccionario con y aquí tendríamos la salida de este
diccionario

Python LOGICA DE PROGRAMACION 92


bien es información que no te sirve ahora mismo pero es para que

veas cómo puedes ir accediendo a los diferentes name space otra forma
más sencilla es con Bars de la misma forma que te he indicado antes

el alcance de bloque es un tipo de alcance que no se implementa en


python y que no existe de la forma tradicional con la que se conoce a este
alcance de bloque este alcance se da en muchos lenguajes de
programación en los elementos que llevan llaves de bloque este tipo de
elementos por ejemplo un If que se declara con ese bloque de código y
aquí escribiríamos el código pues este elemento no está en python se
utiliza para por ejemplo los diccionarios pero para bloques de código no en
el alcance de bloque a nivel de programación general las variables solo
están disponibles dentro de los bloques donde se declaran incluido
cualquier otro bloque anidado dentro de ese bloque Entonces por todo lo
comentado anteriormente ya sabes que los alcances en python funcionan
de forma diferente tendríamos ese alcance local o el alcance encerrado un
ejemplo de lenguaje con alcance de bloque es javascript en python el
bloque de código de un condicional es global Si queremos imprimir la
variable nombre que está declarada dentro de este bloque del If podemos
acceder perfectamente no tenemos ese alcance de bloque sino que esto
estaría en el ámbito global por si no sabes lo que es stave through Aparte
ya del tema Te comento que es simplemente un valor booleano true
verdadero para hacer que la expresión se cumpla siempre es decir este
bloque de lif se va ejecutar Sí o sí porque tiene un valor verdadero en lugar
de tener una expresión que al final genere un valor verdadero o falso

le pongo directamente c true sería como el While true pero aplicado para
unir

Python LOGICA DE PROGRAMACION 93


y en javascript vamos a hacer una prueba rápida ya que se va del tema
pero bueno para que veáis ese alcance de bloque ponemos este If que se
va a ejecutar siempre con este true y por aquí tenemos el bloque con las
llaves entonces en esta línea intentamos imprimir en la consola el valor que
tiene la variable nombre que es una variable con alcance de bloque y aquí
me da un error de referencia que sería el típico name error de python el
nombre no está definido en la línea 5 aquí mismo caráter 13 no es
alcanzable pero en python sí el mismo código en python es alcanzable
porque no existe este alcance de bloque este alcance de bloque se hizo
posible las variables gracias a Añadir enpt 6 si no recuerdo mal en 201 esta
palabra de aquí led con led la variable tiene un alcance de bloque sin
embargo con la declaración antigua que todavía se utiliza con bar
tendríamos un alcance global por lo tanto ya puedes ver aquí que sí que se
puede acceder desde fuera con esto evitamos el alcance de bloque y con
lo otro lo creamos más bien es un parche que se añadió a javascript scp
sobre la marcha Por así decirlo para implementar este alcance

Python LOGICA DE PROGRAMACION 94


gracias a la palabra reservada global podemos hacer que una variable
global sea utilizable dentro de un ámbito local Este es el ejemplo que has
visto al principio del capítulo ahí tendríamos la variable global y la variable
local Aquí se están utilizando dos variables y no puedo reasignar la variable
global dentro de la función entonces mediante el uso de global conseguirás
que se utilice la misma variable global dentro de la función tenemos que
decir que queremos utilizar la variable nombre del ámbito global es decir
que no me cree aquí dentro una variable local con el mismo nombre en este
caso

Python LOGICA DE PROGRAMACION 95


Si imprimimos vemos que se hace esa reasignación declaramos aquí con PC
Master le decimos utiliza la variable global nombre vale pues aquí entramos ya
nombre con ese dato y tenemos nombre que es esta misma variable en este
caso y se reasigna

además con global puedes especificar que una variable local Se convierta
en global con el fin de poder acceder a ella Desde fuera en la línea dos le
digo Haz global la variable a aquí Declaro la variable a con un valor de 10 y
fuera en el ámbito global vemos que puedo acceder a ella sin ningún
problema si quitamos este global nos aparece un name error no podemos
acceder y aquí tenemos que tener en cuenta una cosa puesto que está

Python LOGICA DE PROGRAMACION 96


dentro de una función para que se ejecute su código y esta variable se
haga global y exista en el ámbito global necesitamos

Llamar ejecutar el código de la función si no lo hacemos por muchos


esfuerzos que hagamos no está definida la variable a en este punto en
cierto modo es como el comportamiento de le bar de javascript esto mismo
llevado al terreno de python podemos decir que hacemos una adaptación la
variable sin global sin utilizar Esto será local por lo tanto equivaldría en esta
comparación a una variable con led En javascript y la variable con glob
utilizando Esto será global por lo tanto equivaldría en esa comparación a
una variable con bar en javascript de esta manera emular yamos su
comportamiento si es que al final en python se puede emular
Prácticamente todo algunas cosas llevan más complicación que otras pero
tenemos muchas posibilidades

Python LOGICA DE PROGRAMACION 97


Python LOGICA DE PROGRAMACION 98
para el siguiente ejemplo vamos a habilitar pint de nuevo para que veas
este Warning de por aquí que es importante nos dice using the global
statement que significa utilizando la declaración global esta misma de aquí
nos indica que estamos utilizando esta palabra cuando tengas avisos de las
extensiones como este que no sabes exactamente A qué se refieren y
quieres aprender más te conviene acceder a los enlaces que proporcionan
más detalles puedes venir por esta parte de aquí y si te fijas por aquí tienes
enlaces en cada uno de los avisos en este caso nos interesa esta
advertencia hacemos clic aquí y accederemos a ese enlace que puedes ver
aquí nos avisará de que estamos abriendo

un sitio web externo Así que tener cuidado con qué extensiones utilizáis
esta al menos sería bastante fiable es de Microsoft así Que supongo que
podemos

fiarnos le daríamos ahí abrir y nos aparecería esta información por aquí
Tenemos un montón de mensajes que podemos ir a Endo de pint Pero
bueno los podemos ir accediendo de esta forma a medida que van
ocurriendo cosas y así tenéis algún ejemplo práctico las descripciones son
bastante técnicas y difíciles de entender para quien está empezando Pero
bueno si nos detenemos con calma vamos analizando normalmente lo

Python LOGICA DE PROGRAMACION 99


entenderemos Pues el error era de pint El w63 que es esta página de aquí y
el mensaje emitido es utilizando la

declaración global aquí nos da una descripción del problema que


Sencillamente ocurre cuando se utiliza esta palabra para actualizar una
variable global y pint desaconseja su uso Eso no significa que no puedas
utilizarlo y aquí nos expone un código problemático un ejemplo y luego nos
indica un código igual pero de la forma correcta que ellos recomiendan Así
que para ganar en buenas prácticas nos puede venir muy bien ir
estudiando comp pilint vamos a cargar este código sigue teniendo este
aviso porque está utilizando global y si lo

ejecutamos tenemos 10 10 como puedes ver en el momento de realizar la


llamada en este punto de aquí se reasigna el valor de la variable Pero qué
pasa si no llamamos a la función que no se reasigna con esto estamos
generando un código propenso a arrojar resultados incorrectos o
inesperados probemos la forma en la que nos sugieren hacer esto copiaría
ya sé que cuesta un poquito de ver con tantos avisos pero es solo un
momento ahora desactivamos p aquí el Warning ha desaparecido puesto
que ya no lo estamos Estos son avisos de cosas que podríamos

Añadir pero ahora mismo no le vamos a hacer caso si ejecutamos esto nos
aparece 1 y 10 el primer código el problemático modifica una variable
Global en este caso no se modifica la variable global directamente dentro
de la función sino que esta devuelve el nuevo valor que luego se asigna
manualmente se trata de una práctica más recomendable evita posibles
problemas de depuración y consecuencias inesperadas esto por supuesto
no quiere decir que no tengas que utilizar global dependiendo de cómo
esté escrito el código y las

necesidades que tengas puedes ser que sea oportuno utilizarla por eso te
dicen en pint que no te están diciendo que no la utilices pero que te
desaconsejan su uso esto tómalo como quieras o no lo utilices nunca o
utilizalo lo irás viendo con la experiencia ya que la decisión de usar global
debe tomarse caso por caso teniendo en cuenta las ventajas y desventajas
por si no estáis entendiendo lo que se está haciendo aquí exactamente
Simplemente estoy llamando a esta función y obteniendo ese valor con el
return el valor que necesitaba global

para después poder acceder desde fuera pues aquí simplemente lo guardo
en esta variable y ya puedo utilizarlo pero no dependemos De ninguna

Python LOGICA DE PROGRAMACION 100


variable interna por un lado Tenemos aquí esta variable empieza con un
valor uno Pues dentro de la función podemos acceder a esta variable
porque es global pero en este código queremos que la variable bar que hay
dentro no sea local sino que sea esta misma entonces reasigna valor 10 a la
variable lo que Se imprime aquí es un 10 pero esto Solo ocurre esto mismo
si se llama la función y en este caso si se

llama la función aquí Se imprime con esta variable que es la misma que se
utiliza aquí por global el valor 10 pero si no se llama Se imprime el valor un
Y eso es lo que genera posibles fallos ya que si llamamos o nol ocurren dos
cosas diferentes y aquí el código correcto evita tener esa dependencia de
la llamada la función es un tema más avanzado Así que si no lo entiendes
del todo No te preocupes llegado el momento ya verás cómo se utiliza con
más ejemplos prácticos pues tendríamos ahí en este código esa variable
global bien es accesible desde

dentro de la función Perfecto aquí no declaramos nada por lo tanto no se


crea otra variable sino que utilizamos esta misma Pues aquí Se imprime un
un y aquí decimos que se devuelva un valor 10 o el valor que queramos el
valor que queremos devolver fuera y en esta variable almacenamos ese
valor de retorno haciendo la llamada Por lo tanto queda por aquí un 10 y
finalmente podemos imprimir esto sin utilizar la palabra global

la función predefinida dir nos devuelve una lista de nombres ordenados


alfabéticamente estos nombres son todos

los que hay en el espacio de nombres donde se ejecuta esta función ya has
visto anteriormente bastante sobre el funcionamiento de dir no obstante no
podía faltar en este capítulo de espacios de nombres y alcances ya que la
vamos a utilizar Aquí tienes un ejemplo importamos del módulo maz acos el
elemento acos e imprimimos ese dir primero aparecen los elementos
integrados de python y luego aparece esto los nombres de los elementos
integrados aparecen primero porque el guion bajo alfabéticamente está
antes que las letras

Python LOGICA DE PROGRAMACION 101


si quieres hacer lo mismo

pero a nivel de función Hazlo de la siguiente forma aquí nos sale el listado
de elementos de la función le añadimos otro más y aparecerá

ya os avisé que este capítulo venía muy cargado podemos establecer


condiciones en base a los nombres de los espacios por ejemplo en este If
digo que si math está en el espacio de nombres que lo he almacenado en
una lista con dir aquí entonces que me diga que sí que está y si no que no
está Y en este caso es un print pero podríamos poner cualquier

Python LOGICA DE PROGRAMACION 102


cosa que si está el módulo importado pues entonces que utilice una de sus
funciones y si no está importado pues hacemos otras cosas

puesto que ma está en el espacio de nombres se ejecuta If si no está


importado se ejecuta el els así de simple
i imprimimos espacio de nombres Supongo que os ha quedado Claro pero
bueno para que lo veáis vemos que maz está ahí pues como esto es una lista
podemos acceder y utilizar sus elementos para hacer condiciones

Python LOGICA DE PROGRAMACION 103


Python LOGICA DE PROGRAMACION 104
y este operador de aquí dice que si está en la lista en el elemento

espacio nombres va a ir buscando elemento tras elemento la lista hasta


encontrar o no maz

Paquetes

los paquetes de python Y cómo funcionan cuando creemos aplicaciones


relativamente grandes es normal llegar a tener muchos módulos muchos de
ellos estarán relacionados Entonces estos módulos relacionados pueden
formar parte de paquetes con el fin de crear agrupaciones de módulos los
paquetes en python son muy fáciles de crear y permiten generar una ura
jerárquica tan solo deberás hacer

una carpeta y guardar módulos en ella empecemos creando una nos vamos
a un proyecto vacío al explorador y creamos una nueva carpeta dentro de

Python LOGICA DE PROGRAMACION 105


esta vamos a crear dos archivos o dos módulos fijaros bien que estos dos
módulos queden dentro de la carpeta a un nivel diferente de indentación si
están fuera lo veréis así a continuación vamos a crear dos funciones para
poder probar estos módulos y podemos poner un mensaje parecido aquí
simplemente cambiamos esto para saber desde qué módulo estamos

• ejecutando cada cosa muy importante los cambios cuando trabajéis con
paquetes y módulos los tenéis que ir guardando siempre ya que ahora si hago
cambios en el módulo un y no los guardo e intento acceder desde el módulo
dos a elementos pertenecientes a ese cambio pues no van a estar disponibles
hasta que no guardemos así que control S y lo tenemos siempre guardado sin
que salga ahí ese símbolo en forma de círculo si aparece así es que hay
cambios sin guardar nos vamos a ir al módulo 2s y vamos a importar el módulo

• un import módulo 1 ya Lo tendríamos Y cómo llamamos a la función


descripción del módulo un pues ponemos nombre del módulo punto nombre de
la función perfecto está funcionando correctamente ahora que está claro el
acceso entre módulos de un paquete en una carpeta vamos a hacer
importaciones externas al paquete vamos a importar los módulos del paquete
desde un módulo externo que crearemos por aquí seleccionamos el proyecto
para crear un archivo en la raíz le damos aquí a Nuevo archivo y listo
nuevamente repito Fíjate en los

niveles este archivo tiene que quedar fuera de la carpeta esta cach no le
hagas caso esto lo crea al ejecutar cualquier archivo de python si la
eliminas no perderás nada y volverá a salir después cuando vuelvas a
ejecutar mira [Música] fíjate ejecutamos esto mismo y vuelve a crearla es
una cach para acceder más rápido lo siguiente que vamos a hacer será
importar el módulo uno y el módulo dos en este módulo principal ahora
cómo lo importaría que estas importaciones funcionan como una ruta de
carpeta para acceder desde

la raíz a un archivo que está en la carpeta paquete lo haríamos así nombre


de la carpeta paquete punto nombre del archivo módulo ahí tendríamos las
importaciones hechas y para errores vente aquí a módulo dos Y borra esto
deja ambos archivos solo con su función así para llamar a la función de
módulo un lo haremos con el nombre paquete módulo 1.
• descripción es lo mismo que antes simplemente le añadimos un elemento
más a la ruta si nos funciona esta importación y podemos acceder a los

Python LOGICA DE PROGRAMACION 106


elementos de los módulos dentro de un paquete debería salir soy el módulo
1 y soy el módulo dos correcto has visto qué fácil que es trabajar con
módulos en python si en algún momento algo No te funciona revisa que
tengas los nombres del paquete y módulos escritos correctamente y que
cada archivo está en su correspondiente lugar lo siguiente que vamos a
hacer será Añadir una función más al módulo
• uno

Python LOGICA DE PROGRAMACION 107


Python LOGICA DE PROGRAMACION 108
desde el módulo principal vamos a importar solo la función suma del
módulo uno para hacer esto borramos todo esto y vamos a poner from
paquete punto módulo un import suma y con esto simplemente estamos
importando el elemento suma del módulo un que está dentro del paquete
vamos a probarlo funciona per perfectamente vamos a ver cómo utilizar un
alias con paquetes continuamos con el código anterior si no queremos
poner estas rutas tan largas podemos hacer

• esto importamos con estos nombres y aquí nos referiremos a md1 o md2 o en
su defecto el nombre que queramos ponerle también si quieres hacer esto en
la misma línea a mí personalmente me parece más confuso pero lo puedes
hacer sería esto utilizar un solo import y aquí después de la alias ponemos una
coma y ponemos la siguiente importación con otro alias o sin él y funciona
también igual Claro que si importas bastantes elementos y vas haciendo esto
coma coma coma coma al final te puede quedar un párrafo enorme

Python LOGICA DE PROGRAMACION 109


• por aquí y sería más confuso que verlo de esta forma personalmente me
queda a mí para mi gusto esto más ordenado luego cada uno que utilice las
herramientas que tiene disponibles como quiera yo solos voy dando de vez en
cuando mi opinión personal denominamos sub paquetes aquellos paquetes que
están dentro de otros paquetes Qué te parece si creamos ahora un subp en
esta estructura de aquí ponemos nueva carpeta dentro de la otra y la llamamos
por ejemplo sub paquete voy a quitar para que lo veáis bien Ahora ves Fíjate
que está dentro y aquí
• abrimos el subp aquete y creamos dos módulos más quedará así ahí puedes
apreciar las líneas para ver dónde está todo repito mucho esto porque es muy
fácil equivocarse y poner un módulo en la carpeta que no es y después estar
dando vueltas a ver qué es lo que pasa porque qué no puedes acceder a cierto
elemento porque no te está funcionando una importación etcétera y en visual

Python LOGICA DE PROGRAMACION 110


Studio code no es de los mejores programas para ver en el explorador esto hay
sinceramente estructuras más bien definidas que se ve ve más claro Dónde
está cada cosa quizás

• hay alguna extensión pero lo desconozco que pueda mejorar un poquito la


visualización de esto venimos aquí módulo dos o módulo un copiamos esto y
vamos a poner dos funciones iguales en estos módulos simplemente para
probar los accesos a los módulos aquí ponemos soy el módulo 3 y soy el
módulo 4 nos vamos hasta principal Pi y vamos a mirar de hacer la de estos
dos módulos y a llamar a sus funciones pues tenemos que poner lo siguiente
import paquete punto sub paquete tenemos una carpeta dentro de otra y
finalmente el
• módulo y aquí si queremos también le podríamos dar un alias lo mismo
hacemos con el módulo 4 para llamar al elemento ponemos paquete punto
subp punto módulo 3 punto nombre del elemento la verdad es que muy largo
aquí ya necesitaríamos un alias funciona correctamente pero ya te digo mejor
hacer esto que al final es lo mismo ponemos

Python LOGICA DE PROGRAMACION 111


• estas líneas tan largas una vez y luego ya vamos llamando con calma sin
tener que poner esas parrafadas en python se nos permite importar un paquete
entero en lugar de módulos sueltos como has visto en los ejemplos anteriores
la sintaxis de importación es esta import y nombre del paquete esto ejecuta sin
problemas sin embargo en el momento en el que intentas utilizar algo del
paquete no te va a funcionar Así que es bastante inútil vamos a ver un ejemplo
llamamos al paquete que acabamos de importar módulo un por ejemplo que
está dentro
• del paquete punto y descripción y nos aparece un error de atributo el módulo
paquete no tiene el atributo módulo 1 de esta forma no podemos acceder para

Python LOGICA DE PROGRAMACION 112


inicializar paquetes enteros podemos crear un archivo especial llamado init
punp va a ser como un módulo inicializador de paquete vendríamos a paquete
y Aquí vamos a crear un nuevo archivo dos guiones bajos init dos gu bajos
punto pi es un archivo especial que utiliza python para inicializar paquetes Por
así decirlo para decirle al intérprete estos módulos vienen en un conjunto ya
que si
• no viene a ser una carpeta sin más este archivo init punp normalmente está
vacío pero podemos incluir cosas por ejemplo este print utilizamos el atributo
especial llamado name para que nos muestre el nombre del paquete al ejecutar
el archivo principal punto pi con la importación del paquete deberíamos ver
este mensaje si la inicialización se ha hecho correctamente es decir si tenemos
acceso al paquete pues dejamos simplemente import paquete ejecutamos y se
ejecuta el código que lleva este init punp ahora vamos a

Python LOGICA DE PROGRAMACION 113


probar si efectivamente podemos o no acceder a a nivel de paquete Aquí
vamos a Añadir una función lo siguiente será intentar acceder a dicha
función lo haremos de la siguiente forma paquete pun descripción nos
aparece por aquí el print esto normal y además se llama la función ahora
podrías pensar que poniendo un punto al nombre del paquete podrás
acceder a los diferentes módulos que tiene por ejemplo paquete módulo 1
punto descripción y llamamos a su función descripción pero no seguimos
sin poder acceder a los módulos hemos accedido al

Python LOGICA DE PROGRAMACION 114


Python LOGICA DE PROGRAMACION 115
• nivel de paquete pero todavía no a sus módulos esto lo puede solucionar
tocando el archivo inicializador o bien directamente modificando la importación
pondríamos import paquete punto módulo 1 y en este caso sí que funciona
Pero puede ser que quieras hacer la importación así a nivel de paquete que es
lo que estamos tratando aquí para que luego podamos ir Llamando a cualquier
módulo del paquete no se puede la solución es sencilla importa los módulos del
paquete en el archivo inicializador el init punp así con la importación lo
podremos

Python LOGICA DE PROGRAMACION 116


• inicializar todo ponemos por aquí import paquete módulo 1 y paquete punto
módulo 2 A ver vamos a probar sin tocar nada más llamamos y ahora sí hemos
podido inicializar dos módulos perfecto otra cosa aquí si quitamos esto y
ponemos importar módulo un y módulo dos directamente puesto que estamos
en el paquete y vamos no nos funciona tenemos que poner la ruta completa Es
decir tenemos que indicar paquete punto módulo 1 y módulo dos así ves
tomando apuntes porque luego cuando creas muchas carpetas se puede
volver un

Python LOGICA DE PROGRAMACION 117


Python LOGICA DE PROGRAMACION 118
Python LOGICA DE PROGRAMACION 119
verdadero infierno si no realizas bien toda la estructura con los nombres
que toca tenemos una extensión Bueno hay varias de ellas como import
helper esta de aquí que nos puede venir bien para realizar
automáticamente importaciones vamos a hacer una prueba queremos
Llamar a este módulo a su función descripción para acceder a la función
descripción de módulo uno sería paquete módulo 1.

descripción pues escribimos directamente sin hacer importaciones paquete


tecla enter Y esa extensión nos pone el import directamente punto módulo 1
punto descripción y ya está ahora si no tenemos esto de aquí qué ocurre
que en este caso no nos salva de ello pero si tienes bien hechas las
importaciones pues te va bien lo puedes utilizar muy bien esto tiene esta
ventaja clave pero también tiene una desventaja Y es que en muchas
ocasiones puede que escribamos código llamemos a ciertos elementos y
nos va haciendo de manera automática sin

Python LOGICA DE PROGRAMACION 120


• que nos demos cuenta para nada un montón de importaciones después estas
importaciones se mezclarán con las que nosotros hemos puesto directamente
y puede ser que nos confundamos o que haya alguna importación que no esté
bien hecha por tema de paquetes y todo eso tenerlo en cuenta si la utilizáis que
os fijéis muy bien en eso ya que os pone ahí la línea directamente y no avisa si

Python LOGICA DE PROGRAMACION 121


estamos por aquí abajo y ponemos algo como esto descripción fíjate que
tenemos acceso a varias funciones descripción por aquí nos sugiere paquete
subete módulo 3

• punto descripción pues la ponemos vamos a probar de llamar a descripción


as sí funciona bien pero no nos hemos dado cuenta de toda esta importación ir
probando a ver qué os va mejor para que practiquéis al principio y sepáis hacer
estas importaciones os recomiendo que no la utilicéis mucho recomiendo que
os machaquito para iros adaptando a estas importaciones y luego la valor Main
si se ejecuta con el archivo que la contiene en cambio Si se ejecuta desde otro
archivo mostrará el nombre del módulo que la contiene vamos a

Python LOGICA DE PROGRAMACION 122


• borrar esto de aquí de momento y ejecutamos este archivo aquí me dice el
paquete llamado Main ves ha sustituido ese valor por Main en cambio si
ejecutamos esto desde otro módulo Como por ejemplo aquí me sale el paquete
llamado paquete con su nombre se reemplaza el valor de name por paquete si
aplicamos esta variable en un módulo del paquete sí que nos saldrá el nombre
del módulo por ejemplo import paquete punto módulo 1 y aquí en módulo uno
vamos a poner un print que contendrá esta variable

Python LOGICA DE PROGRAMACION 123


Python LOGICA DE PROGRAMACION 124
Python LOGICA DE PROGRAMACION 125
• especial nos vamos a principal y ejecutamos módulo paquete pun módulo 1
pero si lo ejecutamos desde aquí nos sale Main V Se puede utilizar esto tanto
para nombres de módulos como nombres de paquetes y es aquí donde entra
en juego el famoso If name ig a Main que parece un verdadero galimatías esto
de aquí en realidad es una cosa muy fácil de entender pero la mayoría se le
resiste al dar sus primeros pasos con python el Por qué se resiste es por la
falta de contexto Cuando se quiere saber para qué sirve Normalmente se
explica

esto en una fase temprana del estudio el Por qué no lo sé la verdad Pero para
que veas todo el contexto que os he dado hasta llegar aquí hasta este punto
para que entendáis muy fácil lo que es If name igual a Main que es
simplemente un nombre se compara si un nombre es igual a otro ya está
podemos utilizar esa variable name para controlar la ejecución del código por
ejemplo se puede utilizar para ejecutar código solo si el módulo se está
ejecutando desde el mismo archivo que lo contiene

Python LOGICA DE PROGRAMACION 126


borramos esto si lo has

escrito y venimos aquí dejamos el archivo init pi limpio y ponemos esto


mismo esto es un doble igual voy a Deshabilitar las ligaduras para que
nadie se confunda si queréis haré un vídeo aparte explicando cómo
funcionan las ligaduras y qué tipos tenemos un vídeo así cortito aquí es
donde las tengo habilitadas en settings bueno Esto no tenéis que tocar
nada ya os explicaré Cómo configurar el aspecto visual de visual Studio
code para los que queráis cambiarle fuente colores y todo eso a ver si
tengo tiempo de hacer un vídeo si veo que tenéis
• mucho interés por ello decímelo en los comentarios y lo haré seguro para
el que quiera tenerlo todo exactamente como lo tengo yo bien ves ahí ya
están deshabilitadas el símbolo es este aquí para la primera prueba vamos
a comentar esto y nos fijamos en este If he ejecutado desde mi propio
archivo Entonces esto ha evaluado como true porque la variable tiene el
valor exacto de main si imprimimos esto veremos exactamente Es un String

Python LOGICA DE PROGRAMACION 127


una cadena con Main porque se está ejecutando desde el mismo archivo
ahora si quitamos esto y ejecutamos

Python LOGICA DE PROGRAMACION 128


desde principal punto pi import paquete me sale solo ese print código de
paquete fuera de la zona restringida por lo tanto la zona restringida es esta
de aquí que solo se ejecuta si es desde el propio archivo todo el código que
esté fuera de este If de esta condición se va a ejecutar con normalidad
pero solo se ejecutará si la variable name en el momento de ejecutar tiene
ese valor Main si tiene cualquier otro valor No ya que aquí ejecutando este
archivo desde otro el valor de name se sustituye por el nombre del paquete
o

módulo por si alguien no le ha quedado claro a quienes os haya quedado


claro podéis saltar o podéis tomar un poquito más de contexto pero voy a
explicarlo simplemente con dos archivos con una estructura más simple
para que sea más fácil de entender entonces dejo esto aquí el paquete lo
dejamos aparte principal punto Pi y vamos a poner secundario pun pi
venimos a secundario Pi y aquí imprimimos una variable name que está
cargada en el espacio de nombres Fíjate que la tenemos ahí no es ningún
fantasma está ahí la podemos

Python LOGICA DE PROGRAMACION 129


Python LOGICA DE PROGRAMACION 130
ver ponemos ese name por aquí y ejecutamos nos sale Main Pues ahora
vamos a principal e importamos ese paquete secundario ejecutamos eut
arse llama directamente a esta función lo hemos importado y ese print está
ahí pues ejecuta y al ejecutarlo desde aquí desde otro archivo ese name
guarda en esa variable la variable name el valor llamado secundario que es
justamente el nombre del módulo también funciona con los paquetes como
has visto y es simplemente eso pues si queremos que cierto código se
ejecute concretamente desde un mismo

módulo pues lo podemos hacer Así Fíjate lo que acabamos de hacer antes
que simplemente con esto se ejecuta automáticamente al hacer la
importación el código que haya como un print o cualquier otra llamada a
funciones pues este print lo ponemos por aquí con unif Y si ejecutamos
desde aquí la variable name tiene el valor Main se ejecuta pero si hacemos
lo mismo por aquí no se ejecuta nada a no ser de que el código esté fuera
de este If todo esto que hay afuera se ejecutará con normalidad Esto sí lo
otro no Espero que con esta

Python LOGICA DE PROGRAMACION 131


Python LOGICA DE PROGRAMACION 132
Python LOGICA DE PROGRAMACION 133
• simplificación que acabo de hacer haya quedado mucho más claro que antes

Python LOGICA DE PROGRAMACION 134


pero ya os digo a lo mejor de esta forma lo habéis entendido muy fácil pero
creerme cuando no hay un buen contexto detrás es muy complicado de
entender porque hay estas variables dónde están Qué es el espacio de
nombres y todas esas cosas que os he explicado por eso Hemos tardado tanto
hemos ido tan despacio entrando una y otra vez en temas que eran al final el
mismo tema pero desde diferentes ángulos y todo eso para ir terminando
vamos a ver las importaciones

de paquetes con el asterisco con ese import all cosa que nos va a dar otra
complicación más vendremos a principal punto pi lo borramos todo y
vamos a intentar importar todo del paquete este de aquí diremos from
paquete import y el asterisco con esto se importaría todo de ese paquete
en teoría y antes de ejecutar nada vamos a limpiar esto lo dejamos vacío no
hay error vamos a intentar utilizar módulo uno que debería ya estar en el
espacio de nombres pero no funciona para este tipo de importación y todas
las anteriores

Python LOGICA DE PROGRAMACION 135


• podéis ir utilizando la función predefinida dir para ir viendo Qué hay en el
espacio de nombres vamos a comprobarlo tenemos todo esto pero no se ha
importado absolutamente nada de paquete ni siquiera el nombre paquete nos
falta poner algo en el archivo inicializador en ese init punp en ese módulo hay
que utilizar la variable especial llamada all en ella guardaremos una lista con
todos los módulos del paquete este elemento nos servirá para este tipo de
importaciones si no lo usamos pues no pasa nada pero estará ahí entonces

Python LOGICA DE PROGRAMACION 136


falta que lo hagáis guardamos cambios y probemos a ver qué pasa con
este dir estupendo se nos ha cargado módulo uno y módulo dos y todos los
que tuviese este archivo inicializador básicamente cargamos esos nombres
de los módulos en el espacio de nombres Cómo llamamos a un elemento
de los módulos importado de esta forma lo hacemos así tenemos esta pista
por aquí tenemos que llamar a módulo un o a módulo dos Si queremos la
función descripción de módulo uno pues llamamos a ese módulo bueno
Esto de aquí sale porque ya

tenemos muchas cosas por este print de aquí Así que lo borramos para
dejarlo todo más limpio y funciona correctamente tanto de módulo uno
como de módulo dos el tema de los paquetes es una cosa muy bonita en
python cuando funciona todo tan bien como lo que estamos haciendo es
una maravilla Pero créeme si no aplicas bien todos los conceptos
explicados en este capítulo vas a sufrir bastante te lo aviso con el tema de
las importaciones

Python LOGICA DE PROGRAMACION 137


Python LOGICA DE PROGRAMACION 138
Python LOGICA DE PROGRAMACION 139
Módulo Math en Python
El módulo math proporciona funciones matemáticas avanzadas en Python. Para
utilizarlo, debemos importarlo al inicio de nuestro programa:

import math

Funciones principales:
math.sqrt(x): Calcula la raíz cuadrada de x

math.pow(x, y): Calcula x elevado a la potencia y

math.floor(x): Redondea hacia abajo al entero más cercano

math.ceil(x): Redondea hacia arriba al entero más cercano

math.pi: Constante que representa el valor de π (pi)

math.e: Constante que representa el número e (Euler)

Ejemplo de uso:

import math

Python LOGICA DE PROGRAMACION 140


# Calcular la raíz cuadrada
raiz = math.sqrt(16) # resultado: 4.0

# Usar pi para calcular el área de un círculo


radio = 5
area = math.pi * math.pow(radio, 2)

# Redondear números
print(math.floor(3.7)) # resultado: 3
print(math.ceil(3.2)) # resultado: 4

El módulo math es fundamental para cálculos matemáticos precisos y es parte


de la biblioteca estándar de Python.

el módulo más de python es un módulo que viene integrado con el lenguaje


de programación python este módulo es muy

útil a la hora de hacer muchas de las típicas operaciones Matemáticas que


podamos necesitar al crear nuestros programas gracias a este módulo no
Tendremos que crear estas funcionalidades ya inventadas ni saber cómo
funcionan sus fórmulas Por ejemplo si haces una función para calcular el
área de un círculo debes conocer la fórmula y saberla aplicar al código no
obstante si la función está hecha por por otra persona Tú solo tienes que
saber utilizarla y para qué utilizarla pero no como está hecha internamente
otro ejemplo más para registrarte en un sitio web para crearte una cuenta
de usuario solo necesitas saber qué datos rellenar en el formulario Y cómo
hacerlo pero no necesitas saber en absoluto dónde se va a guardar tu
usuario Cómo se va a guardar Cómo procesa los datos del formulario
etcétera pues las importaciones de módulos se tratan mucho de eso de
poder utilizar funcionalidades de otras personas o tuyas propias sin
necesidad de estar creando constantemente cosas desde cero la
referencia de math la encontrarás en esta página te dejo el enlace en la
descripción la puedes traducir al español por aquí y selecciona la versión
que estés utilizando empecemos importando el módulo math simplemente
ponemos import y el nombre es math de matemáticas en inglés vamos a
utilizar una de las funciones de math por ejemplo sqrt que sirve para
calcular raíces cuadradas a partir de un número para este ejemplo vamos a
hacer que se pueda introducir el número a calcular desde la consola Aquí
vamos a poner una variable raíz que almacenará la raíz cuadrada ya

Python LOGICA DE PROGRAMACION 141


calculada para calcularla utilizaremos de maaz la función sqrt y le tenemos
que pasar un valor numérico que puede ser float o puede ser un int el input
lo estoy transformando a int Pero va a funcionar igual y si no le pasamos el
número por aquí directamente sería lo mismo le ponemos un número y nos
devuelve un float que es lo que nos indicaba por aquí devuelve la raíz
cuadrada de un número x el que le pasemos por aquí que puede ser int o
float como te he dicho y lo que devuelve finalmente es un float aquí
podemos poner float si queremos operar con

decimales con un código tan simple y sin conocer la fórmula para calcular
raíces cuadradas hemos podido crear una calculadora de Raíces en un o 2
minutos dependiendo de lo rápido que escribas Esta es una de las grandes
ventajas de la programación modular y todo lo que viene integrado en el
lenguaje pero realmente lo que viene integrado en el lenguaje de python es
una pequeña parte de lo que podemos hacer con python ya que tenemos
una infinidad de bibliotecas y frameworks para utilizar con python otro
pequeño detalle más por si no se te

había ocurrido aquí si quieres que te haga el cálculo sin decimales que lo
haga con valores enteros transforma esto si tenemos un float que es lo que
devuelve la llamada esta función Pues tú haz que luego se transforme a int
aquí por mucho que pongamos esto nos va a devolver solo la parte entera y
si queremos aquí todo int Pues todo int en este capítulo no vamos a ver
más de maz simplemente era para que supiese importar como utilizarlo Y
es que al final utilizar cualquiera de sus funciones es Exactamente igual

Simplemente tienes que venir a la referencia y podrás ver cómo utilizar


cada una de ellas los argumentos que necesitan para qué sirven etcétera
Además os pondrá En qué versión se han añadido ciertas cosas con esto
sabéis que antes de la versión 3.8 no podéis utilizar esto si estáis
desarrollando en programas antiguos de python De todas formas a lo largo
del curso iremos utilizando funciones de maz a medida que las
necesitemos así veis su uso con ejemplos prácticos python tiene
prácticamente de todo algo que por supuesto no le falta

Python LOGICA DE PROGRAMACION 142


un módulo dedicado al manejo de fechas y horas se trata de date Time es
un módulo muy extenso Así que nos vamos a centrar en las partes más
importantes para empezar con las fechas y horas las clases Time date y
date Time cada una de estas clases tiene muchos métodos Y esta es la
documentación oficial de date Time también te dejo el enlace en la
descripción el módulo datetime de python al igual que math ya viene
integrado en el lenguaje de forma que para importarlo no hay que instalar
nada Solo hacer el import empecemos por la clase Time esta

Python LOGICA DE PROGRAMACION 143


clase está enfocada al manejo de horas en python al ser Time una clase
para crear datos de este tipo estaremos instanciando objetos de tiempo de
tipo Time para crear un objeto de tipo Time lo haremos especificando una
serie de argumentos no obstante no es obligatorio poner ninguno veamos
un ejemplo datetime Time con esto acabamos de instanciar el objeto de
tipo hora estos nombres del módulo date Time como Time no cumplen la
convención de nombres de clase ya que esto al ser una clase como he
explicado debería ir así pero es un módulo antiguo

recuerda el tema que comenté anteriormente la retrocompatibilidad y ahora


podemos imprimir directamente el valor de hora que se ha almacenado en
este objeto que es por defecto las 12 en punto de la noche si queremos
almacenar una hora en concreto podemos poner argumentos el primero
corresponderá a la el segundo a los minutos el tercero a los segundos y el
cuarto a los microsegundos un microsegundo equivale a una millonésima
parte de un segundo Por ejemplo las 14 horas minuto 30 mira aquí lo
tenemos Hour el 14 minute le pasamos el 30 ahora

viene Second pues 20 segundos microsecond que sería bueno podemos


poner un número como este y a lo demás no le vamos a hacer caso de
momento no sale la hora 1430 20 segundos y aquí los microsegundos si no
ponemos los seis dígitos nos salen ceros a la izquierda lo más habitual al
utilizar estos objetos es utilizar estas tres partes así no hace falta
especificar los microsegundos Y si queremos solo una hora las 14 por
ejemplo lo dejaríamos así y nos pone 1400 ahora lo que vamos a hacer es
imprimir por separado los atributos del

Python LOGICA DE PROGRAMACION 144


Python LOGICA DE PROGRAMACION 145
ahora que ya sabes lo más básico con las horas de python es el momento
de Ver las fechas para trabajar con fechas necesitaremos objetos de tipo
date que se traduce al español como fecha entonces podemos decir que
estamos creando objetos de tipo fecha aquí pondremos se crea un objeto
de tipo date llamamos al módulo punto clase date probemos Qué pasa si no
ponemos argumentos aquí nos da un type error no podemos dejar este
objeto sin nada y nos dice que se requiere un argumento year

año vamos a ponerlo le podemos poner Cualquier fecha ahí tenemos year
month y Day con esto estaríamos poniendo 20 de diciembre de 2027 si

Python LOGICA DE PROGRAMACION 146


quieres trabajar con la fecha en elementos separados puedes utilizar los
atributos de tipo fecha para hacer referencia a cada valor lo haríamos así
Aquí estaríamos Llamando al año al mes Con python puedes obtener la
fecha

actual en el momento de ejecutar el programa esto viene a ser más


interesante esto es posible con el método today de la clase date del módulo
date Time vamos a crear un objeto de tipo date y obtendremos la fecha de
hoy la actual en el momento de ejecutar me aparece año 2024 mes de
mayo día 4 y si esto lo ejecuto mañana me saldrá día 5 simplemente la
obtiene en el momento de ejecutarse el programa otra cosa interesante es
obtener también

la hora actual en el momento de ejecución ponemos datetime punto


datetime punto Now puede ser un poco confuso esto de aquí porque está
el módulo date Time y luego está la clase date time y finalmente Now es un
método de la clase date Time si accedemos con control click veremos que
efectivamente hay una clase que se llama date Time que está dentro del
módulo que estamos utilizando llamado justamente date Time y la hora
actual nos aparece con la fecha y la hora incluso con microsegundos esto
lo podemos utilizar para muchas

cosas la primera que se me ocurre para cuando un usuario accede a una


aplicación o para guardar un registro de cuándo se hicieron ciertos
cambios para el software empresarial esto viene de maravilla Y para tantas
otras cosas que podrías utilizar por ejemplo en una aplicación web para
mostrarle al usuario la fecha que se vaya a ejecutando ahí de manera
automática o la hora de esta fecha y hora en conjunto puede ser extraer los
atributos que necesites para no utilizar todo esto junto qué quiere solo la
hora pues utiliza Hour que

quieres el día utiliza day por ejemplo así Mira vamos a poner la hora y
obtenemos solo eso y si ponemos day saldrá el día día 4

También tenemos una serie de códigos de formateo de fechas con los que
podemos obtener en una cadena de caracteres las partes que nos
interesen aquí en pantalla tienes el listado de códigos que puedes utilizar
su significado y un ejemplo de uso pausa el vídeo para verlo con calma Y si

Python LOGICA DE PROGRAMACION 147


hace falta toma unos apuntes veamos un ejemplo para utilizar un poco
estos códigos de formateo tenemos la siguiente

fecha o la que te salga ti si la queremos formatear de una forma más


elegante algo como esto podemos utilizar esos códigos de formateo para
conseguir esto puedes utilizar el método s f Time que se podría traducir al
español como String formateo tiempo algo así String format Time y nos va
a servir para poder formatear los resultados que nos da el objeto de fecha
en este método podemos ir utilizando los diferentes códigos de formateo
de la tabla que te he enseñado vamos a probarlo obtenemos la fecha actual
en este objeto y vamos a

formatearla para que quede más agradable en lugar de que nos salga esto
le pasamos el objeto fecha actual punto y utilizamos este método ahora le
pasaremos una serie de argumentos en una cadena de caracteres y Aquí
vamos a pasarle unos cuantos códigos ahora te explicaré el efecto de cada
uno esta coma no está separando aquí elementos es una coma que va a
salir literalmente en el texto piensa que estamos dentro de un String y esto
que estoy haciendo por aquí es algo parecido a utilizar la f e incrustar
valores de

variables básicamente es eso imprimimos fecha formateada y aquí me


queda sábado día 4 de mayo de 2024 ha quedado una fecha bien me
faltaría el th que se suele poner en inglés Esto de aquí ves th esto no lo he
puesto para que no lo confundas con los códigos aquí Sacaremos el Day
con esto y le añadimos literalmente una t y una h en el String en la cadena y
aquí me saldrá 4th Ahí está con el código a mayúscula sacamos día entero
de la semana nos aparece el día de la semana sin palabras y sin abreviar
me refiero a eso con día entero

porque también hay la abreviación que pondría SAT que se pone con la a
minúscula así después con la d minúscula ponemos día del mes con prefijo
cer solo del 01 al 09 si estamos día 10 aquí ya pone 10 no pone 010 Pero en
cambio con con un cuat pone 04 la B mayúscula representa el nombre del
mes entero May de mayo si ponemos B minúscula sale abreviado en mayo
no sé si se va a ver no pero si estuviésemos en diciembre por ejemplo
pondría dec de e c y finalmente con la y mayúscula ponemos número del
año completo en lugar

de poner 24 pone 20 24 2024 Si queremos número del año abreviado a dos


dígitos ponemos la y minúscula pero es bastante confuso la verdad yo creo

Python LOGICA DE PROGRAMACION 148


que queda más claro ponerlo así las fechas en inglés que vienen por
defecto

Python LOGICA DE PROGRAMACION 149


Python LOGICA DE PROGRAMACION 150
Python LOGICA DE PROGRAMACION 151
python están muy bien pero si estamos desarrollando algo en español lo
más normal sería que las fechas aparecieran formateadas en español de
modo que pasemos a ver una forma de traducirlas mediante el módulo local
podremos hacer esto el módulo local es un módulo que permite a las
aplicaciones adaptar su

comportamiento y presentación a la configuración regional y de idioma del


sistema esto incluye la representación de fechas números monedas
codificación de caracteres etcétera probemos a establecer el idioma en
español ponemos local nombre del módulo punto set local y Aquí vamos a
poner local punto lc all separamos con una coma y ponemos es en
minúsculas de español si quieres precisar más con el español de un país
concreto puedes hacer esto por ejemplo que escribo una aplicación para
España y quiero utilizar español de España pues pongo es en

minúscula gu bajo es en mayúscula que representa el país o región Qué es


para México pues pongo MX y lo mismo con cualquier otro país Solo tienes
que cambiar el código de país la parte importante e imprescindible para
que esté en español es esta de aquí Así que voy a dejarlo con español así
genérico y como estamos utilizando las fechas y las horas vamos a
traducirlas Entonces tenemos que importar también date Time para poder
utilizar fechas y horas por aquí establecemos el idioma ahora vamos a
crear un objeto de tipo fecha

Aquí vamos a formatear la fecha como queramos punto este método y le


ponemos aquí los códigos que queramos yo lo he dejado así utilizando
capitalize esto para que me deje en mayúsculas la primera letra de la
cadena a ver cómo queda estupendo Ya lo tenemos en español sábado 4
de mayo de 2024 a las 1318 podemos crear esta cadena exactamente como
queramos gracias a estos códigos Y si quitamos este capitalize lo único
que cambia es esto que la s de sábado me sale en minúscula Y si yo quiero
que la primera letra aparezca en mayúscula utilizo ese método

que ya vimos en el curso básico así queda mejor presentado la traducción


es simple simplemente hemos establecido el idioma español y después

Python LOGICA DE PROGRAMACION 152


hemos trabajado como siempre con normalidad dejamos en esta parte del
curso el tema de los módulos que vienen con python

Python LOGICA DE PROGRAMACION 153


pip/modulo/biblioteca/frameworks

para pasar a partir del siguiente a utilizar pip y los entornos virtuales con
pip podremos instalar nuevos módulos bibliotecas o frameworks que no
vengan con la instalación de python y esto nos abrirá un mundo de
posibilidades python es un lenguaje de

programación que trae integrados en su instalación un montón de módulos


interesantes y prácticos para realizar fácilmente todo tipo de tareas a pesar
de ello habrá muchas ocasiones en las que necesitemos más módulos

Python LOGICA DE PROGRAMACION 154


bibliotecas y frameworks la comunidad de python está constantemente
creando todo tipo de módulos para propósitos específicos Por ejemplo si
quieres disponer de arise que son elementos más eficientes que las listas
de python necesitarás instalar una biblioteca Como por ejemplo npy la cual
no viene integrada en la

instalación de python si quieres realizar aplicaciones web completas y


tener enormes facilidades para el backend jango puede ser una gran
opción este framework también deberá ser instalado y así lo mismo con
miles y miles de paquetes disponibles en la red en las siguientes
explicaciones denominar a los elementos que puedan ser módulos
bibliotecas o frameworks como paquetes cuando se habla de todos ellos
muy a menudo se habla de módulos Pero esto bajo mi punto de vista es
impreciso ya que módulo realmente corresponde a un

archivo de python no a un conjunto de ellos como podría ser por ejemplo


una biblioteca completa o un framework una biblioteca es un conjunto de
códigos reutilizable que puede estar en uno o más módulos relacionados
entre sí esto nos da una colección de elementos como funciones y clases
para que luego utilicemos en nuestros propios proyectos en cambio un
framework es un conjunto de herramientas y pautas predefinidas para el
desarrollo de aplicaciones es mucho más complejo Que una biblioteca ya
que te proporciona una

estructura bien definida para el desarrollo con su propósito o propósitos


específicos y finalmente tenemos lo que es un paquete que es una
colección de código datos o recursos relacionados que se pueden
organizar y distribuir como una unidad Entonces esto es lo que atiende a lo
que pueda ser tanto un módulo como una biblioteca o un framework y con
paquete no me refiero a los paquetes propios de python los que estábamos
creando anteriormente pip es un gestor de paquetes que te permite instalar
paquetes que pueden ser módulos

bibliotecas o frameworks pip ya viene integrado con python en la


instalación distribuida para Windows Así que no tendrás que hacer nada
para tenerlo en cambio Si estás utilizando una distribución de gnu Linux y
no lo tienes instalado tendrás que hacerlo con el comando que ves en
pantalla instalar un paquete con pip es de lo más sencillo abriremos la
consola por defecto el atajo es control ñe y pondremos el siguiente
Comando pip install y el nombre del paquete que puede ser algo como una
biblioteca framework si te da un error

Python LOGICA DE PROGRAMACION 155


de que no se reconoce el comando pip deberás revisar las variables de
entorno del sistema tal y como mostré en el módulo uno de este curso al
instalar un paquete de esta forma podrás utilizarlo en cualquier proyecto
que hagas de python es decir se instala globalmente no solo para un
proyecto concreto instalemos un paquete cualquiera por ejemplo la
biblioteca npai pues pondremos este Comando pip install npai sobre lo que
nos saca en pantalla lo que nos interesa es esta parte de aquí instalado
satisfactoriamente vamos a ver los

paquetes instalados globalmente para ello pondremos pip freeze en mi


caso aparecen estos paquetes que no tienen por ser exactamente los
mismos ya que yo he instalado ciertas cosas que vosotros no tendréis Y
quizás vosotros tenéis otras que yo no tengo aquí depende de si habéis
utilizado pip o no anteriormente Y podemos ver que por aquí nos aparecerá
np en la versión instalada después para actualizar un paquete ya instalado
tan solo deberemos utilizar este Comando el mismo que hemos utilizado
anteriormente el p en este caso me dice que el

requerimiento ya está satisfecho porque ya tengo la última versión que es


la que acabamos de instalar en caso de que salga otra y pongamos esto
nos actualizará npy si quieres poner el comando de manera más explícita lo
puedes hacer así pip install np y pondremos dos guiones upgrade y hace al
final lo mismo para actualizar pip a la última versión disponible utiliza el
siguiente Comando podemos poner python o python.

exe da lo mismo m pip install y pondremos esa opción upgrade pip que de
hecho la actualización la instalamos con pip pip se actualiza Así mismo en
mi caso me dice que ya tengo la última versión de pip Si queremos
desinstalar un paquete lo haremos con el siguiente Comando pondremos
pip uninstall y el nombre del paquete en este caso por ejemplo np aquí nos
dice que se ha encontrado una instalación existente que es esta misma y
luego que lo está desinstalando aquí nos da un listado de los archivos que
se van a desinstalar seguro que deseamos

continuar sí o no Si queremos desinstalar efectivamente pondremos una y


de Yes si no pondremos una n de no yo voy a poner no Y en este caso no
se ha desinstalado podemos comprobarlo con ese pip free Sigue estando
ahí utilizar un paquete instalado es tan fácil como usar los que vienen
integrados con python tan solo tendrás que utilizar la palabra reservada
import como hemos hecho hasta ahora pues pondríamos import y el

Python LOGICA DE PROGRAMACION 156


nombre de ese módulo el que hemos instalado es npai y le podemos dar un
alias o no voy a utilizar un elemento Pero bueno

Esto no es relevante ahora mismo np haciendo referencia npai pondremos


array y creamos un array de momento no es relevante ni que entiendas
Para qué sirve ni Qué diferencia tiene con una lista etcétera Lo importante
es que veas De qué forma accedes a los elementos del paquete lo harás de
la misma forma que lo haces con tus propios módulos de python o los que
vienen integrados en el lenguaje

/entornos virtuales

si deseas tener tus proyectos más controlados y no instalarlos globalmente


puedes crear un entorno virtual esto te permitirá tener un

proyecto con sus dependencias aislado del propio sistema operativo la


forma en la que instalaremos cualquier paquete dentro de un entorno
virtual es la misma que fuera de él simplemente tenemos que estar
trabajando dentro esto lo haremos a través de la consola por lo tanto ábrela
con leñe y la tenemos lista para empezar a trabajar para crear un entorno
virtual Pon el siguiente Comando en la consola estamos ahora mismo en la
ruta del proyecto la raíz vamos a poner python m bem y el nombre del
entorno virtual en mi caso

será pruebas pulsamos la tecla enter y esperamos unos segundos no


toques nada Mientras esté esto así en espera espérate a que se libere el
prompt por aquí verás que ya ha creado una carpeta que tiene diferentes
carpetas y archivos con esto Tan sencillo ya tienes creado tu entorno
virtual y puedes crear tantos como necesites de momento nos a fijarnos en

Python LOGICA DE PROGRAMACION 157


la carpeta scripts en este archivo de aquí activate que no tiene extensión lo
tenemos que ejecutar cuando lo ejecutemos estaremos trabajando ya en el
entorno virtual habremos entrado

dentro Por así decirlo pues para ello tenemos que acceder a la ruta lo
haremos con cd pruebas scripts activate o bien podemos poner aquí
directamente la ruta así así la ruta de trabajo no nos cambia seguimos en la
raíz del proyecto pero fijémonos que aparece aquí el nombre del entorno
virtual si tienes esto a la izquierda de la ruta quiere decir que estás dentro
del entorno virtual todo lo que ejecute se va a ejecutar Dentro de este y el
entorno virtual Es realmente esta carpeta con todos estos archivos que lo

forman cuando queramos salir del entorno virtual y trabajar con normalidad
como hemos hecho hasta ahora pues vamos a poner lo siguiente
deactivate desactivamos el entorno virtual y ya podemos trabajar con
normalidad vemos Que parecido esto de aquí Por así decirlo lo hemos
cerrado en cualquier momento podemos volverlo a abrir lo haríamos de la
misma forma Así vamos a salir del entorno virtual y vamos a poner pip
freeze así comprobamos los paquetes que hay instalados de manera global
tal y como mostré en el capítulo anterior yo

quiero p game dentro del entorno virtual si te fijas por aquí no tengo p
game instalado pero no lo quiero instalar aquí en el entorno global sino que
lo quiero hacer en el entorno virtual pruebas pues entramos de nuevo y
Aquí vamos a poner lo mismo que pondríamos fuera p install p game o el
nombre del paquete que me dice que se ha instalado p game en esta
versión correctamente y podríamos actualizar pip lo haríamos con este
Comando tal y como mostré en el capítulo anterior y lo actualizaría si lo
hacemos Fíjate en

esta versión 2321 después la comprobaremos Pues ahora ponemos pip


freeze estamos dentro del entorno virtual acuérdate y ahí solo tenemos ese
paquete tenemos un entorno limpio para trabajar solo con lo que
necesitemos esa es la gran ventaja de los entornos virtuales Pues ahora
vamos a salir y vamos a poner de nuevo ese Comando pip free Aquí vemos
que p game no aparece por ningún lado al hacer esto que he hecho yo si te
aparece solo esto el paquete que acabas de instalar en el entorno virtual
estando fuera es un book pasa a veces

elimina la ejecución de la consola y Vuélvela a abrir y ya estará todo normal


pues tenemos ese paquete que solo está disponible ahí en ese entorno

Python LOGICA DE PROGRAMACION 158


virtual ahora vamos a ver en el entorno global la versión de pip Aquí lo
tengo actualizado en el entorno virtual Fíjate que tenía una versión anterior
y me estaba diciendo de actualizar vamos de nuevo al entorno virtual y
pondremos ese pip versión ves aquí tenemos otra versión de pip a lo largo
del curso iremos haciendo más cosas con entornos virtuales pero por el
momento es suficiente para

terminar vamos a ver Cómo eliminar un entorno virtual Pues si estás dentro
utiliza ese deactivate para cerrarlo y después suprime elimina la carpeta
con el entorno virtual y ya desaparecido así de fácil tenemos 50 paquetes
instalados en ese entorno virtual un montón de archivos o lo que sea y lo
queremos descartar pues tan fácil como eliminar la carpeta y se acabó
todo el asunto Pero ten en cuenta antes de eliminar una carpeta de entorno
virtual que no tienes nada valioso

en este capítulo empezamos con el tema de las funciones viendo un

repaso rápido de los conceptos fundamentales el propósito de este


capítulo es recordarte la base de las funciones para que puedas seguir el
hilo en los siguientes capítulos seguramente para la mayoría ya sea
bastante básico Pero simplemente será este capítulo una función es un
bloque de código que se ejecuta al ser llamado en tales llamadas puede
haber una serie de argumentos además las funciones pueden ser utilizadas
para devolver valores dentro del programa con el fin de procesarlos y
utilizarlos en él las funciones se

declaran con la palabra reservada Death les damos un nombre y entre sus
paréntesis ponemos opcionalmente el número de parámetros que
queramos puede ser 0 1 o los que necesitemos después de los dos puntos
intentaremos un bloque con el código de la función y finalmente como
última instrucción podemos poner la expresión de retorno con la palabra
return esta expresión al igual que los parámetros también es opcional si no
quieres devolver valores no la tienes que utilizar en pantalla tienes una
función de lo más ahora si no la llamas no va a tener

ningún efecto Aunque ejecutes el programa esto no hace nada para


ejecutar su código llamamos a la función con su nombre y unos paréntesis
mientras vas desarrollando la estructura completa del código puede ser
que necesites dejar declaradas las funciones pero todavía sin el código
correspondiente como todo elemento con dos puntos en python Debes
tener un bloque obligatorio indentado si no recibirás un error de

Python LOGICA DE PROGRAMACION 159


indentación En estos casos se utiliza la palabra reservada pas o bien le
puedes Añadir un comentario de tipo doc

String si pones un comentario normal y corriente no va a funcionar aquí te


daría un error Por entación De todas formas tal y como nos está indicando
aquí pens no hace falta ni ejecutarlo para comprobarlo en muchas
ocasiones utilizaremos parámetros para poder pasar valores a las
funciones a estos valores se les denomina argumentos aquí tenemos los
parámetros y aquí los argumentos variables valores que quede claro Esa
diferencia que parámetro es la variable que lleva la declaración de la
función a y b y argumento es el valor

que se le pasa a la variable de la función en este ejemplo 10 y 56 ahora si


intentas utilizar el resultado de la suma en tu programa no lo vas a
conseguir ya que está diseñada solo para imprimir valores en la consola
solo hace esto entonces supongamos que intentamos almacenar esto en
una variable llamada resultado y luego intentamos imprimir el valor el
resultado en la consola va a ser 66 y el resultado es noun aquí estamos
recibiendo un n que se almacena con esto el 66 sale de la propia llamada la
función que ejecuta este print pero

real no estamos obteniendo lo que queremos que es manejar en esta


variable el resultado para ello necesitamos devolver valores no imprimirlos
Y en este caso utilizaremos return pues sustituimos este print por ese
return así y ya podemos devolver esos valores ahora así no tenemos ningún
resultado known pero la función ya no sirve para imprimir valores sino para
devolverlos si quieres que haga ambas cosas en este caso no sería muy útil
pero se puede hacer simplemente Pon un print o los que necesites antes
del return el return Recuerda la última

instrucción ya que finaliza la función y en este caso pues funciona como


una función que imprime valores aquí y también los devuelve llegados a
este punto en el curso todos tenéis que saber todo lo que he explicado aquí
pero espero que esto sirva como repaso rápido por si tenéis alguna duda a
partir de los siguientes capítulos más que nada lo hecho por eso

Python LOGICA DE PROGRAMACION 160


Python LOGICA DE PROGRAMACION 161
Python LOGICA DE PROGRAMACION 162
analicemos los tipos de argumentos que utiliza python en las funciones
conocerlos bien Es necesario para aprovecharlas como es debido en
python podemos utilizar diferentes tipos

de argumentos tendríamos los argumentos posicionales los argumentos de


clave los argumentos por efecto argumentos arbitrarios posicionales y
argumentos arbitrarios de clave también he de indicar que podemos utilizar
expresiones como argumentos pero estas se pueden aplicar a los
diferentes tipos de argumentos que te he comentado Así que no las
podemos clasificar como un tipo de argumento realmente pasemos a ver
unos ejemplos prácticos con cada uno de ellos para que te quede todo
mucho más claro los argumentos posicionales son

los más típicos a la hora de realizar llamadas este tipo de argumentos son
los que se correlacionan de forma posicional con la declaración de
parámetros es decir si tenemos primero el parámetro a si indicamos un
valor como 10 este se va a asociar a él al primer parámetro que encuentra
en la función después ponemos otro se irá asociado a b como nos indica
por aquí de manera posicional primer argumento con el primer parámetro
segundo argumento con el segundo parámetro y así con tantos como
pueda tener una función

Python LOGICA DE PROGRAMACION 163


los argumentos de clave son los

que se especifican como pares de clave y valor en este caso podemos


hacer referencia al parámetro de manera explícita es decir este 56 se le
asocia a b Pues yo puedo hacer esto asín el valor 56 al parámetro B en la
llamada y lo mismo aquí y podría combinarlos perfectamente utilizar
diferentes tipos al tener esta asociación explícita Podemos intercambiar las
posiciones de los argumentos no son como los posicionales que tienen que
ir en posiciones concretas sino que los podemos poner en diferente orden
aquí nos funciona nos da 66

Python LOGICA DE PROGRAMACION 164


y aquí va a funcionar Exactamente igual el orden cuando utilizamos este
tipo de argumentos da igual cuando utilicemos bibliotecas o frameworks
como por ejemplo teinter verás que hacer las llamadas a las funciones que
vienen con esta biblioteca harás mención muchas veces al nombre de los
parámetros Ya que vienen cosas muy explícitas como background para el
color de fondo Border para el borde y harán que el código sea mucho más
legible más explícito

los argumentos por defecto son valores que se asignan a los parámetros
de una

Python LOGICA DE PROGRAMACION 165


función de manera predeterminada esto significa que si se llama la función
sin proporcionar un valor para el parámetro se utilizará el valor
predeterminado es decir podemos asignar en python valores directamente
en los parámetros por ejemplo al parámetro B Le podría dar un argumento
aquí mismo por ejemplo este y este va a ser el valor que va a obtener por
defecto al tener este valor ya declarado al declarar la función se me
permite hacer una llamada con un solo valor en este caso me sale el
resultado 66 suma este

10 + 56 Entonces al tener este valor aquí es como si hubiese hecho esto


qué ocurrirá ahora si yo le doy dos valores ejemplo esto en este caso lo
que se hace es reasignación se reasigna el valor que viene por defecto por
este que le pasamos aquí en este caso lo estamos haciendo
posicionalmente pero también se podría hacer así y no habría ningún
problema cuando cuando utilizamos argumentos por defecto tienen que
venir después de los parámetros posicionales por ejemplo Tengo este
parámetro de aquí y tengo este parámetro

de aquí con un argumento por defecto Pues yo por aquí no puedo poner
otro parámetro si pongo otro parámetro tendrá que llevar un valor por
defecto aunque sea un valor nn pero como puedes ver no podemos hacer
esto aquí nos indica el argumento no predeterminado sigue al argumento
predeterminado lo que quiere decir es que el parámetro c es un parámetro
que no tiene un valor predeterminado o por defecto y no se puede poner
después de uno que sí que lleva valores por defecto entonces este
parámetro Lo tendríamos que colocar por aquí

qué ocurriría en este caso pues que si le pasamos dos valores por aquí se
le pasará el 10 al parámetro a 20 al parámetro c y al B se le pasará 56 o lo
que pongamos aquí posicionalmente o con argumentos de clave como te
he enseñado aquí en las ayudas podemos verlo Any en se le puede pasar
cualquier tipo de dato por aquí y por aquí B ya lleva este valor que nos lo
muestra por aquí por defecto un int con valor 56 que será reemplazado
como has visto python es muy flexible en muchos aspectos y las funciones
no son una

excepción y

Python LOGICA DE PROGRAMACION 166


Python LOGICA DE PROGRAMACION 167
ahora pasamos a los argumentos arbitrarios posicionales conocidos Como
ar gracias a este tipo de argumentos podremos crear funciones que sirvan
para obtener argumentos posicionales como queramos en una llamada una

Python LOGICA DE PROGRAMACION 168


función hasta ahora por ejemplo si hacíamos algo tan básico como una
función de suma y queríamos sumar dos valores lo podíamos hacer pero
luego si queríamos que se pudiesen pasar tres cuat cco valores no
podíamos teníamos que venir a la zona de argumentos y poner tres cuat
cco valores y después estos valores se tienen que

pasar obligatoriamente Pues con arx eso se ha acabado ya que podemos


pasar desde cero argumento hasta los que necesitemos y se va a adaptar
es como un comodin se expande y se contrae así como vayamos
necesitando en un mismo programa podríamos hacer a esta función que
utiliza arx o a cualquier otra llamadas de un argumento de tres de 10 y esta
función funcionaría igual sin tocar nada de aquí primero vamos a utilizar la
ignora esto de aquí que he puesto Como comentario es para después y
vamos a hacer esta llamada que

hay por aquí se va a almacenar en la variable llamada y se imprimirá esto


los valores en la lista son lo que hay aquí pues la llamada la hemos hecho
con todos estos argumentos y la lista lleva todos los argumentos pasados
por aquí ahora si yo hago esto la función sigue funcionando y sigue
funcionando cómo lo hace muy sencillo por aquí tenemos una lista vacía
después tenemos un bucle y finalmente devolvemos lo que tenga la lista el
bucle lleva un iterador que se puede llamar i o lo podemos llamar
argumento si te ayuda a

verlo mejor y se está iterando ar por lo tanto arx es un elemento iterable un


elemento que se puede recorrer Como por ejemplo una lista o una tupla
concretamente que eso es lo que produce este arx este parámetro especial
lo que hace es obtener todos los argumentos que le pasamos en una
llamada y los clasifica o los ordena en una tupla simplemente es eso
entonces realmente estamos pasando un único argumento que es una tupla
con todos estos argumentos dentro es maravilloso verdad pues es una
pequeña trampa es una pequeña ilusión de

que estamos utilizando el número de argumentos que queremos pero


realmente estamos pasando uno Aunque al final obtenemos lo que
queremos que es pasarle seis argumentos es así le estamos pasando seis
argumentos pero realmente al intérprete de python le pasamos uno y ese
uno se puede iterar se puede recorrer y utilizar como queramos pues
tenemos una tupla que la vamos iterando con argumento y este ar Aquí
está pasada la tupla le decimos itame la tupla arc y cada vez que la ites lo
que quiero que hagas es que añadas un elemento que es el iterador

Python LOGICA DE PROGRAMACION 169


argumento en la lista entonces hacemos la llamada crear lista y se le pasa
la tupla aquí tenemos ahí esa tupla que contiene todo esto luego tenemos la
lista vacía y aquí iteramos la tupla la primera vuelta queé obtiene
argumento obtiene el siete pues siete con el append se añade a la lista
Entonces tenemos una lista que lleva un siete luego la segunda vuelta
argumento recibe 45 pues se añade 45 y así con el resto de argumentos
aquí imagínate otro ejemplo que tienes un usuario en un programa donde
puedes hasta 10

opciones diferentes puede marcar 10 cosas pero no sabes cuántas va a


marcar puede ser que no quiera ninguna puede ser que quiera cinco puede
ser que quiera a tres pues entonces necesitamos hacer algo como esto que
se obtengan primero todas las opciones que quiere el usuario y después se
haga una llamada un poco más inteligente Por así decirlo con algo como
arx para que pueda procesar un número arbitrario de argumentos y por eso
se llaman argumentos arbitrarios posicionales Pues ahora vamos a
simplificar más esto para que quede más

claro lo voy a borrar todo esto y venga empezamos con este código más
sencillo aquí tenemos una función que utiliza arx perfecto y Aquí vamos a
ejecutarlo para que lo veas imprime una tupla como te he dicho arx es una
tupla que lleva 10 y 20 que son los argumentos que hemos pasado por aquí
se los pasamos en la llamada genera una tupla con los valores 10 y 20 y
aquí tenemos una tupla con los valores 10 y 20 aquí en el tipo de podemos
verlo es una tupla o si no pasando el cursor por aquí pues efectivamente se
trata de un

iterable es una tupla que podemos recorrer como he hecho yo con ese
bucle ahora vamos a emular lo que hace arx lo vamos a hacer con una
tupla vamos a dejar de utilizar arc y voy a utilizar mi ar el mío propio Ponle
el nombre que quieras Aquí vamos a imprimir lo que lleva mi arc y aquí
veremos el tipo de dato de mi arc también y Aquí vamos a poner una tupla
que llevará los argumentos que yo quiero 10 y 20 Pues aquí en lugar de
pasarle varios argumentos como nos ha posibilitado arc Pues voy a pasar la
tupla que es lo que se hace al final con

arx de fondo y el resultado es exactamente el mismo con esto estoy


emulando el comportamiento es que no es más que una tupla simplemente
tenéis que fijaros que eso que arx no es nada más que una tupla es una
ilusión al final Real porque lo podemos utilizar pero nos da la ilusión de que
estamos pasando tantos argumentos como nos da la gana cuando en

Python LOGICA DE PROGRAMACION 170


realidad estamos pasando Solo uno arx realmente es un nombre de
convención si pones Cualquier nombre funcionará lo que le importa al
intérprete Es que le pongas el asterisco antes que el nombre

para que identifique que estás utilizando arx por ejemplo aquí en lugar de
poner asterisco arc podemos poner objetos por ejemplo cada valor que
pasamos como como argumento realmente en python es un objeto un
objeto de tipo str de tipo in de tipo float etcétera Pues bueno le voy a llamar
objetos como le puedo llamar lo que yo quiera y aquí lo que vamos a hacer
es imprimir una tupla que se llame objetos ahora la llamada a esta función
Cuántos argumentos le pasamos pues lo que nos la gana Hola 34,5 19 son
diferentes tipos Fíjate que

pone objetos en que podemos pasar los que queramos no tenemos un


orden posicional solo hay eso Pásale todo lo que quieras a objetos vale
ejecutamos esto y se imprimen todos esos objetos se genera una tupla con
esto se pasa aquí a objetos y podemos imprimir esa tupla ya está Mira que
ese parámetro pone ahí tle Aunque ni siquiera es ar pero sí que lo es Utiliza
este asterisco si decides no seguir la convención de llamarlo arc
especifícalo muy bien en la documentación de tus programas Aunque
realmente quien sabe programar en python

ya conoce de inmediato que que objetos esto de aquí es lo mismo que arx
gracias al asterisco yo te recomendaría que utilizase siempre arx al final
será mejor para no producir malos entendidos entonces aquí utilizarías arx
y el nombre de aquí dentro de la función tiene que ser arx y es lo mismo
aquí tenemos de nuevo como siempre en este curso la función predefinida
print de python si es que print es una función imprescindible para aprender
el lenguaje python nos acompaña en todas las pruebas de todos nuestros
programas

y tiene muchos detalles que reflejan cosas del lenguaje Como por ejemplo
eso que ves por ahí ese parámetro values Fíjate que lleva el asterisco en
algunas referencias también lo he visto como objects aquí objetos valores
objetos pues final es lo que se le va a pasar a la función print gracias a eso
podemos pasar a una función print lo mismo que hemos pasado en la
función del ejemplo anterior esto que estábamos haciendo por aquí
tenemos ahí un número indeterminado indefinido de argumentos pues está
utilizando ese arc para obtener objeto

Python LOGICA DE PROGRAMACION 171


un objeto 2 objeto 3 objeto 4 lo guarda en una tupla y luego nos lo imprime
así arc siempre tiene que ser el último parámetro junto con el parámetro
especial arx puedes utilizar perfectamente argumentos de otros tipos como
estoy haciendo en esta función de aquí el valor 1 y cuatro se pasan
posicionalmente a los parámetros a y b respectivamente después todos los
argumentos que vengan pasarán a formar parte de la tupla arx en este caso
son estos tres valores pero podrían ser más si añades algún parámetro
después de

arc e intentas proporcionar un argumento posicional para este recibirás un


error Por ejemplo que aquí queremos incluir c Pues nos da error de tipo a la
llamada de función le falta un argumento obligatorio de solo clave c el error
indica que en la llamada nos falta un argumento de tipo clave ahí está el
secreto para poder bien una función Así podríamos hacer perfectamente
esto utilizar un parámetro de clave para el parámetro c si lo queremos
colocar ahí en este caso no se utiliza Pero lo podemos poner así
perfectamente primero a y b la tupla arx

con estos tres argumentos y finalmente c que lleva ese valor por defecto de
esta forma no hace falta pasar ese argumento el de c no da error como
puedes ver pero si quieres pasar un argumento para el parámetro c en la
llamada Lo tendrás que hacer siempre como argumento de clave porque
aquí cómo le vas a especificar un valor a c posicionalmente no puedes aquí
Tenemos uno y cuatro que van para a y b después esto se le pasa a arx Y si
pasamos aquí otro A qué parámetro crees que se le va a pasar a arx o a C
se le va a pasar a

Python LOGICA DE PROGRAMACION 172


Python LOGICA DE PROGRAMACION 173
Python LOGICA DE PROGRAMACION 174
Python LOGICA DE PROGRAMACION 175
Python LOGICA DE PROGRAMACION 176
Python LOGICA DE PROGRAMACION 177
Python LOGICA DE PROGRAMACION 178
podemos pasar argumentos de todo tipo como argumentos estas se
resolverán primero y sus resultados serán pasados como argumentos en
las llamadas de las funciones por ejemplo en suma tengo un solo parámetro
a pues quiero pasarle a un valor pero quiero que este valor sea el resultado
de una operación aritmética pues lo puedo hacer esto no son dos
argumentos es uno solo el intérprete de python primero resuelve lo que hay
dentro de los paréntesis que sería 30 y luego hace la llamada con ese valor
30 sería lo mismo que hacer esto por lo tanto lo que he pasado por aquí

es un argumento posicional pero para pasárselo he utilizado una expresión


por eso es que dije anteriormente que este tipo de argumentos los de
expresiones no son un tipo realmente de argumentos sino que se pueden
utilizar con los diferentes tipos que hay como los posicionales o los de
clave por ejemplo porque aquí podría poner a igual a 10 + 34 y pasa
Exactamente lo mismo e incluso podríamos pasar expresiones bule anas
por aquí hacemos la llamada y le decimos a como argumento de clave que
no importa hacerlo así y le ponemos 10 ig 10 aquí qué va a

Python LOGICA DE PROGRAMACION 179


hacer le va a pasar al argumento de clave a un valor true que es el
resultado de esta evaluación boleana y esto lo podríamos pasar
posicionalmente también sin ningún problema esto al final es lo mismo que
pasarle aquí resolviéndolo todo esto true Exactamente lo mismo pero el de
python puede servir para resolver expresiones en las llamadas

Python LOGICA DE PROGRAMACION 180


llegamos al segundo tipo de argumentos arbitrarios kw arx kw arx es
parecido a arx la diferencia principal es que nos permite pasar un
diccionario de argumentos en lugar de una tupla de

Python LOGICA DE PROGRAMACION 181


valores Pues con ambas cosas podemos trabajar con argumentos
posicionales con un número indeterminado de ellos y también con kw ar
con argumentos de clave con un número indeterminado de ellos también
vamos a ver varios ejemplos para que te quede claro por ejemplo hacemos
una función muy simple aquí para escribir kw ar lo haremos con doble
asterisco para diferenciarlo de Ar y aquí en este print vamos a imprimir lo
que que pasemos a este parámetro especial y a continuación haremos la
llamada Como por ejemplo nombre y los

definimos Aquí estos argumentos de clave no existen los vamos definiendo


en la llamada y en otra llamada que hagamos por aquí pueden ser
diferentes no tengo por qué utilizar nombre después pues paso estos tres
como podrían ser 50 lo ejecutamos y lo que vemos en la consola es un
diccionario Sencillamente lo que pasado aquí es que kw ar genera un
diccionario en lugar de una tupla como hacía arx con los argumentos de
clave que le pasemos Entonces yo le paso nombre y se le pasa como
primer argumento de clave lo almacena en el diccionario y seguimos

otro y otro y finalmente obtenemos esto generamos un dicionario con las


claves pares valor pasadas a la función esto te Será muy útil en el futuro
vamos a ir haciendo prácticas con estas cosas y verás Lo útil que es kwar
también es un nombre de convención lo importante para que el intérprete
de python entienda que quieres usarlo es especificar como he dicho estos
dos asteriscos arx tiene uno y kw ar tiene dos si aquí pones cualquier otro
nombre al igual que hacíamos con arc pues se puede hacer No pasa nada
te recomiendo

que dejes kw arc la convención para no crear confusión Pero bueno que
sepas que puedes utilizarlo así arx puede ser utilizado junto con kw arx así
tendremos ambas posibilidades en las funciones arx se colocará primero
como primer parámetro y kw ars después y si tenemos argumentos
posicionales obligatorios los pondremos antes de AR por ejemplo estos dos
vamos a hacer una llamada cualquiera aquí le paso un 45 que va a ir
posicionalmente al parámetro a aquí le paso un 100 que va a ir al parámetro
B y después se nos acaban los argumentos

posicionales obligatorios pasamos a los arbitrarios de arx También


posicionales bien todos estos van a ir a parar a arx estos tres Cómo hago
para pasarle algo a kw ar si esto está absorbiendo todos los argumentos
que voy poniendo pues es tan simple como pasar un diccionario o un
argumento de clave aquí tengo un diccionario pues se lo voy a pasar

Python LOGICA DE PROGRAMACION 182


ejecutemos y veamos si funciona tenemos 45 y 100 que se han pasado
correctamente a los parámetros a y b después tenemos una tupla que ha
absorbido Incluso el diccionario

Entonces esto de aquí no nos está funcionando se ha pasado todo a ar


porque tenemos ahí un diccionario vacío es como si no le hubiésemos
pasado nada a K o más bien es que no le hemos pasado nada para que el
intérprete de python entienda que este diccionario no se lo queremos pasar
como un elemento posicional para Ar y lo incluye ahí en una posición de la
tupla tenemos que poner esto así le indicamos al intérprete que va a ir esto
para kar y ahí lo tenemos Nos ha funcionado a y b la tupla de arc con estos
tres Y

luego el diccionario que ha sido pasado a kw ar si hacemos esto de poner


arc después de kw AR nos va a dar este error el parámetro no puede seguir
el parámetro tal es decir no se puede poner ar después de kw AR cuando
utilices python para un propósito concreto encontrarás un montón de usos
para arc y kw ars por ejemplo si trabajas con bases de datos podrías crear
un diccionario que llevara los datos de conexión a la base de datos como
este y pasárselo a una función de conexión con kw arx todo de una
simplemente pondríamos ahí en la llamada

conexión y le pasaríamos todo esto a ese parámetro

Python LOGICA DE PROGRAMACION 183


Python LOGICA DE PROGRAMACION 184
Python LOGICA DE PROGRAMACION 185
para este capítulo voy a hacer una explicación sencilla de lo que es un
bucle con múltiples iteradores en python Y por supuesto cómo funciona
para ello primero describiré los pasos de un bucle con un solo iterador y
luego añadiremos a ese ejemplo un segundo iterador Además haremos la
prueba con más de dos iteradores para que veas lo fácil que es vamos a
empezar con una tupla una lista algún elemento iterable con posiciones
simples Sin poner dentro ninguna tupla ninguna lista ni nada por

Python LOGICA DE PROGRAMACION 186


el estilo valores como números o str Pues ahora vamos a crear un simple
bucle que recorra esta lista e imprima cada uno de los valores vamos a
crear el iterador color e iterar la lista colores imprimiremos cada vuelta del
bucle el valor del iterador para verlo pues ejecutamos este sencillo código
perfecto nos itera cada posición como era de esperar aquí tenemos una
tupla de tuplas una tupla que contiene varias tuplas Pues si queremos iterar
esta tupla con cada uno de sus elementos lo tenemos que hacer con un
doble iterador

o con un bucle anidado con el bucle anidado se nos complica


innecesariamente Así que vamos a utilizar la técnica del doble iterador que
en python es superfácil vamos a cambiar esto tenemos frutas y colores
pues pondremos dos iteradores uno que se llame fruta y el otro color pues
ponemos por aquí fruta y la lista ahora se llama datos tenemos estos dos
iteradores que están colocados de forma que coincidan con las posiciones
de las tuplas manzana va a ir a parar al iterador fruta al primer iterador y
rojo irá a parar al

segundo iterador pues teniendo cada vuelta estos datos aquí en los
iteradores los podemos utilizar así de fácil por ejemplo de esta forma y lo
que nos sale en la consola es esto manzana rojo pera verde plátano
amarillo el bucle se ejecuta tres veces e itera seis elementos por qué lo
hace de dos en dos Fíjate lo fácil que es utilizar un doble iterador en python
y lo difícil que es entenderlo si no te lo explican bien Espero que con este
ejemplo tan simplificado lo hayas entendido bien lo utilizaremos de formas

más avanzadas y prácticas a lo largo del curso ahora bien qué quieres
utilizar más iteradores lo puedes hacer por ejemplo supongamos que esta
tupla bueno cada una de ellas tiene un tercer elemento el estado de la fruta
pues la manzana está podrida la pera está madura y el plátano estará verde
para iterar cada una de estas tuplas todo de una vez con este bucle
Simplemente tienes que Añadir otro iterador y aquí lo vamos a imprimir y
así la primera vuelta se leera esta tupla se le pasa la tupla al bucle Y luego
el primer iterador va a ir con

manzana el segundo con rojo y el tercero con podrida lo mismo cada vuelta
se ejecutará tres veces este bucle de tres veces procesamos nueve cosas
y así harás lo mismo con 4 5 10 o adores que quieras

Python LOGICA DE PROGRAMACION 187


Python LOGICA DE PROGRAMACION 188
con los diccionarios tenemos un método muy práctico para recibir las
claves y los valores de una forma muy curiosa estoy hablando del método
item este que tenemos por aquí ejecutemos primero esto y veamos lo que
hace nos aparece aquí con el type un objeto de tipo dict items y después
nos aparece el valor por aquí de este objeto

el objeto contiene una lista con duplas con cada par clave valor de un
diccionario El que le he pasado con concretamente ahí argumentos Pues
aquí tenemos la lista como la puedes ver aquí Ahí están los corchetes y
dentro contiene lo siguiente una tupla aquí tenemos clave y valor entonces
con esto tenemos una lista con tres posiciones esas posiciones son tuplas
que cada una lleva par clave valor con un método como este podemos
procesar un diccionario y hacer con él lo que queramos digamos que
cuando entendemos bien cómo funciona

nos facilita bastante el trabajo de ciertas tareas y aquí vas a ver un ejemplo
ejecutemos lo primero y ves ahí queé nos hace clave clave clave valor valor
valor y por en medio nos va sacando las claves y los valores por separado
este bucle lo que está haciendo aquí es básicamente iterar el diccionario y
a un doble iterador nos devuelve primero esto y luego esto analicemos bien
lo que hace tenemos el diccionario argumentos se pasa por aquí con kw
aquí la función una vez llamada ya tiene el diccionario pasado y con este

Python LOGICA DE PROGRAMACION 189


bucle se va a iterar cada parte de Qué exactamente pues del objeto
generado items a partir del diccionario pasado por kwar objeto items como
has visto contiene esa lista con diferentes tuplas cada tupla lleva clave
valor Entonces esto de aquí el iterador clave va a iterar de la primera tupla
esto de aquí la clave y el segundo iterador va a iterar el valor con ese doble
iterador de una vez hacemos las dos cosas simplemente es eso en lugar de
tener que hacer un bucle anidado Pues la primera vuelta hace esto nos
obtiene la clave

por aquí y el valor por aquí con lo que tenemos finalmente en este String
clave dos puntos la clave es nombre y el valor es Enrique y luego hace lo
mismo con esto procesa aquí edad y aquí procesa 32 y la siguiente vuelta
teléfono y este número de aquí con este ejemplo todavía es difícil
desarrollar un uso práctico para kw ar no os preocupéis porque vamos a ir
haciendo prácticas en el curso seguramente habéis entendido lo que hace
este código pero no sabéis cómo desarrollarlo en algo práctico o que sea
útil para ello necesitamos hacer unos

cuantos ejercicios proyectos y demás Seguiremos viendo cosas a lo largo


del curso por el momento con lo que os tenéis que quedar es que con arc
podemos pasar un número indefinido de argumentos y con kwar podemos
pasar un número indefinido de clave par valor

Python LOGICA DE PROGRAMACION 190


Python LOGICA DE PROGRAMACION 191
en este capítulo vamos a ver un elemento de python muy práctico se trata
de las funciones lambda o anónimas también conocidas como funciones
Sin nombre una función lambda es un tipo de función especial de python
que permite crear funciones simples con tantos parámetros

como quieras pero con una única expresión estas nos permiten tener una
sintaxis mucho más reducida probablemente en este capítulo no le llegues
a ver todo el sentido a utilizarlas te pondré unos cuantos ejemplos PR para
que vayas viendo cómo funcionan pero Normalmente se les ve la utilidad
real cuando las utilizamos en cualquier tipo de propósito donde nos
solucionen bastante la vida la sintaxis de este tipo de funciones es muy
simple utilizamos la palabra reservada lambda le damos una serie de
parámetros dos puntos y luego

la expresión que queramos Recuerda que solo tiene que ser una las
funciones lambda son un tipo de función muy práctica para utilizarse en
operaciones sencillas gracias a ellas conseguiremos crear ciertas
funciones en una sola línea en lugar de ocupar varias en el siguiente
ejemplo tienes dos veces la misma función una escrita como función
lambda y la otra Como función normal una Death ambas funciones sirven
para sumar dos valores además la función anónima devuelve
automáticamente el valor de retorno sin utilizar la palabra return

como puedes apreciar la función normal es más legible vemos más claro a
simple vista los pasos que da Así que cada una tiene sus ventajas y sus

Python LOGICA DE PROGRAMACION 192


inconvenientes quizás hayas caído en que una función anónima no tiene
nombre por eso se llama así entonces si no tiene nombre Cómo la vamos a
llamar para utilizarla realmente podríamos decir que sí que pueden tener
nombre ya que para utilizarlas las Tendremos que guardar en una variable
no siempre es necesario pero de momento te lo voy a enseñar así con esto
almacenaremos el valor de

retorno y además podremos Llamar a esta función para llamar esta función
normal tendrías que poner sumar los paréntesis y poner unos valores para
hacerlo con la función lambda lo puedes hacer así la almacenaremos en
una variable y luego la podemos llamar cuando queramos Cómo la
llamamos con el nombre que ha heredado de esa variable estas funciones
son un poco peculiares pero son muy fáciles de utilizar la variable suma
está sirviendo como nombre para llamar a la función anónima en este caso
solo se están imprimiendo los

valores de retorno pero podrías almacenarlos en otras variables por


ejemplo esto y luego ya si quieres imprimirlas pues lo puedes hacer por
supuesto pero así tenemos las llamadas los valores de retorno
almacenados en funciones como hacemos muchas veces con las
funciones normales el resultado es el mismo por si alguien no le ha
quedado claro cómo funciona esto de aquí pues mira tenemos esto que
equivale a Def X e Y son los parámetros fíjate aquí en la instrucción que
nos da parámetro x parámetro y admite cualquier tipo de dato y aquí los

estamos utilizando en una expresión es decir súmame lo que se le pase al


parámetro x má parámetro Y entonces en las llamadas este 5 irá x y este 30
irá a y y aquí lo mismo 3 para x 7 para y exactamente como lo tienes aquí
podríamos decir que estos son clones detente analizarlo y toma tus
conclusiones aquí si quieres le puedes llamar sumar exactamente las
funciones lambda se utilizan normalmente en situaciones donde una
función normal sería excesiva o innecesaria también habrá veces que
podrás facilitar mucho el código

utilizando una lambda evitando incluso la anidación de elementos por


ejemplo cuando creemos eventos en ciertas situaciones como con las
interfaces gráficas de la biblioteca teinter no os puede ser de Gran utilidad
utilizar funciones de este tipo sin embargo no voy a explicar este tema de
los eventos en en este vídeo esto lo explicaré en el siguiente módulo a
medida que utilices propósitos específicos en python empezarás a ver

Python LOGICA DE PROGRAMACION 193


dónde y cómo utilizar estas funciones anónimas al principio pueden
parecer algo abstractas y carecer

de sentido hace falta práctica para ir conociéndolas mejor

Python LOGICA DE PROGRAMACION 194


Python LOGICA DE PROGRAMACION 195
Python LOGICA DE PROGRAMACION 196
en este capítulo te enseñaré la base fundamental sobre las funciones
decoradoras un tipo de función que nos va a ser de Gran utilidad a la hora
de aprovechar mucho código las funciones decoradoras de python son
funciones especiales que nos ayudarán a decorar entre comillas el código
de ciertas funciones se trata de emplear ciertas funcionalidades de una
función sobre otras Esto quedará mucho más claro con los ejemplos que
verás a continuación en python las funciones

también son objetos puedes comprobarlo de la siguiente forma así como


hemos hecho con cualquier objeto hasta ahora y ahí vemos que nos
aparece Class function estamos ante un objeto de tipo función esto entre
muchas posibilidades es uno de los motivos por los cuales podemos
asignar una función a una variable Aunque realmente no le estamos
asignando la función sino que asignamos un valor de retorno Pero
podemos almacenar la llamada a la función directamente en una variable
como hemos hecho tantas veces también

podemos pasar funciones como argumentos para otras funciones en este


ejemplo la función B es espera un argumento este argumento podría ser
cualquier objeto sin embargo puesto que dentro de la función se hace uso
del argumento con unos paréntesis se espera un objeto invocable un objeto
como una función de tipo callable así es como se le conoce en inglés
invocable o llam podríamos traducirlo mal pues eso las funciones podemos
decir que son objetos llama bles o invocables ejecutamos esto y pone B
ejecutada función a

Python LOGICA DE PROGRAMACION 197


ejecutada con esta sola llamada acabo de conseguir Llamar una función
con otra función eso es lo que hace este código declaramos la función a no
la llamamos aquí declaramos la función B que espera un argumento y
cuando la llamamos lo primero que Se imprime es esto después utiliza el
argumento de manera invocable llama a la función que le pasemos en este
caso ha llamado a la función a y al llamarla imprime pero si intento pasar un
objeto que no se puede llamar que no es callable como puede ser un int va
a ocurrir el siguiente

error un 10 no es invocable no podemos hacer nada con esto En este


sentido aquí tenemos ese error que se produce en la línea se y nos indica
Exactamente eso type error error de tipo el objeto de tipo int no es
invocable y cómo sabe el intérprete de python que aquí tenemos que
pasarle algo invocable cómo es que no está funcionando este parámetro
como los que hemos utilizado hasta ahora pues sencillamente se debe a la
forma en la que se utiliza en esta línea porque si yo borro esta línea aquí va
a funcionar se ejecuta la función B

se le pasa como argumento S10 y no hacemos nada con ello pero el error
reside en el momento en el que intentamos utilizar un objeto que no es
invocable como objeto invocable con estos paréntesis básicamente
invocable acuérdate que es llam que se puede hacer una llamada Pues bien
aquí en el ejemplo que teníamos antes el que está correcto podemos
observar que dentro de la función B es posible controlar perfectamente el
flujo de ejecución y hacer lo que queramos cuando queramos tanto antes
como después de llamar a la

función pasada como argumento aquí estoy ejecutando este código antes
de llamar a la función pero después de llamar a la función podría hacer algo
más pues vamos a cambiar esto Esto lo voy a poner por aquí y aquí voy a
poner otro print ahora si ejecutamos esto me dice se ha iniciado la función
función a ejecutada y luego función B qué está ocurriendo aquí pues
primero se ejecuta la línea cinco después se llama a la función pasada
como argumento que nos lleva a la línea dos se ejecuta el código que haya
por aquí una línea o las que sean y

después volvemos por aquí a la línea Si fíjate ahí el control del flujo de
ejecución que tenemos Esto es algo que realmente ya sabíais hacer lo
único que os faltaba quizás era saber que podíais pasar funciones como
argumentos pero por todo lo demás funciona Exactamente igual que todo lo
que hemos utilizado hasta ahora lam es una función y se ejecuta su código

Python LOGICA DE PROGRAMACION 198


en el momento de hacerlo Pues aquí está pasando Exactamente lo mismo
solo que ahora tenemos una función especial que es capaz de llamar a
otras funciones Pues bien Esto os va a servir

como introducción para entender muchísimo más fácil las funciones


decoradoras que realmente son muy fáciles de entender pero se puede
complicar mucho su manejo Así que asimilar bien estos conocimientos y en
el siguiente capítulo ya empezamos a aplicar funciones decoradoras de
verdad aquí lo que he hecho ha sido emular el comportamiento de esas
funciones decoradoras de python pero realmente todavía no las hemos
utilizado

Python LOGICA DE PROGRAMACION 199


Python LOGICA DE PROGRAMACION 200
Python LOGICA DE PROGRAMACION 201
Python LOGICA DE PROGRAMACION 202
en pantalla tienes cuatro funciones de operaciones aritméticas bastante
inútiles las voy a poner aquí

al principio para simplificar al máximo el concepto de las funciones


decoradoras soy consciente de que esto al tener un resultado fijo no es
nada útil tenerlo en una función partimos de esta base tenemos estas y
queremos añadirles una funcionalidad más que nos pongan algún mensaje
al principio y al final algo como esto al Llamar a estas funciones nos dirán el
resultado de la operación es tal Y finalmente dirán operación realizada con
éxito el código de estas funciones Entonces se está repitiendo mucho tanto
el primer print como el

tercero son exactamente iguales en las cuatro funciones y si en lugar de


cuatro tienes 100 funciones de este tipo Aquí es donde entran en las
funciones decoradoras Así que voy a crear una para mejorar un poco este
código aunque ya os digo de primeras es bastante inútil lo que estamos
haciendo aquí pero es para que entendáis el concepto una función
decoradora se declara como una función normal con Def aquí
necesitaremos un parámetro que llame a cierta función que se vaya a
decorar ahora explicaré detalladamente

esto después vamos a poner esto el resultado de la operación es que es lo


primero que quiero que salga en cada una de las funciones y después en
lugar de poner literalmente este código voy a utilizar este parámetro de

Python LOGICA DE PROGRAMACION 203


aquí como viste en el capítulo anterior en forma de llamada a función y
después lo que quiero que salga después si te fijas es lo mismo Solo que
en lugar de poner el código literal único de cada función pongo la llamada
un parámetro que va a servir para hacer llamadas con esto ya podemos
prescindir

de esto y ahora te falta saber cómo utilizar esta función decoradora con
otras funciones Pues a la que le quieras aplicar este funcionamiento esta
mecánica se lo aplicarás de la siguiente forma pones un ara y el nombre de
la función decoradora en este caso es decoradora la he llamado así Pero
puede ser cualquier nombre nombres válidos en python por supuesto y
aquí acabamos de decorar la función sumar las otras no ahora podrías
pensar que para llamar a la función sumar lo tenemos que hacer Así esta
función no tiene parámetros Así

que debe funcionar así pero no nos suelta un type error el objeto known
type de tipo known no es invocable si hacemos esto se llama
automáticamente a la función decoradora no hay que llamarla y si te fijas la
función decoradora se encarga de decorar el código de la función en este
caso la función solo tiene un resultado print de 20 pero esto se lo añade la
función decoradora primero ejecuta esto después llama la función
parámetro en este caso se le pasa automáticamente aquí al decorarla de
esta forma y ejecuta su código en esta línea por eso

nos sale aquí este 20 que es lo que da de resultado esta función y


finalmente acabamos con esto aquí dentro de la función decoradora
puedes poner el código en el orden que quieras no tiene por qué ser una
línea arriba otra abajo pero es para que veas que puedes hacer un antes y
un después de llamar a la función decorada es posible aplicar este código
repetitivo A cuántas funciones necesitemos tan solo hay que utilizar el
nombre de la función decorador con unaa de prefijo Tantas veces como
queramos así y ahora mismo todas estas funciones

están decoradas y ahí lo podemos ver que se llama a todas estas funciones
de la manera decorada utilizando el decorador Esto está funcionando nos
ahorramos repetir mucho código estos dos print cada vez en una de las
funciones Pero tenemos un gran problema que las funciones como las
estamos construyendo aquí se Ejecutan automáticamente sin llamarlas en
el código claro seguramente hais pensado en eso que estoy ejecutando no
la puedo llamar a la función porque me da error y se Ejecutan
automáticamente claro esto muchas veces

Python LOGICA DE PROGRAMACION 204


no nos va a servir pues vamos a escribir una estructura mucho más
funcional que esta la estructura típica de función decoradora de python se
basa en tres funciones las cuales con el fin de entendernos de forma
simple llamaré decoradora función parámetro e interna por supuesto estos
nombres no son obligatorios la función decoradora va a ser la que reciba
como argumento la función parámetro a raíz de esto la función decoradora
devolverá con un return el valor de llamar a la función interna esto parece
una locura Y

seguramente no lo has entendido pero verás que es más senillo de lo que


parece y que no es tan complicado vamos a escribir la sintaxis de una
función decoradora cualquiera y lo haremos con la sintaxis que te acabo de
describir no como lo ha hecho antes aquí tenemos la función decoradora
una de las tres que te he comentado que es la propia decoradora y luego
funciona con la función parámetro que es otra de las funciones que te he
comentado después dentro tendremos otra función más la llamada función
interna aquí

pondremos el código que queramos de momento voy a dejar un pass y


después de esto pondremos un return interna vamos a devolver el
resultado de esa función piensa que este return está indentado dentro de la
función de decoradora no en interna otra forma que verás en muchos
ejemplos de simplificar estas tres funciones es A B y C tendríamos la
decoradora que se expresa como a la función parámetro sería b y la
función interna c que se representa muchas veces así F a que admite
parámetro de función b y devuelve c vamos a hacer el ejemplo de antes de

las operaciones aritméticas pero con esta nueva estructura vale en interna
vamos a poner el código que queremos que se llame cada vez pues
pondremos primero es print el primero que salía Esto será lo primero que
hará al decorar cierta función y después tiene que utilizar la función
parámetro al acabar de ejecutar esa función la que decoremos que va a ser
la función pasada por parámetros ponemos el mensaje final aquí de
primeras vamos a quitar este return Para que veas una cosa ponemos
decoradora vamos a decorar la siguiente

función la función sumar y esta lo que hacía era un simple print con un 10 +
10 esta vez vamos a ejecutar el código y podemos comprobar que nos está
ejecutando automáticamente bien ya nos ha funcionado sin embargo no
tenemos resultados Entonces vamos a intentar de llamar a esta función y
tenemos el mismo error de antes no podemos utilizar estas llamadas al

Python LOGICA DE PROGRAMACION 205


decorar la función no se está viendo nada Finalmente nos queda una
devolución un tipo no una y no es invocable ese tipo de dato entonces No
podemos llamar a la función no nos alarmemos y

busquemos una solución para esto esto ocurre porque la llamada Está
contenida en la función interna Y recuerda que teníamos un alcance
encerrado en las funciones anidadas para solucionarlo hay que hacer un
simple return que es el que tenía yo por aquí así ahora Si ejecutamos
vemos que nos sale correctamente lo que queríamos hacer lo vuelvo a
explicar una vez más por si alguien no le ha quedado claro cómo funciona
esto creamos la función decoradora esta función recibirá un parámetro el
parámetro va a ser una función básicamente la que queramos

decorar la que sea al Poner este decorador aquí estaremos pasando la


propia función aquí automáticamente después lo que tenemos dentro es
una función interna una función anidada esta función interna se utiliza para
que no se hagan las llamadas de manera automática como nos pasaba al
principio al ejecutar el código que no se llame a la función decorada así la
contenemos bien pues esa contención lo que hace es en este caso ejecutar
un código aquí después llama a la función decorada que en este caso va a
ser sumar que se ha

pasado por aquí la llama aquí ejecuta su código y después nos saca esto
esto te lo hago en tres pasos para que veas que puedes hacer cosas antes
y después de llamar a la función después como tenemos ese alcance
encerrado esto se va a quedar contenido en esta función interna pues lo
que hay que hacer desde aquí es devolver la función interna para que
finalmente la consola cuando hagamos esto tengamos un valor de retorno
es complicado ya lo sé pero necesita tiempo y práctica así que no te
preocupes si necesitas repasar

este capítulo hazlo porque en el siguiente lo vamos a complicar más con


parámetros Decorando funciones que sean más prácticas que esto que
tengan sus propios parámetros para que podamos hacer por ejemplo si si
hacemos una función de suma que le podamos pasar valores y que no
sean resultados estáticos como esto aquí ya te aviso que con las funciones
decoradoras se complicarán con funciones que admitan parámetros

Python LOGICA DE PROGRAMACION 206


Python LOGICA DE PROGRAMACION 207
Python LOGICA DE PROGRAMACION 208
Python LOGICA DE PROGRAMACION 209
Python LOGICA DE PROGRAMACION 210
Python LOGICA DE PROGRAMACION 211
Python LOGICA DE PROGRAMACION 212
Python LOGICA DE PROGRAMACION 213
las funciones del capítulo anterior eran bastante inútiles al final esta al menos
pued

Python LOGICA DE PROGRAMACION 214


las funciones del capítulo anterior eran bastante inútiles al final esta al
menos puede realizar diferentes

sumas a partir de dos argumentos así sin utilizar ni ninguna función


decoradora funcionan bien Pero y si queremos hacer algo como lo del
capítulo anterior que se ejecute cierto código antes de llamar a la función y
después decorándolo vamos a crear una y lo probamos a la decoradora la
voy a llamar a va a admitir una función como argumento que llamaré
parámetro b y la función interna va a ser C hará este print primero llamará
la función pasada como argumento imprimirá esto y finalmente devolverá el
resultado de la función interna ahora

vamos a decorar esta función de aquí ahora ya tenemos la función sumar


decorada si intentamos ejecutar estas llamadas no funcionan nos dice error
de tipo la función c definida en a toma cero argumentos posicionales pero
se le pasaron dos por lo tanto tenemos una función decoradora que
realmente admite cero argumentos no está esperando nada el error se
desencadena en la primera llamada pero pasaría con el resto igual si
miramos la función c el error no se equivoca esta función no tiene
parámetros para los que pasar esos dos

argumentos por lo tanto ya sabemos dónde hay que colocar los parámetros
en la función c la interna entonces pondremos num 1 num 2 y ahora
probamos de ejecutar de nuevo nos aparece un type error la función sumar
requiere dos argumentos ionales num 1 y num 2 ahora el error está en la
función sumar que desencadena el problema en la función parámetro la B
lo hace concretamente aquí en la línea cuatro Pues el error lo que nos está
indicando es que nos faltan dos argumentos posicionales requeridos para
solucionar esto le añadiremos los dos

parámetros a la llamada de la función b y listo con esto ya estaría


ejecutamos y ahora sí nos funcionan todas las llamadas la primera la
segunda y la tercera bien al igual que he hecho otras veces voy a explicar
lo mismo pero de una manera más detallada por si alguien no le ha
quedado claro primero definimos una función llamada a decorador que
toma un argumento B esta función decoradora tiene como el propósito
envolver a otra función en este caso va a ser la función sumar y modificar
su comportamiento que para eso utilizamos las funciones

decoradoras en este caso la modificación del comportamiento son solo dos


prints pero podemos hacer cualquier cosa las posibilidades son ilimitadas la

Python LOGICA DE PROGRAMACION 215


función decoradora tomará como argumento la función decorada Entonces
al parámetro B en este código se le pasará la sumar cuando llamemos a la
función B dentro de la función decoradora estaremos Llamando a sumar o a
restar o a la función que queramos decorar en ese momento después se
define la función interna c que tiene dos parámetros gracias a ellos
podemos recibir los valores que utilizamos en la

llamada por aquí y pasarlos internamente dentro de su código si no no


podemos acceder a ese alcance encerrado por eso necesitamos
especificar losos por aquí voy a borrar estas dos llamadas y voy a explicar
con esta Pues aquí tendríamos algo como 40 y 54 Esto se lo pasará por
aquí entonces en B que es lo mismo que sumar tendremos esto realmente
Entonces se ejecutará Primero este código después hará la llamada y
ejecutará este otro para finalmente devolverlo todo fuera en los siguientes
capítulos lo voy a complicar todavía un

poco más con arc y kw arc

Python LOGICA DE PROGRAMACION 216


Python LOGICA DE PROGRAMACION 217
Python LOGICA DE PROGRAMACION 218
Python LOGICA DE PROGRAMACION 219
Python LOGICA DE PROGRAMACION 220
utilizar funciones decoradoras con un número determinado de parámetros
está muy bien pero qué ocurre Si queremos utilizar un decorador funciones
que tengan un número indeterminado de parámetros supongamos que
queremos una función sumar como esta pero luego queremos otra función
más que se llame restar y que tenga cuatro parámetros por ponerte un
ejemplo claro con el fin de no tener que crear varias funciones decoradoras
para utilizar al final el mismo propósito lo que les haría perder

todo el sentido podemos utilizar el anteriormente explicado ar vamos a


crear esta función vamos a a utilizar el decorador y pondremos restar aquí

Python LOGICA DE PROGRAMACION 221


le vamos a poner cuatro parámetros vale la llamada a esta función se haría
así si ejecutamos esto a ver qué ocurre tenemos un error nos está
indicando Sencillamente que la función espera dos argumentos pero le
estamos

pasando cuatro la operación con la suma la ha hecho y ha decorado


correctamente sin embargo la resta nos da error pues aquí puesto que
necesitamos argumentos posicionales un número indeterminado de ellos
simplemente tenemos que poner aquí arc y aquí vamos a poner lo mismo
así ya tenemos las funciones listas para ser decoradas independientemente
del número de parámetros que tengan funcionará con dos con cuatro o con
50 pasemos a otro ejemplo para ver la utilidad de emplear kw arc en las
funciones decoradoras en este ejemplo

puedes ver que hay funciones que esperan diferente número de


argumentos las dos primeras funciones esperan dos argumentos y la última
solo uno pues bien partiendo de la base necesitamos poner arc como
mínimo si queremos decorar estas funciones con la misma función
decoradora Hagamos una llamada por ejemplo a la función rectángulo
ahora mismo lo tenemos como puedes ver con arx se realiza
perfectamente sin problemas y también pasará lo mismo con las otras dos
tal y como te he enseñado en el ejemplo anterior esta función

decoradora se adapta a diferente número de parámetros sin embargo mira


lo que ocurre si quieres hacer una llamada con argumentos de clave con
algo que deberías poder hacer naturalmente python ya que es muy habitual
si yo quiero hacer más legible esta llamada pondré área rectángulo y le
puedo poner por ejemplo altura en lugar de pasárselo en el mismo orden
pongo argumento de clave altura valor 10 y aquí le voy a pasar base 40 en
principio visual Studio me está sugiriendo que utilice estos argumentos de
clave podríamos decir que son

accesibles pero al ejecutarlo tenemos un error error de tipo la función c


definida en a toma un argumento de clave inesperado altura Vale pues esta
función decoradora no está esperando argumentos de clave y esto ocurre
porque se lo estoy pasando a arx tenemos ese problema arx como expliqué
anteriormente solo recibe argumentos posicionales es aquí donde hay
Añadir la funcionalidad extra a esta función llamada kw ar ponemos una
coma y ampliamos esa funcionalidad así ya tenemos una función
decoradora todo terreno podríamos decir

Python LOGICA DE PROGRAMACION 222


porque ahora podemos llamar sin ningún problema con argumentos de
clave y si lo hacemos con argumentos posicionales tampoco habrá
problema en este caso 10 se le pasará base posicionalmente y 40 altura y
con los argumentos de clave Ya sabes en el orden que quieras

Python LOGICA DE PROGRAMACION 223


Python LOGICA DE PROGRAMACION 224
Python LOGICA DE PROGRAMACION 225
Python LOGICA DE PROGRAMACION 226
Python LOGICA DE PROGRAMACION 227
Python LOGICA DE PROGRAMACION 228
las funciones generadoras son un tipo de función especial de python que
permite dividir una ejecución de función en partes más pequeñas con el fin

Python LOGICA DE PROGRAMACION 229


de aprovechar mejor los recursos del sistema sobre todo hablando en
términos de memoria esto es gracias a que estas

funciones Crean un objeto iterador que se puede ejecutar paso a paso en


lugar de todo a la vez como ocurre con las funciones normales se dice que
estas funciones son de valuación herida porque se van ejecutando de
forma gradual generando un valor cada vez y no todos de golpe si creas un
generador y no lo utilizas la función no se ejecutará en absoluto solo se
ejecutará cuando se solicite el primer valor mediante la función next o al
usar el generador con por ejemplo un bucle for la palabra reservada yield
es

parecida a return con una diferencia clave una función con return o incluso
con print se ejecuta íntegra en el momento de la llamada y luego devuelve
o imprime un valor dando por finalizada la ejecución las funciones normales
procesan y almacenan todos los datos de una secuencia de una sola vez
eso no es importante en funciones con consumos mínimos pero se
convierte en un problema a la hora de trabajar con una gran cantidad de
datos con yield tenemos una especie de return que devuelve valores pero
es capaz de hacerlo por pasos como

un bucle y sus iteraciones vamos a escribir un pequeño ejemplo


empezamos con una función normal tenemos una función con un bucle y
queremos que esta nos devuelva los valores iterando un Rango gracias a
ese r return podemos pensar que lo haríamos correctamente sin sin
embargo Si queremos imprimir el valor de retorno o guardarlo en una
variable veremos que después de ejecutar el primer valor del Range que es
cer finaliza la ejecución como era de esperar simplemente tenemos un cero
y finaliza la función claro esto es porque

llega bucle se le pasa al iterador el Val cer y por aquí entra dentro del bucle
la primera iteración devolviendo ese valor cero gracias a este return I Y eso
es lo que nos sale por aquí Sencillamente eso Entonces en este caso lo que
haríamos es lo que hemos hecho muchas veces con los bucles en lugar de
un return poner print y ahora sí tenemos todos los resultados que se
imprimen porque se va and un print cada vez a consecuencia de haber
hecho esta llamada aquí lo podemos hacer así Si queremos imprimir todos
los valores

generados por ese bucle o bien nos las ingeniamos para crear una lista o
algo por el estilo que vaya guardando todos los valores y los pueda

Python LOGICA DE PROGRAMACION 230


devolver de una sola vez algo como esto creamos una lista vacía ponemos
un bucle y a la lista vacía Le vamos añadiendo los valores que genera el
bucle por ejemplo con un append entonces cada vez que se ejecute este
bucle le añade la lista el cer el un el dos y así hasta el final y finalmente
queremos que esta función nos devuelva la lista resultante con todos esos
valores generados pues

ponemos aquí un return lista valores devolvemos la lista completa Así


solucionamos de otra forma el problema lo guardamos por ejemplo en
valores entonces al imprimir valores estamos imprimiendo la lista generada
ahí lo tenemos Y seguramente te estés preguntando por qué me estás
explicando todo esto con los bucles por qué estamos haciendo todas estas
cosas Pues bien Es para que puedas apreciar la diferencia que tiene yield
para crear una función generadora volvemos a la función sencilla de antes
y cambiamos este

return por yield esta palabra es reservada de python si imprimimos la


llamada nos va a aparecer esto de aquí objeto generador llamado
generadora es el nombre de la función en esta posición bien hemos creado
un objeto generador gracias a ese yield si ponemos return e imprimimos
esto pues tenemos ese valor de retorno pero ahí estamos viendo que
producimos un objeto generador desde el momento en el que llamas a la
función esta queda con su objeto creada esperando a ser iterada claro que
si generas el objeto en un

print no lo vas a poder utilizar en el código Entonces vamos a guardarlo en


una variable bien ya tenemos ese objeto generador en la variable Rango
ahora vamos a ir iterando el objeto gracias a la función predefinida next
esto hará que se ejecute un paso de la función cada vez y esa es la gran
diferencia es lo que te he querido hacer ver que con las funciones
normales se ejecuta todo de golpe pero aquí podemos contener los pasos
de la función ponemos next y le decimos Rango del objeto Rango pues
queremos la siguiente iteración en este caso la

primera y ahí tenemos un cero perfecto volvemos a hacer lo mismo Pues


tenemos un cero en la primera llamada y un uno después y ahora si
ponemos otro pues ya sabes que va a dar un dos y así hasta acabar con
todos los valores de la función la ventaja de esto por si no lo estás viendo
Es que en funciones que manejen grandes volúmenes de datos podremos
dosificar la ejecución para evitar hacerlo todo de golpe y entre las

Python LOGICA DE PROGRAMACION 231


ejecuciones además podríamos hacer cualquier cosa extra por lo tanto
podemos dividir como queramos las

llamadas a las funciones por ejemplo entre esta ejecución podríamos poner
aquí otra cosa y no hay ningún problema en resumen gracias a yield vas
pausando y ejecutando una llamada a una función si lo entiendes mejor con
muchos fines pero el principal es el rendimiento más óptimo en
operaciones que requieren procesar muchos datos veamos otro ejemplo
utilizando varios yield en la misma función tenemos un bucle que va desde
el rango 0 hasta el 10 dentro de ese bucle tenemos una condición extra con
este If básicamente

esta condición extra sirve para evaluar si el número que se ha generado en


el rango es par o impar mediante el operador módulo este operador de aquí
es el igual que se trata del doble igual es porque tengo las ligaduras
activadas en visual Studio si alguien tiene dudas con las ligaduras que son
y cómo funcionan decímelo en los comentarios y os lo explico en esta
evaluación se dice que si el módulo de I en entre dos es igual a 0 es decir
no tiene resto la división del número entre dos es igual a 0 quiere decir que
el número es par porque es

divisible entre dos y si no en caso contrario es impar porque no es divisible


entre dos Es simplemente lógica matemática Pero bueno Esto no tiene nada
que ver al final con lo que te quiero enseñar simplemente es un ejemplo
que utiliza esta lógica por aquí qué crees que va a ocurrir cada ejecución
de esta función generadora fíjate que tenemos dos jod pues que unas
veces se ejecutará un yil y otras otro según cada condición tenemos
primero par luego impar par impar es otra de las cosas que podemos hacer
con este tipo de funciones

y quizás te preguntes Qué diferencia tendría hacer esto con return porque
aquí podríamos devolver unas veces par con el número y otras veces impar
vamos a probarlo así y aquí con return no podemos utilizar next me
devuelve siempre par cer0 Porque aquí se ejecuta una vez 0 es un número
par 0 dividido entre dos es 0 entonces entramos aquí cero par se devuelve
y el return lo que hace es finalizar la función yil no yil nos permite seguir
ejecutando la función desde ese punto devuelve un resultado pero no
finaliza

la función Eso es lo que quiero que quede claro Esa diferencia piensa que
conur no creamos un objeto iterable necesariamente en el caso del ejemplo

Python LOGICA DE PROGRAMACION 232


se devuelve un str que es iterable pero no es un objeto iterador si
intentamos next con return por si se te ha pasado por la cabeza aquí te va a
dar el siguiente error error de tipo el objeto str no es un iterador aquí si
ponemos type Rango nos devuelve un objeto str eso es lo que return pero
si utilizamos una generadora con simplemente especificar este yield el tipo
es una función generadora

un objeto de tipo generador que es un objeto iterable y se puede iterar


paso por paso quiero que quede muy clara la diferencia entre lo que es un
objeto iterador o un objeto generador y un objeto iterable un objeto
generador o iterador se crea utilizando una función generadora mediante la
palabra clave yield si utilizamos en una función esa palabra clave de python
generaremos un objeto generador o iterador los generadores crean
elementos sobre la marcha y no almacenan toda la secuencia en la
memoria de golpe gracias a esto

son eficientes para manejar grandes cantidades de datos al poder hacerlo


de manera dosificada por partes a medida que esos datos se van
necesitando o con unas pausas determinadas y un objeto iterable es
cualquier objeto que se puede iterar mediante un bucle puede ser una lista
una cadena de caracteres una tupla un set un conjunto etcétera veamos las
diferencias clave el generador se crea a través de función generadora
utilizando yield un iterable se crea mediante estructuras de datos como
pueden ser listas cadenas

tuplas etcétera el generador crea cada elemento sobre la marcha y no


almacena los elementos en memoria el iterable en cambio a almacena
todos los elementos en memoria el generador una vez que el elemento es
generado no se puede volver a generar no podemos ir atrás por ejemplo
hacemos tres iteraciones con un objeto generador pues no podemos volver
a ejecutar esas partes Tenemos que continuar hacia delante hasta que se
termine de recorrer y una vez se termina se tiene que volver a generar con
una llamada más es decir tenemos que crear

otro objeto generador para poder volver a utilizarlo en cambio un iterable lo


podemos acceder múltiples veces podemos recorrer una lista entera de
arriba a abajo ir a la posición cer ir a la posición c y vol ver hacerlo en
cualquier momento el generador mantiene su estado a cada llamada cada
vez que utilizamos next se pausa y seguimos más adelante pero el estado
la posición del objeto generador queda ahí en espera hasta que ejecutemos

Python LOGICA DE PROGRAMACION 233


otra parte más gracias a esto nos permite retomar la ejecución justo
después de la última

llamada y el iterable no mantiene estado entre iteraciones cada iteración


empieza desde cero por aquí tenemos un iterable un objeto iterable no un
objeto iterador y lo podemos recorrer con por ejemplo este bucle cada una
de sus posiciones pero no podemos ir pausando la ejecución es decir no
podemos ir ejecutando ahora esta posición y cuando nosotros queramos le
decimos Pues venga ahora ejecuta esta otra parte sí que podríamos hacer
un sistema con ies y demás Pero eso no sería una buena solución en este
caso tenemos una

función de python llamada iter la cual nos permite generar iteradores


objetos generadores a partir de iterables tenemos esta cadena que es un
iterable y vamos a crear un generador a partir de ella utilizamos iter y le
pasamos el iterable y Aquí vamos a imprimir el tipo de cadena generador
tenemos ahí un iterador es otro tipo de objeto s as yator pero vamos a
probar si podemos utilizar next ponemos eso

mismo y ahí tenemos esa h y ahora después de esa pausa podríamos hacer
esto iríamos parte por parte es posible generar objetos iterables como una
lista A partir de un objeto de tipo generador esto se consigue con una de
las funciones predefinidas de conversión como puede ser list o por ejemplo
tle si queremos hacer tuplas pues dejamos esto igual y Aquí vamos a crear
la lista convertimos ese objeto que es iterable en una lista y Aquí vamos a
imprimir la lista para que lo veas tenemos esta función generadora creamos
un objeto

generador iterable Y en lugar de recorrerlo paso por paso en este caso lo


obtenemos todo en una lista hacemos esas iteraciones de manera
automática y lo incluimos en la lista pues pues teniendo esta lista que
necesitamos acceder a dos iteraciones concretas al Siete impar y al dos
par pues vamos a hacer esto lista generador posición 7 el iterador empieza
desde el cero por eso la posición de lista si va a ser si en este caso y aquí
la posición dos pues tenemos siete impar dos par podemos acceder
individualmente Med ante esta lista A

cada iteración del objeto generador que ahora ya estamos accediendo


directamente sobre la lista no sobre el objeto generador utilizando estos
objetos generadores te vas a encontrar muchas veces con la excepción
stop y duration la función next produce una excepción cuando las posibles

Python LOGICA DE PROGRAMACION 234


ejecuciones de la función generadora se han terminado y se intenta
acceder a la siguiente para este ejemplo vamos a simplificar esto Así
mismo eliminamos esto y esto También bien la primera vez tenemos un
cero la segunda tenemos un

uno tenemos un dos y qué ocurre cuando se sale del Rango esta excepción
producida en la línea 10 aquí funciona correcto 0 1 2 y el 3 ya no puede esto
Simplemente porque se ha acabado el rango podríamos decirlo de otra
forma por si lo entiendes mejor que se ha gastado la llamada la función
pero aquí Si la vuelves a llamar creas Otro objeto en este punto estaremos
Llamando a ese nuevo objeto entonces podemos seguir utilizando la
función generadora este cero se produce aquí en este último print si no
quieres producir esta

excepción cuando salgas del Rango puedes controlarla con los bloes try
except como ves aquí tema que vamos a tratar en la siguiente parte de este
curso Pero bueno de momento puedes ver lo fácil que funciona ejecuta 012
y cuando ya no tiene más rango que ejecutar la generadora me dice la
ejecución finalizó en lugar de sacar esa excepción stop iteration la tenemos
manejada por aquí con este xa primero se ejecuta esto y si en algún
momento ocurre una excepción en este caso ocurre en esta línea la 11 Pues
saltará el código del except en

lugar de finalizar de forma abrupta el programa y por aquí podría continuar


el programa sin problemas esta excepción no lo va a detener como nos ha
ocurrido siempre en todos los ejemplos hasta ahora cada vez que nos salía
una excepción por eso es muy importante que aprendas a manejar
excepciones ah

Python LOGICA DE PROGRAMACION 235


Python LOGICA DE PROGRAMACION 236
Python LOGICA DE PROGRAMACION 237
Python LOGICA DE PROGRAMACION 238
Python LOGICA DE PROGRAMACION 239
Python LOGICA DE PROGRAMACION 240
Python LOGICA DE PROGRAMACION 241
Python LOGICA DE PROGRAMACION 242
Python LOGICA DE PROGRAMACION 243
Python LOGICA DE PROGRAMACION 244
Python LOGICA DE PROGRAMACION 245
Python LOGICA DE PROGRAMACION 246
Python LOGICA DE PROGRAMACION 247
Python LOGICA DE PROGRAMACION 248
Python LOGICA DE PROGRAMACION 249
Python LOGICA DE PROGRAMACION 250
Python LOGICA DE PROGRAMACION 251
Python LOGICA DE PROGRAMACION 252
Python LOGICA DE PROGRAMACION 253
en este capítulo te voy a mostrar una breve introducción sobre lo que es la
programación defensiva la programación defensiva es la técnica de
programación que se centra en crear código que sea capaz de anticiparse
a los fallos que puedan producirse en un programa cuantas más líneas de
defensa implementas más robustos serán las técnicas de programación
defensiva se centran en prepararse para lo peor que pueda ocurrir por
parte de los usuarios o por parte de las condiciones de ejecución del propio
entorno hay infinidad de

Python LOGICA DE PROGRAMACION 254


cosas que debemos tener en cuenta tenemos que pensar como un
pesimista al final con la célebre ley de murpy en la mano si algo puede salir
mal saldrá mal Eso te lo aseguro en este caso ese pesimismo no es malo
contrariamente se convierte en una habilidad estrella el saber ver los fallos
donde otros no los pueden ver puede cons arse una gran habilidad ya que
no es nada fácil y requiere de gran experiencia a medida que te enfrentas a
diferentes fallos vas obteniendo información útil de Qué formas pueden
fallar las cosas con el

tiempo aprenderás a perfeccionar tu ojo crítico y a ver fallos en cualquier


parte fallos que no tienen por qué ocurrir pero si hay una remota posibilidad
de ello Que no te quepa duda de que en algún momento serán alcanzados
ya sea por un usuario malintencionado o por un usuario inexperto que
utilicen mal la funcionalidad propia para la que se creó cierto programa los
fallos más difíciles de encontrar pueden suponer unas de las
vulnerabilidades más grandes que se pueden crear en el mundo de la
informática ya que los usuarios suelen

ser expertos en encontrar fallos en ocasiones sin querer y otras como he


comentado de manera malintencionada alguien que programa tiene Clara la
funcionalidad de sus programas y Cómo deben utilizarse pero muchas
veces no sabe de Cuántas formas diferentes no se debe emplear su
programa ese es el problema los usuarios tienen niveles de informática
muy dispares los unos con los otros entonces Puede que haya alguno que
no sepa entre comillas utilizar bien un programa de este mal uso puede que
llegue atopar con problemas que no eran

visibles para el ojo experto del programador podríamos decir puesto que en
su lógica de programación quizás ese mal uso no estaba contemplado la
cantidad de cosas a tener en cuenta es uno de los motivos por los que los
programas siempre cuentan con Books de todo tipo que deben
solucionarse después con parches o con actualizaciones puedes controlar
si un usuario pone un valor numérico en la consola o una cadena qué
ocurre cuando un programa espera un valor numérico para operar y se le
pasa un str como Hola si no manejamos cosas

como estas que al final son las más básicas las que te estoy contando el
programa queda a Merced de que el usuario entienda o quiera
voluntariamente hacer un uso adecuado del mismo en los próximos vídeos
voy a hablar de tres áreas importantes de la programación defensiva
manejo de excepciones validación de datos y el uso de afirmaciones por

Python LOGICA DE PROGRAMACION 255


supuesto aún hay mucho más en el tema de la programación defensiva sin
embargo quiero dar un enfoque fácil de entender para quienes estáis
empezando con python en esta primera parte contemplaremos tres

palabras reservadas del lenguaje python dedicadas a este propósito se


trata de los bloques de código declarados con try except y Finally también
utilizaremos la palabra reservada Rise con la que conseguiremos lanzar
excepciones estos elementos son Realmente muy parecidos al uso que
tiene un condicional If pero Son estructuras específicas para manejar
excepciones podríamos decir que haremos condiciones de ciertos fallos y
se pueden expresar de la siguiente forma si cierta cosa falla de esta forma
hace esto en cambio Si no falla ejecútalo con

normalidad Sencillamente es decirle esto al intérprete de python la


validación de datos se basa en comprobar y asegurarse de que los datos
introducidos en el programa cumplen con ciertos criterios como pueden ser
el tipo de dato Rango válido longitud adecuada etcétera de momento
evitaremos la posibilidad de que el usuario ponga algo incompatible con
nuestro programa o con el propósito para parte de él estas validaciones las
haremos para que el programa rechace trabajar directamente con ciertas
cosas y que reconda al usuario por por donde

nosotros queramos antes ni siquiera de tener que reconducir el posible fallo


con el posible consecuente gasto de recursos extra o no haber
contemplado el fallo desde todos los ángulos posibles lo que quiero decir
es que es más seguro que una acción o dato que pueda suponer un
problema en tu programa no entre directamente dentro de él que no sea
aceptado si se acepta y se rectifica con el manejo de excepciones solo con
eso puede que a raíz de ello se encuentre otra forma de hacer un el uso del
programa no obstante también Se podrían

encontrar formas de saltarse la propia validación de modo que


implementando ambas medidas en ciertos casos siempre que sea
necesario puede ser una buena Barrera de seguridad una barrera doble
podríamos decir Ten siempre presente que nada es 100% seguro y que El
eslabón más débil son los usuarios da igual la seguridad que tenga un
programa si al final un ciberdelincuente consigue Que el propio usuario le
dé acceso con técnicas como puede ser la ingeniería social también en los
próximos capítulos crearemos afirmaciones para comprobar si

Python LOGICA DE PROGRAMACION 256


se cumplen ciertas condiciones o no esto nos ayudará tomar decisiones en
ciertos momentos E

Introducción a la depuración

antes de introducirse de lleno en la programación defensiva es conveniente


que sepas un poco sobre la depuración de errores un tema de suma
importancia para garantizar un correcto funcionamiento de los programas
no voy a entrar en todos los detalles de la depuración ya que dan para un
curso dedicado y más incluso pero sí que te daré una buena introducción
para que tengas una idea de cómo funciona ante todo este proceso será un
requisito fundamental trabajar con un vcs sistema de control de versiones
puesto que así siempre que

algo vaya mal en el proceso de depuración contaremos con todos los


cambios anteriores y un historial de depuración completo no tendremos por
qué perder nada ni estar duplicando archivos de forma manual en este
curso todavía no veremos nada de vcs pero si os interesa mucho la idea
podemos ver un curso dedicado de git por ejemplo con github Y enfocarlo
de cierta forma a python Aunque al final se puede utilizar de manera
genérica no importaría ni siquiera dedicarlo a python en sí tengo un curso
ya hecho en mi canal que tiene

algo de tiempo y no estaría mal la verdad actualizarlo un poco o hacerlo


quizás más completo La depuración es el proceso de buscar y corregir
fallos de todo tipo en el código mediante la depuración vamos a conseguir
bastantes beneficios por ejemplo reduciremos el tiempo de desarrollo en
un principio podemos pensar que con la depuración tenemos que invertir
tiempo entonces perderíamos Pero esto realmente no es así a corto plazo
perdemos algo de tiempo sin embargo esto compensa a largo plazo
evitando que de base se produzcan

problemas que posteriormente compliquen y den fallos en etapas más


avanzadas del desarrollo haciendo al final perder mucho más tiempo con la
depuración también intentamos garantizar un código más funcional nos
aseguramos de que el programa no arroje datos incorrectos o que haga
cierres inesperados coloquialmente hablando crasheos del inglés Crash así
como procurar también un buen rendimiento y experiencia para el usuario
que al final son de las cosas más importantes porque quiénes van a utilizar
el software pues finalmente los

Python LOGICA DE PROGRAMACION 257


usuarios todo lo que hacemos lo hacemos al final para los usuarios
entonces tiene que ser lo mejor posible para el usuario y con usuarios no
solo me refiero al usuario final que se sienta en un pc y lo utiliza los
usuarios puede ser también una empresa que utilice tu software para
producir algo si tu software no funciona bien no es óptimo Pues esta
empresa funcionará peor con la depuración también podemos mejorar la
calidad del código ya que comprobaremos que todo sea sólido pero
sencillo de mantener IL legible también es decir No

solo tenemos que dedicarnos a buscar errores sino a perfeccionar ciertas


cosas que no estén del todo óptimas y otra ventaja considerable de la
depuración es el aprendizaje del código ya que al estar analizando el
código en profundidad y cómo funciona su comportamiento vamos a ganar
muchos conocimientos sobre el propio software y sobre la programación
en general es un buen método de estudio al final podríamos encontrar más
ventajas de la depuración pero creo que con esto ya te haces una idea de
lo importante que es

la depuración puede volverse un tema muy complejo en muchos casos va a


requerir de una vasta experiencia así que hab problemas que con poca
experiencia seguramente no puedas solucionar En estos casos te
recomiendo que siempre vayas manteniendo la calma y que hagas los
descansos que sean necesarios hay problemas que se solucionan
haciendo un reset en tu mente sal a pasear descansa o duerme haz algo
que te distraiga y muchas veces al final encontrarás la solución a
continuación te detallo diferentes fases que puedes seguir en el

proceso de depuración tengo que decirte que este proceso las fases que te
voy a comentar pueden variar de orden dependerá del propio problema y
cómo lo tengamos que afrontar por ejemplo voy a dejar la documentación
para el último apartado pero no implica que no debas estar documentando
todo el proceso desde el principio primero podríamos empezar por la
reproducción del fallo hay que identificar un posible fallo hay que analizarlo
y describirlo meticulosamente habrá que saber cuál es el comportamiento
de este fallo si está

dando unos resultados incorrectos si hace que el programa deje de


funcionar etcétera una vez tenemos localizado El problema vamos a
establecer una serie de condiciones que nos ayuden a reproducir el fallo ya
que es difícil luchar con un fantasma que no puedes ver estas condiciones
se basarán en cosas como las entradas del usuario es decir la información

Python LOGICA DE PROGRAMACION 258


externa que entra al programa las posibles configuraciones con las que
trabaja el entorno donde se está ejecutando etcétera se trata al final de
intentar Reproducir el fallo en

las condiciones lo más parecidas posible a cuando se originó el problema


finalmente Reproducir demos el error de la forma más fiel posible al poder
reproducir un fallo concreto sabemos mucho mejor por dónde empezar a
atajarlo una vez hemos reproducido el problema sabemos cuándo ocurre y
Cómo ocurre bajo ciertas condiciones estas son pistas para saber por
dónde empezar a identificar errores esta vez directamente ya en el código
en esta fase llevaremos a cabo un análisis del código buscando Dónde se
produce errores

o fallos aquí se buscarán errores de lógica de sintaxis semánticos de


ejecución etcétera para este propósito utilizaremos herramientas de
depuración que nos permitan analizar el programa y todos sus elementos
paso por paso los puntos de interrupción nos serán de gran ayuda en esta
fase para ir viendo cómo se comporta el programa en ciertas acciones
concretas las pruebas unitarias también nos vendrán bien para probar
partes concretas del programa y no nos centraremos solo en el programa
de forma global una vez se identifica la causa

del problema en el propio código fuente se tiene que implementar una


solución para ello se modificará el código que haga falta o se realizarán
ajustes de ciertas configuraciones que nos estén causando problemas que
habrá que corregir si eran parte del problema o el problema en Sí al aplicar
estas soluciones es importante tener muy en cuenta el impacto que puedan
tener para minimizar o evitar nuevos fallos una vez terminado todo lo
anterior habrá que realizar pruebas exhaustivas para determinar si el
problema Está realmente

resuelto y que no comporta nuevos fallos al final habrá que probar el


software en diversos escenarios ya que puede que funcione bien en unos
concretos y que presente problemas en otros en resumen hay que
asegurarse de que el problema sea resuelto y que está hecho que no esté
incumpliendo las expectativas propias del programa No solo en fallos Por
ejemplo si tenemos un programa que busca ofrecer un gran rendimiento
con ciertas acciones la solución del problema no debería hacer que se
pierda esta expectativa es decir solucionamos

Python LOGICA DE PROGRAMACION 259


un problema que tiene el programa pero lo hacemos mucho más lento con
esa solución al final esta solución sería una mala solución la
documentación es una parte importante que debe estar presente en todas
las fases del desarrollo tal y como dicho al principio una documentación
bien hecha y completa es una gran fuente de información para todos los
aspectos del desarrollo no solo para la depuración en cuanto a la
depuración tendremos que ir documentando cosas como qué tipo de fallo
era cuál o cuáles exactamente Por qué se producían

En qué escenarios concretos Cuál fue la solución que aplicamos Qué


impacto tuvo si afectó a otras áreas del programa etcétera toda esta
información podrá ser útil en el futuro ya sea para Añadir mejoras sin
reproducir un fallo anterior o bien para investigar nuevos fallos de cuertos
que podrían estar relacionados con el problema o con su solución Espero
que te haya gustado este capítulo si es así apóyalo Como Puedas pa

Tipos de errores en programación

a la hora de desarrollar software podemos cometer muchos tipos de


errores diferentes errores como los de sintaxis errores de nombres
incorrectos o que no existen fallos de lógica errores semánticos también
errores En tiempo de ejecución Hay un montón de cosas a tener en cuenta
empecemos por los errores de sintaxis este tipo de errores suele ser los
más fáciles de resolver ya que muchos de los programas de edición de
código cuentan con numerosas ayudas para resolverlos son los errores por
escribir código con una sintaxis

incorrecta en python la sintaxis de este ejemplo no es válida Entonces nos


suelta este syntax error sintaxis inválida este tipo de errores se solucionan
muy fácilmente puesto que tenemos numerosas ayudas ya sea por el
intérprete o por el programa con el que escribimos código el intérprete nos
señala el elemento concreto en la línea concreta y demás y el tipo de error
concreto y luego el programa con el que desarrollamos tiene numerosas
ayudas por ejemplo aquí me sale el error me sale por aquí que se esperaba
esto me marca Dónde está el

error exactamente el archivo que está con error también aquí si tenemos
varios archivos también los podremos ver de otro color porque tienen un
error la solución para este tipo de errores pues escribir una sintaxis
correcta así de sencillo Y en este caso deberíamos definir a y b pues
vemos que ahora ya el problema se ha resuelto los errores de nombre son

Python LOGICA DE PROGRAMACION 260


aquellos que ocurren cuando llamamos a identificadores que no existen por
ejemplo esto variable es un nombre que no existe no está definida
entonces me da un tipo de error

name error error de nombre para solucionar este problema simplemente


Tendremos que ver qué nombres nos dan el error y si es porque
efectivamente no existen en el código o bien si no son alcanzables en el
punto en el que se produce el error eso hay que tenerlo en cuenta los
errores de lógica no tienen por qué ser muy complicados de resolver puede
que sí puede que no depende habrá que ver cada caso y la profundidad
que tienen elementos implicados la longitud del código y ilógico podríamos
decir aparte de la claridad del mismo a la hora de

escribirlo voy a escribir un fallo de lógica y a ver si lo encuentras a medida


que lo voy escribiendo bien Este es el código si quieres pausa el vídeo
míralo bien y a ver si encuentras ese fallo de lógica si ejecutamos esto
vemos que nos aparece un bucle infinito por una lógica mal planteada no
hay un error el programa puede continuar se ejecuta pero no está haciendo
seguramente lo que queremos que haga pues a esto se le llama fallo de
lógica y el fallo de lógica en este caso se soluciona añadiendo una
expresión

para incrementar el valor del iterador en ningún momento incrementa la


condición se cumple número es menor que cu pero no tenemos ningún
mecanismo para ir cambiando el valor entonces nunca va a cambiar ese
cero y por lo tanto este bucle se vuelve infinito pues ponemos algo como
esto un incremento en uno por ejemplo y ya está fallo de lógica
solucionado si es que realmente lo que queríamos hacer era esto habrá
veces por supuesto en que los fallos de lógica sean muy difíciles de
Reproducir y con esto me refiero a

encontrar ese fallo ya que sabrás que hay aplicaciones que son muy
complejas y los desarrolladores no encuentran el fallo hasta que se
produce cuando ya hay un montón de usuarios utilizando ese software te
pongo un ejemplo sencillo las funciones decoradoras hacemos que una
función sea útil para reutilizar código en diferentes funciones o métodos
entonces puede que la lógica de esta función decoradora funcione con
unas funciones o métodos que vayamos Decorando pero que no lo haga de
la misma forma en otros casos y no nos

Python LOGICA DE PROGRAMACION 261


demos ni cuenta y hasta que no se utilice esa parte quizás de esa manera
específica del programa No encontraríamos ese fallo de lógica por eso
puede ser o muy fácil como en este ejemplo o puede ser muy complicado
los errores semánticos son aquellos que aún teniendo una sintaxis correcta
No aplican bien el sentido de las declaraciones de programación por
ejemplo aquí tenemos una función de suma muy sencillita y la queremos
usar pues la llamamos no sin problema Qué espera dos argumentos pues
vamos a dárselos bien ha

funcionado no hay ningún fallo me aparece ese Hola mundo pero realmente
esta función estaba diseñada para concatenar yo diría que no en principio
Mi idea no era esa era para sumar dos valores numéricos Pues si
efectivamente no está diseñada para concatenar habrá que solucionar el
fallo simplemente escribiendo los argumentos adecuados por eso es muy
importante la documentación indicar si trabajamos con más personas o
para recordarlo nosotros mismos De qué forma se tiene que utilizar una
función Ya que en este caso

se ve muy evidente Pero puede haber una función que no sea tan evidente
si nos explica su uso otro ejemplo muy fácil de entender para este tema es
el lenguaje de marcado html5 con sus etiquetas semánticas ah etiquetas
especiales destinadas a sustituir en muchos casos a la etiqueta genérica
dip que se utilizaba en versiones anteriores para todo y gracias a estas
etiquetas semánticas podemos dar un significado semántico a las
diferentes secciones de un sitio web y lo podemos organizar al igual que
hacíamos con los dip pero de

una manera más declarativa más expresiva al final semántica una etiqueta
semántica de html puede ser heer que está diseñada para añadir el
contenido del encabezado de lo que podría ser por ejemplo un artículo sin
embargo no hay ningún mecanismo de sintaxis involucrado en esta
semántica por lo que podrías hacer mal uso de ella y poner estas etiquetas
como pie de página en lugar de utilizar la etiqueta semántica destinada a
ello foder Pues bien si alguien no conoce bien el funcionamiento y
significado de estas etiquetas

seguramente no la implemente de manera correcta y es muy fácil de hacer


porque no producirán fallos al menos fallos a la vista los errores En tiempo
de ejecución son aquellos que ocurren mientras el programa se encuentra
en ejecución el código que tienes en pantalla es correcto en cuanto a
lógica semántica y sintaxis todo lo que hemos visto anteriormente lo

Python LOGICA DE PROGRAMACION 262


cumple esa función se está utilizando al final para lo que corresponde que
es Para pasarle un dividendo y un divisor ejecutamos esto le vamos a dar
esos valores de entrada por ejemplo 10

Divo 3 perfecto sin embargo mientras está ejecutando el programa si


pongo un valor incorrecto me sale un error en tiempo de ejecución ha
ocurrido mientras el programa se estaba ejecutando no es un error que
haya producido por el código en sí sino por los datos de entrada y pueden
producirse por otros factores esto es solo un ejemplo se pueden producir
errores de diferentes tipos en tiempo de ejecución por ejemplo dividir 10
ent 0 que nos produce un error de división por c porque no se puede dividir
entre cero muchos de los fallos en tiempo de

ejecución como estos que te mostrado se pueden solucionar con el manejo


de excepciones o con la validación de datos tem más que verás en los s

Resolución de errores y excepciones con Python

las excepciones pueden ocurrir en muchas ocasiones tener en cuenta todo


lo que puede generarlas en un programa hará que sea mucho más Sólido y
que tenga capacidad de responder ante muchas situaciones distintas las
excepciones son eventos que provocarán una interrupción del flujo de
ejecución de un programa si no son manejadas las excepciones no son los
únicos errores que se pueden producir en un programa no hay que
identificar como que un error es equivalente a una excepción una
excepción es un tipo de error o un

evento producido a partir de un error el término error puede ser utilizado


más ampliamente Es cierto que una excepción se puede considerar un tipo
de error pero no es cierto que todos los problemas que ocurren en el
código sean excepciones Recuerda que había hasta errores de lógica o
semánticos que no arrojan excepciones pero sí datos erróneos por ponerte
un par de ejemplos esto te lo explico para que tengas en cuenta que no
todos los errores pueden ser manejados directamente en el código y para
que hablemos con

propiedad empecemos por el siguiente ejemplo en pantalla puedes ver una


excepción por error de sintaxis el error se produce si te fijas Por qué le falta
el nombre y el intérprete de python me marca Dónde está el problema me
dice que el paréntesis que que este paréntesis es una sintaxis inválida Esto
me lo dice porque está tomando este paréntesis como identificador y no es
una sintaxis válida en python puesto que ya nos rompe la zona de

Python LOGICA DE PROGRAMACION 263


parámetros y todo y produce como desencadenante otros fallos como
sangría inesperada

etcétera la información que nos da el intérprete es acertada nos señala


Dónde está el fallo pero no nos dice exactamente qué es el problema nos
dice te falta el nombre de la función pues este tipo de fallo se solucionará
con la experiencia con lo que ya sabes Hasta ahora tienes la experiencia
suficiente como para reparar este error y lo vas a hacer mediante tus
conocimientos Incluso si se complicas mucho podrías buscar una solución
consultar a alguien o investigar más por tu cuenta este código es muy
sencillo el fallo es muy fácil de

ver pero supongamos que llegas a un código más complejo y no lo Puedes


resolver porque no encuentras el fallo no sabes qué empezar a buscar ni
qué consultar porque no lo estás encontrando Pues entonces llegados a
ese punto puedes y deberás recurrir a las herramientas de depuración vas
haciendo pruebas y vas probando el código como te mostré anteriormente
vamos a ver otro ejemplo por aquí me solicita dos números para hacer una
suma si le ponemos dos valores numéricos como ya sabes no hay
problema sin embargo si a la función int esta de

aquí se le pasa una letra Esto es lo que ocurre nos suelta un value error
literal inválido para la función int con base 10 y nos dice exactamente cuál
es el problema este simple código se desmorona como un castillo de
naipes con una simple letra en la consola es así de frágil pero por suerte
gracias a las técnicas de la programación defensiva podremos anticiparnos
a este tipo de fallos otra forma de de solucionar problemas que tenemos
ahora mismo al alcance de la mano son las inteligencias artificiales cuando
tengas problemas en

el código puedes pedirle a una Inteligencia artificial que mire a ver si te


encuentra el fallo deberás tener en cuenta que no deberías trabajar con
cierto código sensible directamente con la Inteligencia artificial si estás
trabajando por ejemplo con una empresa es probable que no te dejen pasar
cierto código directamente la Inteligencia artificial por temas por supuesto
de seguridad y en muchas otras ocasiones ni te va a encontrar el problema
ni te lo va a solucionar bien y además Debes saber qué es lo que estás
haciendo

porque si no lo sabes es posible que te cuele algún agujero de seguridad o


cualquier otra cosa vamos a hacer un experimento vamos a gemini a chat

Python LOGICA DE PROGRAMACION 264


gpt a la ía que sea cada una te puede dar resultados diferentes y
probaremos de solucionar el código de la función sin nombre a ver si nos lo
arregla supongamos que no sabemos Dónde está el fallo no lo estamos
viendo y le pedimos ayuda con un prom como este Puedes decirme dónde
está el fallo le especificamos que esto es código python por si acaso y le
pasamos ahí la función

tal cual da igual las tabulaciones aquí te entenderá seguramente le damos a


enviar y a ver qué pasa el fallo en el código python está en la definición de
la función por aquí me dice que falta el nombre deben tener un nombre en
este caso es un problema sencillo y me lo resuelto bien importante sobre lo
que te he dicho acuérdate las ia te pueden venir muy bien para solucionar
problemas puntuales Trozos de código pequeñas ayudas para recordar
cómo se hacía cierta cosa pero en principio deberías saber perfecta ente lo
que estás haciendo cualquier

código que te dé la ia deberías poder analizarlo de arriba abajo y saber lo


que hace cada línea si implementas código sin saber exactamente todo lo
que hace y si está bien hecho con buenas prácticas o no puedes tener
muchos problemas así que hazle caso a esto que te dice por aquí usa el
código con precaución ya te lo avisa esto seguramente ya la mayoría
conocéis Cómo funcionan y lo que debéis tener en cuenta Pero bueno lo
explico por si alguien no lo sabe ya que es algo importante voy a hacer otra
prueba que

hace unos meses me funcionó mientras escribía el libro de python


avanzado y es darle un prompt incorrecto de primeras Como por ejemplo
este en programación true and true es igual a false es incorrecto
normalmente true and true en valores es true Pues aquí me corrige dice
que true and true no es igual a false es igual a true bien Pero y si le
contradigo le digo con mucha seguridad te equivocas lo he comprobado
ahí lo tienes me da la razón en algo que estoy equivocado en python yo no
le sobre python para empezar lo he dicho en

programación Pero bueno true and true si es igual a false pues lo dicho te
puede venir muy bien para solucionar cosas para seguir aprendiendo para
agilizar un poquito más ciertos trabajos repetitivos y demás Pero bueno
teniendo en cuenta estas cosas por eso es importante que aprendáis
podéis aprender en conjunto con la ia and ciertas dudas Por qué cuando
ejecuto esto exactamente me sale esto pues te dirá una serie de cosas e

Python LOGICA DE PROGRAMACION 265


intenta comprobarlas intenta comprobar que todo lo que te va diciendo es
cierto ya sé

que yo en mi caso aquí he forzado el fallo ya que de primeras no se ha


equivocado me lo ha dicho correcto esto de aquí pero claro si fuerzas el
fallo Pues bueno le invitas a cometer fallos pero es que puedes que tú
realmente pienses que se está equivocando evidentemente por una
información que tuvieses anterior que sea incorrecta le contradigas y te
diga sí tienes razón Espero que te haya gustado este capítulo si es así
apóya

Python LOGICA DE PROGRAMACION 266


Tipos de excepciones en Python

Contamos con una gran cantidad de tipos de excepciones veamos


brevemente algunas de las más comunes con unos cuantos ejemplos
prácticos la excepción name error es producida cuando se intenta acceder
a una variable o a una función que no ha sido definida o que no es
alcanzable según el ámbito para producir una excepción de este tipo basta
con Llamar a una inexistente por ejemplo con un print así de sencillo lo
producimos o incluso tal y como indicado que esté fuera del alcance en
este caso también nos dará

ese mismo error porque aquí a no es alcanzable la excepción sx error es


producida cuando el intérprete detecta una palabra con una sintaxis
incorrecta puede ser una palabra mal escrita por ejemplo o también que
falte yo que sé un paréntesis a la llamada una función por ejemplo Aquí
vamos a poner cualquier cosa y nos olvidamos este paréntesis y ahí
producimos ese syntax error la excepción value error ocurre cuando le
pasamos a una función o método algún valor de entrada Mediante los
argumentos incorrecto veamos un ejemplo

Python LOGICA DE PROGRAMACION 267


vamos a poner una variable y aquí con la función predefinida int vamos a
intentar transformar el valor de saludo pues aquí Aparentemente no
tenemos ningún fallo pero nos aparece ese value error porque estamos
pasando un dato de entrada incorrecto para la llamada la función in
básicamente un error Por valor incorrecto la excepción type error ocurre
cuando una operación o una llamada a función o método se le pasa un tipo
de dato incorrecto para lo que va a esperar podemos ver un ejemplo de
esto con la función predefinida

suom esta función predefinida suma varios valores de un objeto por


ejemplo tenemos una lista con tres números Pues nos los va a sumar
automáticamente por ejemplo esto le pasamos aquí lista y se realiza la
suma ves me sale 40 automatiza esa suma que el equivalente sería a poner
aquí 10 + 20 + 10 después de resolver las posiciones de índice vale eso es
lo que hace zoom Pero qué pasa si a esta función le pasamos un dato de
entrada incorrecto que no puede sumar Como por ejemplo Hola un String
este error de tipo nos dice tipo

o tipos de operandos no soportados para este operador más de aquí el que


suma o concatena int ist el error explicado de una forma más simple es
Sencillamente que no podemos utilizar el operando str como es Hola para
esta función y este tipo de excepción no solo se hace en argumentos de
entrada para las funciones sino que también lo podemos producir en una
simple variable esto en otros lenguajes de programación puede ser que te
funcione pero en python así No aquí producimos ese type error
exactamente el mismo error básicamente

es que no se puede utilizar este operador con operandos int y str a la vez la
excepción Index error aparecerá cuando se haga referencia a un índice
inexistente de un elemento iterable como puede ser una lista una lista
Como por ejemplo esta intentamos acceder a la posición de índice número
cinco que no existe en esta lista y nos sale ese error de índice índice de
lista fuera de Rango la excepción key error aparece cuando intentamos
acceder a una clave de diccionario inexistente tenemos ahí ese diccionario
que puede

estar perfectamente vacío y en este print intentamos acceder a una clave


que no existe Pues en este caso se produce ese key error sobre clave
cualquiera que no existe esta excepción ocurre cuando hacemos referencia
un atributo inexistente vamos a poner una lista vacía se trata de un objeto
de la clase list como ya sabes entonces si ahora intento utilizar con este

Python LOGICA DE PROGRAMACION 268


objeto un método inexistente en su clase Voy a recibir un error por atributo
inexistente por ejemplo lista punto aquí me salen los diferentes métodos
pero me

voy a inventar uno Pues en este caso forzamos ese error el objeto de tipo
lista no tiene la atributo inventado la excepción por módulo no encontrado
ocurre cuando falla la importación de un módulo puede ser un nombre
incorrecto de archivo que la ruta esté mal o que ni siquiera se haya creado
o instalado dicho módulo a ver voy a probar la biblioteca p game que no
estoy seguro si la tengo vale me dice que no se ha podido resolver parece
que no pues ahí tenemos ese error porque este módulo o módulos
correspondientes a p game no son

accesibles Sencillamente porque no está instalado Pues aquí si ahora


pongo pip install p game se instalará en mi sistema y se resolverá la
importación Pero bueno Esto es para que veas se produce este tipo de
error pues una vez instalado ya podemos ver que el error desaparece y
podemos ejecutar sin problemas la excepción de archivo no encontrado
puede ocurrir cuando se especifica un nombre de archivo o ruta incorrecta
por ejemplo con esto si ejecuto con esta ruta que no está en mi sistema
este archivo no está no

existe pues recibiré ese error porque el archivo no está no se encontrado


no existe tal archivo o directorio concretamente nos dice esto la excepción
por división por cer0 ocurre cuando intentamos dividir entre cer0 por
ejemplo esto la excepción de sistema operativo se puede producir cuando
ocurre un fallo al acceder a un archivo o a una carpeta en el sistema
operativo por ejemplo utilizando el símbolo asterisco en el nombre que no
está permitido en este caso nos sale unos error argumento inválido
concretamente

el nombre esto se solucionará tan fácil como poner un nombre de archivo


como este y ahora me sale otro error pero es porque no se encuentra el
archivo pero ya no tenemos un os er la excepción indentation error suele
ocurrir cuando empezamos a aprender python o cuando copiamos código
de alguna parte por no tener el mismo número de espacios en la
indentación por ejemplo aquí este print debería estar indentado en este
caso me sale dicho error y aquí en las indentaciones podemos poner
espacio por convención se ponen cuatro

Python LOGICA DE PROGRAMACION 269


en python así pero funciona si ponemos uno perfectamente y aquí
debemos seguir respetando en el mismo bloque el mismo número de
indentaciones en este caso no tenemos problemas si ponemos otro bloque
en el mismo archivo podríamos poner diferente número sin ningún
problema también y funcionará correctamente esto es muy mala práctica
porque te deja un código muy mal escrito pero para que veas que en el
bloque se busca que tenga el mismo espacio pero no necesariamente en
todo el archivo pero claro qué ocurre si en el mismo bloque Pues tienes

uno con un espacio y otro con dos pues ahí sí que tienes esa indentation
error porque estamos creando realmente dos niveles diferentes de
indentación Espero que te haya gustado este capítulo si es así apóyalo
Como Puedas para que siga subiendo mucho más co

Python LOGICA DE PROGRAMACION 270


Python LOGICA DE PROGRAMACION 271
Python LOGICA DE PROGRAMACION 272
Python LOGICA DE PROGRAMACION 273
Python LOGICA DE PROGRAMACION 274
Python LOGICA DE PROGRAMACION 275
El manejo de excepciones con TRY, EXCEPT y FINALLY

De qué forma las puedes manejar con los bloques de código try except y
Finally el bloque try es el bloque de código que va a intentar ejecutar cierto
fragmento de código lo hará siempre que no salte una excepción vamos a
colocar de esta manera dos puntos y por aquí escribiríamos el bloque de
código tiene que ir por supuesto indentado y aquí tenemos que hacer caso
a esto la instrucción try debe tener al

menos una cláusula except o Finally es decir un bloque try no puede ir


nunca solo tiene que ir con un except o con un Finally y esto realmente es
porque si no carecería de sentido utilizar try porque try lo que hace es
intentar ejecutar cierto código al igual que hacemos en una hoja cualquiera
de python pues con este bloque se intenta y con el except lo que vamos a
hacer es darle un código alternativo que se va a ejecutar en el caso de que
este código falle intenta hacer esto si no en caso contrario si me salta una
excepción hace esto de aquí

así de simple es el funcionamiento el bloque except no puede ir solo sin try


es dependiente también el bloque Finally que veremos a continuación sería
lo mismo como un Else que no puede ir sin un If y esto podríamos verlo

Python LOGICA DE PROGRAMACION 276


como If y Else si se cumple esta condición haz esto y en caso contrario
hace esto otro pero enfocado a si falla o no falla finalmente vamos a
escribir el bloque Finally este bloque está siempre sujeto a un bloque try y
opcionalmente a un bloque except este bloque se va a ejecutar siempre
independientemente de

si se ejecuta el try o el except da igual lo que ocurre aquí se ejecuta este o


este pero luego finalmente se ejecuta Este sí o sí haya error o no haya error
es un bloque opcional no hace falta que lo pongamos es por si necesitamos
hacer algo después de manejar la excepción con estos dos bloques de aquí
el bloque Finally se utiliza mucho para tareas de limpieza tales como cierres
de recursos como sockets archivos conexiones a bases de datos acciones
de limpieza de memoria etcétera entonces estamos ante un elemento que
se suele utilizar para

prácticas algo avanzadas pero que se puede utilizar de forma muy sencilla
como vas a ver en este vídeo empecemos manejando una excepción por
ejemplo la excepción Zero division error Aquí vamos a crear una función
dividir dentro de ella Vamos a manejar posibles situaciones Aquí vamos a
intentar realizar la división este sería el típico código que meteríamos
directamente en la función pero ahora lo ponemos aquí en este bloque para
manejar posibles fallos que

ocurran con dicho código vamos a llamar por aquí a la función y vamos a
dividir 10 en 3 bien 3 con 33 funciona correcto Pero y si divido 10 entre 0
en este caso no ocurre nada porque se le está pasando a este except pero
vamos a quitarlo Para que veas su efecto vamos a quitar todo esto y
probemos de ejecutarlo así este código sin manejar las excepciones
produce esta excepción concreta no se puede dividir por cer0 entonces lo
que queremos conseguir con el manejo de excepciones es que si el usuario
intenta dividir por cero se

maneje el código de alguna manera para que no se produzca este error y


finalice el programa de forma abrupta sino que se maneje por ejemplo
indicándole al usuario no se puede dividir por cero o haciendo cualquier
otra cosa alternativa deja esto como estaba y ahora vamos a manejar esa
excepción concreta pues pondremos esto mismo Z Vision error si hay una
excepción se ejecutará esto Pues de momento un print para avisarle
ejecutamos y vemos que en este caso me sale el código de aquí no se
realiza la operación porque no se puede nos produce

Python LOGICA DE PROGRAMACION 277


esa excepción pero gracias a este except la manejamos y le damos una
salida alternativa una solución problemas se solucionan y luego tenemos el
Finally en este caso lo vamos a utilizar simplemente para mostrar un
mensaje pero podemos hacer un millón de cosas en este caso no se puede
dividir por cero sale el except y luego se ejecuta esto el Finally el try no se
ha podido ejecutar porque se produce esa excepción aquí al intentar dividir
entre cero con ese divisor por culpa de este cero de aquí y luego tenemos
el Finally que

simplemente se ejecuta Sí o sí si ponemos un valor correcto el código del


try se puede ejecutar con normalidad y luego pasamos al Finally el except
se ignora porque no se ha producido la excepción hasta esto todo muy bien
pero qué ocurre si hago una excepción que no esté controlada aquí
estamos controlando la excepción por división por cero pero por ejemplo
intento pasar un valor de entrada incorrecto un str cuando se está
esperando un valor numérico Pues aquí probaremos eso y nos sale un type
error es decir se ha

intentado hacer la operación y no se ha podido manejar porque no hay


ningún un bloque que maneje concretamente esa excepción en este caso
Tendremos que manejar más posibles excepciones por lo tanto tenemos
que anticiparnos a todos los fallos que pueda cometer un usuario esto con
la experiencia irá Sabiendo muchas veces Qué tipos de excepciones Tienes
que controlar y si no a prueba de ensayo y error a medida que vayan
ocurriendo errores los irás solucionando en python se nos permite manejar
de forma general todas las excepciones esto

lo hacemos creando un blo except sin indicar un tipo de excepción


concreta es decir así except a secas si ejecutamos esto se maneja tanto
esta excepción de tipo type error como la de división por cero o cualquier
otra el problema aquí es que cuando dividimos por cer0 el mensaje que nos
aparece es acertado no se puede dividir por cero pero cuando hacemos
esto no estamos avisando al usuario correctamente porque Igualmente me
dice no se puede dividir por cer0 y no es lo que estoy haciendo aquí Esto
es para que veas que en este

caso hiciésemos lo que hiciésemos si aplicamos una solución concreta


para un tipo de fallo y ocurre otro que no esté contemplado pues podemos
confundir al usuario o aplicar una mala solución que sea incorrecta para
cierto problema específico lo que quiero decir con esto es que es mejor es
recomendable que en lugar de utilizar el manejo general de excepciones

Python LOGICA DE PROGRAMACION 278


vayas utilizando varios bloques except para contemplar los diferentes tipos
de fallos por ejemplo en este caso podríamos hacer esto utilizar dos
bloques except para

cada tipo de excepción en el caso de que hagamos esto un type error nos
salta la solución de este except valor incorrecto Pon un número y en el
caso de que ponga un cero se produce esa otra excepción no se puede
dividir por cero con esto hemos generado un programa más defensivo
contra entre comillas los ataques del usuario ataques seguramente por
error por no saber utilizar bien el programa o a veces de forma
intencionada para intentar aprovechar en algo del programa si quieres
Añadir más líneas defensivas para otros posibles fallos

que pueda cometer el usuario puedes hacerlo solo tienes que determinar
con Ingenio y experiencia la ley de murpy Busca todos los posibles fallos
que podrían cometerse en tus programas No dejes agujeros en líneas
defensivas así crearás programas mucho más flexibles y robustos a la vez
Espero que te haya gustado este capítulo si es así apóyalo Como Puedas
para que siga subiendo mu

Python LOGICA DE PROGRAMACION 279


Python LOGICA DE PROGRAMACION 280
Python LOGICA DE PROGRAMACION 281
Python LOGICA DE PROGRAMACION 282
Python LOGICA DE PROGRAMACION 283
Python LOGICA DE PROGRAMACION 284
La validación de datos en Python

ya has visto lo que son las excepciones estas las podemos manejar cuando
ocurren pero también podrás evitar directamente que ocurran mediante la
validación de datos lo que veremos en este capítulo la validación de datos
es el proceso de comprobación en el que se verifica que los datos cumplan
con los requisitos especificados gracias a la validación podremos procesar
datos más precisos íntegros consistentes reduciremos el tiempo Y gasto de
recursos ofreceremos una mayor seguridad etcétera gracias a la validación
la calidad de los datos

mejora ya que podemos tener un control preciso sobre cómo se manejan el


tiempo Y gasto de recursos se mejora en ciertas validaciones al evitar que
se procesen y manejen ciertas excepciones Y además que se tengan que
realizar tareas extra con un coste de tiempo de ejecución y recursos del
propio sistema en cuanto a seguridad esta se puede mejorar al controlar
ciertos tipos de datos podemos evitar que alguien con Malas intenciones o
por accidente comprometa la seguridad del Software o incluso si llegase al
sistema en programación hay muchos tipos

de validaciones para diferentes casos algunos como la validación de


longitud validación de Rango de tipo de dato etcétera A continuación

Python LOGICA DE PROGRAMACION 285


vamos a ver un par de métodos para manejar validaciones con ejemplos
prácticos lo harem por un lado mediante el manejo de excepciones y con
una flag que podemos traducir al español como bandera por aquí tienes
una sintaxis general de lo que sería una posible validación mediante el
manejo de excepciones por un lado intentaremos validar algo en el bloque
try Y si esto no valida se pasará el flujo de

ejecución al bloque xer que manejará la excepción que ha producido el


código que no ha validado veremos ejemplos prácticos para izar esto otra
forma de plantear la validación es mediante una bandera una bandera es
una variable con un valor buleo que va a servir de indicador para marcar el
estado de la validación hay diversas formas o sintaxis de hacer las
validaciones Yo te iré enseñando unas cuantas en este capítulo Pero por
supuesto no las tomes como las únicas formas correctas que existen Esta
es una posible sintaxis que

puedes utilizar para validar con bandera en esta sintaxis tenemos una
bandera que indica que por defecto el estado de la validación Es falso que
no la ha pasado es decir hasta que no se comprueba la validación es
negativa después en el código hay un While not que se ejecutará
indefinidamente hasta que la bandera pase a un estado verdadero es decir
mientras la bandera no valide seguimos intentando hacer esto de la
validación una vez la bandera pase a estado verdadero true la validación
concluirá y saldremos de este bucle habiendo

validado para que la bandera pase a un estado true es necesario que la


expresión de If sea true mientras esto no ocurra se seguirá ejecutando el
código del els y digo que la expresión del If tiene que ser true porque
tenemos ahí la bandera que se cambia estado true en el propio If ahora que
ya tenemos dos formas distintas de validar cosas empecemos a ver
validaciones específicas con ejemplos prácticos Comencemos con la
validación de tipo de dato en este tipo de validación manejaremos
validaciones con tipos de datos como los in float str

etcétera vamos a hacer esta validación de tipo de dato con manejo de


excepciones empecemos Este ejemplo con una sola línea de código una
entrada de datos de tipo int ejecutamos este código y ponemos una letra
nos sale un value error la excepción value error ocurre cuando se pasa un
valor de entrada incorrecto Por ejemplo si a la función in no se le pasa un
valor str con un número en tero se generará un error de este tipo pues lo

Python LOGICA DE PROGRAMACION 286


has visto con una letra pero también se puede producir con un valor
decimal de tipo

float para empezar ya sabemos que tenemos que manejar este tipo de
excepción que nos puede ocurrir lo haremos con un try except intentamos
pasar esta entrada pero en caso de que ocurra el fallo manejamos ese
value error bien ponemos un valor 10 por ejemplo correcto ponemos un
valor decimal 10 con5 me salta la excepción debe ser un número entero
funciona bien y una letra Pues también funciona bien hemos manejado ese
value error ahora después del manejo vamos a seguir con código posterior
por ejemplo un print a

continuación un print que ya está fuera de este manejo vale a ahora si


ponemos una edad si el número es entero funciona bien pero vamos a
poner por ejemplo 32 con1 aquí me aparece otra excepción diferente name
error la variable d no está definida aquí tenemos un problema si nos fijamos
por aquí ha saltado la excepción value error al ponerle ese valor decimal el
valor debe ser un número entero y a consecuencia de esto no se ha
ejecutado nunca el bloque try por lo tanto no se ha declarado nunca la
variable edad y como consecuencia en la línea 6

edad no está definido aquí podemos manejar esta excepción añadiendo


otro conjunto try except para este print por supuesto hay otras formas Pero
te quiero llevar por aquí para que entiendas el punto en el caso de que
edad no llegue a estar definida por lo que pueda ocurrir aquí pues
manejaremos esto este name error y aquí podemos poner pas o informar
de que se ha producido un error lo que sea da lo mismo bien Ahora vamos
a poner de nuevo 32 con1 un decimal para que ocurra esta excepción el
valor debe ser un número

entero y ya está llegamos aquí a este except porque se ha producido ese


name error en este punto se ha intentado pero no se ha podido y llegamos
al pass que lo que hace es no sacar nada vamos a informarlo mejor bien 32
con1 el valor debe ser un número entero la variable nombre no se ha
definido ves se está ejecutando finalmente esto te habrás dado cuenta
seguramente que esta solución es muy pobre y al final vamos a tener un
código que va a estar lleno de bloes try except try except y va a ser un
auténtico caos

Además de que la solución es pobre en el sentido de que no damos una


buena salida alternativa el programa no hace lo único que tiene que hacer

Python LOGICA DE PROGRAMACION 287


que es mostrarle un mensaje al usuario con la edad algo tan simple ya no lo
hace para empezar soluciona los fallos los esquiva Por así decirlo pero no
cumple con su cometido tampoco se asegura el programa de primeras que
el usuario introduzca ya una edad correcta Pues bien para solucionar esto
añadiremos un bucle indeterminado While true que Solo finalice cuando el
usuario ponga un

valor entero es decir vamos a validar la entrada ahora sí que vamos a


utilizar ya la validación de datos esto lo vamos a borrar ya no lo
necesitaremos y dejaremos este print así bien y lo que queremos validar es
esto de aquí lo tabamos y pondremos el W true arriba y aquí importante
una vez se haya hecho la validación tenemos que romper la ejecución del
bucle para poder salir Por eso aparecía esto aquí ensombrecido porque no
se iba a ejecutar nunca este bucle iba a ser infinito por mucho que pasás
demos la validación aquí seguiría

otra vez preguntándome Elo por eso este break es importante bien
ejecutamos ponemos una edad correcta de tipo int la validación podemos
decir que se ha hecho correcta porque hemos puesto un valor entero y
finalizamos por aquí el programa sin problema ahora que le pongo una
edad con decimales o una letra el valor debe ser un número entero y me
vuelve a pedir la edad no me deja llegar a este punto sin haber introducido
un int porque si esto produce una excepción no se llega a ejecutar nunca el
blo try y por lo tanto

no se rompe nunca la el ejecución del bucle y estaremos cada vez en ese


except encerrados hasta poner la edad correctamente ahora ponemos una
letra también lo mismo debe ser un número entero Pues venga Ahora sí a la
tercera bien y salimos finalmente de ese bucle pues este programa
sencillito no nos deja terminar el programa con un valor no válido o
proseguir Por así decirlo no podemos salir de esta validación de aquí y aquí
podemos tener mucho código pero hasta que no se complete esto nada no
continuamos y ahora vamos a ver un

ejemplo práctico muy parecido al anterior Pero esta vez vamos a utilizar un
método de la clase str de python el método is digit para comprobar si los
valores de es r son dígitos son números este método va a devolver un valor
buano true o false en torno así lo es o no lo es si el valor pasado como
argumento contiene un str con todo dígitos devuelve true en caso contrario
false es así de simple vamos a hacer la comprobación básica primero

Python LOGICA DE PROGRAMACION 288


vamos a probarlo cómo funciona con un print tenemos ahí el str con un
valor

numérico y le vamos a poner digit este método de str sobre el valor Pues
nos dice si es dígito ahora que ponemos un valor decimal qué crees que va
a pasar aquí son todo dígitos o no lo son Pues aquí vemos Que no false
porque este String lleva un punto y eso no es un dígito y aquí por supuesto
si ponemos letras también false Sabiendo esto podemos aplicar esto mismo
a una validación con bandera Si queremos validar que un valor sea un
número entero lo podemos hacer de la forma que verás a continuación
ponemos la bandera con un

estado false por defecto indicará que la validación Todavía no se ha pasado


aquí pondremos un While not bandera es decir mientras que la bandera sea
false esto es lo mismo que se vaya ejecutando Pues aquí pondremos edad
vamos a hacer un código muy parecido al anterior y en este caso no vamos
a transformar vamos a poner un input con un str directo y aquí pondremos
una condición ifed el valor String que se vaya a introducir por ese input is
digit entonces que haga esto y además nos tenemos que asegurar de que

ponemos la bandera en estado true es decir que indicamos que la


validación se ha completado con esto ya no se cumplirá la condición de
bandera igual a false que tenemos aquí y saldremos automáticamente del
bucle si no ocurre esto exactamente así entonces seguirá insistiendo el
programa Aquí tenemos ese els que nos va a avisar del fallo cada vez que
ocurra vamos a probar introduzca su edad le voy a poner un valor con
decimales no se cumple lo de dat is digit me daría aquí un false Entonces
pasamos al Else introduzca un número

entero y como estamos en el bucle Pues otra vez para aquí venga
introduzca su edad lo intentamos de nuevo tampoco y ahora sí funciona
correcto es otra forma diferente de validar pero sin utilizar el manejo de
excepciones Aquí hacemos condiciones con una bandera y como está
planteada esta validación No necesitamos ni siquiera un break para salir
porque estamos basándonos en los valores buanos de la bandera con la
función predefinida type de python puedes obtener el tipo de dato clase a
la que pertenece un objeto como

ya sabes un objeto como un int un str cualquier otro en base a esta


obtención se pueden utilizar condicionales para crear validaciones en base
a tipos de datos Y esto ya es muy interesante vamos a ver un ejemplo

Python LOGICA DE PROGRAMACION 289


creamos una variable de tipo str y Aquí vamos a crear una condición en
base al tipo de dato esto Recuerda que tengo las ligaduras activadas y es
un doble igual si el objeto es igual al tipo str entonces me dirá el objeto es
una cadena el intérprete en cierto modo lo sabrá entre comillas y aquí
ponemos els para el caso

de que esto no sea así y además informaremos al usuario del tipo de valor
que es el objeto si no es str pero dime cuál es así hacemos un programa
más funcional el objeto es una cadena por supuesto lo Entonces se ha
ejecutado el If ahora ponemos un int pues me dic no es una cadena y
además me dice que es Class int por otro lado Ya entrando en pequeños
detalles si quieres que la frase del els quede solo con el tipo de dato en
lugar de sacar Class int que nos saque int directamente puedes utilizar el
atributo especial llamado name que

contiene el valor de nombre del tipo de dato es decir aquí a type valor le
pondremos un punto para utilizar ese atributo dos guiones bajos name dos
guiones bajos así Y en este caso me saca simplemente el name el valor de
name Esta es la diferencia antes sacaba esto y ahora saca esto
simplemente es un pequeño detalle para que sepas que tienes ese atributo
para poderlo utilizar Así esta forma de utilizar type parece funcionar bien
pero para este tipo de validaciones se suele recomendar el uso de la
función predefinida is in stens Ya verás que es

una forma más limpia y más ajustada al lenguaje python podemos decir
idiomática o Como algunos dirían pitón o ponica la sintaxis de la función is
instance es la siguiente is instance y vamos a pasar dos argumentos que
los tenemos por aquí object y Class en la parte de objeto hacemos
referencia al objeto que queremos comparar en la parte de clase haremos
referencia a la clase con la que queremos comparar entonces en esta
comparación revisamos si el objeto pasado como primer argumento es una
instancia de la clase pasada como

segundo argumento si el objeto es instancia de la clase comparada nos


devuelve un valor true en caso contrario false veamos la diferencia entre
ambos tipos de comparaciones este tipo de validación que hemos hecho
con type nos puede quedar con is instance de la siguiente forma esta
condición la quitaremos y pondremos If is instance y ya le pasamos
recogidos esos dos valores valor que es el objeto de tipo int en este caso y
queremos compararlo con la clase str por ejemplo si esto evalúa como true
pues ejecutará If si no el

Python LOGICA DE PROGRAMACION 290


Else el objeto no es una cadena int me salta Esto está funcionando bien y si
es una cadena Entonces el objeto es una cadena ves es otra forma de
hacer lo mismo pero se recomienda que utilicemos esta aquí para hacer la
validación este type no pinta nada este type es solo informativo que nos
saca esto de aquí pero para la validación en Sí para hacer la condición se
recomienda esto aunque también puedes utilizar la otra forma en el
siguiente ejemplo voy a crear una entrada validada con longitud el usuario
deberá

introducir una contraseña de mínimo ocho caracteres si la longitud es


inferior no validará para conseguir esto podemos utilizar la técnica de
bandera empezamos con esa bandera false ponemos el While avisamos al
usuario de lo que tiene que hacer en esta entrada y ya ponemos la
condición de lif yen vamos a medir la longitud del str pasado la entrada y
len contraseña es mayor o igual a o entonces bandera será true validará y
aquí podemos avisar en la consola o no

podemos hacer la validación de fondo sin que el usuario sepa nada


perfectamente después de hacer la validación si se ha hecho avisaremos
con este print Bueno aquí no habría que Mostrar la contraseña realmente
Tendría que ir con los asteriscos censur Pero bueno es para que entendáis
el ejemplo probemos esta validación y vamos a poner una contraseña
pequeña que no cumple con este mínimo pues me dice eso la contraseña
debe tener al menos ocho caracteres le pongo ocho o más y ahora sí ha
validado contraseña establecida

pero la contraseña no la podría establecer el usuario hasta que no cumpla


con esta condición y quizás otras que pongamos Como por ejemplo de que
debe contener también Algún símbolo debe contener alguna mayúscula
para terminar veamos un ejemplo de validación de Rango esta vez vamos a
utilizar una validación múltiple utilizando en conjunto las técnicas de
bandera y el manejo de excepciones para que veas que ambas cosas se
pueden utilizar conjuntamente primero ponemos la bandera hasta aquí la
validación de bandera

normal pero en este bucle vamos a incluir el manejo de excepciones sin


ningún problema y aquí voy a poner un except listo parece muy complicado
pero

realmente fácil primero con la bandera vamos a certificar que se acabe


poniendo en algún momento ese valor válido que queremos en este Rango

Python LOGICA DE PROGRAMACION 291


de aquí mientras el usuario no lo cumpla no saldremos y además con el
manejo de excepciones lo que estamos mirando es que el valor introducido
también no produzca una excepción Porque si ponemos la bandera sola
pero no manejamos excepciones puede pasar que el usuario ponga por
ejemplo una letra Donde se espera un valor numérico como aquí y que me
salga esa excepción value error o cualquier otra

entonces manejamos esa excepción y luego además validamos el dato del


usuario Aquí está manejado de manera general pero podrías precisar más
poner except value error y demás escribe un número del uno al 10 pues
pongo a y me dice ese no es un valor válido hemos ejecutado Este except
pero luego termina el bucle la vuelta y empezamos otra vez try de nuevo
estamos aquí escribe un número del 1 al 10 pues le ponemos 500 que se
pasa de ese Rango de validación dije un número del 1 al 10 ha saltado esto
aquí ya hemos controlado la

validación de Rango numérico Pues bien lo intento de nuevo y pongo un


número que cumple Esa condición el número introducido es siete Hemos
llegado Aquí ya está av validado y podemos continuar hay miles y miles de
ejemplos que se pueden hacer para este tema podría estar aquí horas
poniendo ejemplos sin embargo Tenemos que continuar con más temas ya
tenemos que acabar esta Tercera y última parte del módulo para poder
empezar con nuevos temas lo importante de este capítulo es que hayas
captado la idea que sepas que se pueden hacer

combinaciones entre las dos formas de validar y que puedes validar todo
aquello que quieras controlar al máximo Eso sí necesitarás un poquito de
lógica de programación enfocada en este punto experiencia y también
mucho Ingenio en muchas ocasiones para poder ver por dónde podría fallar
el programa por dónde podría manipular ciertas cosas el usuario y todo lo
que te vaya surgiendo por el camino Espero que te haya gustado es

Python LOGICA DE PROGRAMACION 292


dacion bandera

Python LOGICA DE PROGRAMACION 293


Python LOGICA DE PROGRAMACION 294
Python LOGICA DE PROGRAMACION 295
Python LOGICA DE PROGRAMACION 296
Python LOGICA DE PROGRAMACION 297
validacion de dato con bandera

Python LOGICA DE PROGRAMACION 298


validacion de tipo de dato con la funcion type

Python LOGICA DE PROGRAMACION 299


instance

Python LOGICA DE PROGRAMACION 300


validacion de longitud

Python LOGICA DE PROGRAMACION 301


validacion de rango

Python LOGICA DE PROGRAMACION 302


aserciones o afirmaciones con Python

el uso de afirmaciones nos va a venir muy bien para poder hacer


comprobaciones de ciertas cosas en los programas estas afirmaciones
pueden ser muy útiles en el proceso de desarrollo y depuración del código
gracias a un nuevo tipo de excepción podremos confirmar si una expresión

Python LOGICA DE PROGRAMACION 303


es false y lanzar una excepción especial con ello ahora verás cómo las
afirmaciones o verciones son una gran herramienta a la hora de ir
documentando y depurando el código estas afirmaciones te permiten
verificar si algunas condiciones específicas son

ciertas en determinados momentos lo que puede ser de Gran utilidad


mientras estés depurando código si en la condición de afirmación el valor
es falso quiere decir que hay algo mal en tu código Si eso ocurre se
generará una excepción de tipo assertion error vamos a hacer una
afirmación falsa escribimos una sencilla variable utilizamos la palabra clave
asert y pondremos una condición como a igual que c una coma y
especificamos un mensaje si ejecutamos esto tenemos un assertion error el
valor no es cer nos salido este mensaje en este caso el

programa terminaría en la línea tres aunque aquí tuviésemos más contenido


puesto que se produce esta excepción de tipo assertion error con esta
aserción lo que estamos haciendo es comprobar si el valor de a es igual
que cer si no lo es me salta esta excepción indicándome el error que yo
quiera configurar aquí si ponemos a con un valor de cer esto evalúa como
true y ya no tendrá que salir esa excepción ves el programa se ejecuta sin
problemas hay diferentes tipos de afirmaciones vamos a ver un par de ellas
para que veas cómo funcionan en

diferentes casos para el siguiente ejemplo Contamos con una lista Aunque
podría cambiarse por cualquier elemento que contenga varios valores a la
vez como tupl sets etcétera todos estos ejemplos que te voy a mostrar son
muy sencillos y los vas a ver muy claros porque tenemos dos o tres líneas
de código sin embargo enfoca esto a programas más complejos donde es
más difícil comprobar cierta información pues vamos a crear aquí una
afirmación vamos a comprobar si es cierto que el valor si está en la lista
números y aquí indicaremos un mensaje

para el caso de que esto evalúe como false y aquí tenemos la expresión y
aquí tenemos lo que tiene que hacer en caso de false en este caso me sale
un error porque si no está en la lista aquí podríamos por ejemplo invertir not
y números y aquí en este caso contrario diríamos siete está en la lista si
queremos preguntar a la inversa en este caso si s no está en la lista no me
dice nada si está Pues sí me dice si está la lista es lo mismo pero la inversa
pues las afirmaciones nos sirven para esto para ir comprobando cosas de
todo

Python LOGICA DE PROGRAMACION 304


tipo las afirmaciones de instancia te permiten ver si algún elemento
concreto es instancia de una clase concreta pues lo haremos de la
siguiente manera esto lo podemos dejar así y utilizaremos ese eens que
probamos anteriormente Y preguntaremos si este objeto números es de la
clase tle en caso contrario indicaremos que el objeto no es una tupla Por
así decirlo podemos generar nuestras propias excepciones por así
llamarlas el objeto no es una tupla evidentemente si resulta que sí que lo es
Entonces no me sale ese error pues con

este tipo de afirmaciones te puedes asegurar de que estás trabajando con


el tipo de objeto necesario ahora Para que veas la utilidad de las
afirmaciones en depuración piensa en equipo estás en una empresa
trabajando con varias personas en el mismo proyecto a ti te encargan en
realizar varios módulos estos módulos van a servir como bibliotecas para el
resto de integrantes del equipo para que puedan utilizar ciertas
funcionalidades de manera cómoda fácil y bien organizada las clases
funciones y todo lo que haga

será accedido por los integrantes del equipo y utilizado para desarrollar el
programa por supuesto Entonces es una buena práctica utilizar las
afirmaciones para que cuando estos hagan algo que no deberían hacer
algo para lo que no has diseñado cierta biblioteca se les informe de que
han hecho algo mal mediante las afirmaciones supongamos que tenemos
un módulo para calcular el índice de masa corporal pues venimos aquí y
creamos un archivo imc Pi y Aquí vamos a implementar el código una
función que calcula el índice

de masa corporal la fórmula es sencilla Pero bueno aquí es lo menos


importante peso dividido por entre paréntesis para calcular primero altura
elevado 2 lo importante en este ejemplo son estas dos aserciones son dos
comprobaciones que puede ser que el resto de desarrolladores no tenga en
cuenta al no haber diseñado ellos esta función que por supuesto podría ser
una función mucho más compleja aquí está el ejemplo muy simplificado
Pues con las afirmaciones comprobamos que cuando se utilice la función
calcular y MC el peso

sea mayor que cer y la altura también si no ocurre así si se introduce en


algún momento un peso o una altura de cero o menos nos indicará ese
error por aserción el peso debe ser mayor que cer0 o la altura debe ser
mayor que cer0 así aquí en programa si está introduciendo datos
incorrectos por lo que sea no le dejaremos continuar le daremos un toque

Python LOGICA DE PROGRAMACION 305


una advertencia ahí en la consola y después puede perfectamente
consultar la documentación del módulo consultarte a ti que has hecho el
módulo o Investigar por su cuenta pero bueno esto ya son

otras cosas simplemente indicándole esto el peso debe ser mayor que cero
ya sabe que ahí está poniendo un dato incorrecto entonces pensará
lógicamente que debe poner otro valor mayor que cero y ya está Puedes
pensar Por qué no hacer la parte de las afirmaciones con condiciones de
condicionales como hemos hecho muchas veces que hacíamos
expresiones bule anas de todo tipo con los condicionales fíjate aquí de qué
forma má se lee el código y mira aquí de otra manera con condicionales
Cómo se lee sinceramente para mi gusto con las afirmaciones se ve

mucho más claro el código y son más fáciles de limpiar una vez terminada
la fase en la que las necesitemos porque luego deberíamos deshacernos
de ellas esto nos sirve para cuando estamos produciendo después para los
usuarios estas aserciones no van a servir para nada Con este código lo que
hacemos Es lanzar excepciones con esta palabra de aquí cosa que como
dicho lo veremos en el siguiente capítulo vamos a dejar las aserciones y
además decirte que se pueden Desactivar automáticamente en fases
futuras del desarrollo para que no

influyan en las prácticas de rendimiento del Software ahora te explicaré


Cómo hacer esto centrándonos de nuevo en este código nos vamos a
poner en la piel de otra persona del equipo la que se encarga de crear la
interfaz para el usuario para simplificar el ejemplo la interfaz estará basada
en consola Pero por supuesto Podría tener una interfaz con ventana
perfectamente utilizando esta lógica eso verás cómo hacerlo en el curso de
teinter El que haremos a continuación de este pues bien Vamos a crear esta
interfaz que estaría haciendo

otra persona por aquí mismo en otro archivo importamos imc bien
guardamos todos los cambios y ya tendríamos acceso a este módulo
después de escribir esta interfaz pues lo normal sería probarla a ver cómo
funciona ponemos peso en kilogramos 85 por ejemplo ingrese su altura
1,85 y tenemos su índice de masa corporal es 24,84 parece funcionar bien
pero ahora vamos a probarlo con valores ilógicos ilógicos como puede ser
un cero Nadie puede pesar 0 kg Aquí sí que pondremos bien la altura y nos
sale este assert el peso debe ser mayor que cero y

Python LOGICA DE PROGRAMACION 306


aquí nos lo indica de nuevo e incluso esta aserción nos dice exactamente
Cuál es la comprobación Que se está haciendo con esa aserción pues
sabemos que el dato puesto por peso no debe ser cero y debe ser mayor e
incluso podríamos Añadir más aserciones con diferentes tipos de
comprobaciones todo lo que se te ocurra cosas que pueden hacer fallar el
programa o que no funcione de la manera que se espera ahora vamos a
probar con un valor ilógico para la altura el peso bien y la altura -1 m la
altura debe ser mayor que cer clo

porque hemos puesto un valor negativo Pues yo poniéndome en la piel de


ese desarrollador que estuviese desarrollando la interfaz pues acabo de
descubrir dos cosas que no se deben hacer y repito otra vez vez está todo
muy simplificado y parece muy tonto pero es para que entendáis la utilidad
de esto de manera muy simplificada que Creo yo que es la mejor forma de
verlo y así me puedo ceñir a lo que el creador del módulo imcp quiere
implementar a utilizar el código que ha creado de la manera que quiere que
se utilice no de la manera

que yo creo que se debe utilizar ahora lo que habría que hacer es Añadir
medidas para que el usuario final no pueda introducir ese tipo de valores
por ejemplo añadiendo por aquí una validación de datos para forzar que el
valor introducido en la interfaz sea mayor que cero tanto en peso como en
altura así de simple en momentos determinados puede que necesitemos
Deshabilitar todas las afirmaciones de un módulo y además de las
importaciones que tenga hechas dicho módulo por ejemplo para probar el
rendimiento del Software sin que se vea

afectado por la evaluación de estas afirmaciones ya que estas consumen


recursos hay que tenerlas en cuenta aquí no son significativas estas
comprobaciones pero en programas grandes sí que pueden serlo Entonces
vamos a abrir la consola control e si no la tienes abierta y aquí mismo
escribiremos lo siguiente python ejecutamos python ponemos opción o y
test punto pi que es este archivo ingrese su peso en kilogramos vale voy a
probar con un cero que haría saltar esa aserción si no estuviese
deshabilitada y la altura cero

también pues aquí hemos probado el programa este módulo sin la


mediación de esas aserciones y como consecuencia estos valores han
generado un problema diferente por culpa de no seguir las indicaciones de
quien creó el módulo imcp Pues he creado una excepción de división por
cero o cualquier otra cosa que podría pasar pues bueno lo único que quiero

Python LOGICA DE PROGRAMACION 307


demostrarte con esto es que puedes hacer pruebas ya sea de rendimiento
o para producir excepciones deshabilitando estas aserciones sin quitarlas
cosa que no podrías hacer si

aquí en lugar de utilizar aserciones estuvieses utilizando ese lanzamiento


de excepciones con los condicionales cosa que todavía no te he explicado
pero ahora si vuelvo a ejecutar después de cerrar la consola las aserciones
vuelven a funcionar se deshabilitan en tiempo de ejecución Espero que te
haya gustado este cap

Python LOGICA DE PROGRAMACION 308


Python LOGICA DE PROGRAMACION 309
Python LOGICA DE PROGRAMACION 310
Python LOGICA DE PROGRAMACION 311
Python LOGICA DE PROGRAMACION 312
Python LOGICA DE PROGRAMACION 313
Python LOGICA DE PROGRAMACION 314
Python LOGICA DE PROGRAMACION 315
Python LOGICA DE PROGRAMACION 316
Lanzar excepciones (raise)

para lanzar una excepción en python se utiliza la palabra reservada Race


seguido del tipo de excepción que se quiere lanzar veamos un ejemplo
práctico con Race vamos a escribir una variable tenemos ahí un tipo de
dato in imagina que estás creando algo complejo con muchos módulos y
que otras personas estarán utilizándolos para diseñar aplicaciones en
determinado punto del desarrollo quieres que solo se utilicen valores
enteros en la variable a entonces puedes hacer que si alguien utiliza de
forma entre comillas

incorrecta dicha variable que le salte una excepción para avisarle de que
no puede utilizar de esa forma la variable por ejemplo supongamos que
alguien la quiere utilizar de la siguiente forma le asigna un valor 0,5 que
sería un float la evaluación que se haría sobre variable sería algo como esto
si el tipo de la variable a no es int entonces haz esto lanza la siguiente
excepción si ejecutamos esto veremos que efectivamente se cumple la
condición de If en la que se indica que el valor de la variable a no es int

y esto evalúa como true por lo tanto se lanza esta excepción personalizada
de tipo type error en este caso la excepción no es producida por un fallo al
escribir código python el código es perfectamente correcto pero Nosotros
hemos establecido esa regla de error de tipo type error con un mensaje

Python LOGICA DE PROGRAMACION 317


personalizado y he hecho que se Lance esta excepción siendo que el
intérprete de python no fallaría por tipo en este caso lo hago fallar yo para
que no se permita hacer lo que le he especificado por aquí la clase base
exception es la

superclase de todas las excepciones de python la clase exception de


python es la superclase de todas las clases de excepciones no fatales de
python las que has visto normalmente hasta ahora conociendo este dato
podemos ir al nivel superior de las clases de cciones y generar nuestras
propias excepciones de todo tipo por ejemplo con un Rango si vamos al
código interno de python el archivo buildins veremos dichas herencias
vamos a escribir aquí exception para acceder a esa clase control click y
vemos el código puedes

ver que esta hereda de otra superclase la que he dicho antes bas exception
pues bien Ahora que has visto esto vamos a ver un ejemplo práctico Para
que aprendas a crear tus propias clases de excepciones esta acción es
bastante avanzada incluso con el nivel que se ha llevado hasta ahora en el
curso Así que analiza el código que te voy a poner a continuación con
mucha calma seguramente lo entiendas casi todo o todo pero es posible
que se te escape algo Este es el código del ejemplo tenemos una clase
llamada excepción Rango que hereda de

esa clase exception dentro tenemos un método inicializador y luego validar


Rango empecemos analizando esta clase de aquí concretamente el init esta
parte se utiliza para llamar al constructor de la clase base exception y
pasarle a un mensaje que describa la excepción mensaje lleva por defecto
un str vacío en la instanciación Esto es para darle el mensaje en cualquier
momento del código no en la propia instanciación los otros dos atributos
mínimo y Máximo se utilizan para definir los límites del Rango que usa esta
excepción en

particular y se almacenan como atributos de la instancia de la excepción


los valores son libres y se pasarán al instanciar el objeto entonces
podemos hacer rangos diferentes creando diferentes objetos de esta
misma clase después tenemos un método llamado validar Rango por aquí
que sirve para hacer la validación de los datos con un condicional si el valor
que le pasemos a número no está en el rango especificado en los otros dos
argumentos pasados al método init mi mínimo y Máximo se lanza una
excepción de tipo excepción Rango

Python LOGICA DE PROGRAMACION 318


esta excepción especifica en un mensaje Cuál es el rango correcto en caso
contrario nunca se lanza esta excepción después por aquí utilizamos la
clase excepción Rango con el manejo de excepciones empecemos por el
bloque try piensa que este código lo utilizo en el mismo módulo en el
mismo archivo de python para simplificar la explicación pero podrías tener
incluso una biblioteca con tus propias excepciones e ir importándole try se
intenta ejecutar el programa con normalidad Se le pide al usuario un
número en el rango que queremos de 0 a

300 en este caso y después se obtiene el dato se crea un objeto validador


de tipo excepción Rango con el valor mínimo y el máximo para después en
la siguiente línea utilizar el método validador del objeto el método validar
Rango en este método se pasa el valor de la entrada y se evalúa si está en
el rango pasado en la instanciación del objeto validador si el número evalúa
como false en el condicional If quiere decir que se encuentra en el rango ya
que no cumple la condición de If y por lo tanto nunca llega a lanzar la
excepción de tipo

excepción Rango con ese Race si evalúa como true en el condicional If


quiere decir que no se encuentra en el rango en ese caso se lanza la
excepción con la palabra reservada Race junto con los tres valores
lanzados con ese Race una vez creada La excepción podemos aplicar
también un manejo de esta este except utiliza el manejo de excepciones
con nuestra propia excepción para que veas que es posible también
manejar nuestras propias excepciones en este ejemplo es simplemente un
print pero sabes que se pueden hacer un montón de cosas a partir

de aquí podríamos decir si nos salta esta excepción quizás que se pasasen
otros valores o que se hiciese alguna acción alternativa para solucionar la
excepción también hay que tener en cuenta que el usuario podría incluir un
carácter No válido por ejemplo una letra o un conjunto de ellas esto hará
que la función int esta que tenemos por aquí que transforma el valor del
input genere un value error en ese caso nos viene bien manejar también
este tipo de excepción que lo hacemos con esto así que ya puedes ver que
puedes crear tus

propias excepciones después manejarlas utilizar la validación de datos en


dichas excepciones y Añadir tantas defensas y lógica como creas
necesaria para hacer tus programas más sólidos tal y como dicho estas
explicaciones Este ejemplo es bastante complicado necesitas todavía más
práctica para enfocarlo a algo práctico bien vamos a probar un poquito esto

Python LOGICA DE PROGRAMACION 319


para que lo entendáis mejor este exep de aquí lo voy a comentar para que
no tenga efecto vamos a probarlo así introduce un número entre 0 y 300 le
pongo 35 el número está dentro del Rango

permitido bien el try ha podido ejecutar el programa sin ninguna excepción


y se ha validado el rango y todo finalmente como no ocurre esta excepción
pues no se lanza en el caso de que sí que ocurra una excepción por
ejemplo nos salimos del Rango con un 400 ahí me sale esta excepción
personalizada excepción Rango son las típicas excepciones que saca
python como type error pero excepción Rango se llama es una excepción
creada por nosotros y aquí me indica el mensaje valor fuera de Rango esto
lo que hace es finalizar el

programa pero nuestra propia excepción la podemos manejar por ejemplo


con este except que este except lo que va a sacar en este print si ocurre
esa excepción de tipo Rango es el error el error que hemos configurado
aquí en el mensaje Todo esto será más sencillo de entender cuando
empecéis a hacer prácticas con todo esto ya lo veréis ahora me equivoco
con esta excepción manejada en lugar de finalizar de forma abrupta el
programa me va a sacar la descripción del error valor fuera de Rango ha
hecho saltar se ha

lanzado la excepción y luego la hemos manejado por aquí al manejar la


excepción con este except el programa puede continuar valor fuera de
Rango salta la excepción se maneja y el programa sigue Espero que te haya
gustado este capítulo si es así apóyalo Como Puedas

Python LOGICA DE PROGRAMACION 320


Python LOGICA DE PROGRAMACION 321
Python LOGICA DE PROGRAMACION 322
Python LOGICA DE PROGRAMACION 323
Python LOGICA DE PROGRAMACION 324
Python LOGICA DE PROGRAMACION 325

También podría gustarte