Python-LOGICA y Ejercicios
Python-LOGICA y Ejercicios
PROGRAMACION
LOGICA DE PROGRAMACION.pdf
README.md
funciones integradas
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
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
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
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
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
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
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
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
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
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
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
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
le pongo directamente c true sería como el While true pero aplicado para
unir
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á
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
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
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
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
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á
Paquetes
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
• 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
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
• 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
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
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
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
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
import math
Funciones principales:
math.sqrt(x): Calcula la raíz cuadrada de x
Ejemplo de uso:
import math
# Redondear números
print(math.floor(3.7)) # resultado: 3
print(math.ceil(3.2)) # resultado: 4
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
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
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
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
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
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
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
/entornos virtuales
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
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
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
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
los argumentos por defecto son valores que se asignan a los parámetros
de una
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Introducción a la depuración
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á
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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