Curso COMPLETO de LÓGICA DE PROGRAMACIÓN Desde Cero
seguro que alguna vez has escuchado esta
expresión a programar se aprende
programando la realidad es que no puedes
aprender a programar si no practicas Y
eso es justo lo que vamos a hacer en
este curso desde cero de lógica de
programación vamos a seguir una ruta de
estudio con el lenguaje de programación
que tú elijas durante más de 7 horas y
13 ejercicios y donde tú también podrás
participar de manera activa enviando tus
correcciones Así que comenzamos a
[Música]
picar Bienvenidos a mour dep by brce
moure tutoriales de programación y rollo
de software Mi nombre es bryce moure Soy
ingeniero de software desde hace más de
14 años cuando comenzamos a aprender un
lenguaje de programación solemos cometer
el error de dedicarnos a visualizar
únicamente tutoriales durante horas algo
que puede resultar agradable ya que cada
vez se nos van presentando más conceptos
pero una vez finalizamos los tutoriales
es muy habitual sentirse con la
sensación de que nosotros mismos no
seríamos capaces de idear un algoritmo
una lógica que resuelva un problema y
que haga uso del lenguaje de
programación que durante tantas horas
hemos visto sus tutoriales o leído la
teoría esto como he dicho al principio
es principalmente por un motivo falta de
práctica pero de una poca práctica No de
muchísimas horas de práctica muchas más
de la que le hemos dedicado a estudiar
la teoría esa es la realidad y por eso
con este curso quiero ayudarte a
conseguirlo la lógica de programación es
el proceso de aplicar una secuencia
estructurada y coherente de pasos para
resolver problemas específicos mediante
un lenguaje este curso forma parte de
una actividad de nuestra comunidad
llamada retos de programación cada
semana y Durante los últimos do años
propuesto y resuelto ejercicios para
mejorar en programación y aprender a
utilizar un lenguaje tienes todo en
retos de programation comom desde más de
100 ejercicios A diferentes proyectos
para tu portafolio y donde podrás
encontrar la última iniciativa llamada
roadmap o ruta de estudio en la que
vamos a centrar este curso con esta ruta
de estudio vas a aprender desde cero el
lenguaje de programación que tú elijas
como el que tú elijas exactamente ya que
este curso no se centra tanto en que yo
explique un lenguaje concreto sino
Cuáles son los conceptos y fundamentos
comunes entre la gran mayoría de
lenguajes porque Sí Prácticamente todos
son iguales a nivel fundamental
únicamente cambia su sintaxis Así que
cómo funciona este curso en cada clase
te voy a explicar un concepto teórico de
los lenguajes de programación esta
teoría la vamos a llevar a la práctica
resolviendo diferentes ejercicios
lógicos la manera real de conseguir que
esta teoría se transforme en una pieza
de un puzzle que poco a poco vamos a
combinar con otras y así aprender a
resolver ejercicios más complejos todas
estas lecciones las encontr harás en
retos de programación comom barrad map y
en cada lección tendrás los siguientes
recursos un enunciado para presentar que
se va a estudiar y qué ejercicio
Tendremos que resolver para aplicar la
teoría aquí te recomendaría que primero
leas cada ejercicio e intentes buscar
algo de información por tu cuenta ya que
esa es una de las habilidades que
tenemos que desarrollar como
programadores y que va a ayudarte a
marcar la diferencia en la primera clase
incluso vamos a hablar de Cómo encontrar
esos recursos para que aprendas el
lenguaje que tú quieras aparte del
ejercicio cada lección tendrá asociada
una corrección de código propuesta por
mí intentando que esa solución no sea
demasiado simple ni demasiado compleja
para que la pueda entender todo el mundo
una solución que yo elaboro y explico
Durante este curso y que en la web
también tendrás por separado el enlace
tanto del código como del vídeo pero
cómo dices que este es un curso para
aprender cualquier lenguaje si tú estás
usando python para resolver el ejercicio
como he dicho este no es un curso de
python es un curso de lógica y todos los
lenguajes poseen los mismos fundamentos
yo he necesitado elegir un lenguaje para
poder ejecutar el código Pero lo
importante es que también vas a tener tu
disposición las correcciones de las
lecciones en el resto de lenguajes en la
web en cada uno de los ejercicios
tendrás esta opción comunidad accediendo
así a las correcciones en todo el resto
de lenguajes todas ellas aportadas por
la comunidad Mira todas las opciones que
tenemos en este ejercicio y créeme
cuando te digo que lo importante no es
el lenguaje sino nuestra capacidad de
entender los fundamentos y aplicar
soluciones Así que déjame en comentarios
con Qué lenguaje vas a realizar el curso
si en la web de roadmap seleccion as ver
el ranking podrás descubrir que no te
miento aquí se visualiza un listado de
todos los lenguajes que ya está
utilizando la comunidad para resolver
los ejercicios su porcentaje de uso e
incluso el listado de usuarios teniendo
en cuenta sus aportaciones estos datos
se actualizan una vez al día y tú puedes
ser una de las personas Que aparezca las
primeras posiciones de ranking en la web
se explica cómo puedes aportar tus
propias correcciones para que se
incorporen al proyecto de código abierto
visita la sección de preguntas
frecuentes Y recuerda que todo el código
está disponible en el repositorio de
gith llamado roadmap retos programación
aquí es donde encontrarás todos los
ejercicios resueltos en los diferentes
lenguajes y donde también podrás
consultar las instrucciones para
participar con tus correcciones dedícale
unos minutos a leer toda esta
información ya que es muy importante
para realizar de forma correcta el curso
también pedirte un único favor que es si
quieres apoyar esta iniciativa hagas
estar en el repositorio simplemente es
un clic y ayudas a valorar este recurso
aportando tus correcciones también
ayudarás a que este recurso cada vez sea
más valioso en cada una de las lecciones
es decirte que también podrás encontrar
su nivel de dificultad y una sección
extra con otro reto un poco más complejo
para que puedas seguir practicando lo
aprendido y que sinceramente te
recomiendo que siempre intentes hacer ya
antes de empezar recordarte que esta es
una actividad que realizamos de manera
semanal desde Twitch y en directo este
curso tiene 13 lecciones pero en la web
puedes consultar los nuevos ejercicios
La idea es crear cursos agrupando
bloques de lecciones ya finalizadas lo
que quiere decir que a futuro tendrás
una segunda Tercera y hasta cuarta parte
de este curso a que avancemos Pero como
te digo puedes seguirlo semana a semana
desde la web y las emisiones en directo
por último invitarte a unirte al
servidor de discord de nuestra comunidad
donde podrás reunirte con más de 70.000
personas que están aprendiendo un lugar
para compartir preguntar y ayudarnos
también podrás consultar en la sección
de eventos cuando realizo las
transmisiones en directo entre ellas la
actividad de la ruta de estudio de
programación en la que se basa este
curso y ahora sí bienvenido y Bienvenida
al curso de lógica de programación desde
cero
[Música]
si os vais a la web y ya pincháis en
github o os vais al primer reto de
programación que vamos programar hoy y
le dais al botón de ejercicio os va a
llevar al github aquí es donde va a
estar el ejercicio todas
eh No sé todas las reglas que yo os
quiera poner van a estar aquí escritas
os dije que había un tutorial de cómo
participar mirar instrucciones
aclaraciones guía rápida Vale hasta cómo
trabajar con giop está todo está
absolutamente todo aquí aquí veis por
ejemplo el reto de programación primer
reto aquí estará mi código el vídeo las
soluciones de la comunidad todo si
utilizáis os prometo 10 minutos de
vuestro tiempo en leer web y repositorio
o incluso los repositorios del año
pasado Pero bueno vamos a quedarnos un
poco con lo que empieza hoy eh Aunque
todo lo del año pasado también está
explicado y también sigue más o menos el
mismo formato Okay Eh os acabaré
enterando perfectamente si no también
discord y si no me preguntáis a mí o le
preguntáis a la comunidad o lo que sea
vale al principio em habrá que
esforzarse un poquito más entender que
Oye va a estar empezando si nunca habéis
participado en los retos Pues igual os
cuesta un poco más por cómo interactuar
con git o con github o con la dinámica o
que enviáis el ejercicio igual hay que
modificar algo porque se ha hecho mal
Bueno cualquier cosa Vale también os
digo que por favor H tengáis muy en
cuenta muy en cuenta todo lo que pone en
la web todo lo que pone aquí en el
repositorio por qué porque incluso
cuando Vais a enviar vuestra corrección
hay una plantilla hay una plantilla que
os va a saltar Esta es la plantilla que
no hace falta eh incluso ni leerla Pero
bueno pide cosas muy fáciles os dice Oye
asegúrate de que el título de p request
con el que estás enviando tu corrección
pues tiene este formato que el nombre
del fichero es el nombre de tu usuario
de github eh aquí veis 19 purri sin
atender es posible que de estas 19 15
Sea gente que no ha puesto bien eh su
nombre de usuario y con lo cual no se
puede aceptar esa p request no se puede
aceptar ese código porque si no podría
entrar en conflicto con otra persona que
quiere enviar el ejercicio y así también
queda registrado Cuál es exactamente las
correcciones que ha enviado cada usuario
vale mira la primera vez que participo
super Entiende todo vale así que de
verdad que si hay alguna equivocación No
pasa nada eh Jer está Roswell está
control también para ayudaros em desde
la parte de moderación estar revisando
todas las prs hacerles caso pero también
intentemos
em quitarles trabajo a toda la gente que
está ayudando gratis en la comunidad y
basta con leer esto en el momento que lo
enviéis bien ya una vez eh después ya no
Vais a tener que que revisar nada esto
prácticamente ya digo es leer las normas
una vez leer esta plantilla que os va a
saltar en el momento que queráis
lanzarla la p request y ya está No vais
a tener que hacer eh prácticamente nada
más eh se trata de que todo esté
atendido y que lo vayamos mejorando poco
a poco OK Así que por favor eso es lo
primero que tenéis que tener en cuenta
vale eh vamos a ello no será hora de
comenzar no así que qué es esto de
roadmap lo vuelvo a repetir ya sabes
algún lenguaje genial el roadmap te va a
servir no tienes ni idea de algún
lenguaje La idea es que con el Road map
aprendas
a por lo menos programar con algún
lenguaje que vayas aprendiendo los
fundamentos poco a poco porque como bien
Dice el roadmap Y si nos vamos aquí a la
web de roadmap veréis lo siguiente están
todos los retos a medida que se van ir
publicando uno cada semana pues aquí lo
veis va a aparecer con una dificultad
con la fecha en la que se publica con la
fecha que la que se corrige hoy es día 2
el reto aquí tenéis el texto el
ejercicio en Sí vale el horario el día
que se va a corregir en directo también
tenéis aquí para que podáis Crear un
recordatorio y os vengáis al directo si
podéis si no podéis bueno que sepáis
cuándo va a aparecer la corrección os lo
prometo y como va a ser un repaso tan
exhaustivo por e los lenguajes de
programación aunque ya sepáis programar
Estoy seguro que algo Vais a acabar
descubriendo nuevo en el lenguaje okay Y
por qué con cualquier lenguaje brce tú
tendrás que explicarlo en algún lenguaje
por supuesto e habitualmente yo lo que
voy a hacer es utilizar el lenguaje
python porque es uno de los que más
utilizo que también estamos haciendo
cursos aquí dentro de la comunidad vale
pero eh eso no es lo importante Qué es
lo importante de todo esto que la propia
comunidad está enviando correcciones En
todos los lenguajes si no me equivoco
hoy en día en solo una semana hemos
reunido 21 lenguajes de programación
cuando le eché yo un ojo vale Así que
bry tú lo haces con python y a mí no me
interesa python no te preocupes porque
gente de la comunidad va a estar
enviando correcciones En todos los
lenguajes Y si hay 20 lenguajes
distintos es muy posible que alguno de
los tuyos si estás partiendo desde cero
y no sabes ni por dónde empezar es muy
posible que entre esos 20 lenguajes o
más o bueno los que sea que envíe la
comunidad esté también eh el lenguaje
que tú quieres aprender vale Estos son
retos para aprender fundamentos de los
lenguajes los lenguajes hay cosas que
tienen en común todos vale Y eso es
justo lo que vamos a tratar habrá cosas
que igual hay pequeñas diferencias pero
digamos que el enunciado general de cada
uno de los retos del roadmap serán en
principio no sé propuestas que se pueden
resolver con cualquier lenguaje de
programación igual que hacíamos el año
pasado así que os servirá para revisar
la teoría os servirá para estudiar y os
servirá para hacer la parte de lógica
Aunque yo lo esté explicando en otro
lenguaje distinto Okay y después el
roadmap hay que llevarlo semana a semana
yo no puedo seguir el ritmo yo me voy a
incorporar más adelante porque no puedo
empezar no pasa absolutamente nada todos
los ejercicios se van a poder entregar
en el momento que os dé la gana se
seguirá revisando incorporando a repo
como ya Vais a tener mi explicación y
Vais a tener la ruta de estudio uno tras
otro que os queréis saltar alguno porque
igual pensáis que ya lo sabéis os lo
saltáis y empezáis por el que os de la
gana que queréis empezar la ruta de
estudio y que ya ha pasado un mes desde
el día de hoy que estamos empezando pues
no pasa tampoco absolutamente nada vais
poco a poco se trata de un curso que
puede ser en comunidad que sería la
manera ideal pero pero pero también por
otro lado en realidad lo podéis hacer
vosotros A vuestra a vuestro ritmo y ya
está al final no deja de ser un recurso
libre y gratuito vale sobre la
dificultad se trata de que los retos
como van a seguir una ruta de estudio
más o menos van a estar relacionados
entre ellos Okay pero la dificultad sí
que es cierto que puede ir variando aún
así aunque se siga la ruta de estudio
igual lo que voy haciendo los retos es
que igual hay una parte que es más fácil
y otra parte como para sacar nota Es
okay Te parece más simple la premisa
Pues venga Si quieres ponerte un poquito
más a prueba cu tienes eh Pues un
ejercicio un poquito más avanzado dentro
de la propia lección de la semana y os
voy a enseñar el ejemplo en el reto que
voy a publicar en el momento que corrija
este Okay es un poco la idea no no os
imaginéis que en el primer reto va a ser
un rollo hiper complicado para gente que
tenga muchísima experiencia pero bueno
se trata de que a medida que avancemos
por los fundamentos va a haber más
recursos para que podáis aprender Y así
también yo voy a poder justificar que
Okay no entiendes el reto 10 Échale un
ojo a los de atrás y vete poquito a poco
y ya verás como cuando llegues al 10 lo
vas a tener mejor y como tenemos los
grupos de estudio en el discord si no
sabéis lo que son los grupos de estudio
buscarlos dentro de discord también es
decir hay
e decenas de formas de aprender a
programar con los retos que tenemos en
la en la comunidad con la parte de
roadmap y con la parte de los retos de
programación no hay un plazo máximo la
dinámica es cada semana yo explico reto
publico nuevo cada lunes habitualmente
pero si os queréis ir a los anteriores
como va a estar el vídeo grabado comoo
va a estar el código publicado como van
a estar las soluciones de la comunidad
pues no no importará tanto vale Así que
eh otra cosa muy importante en la web os
va a llevar a cuándo son las
correcciones vale Ya os dije que un
sitio importante es el canal de Reto
semanal que es el que está relacionado
con los retos de programación Y si os
vais también aquí a eventos aquí
empezaré a ver cuáles son los directos
Cuáles son los eventos importantes que
celebramos en la comunidad Ya veis ahora
y en curso y 500 personas apuntadas Eso
es que 500 personas se han enterado de
este evento han decidido Crear un
recordatorio para cuandoo se nos vamos a
poner aquí a corregir el reto que era
ahora mismo pero si os fijáis el próximo
lunes 8 de enero a las 8 de la tarde 8
de la tarde hora España la la hora que
es ahora mismo aquí veis que ya está
creado un evento y que ya se han
apuntado personas pues bueno ya sabéis
qué día de la próxima semana vamos estar
aquí con el nuevo reto de programación
Okay así que de verdad la idea y ya
llevamos un tiempo Aunque empecemos con
los con el roadmap
Eh ya llevamos tiempo haciendo retos
aunque no sean exactamente iguales como
para que fuéramos teniendo en cuenta e
las los diferentes problemas o las
diferentes casuísticas de la comunidad
vale Y ya lo último sobre repositorio
qué os pediría Cuál es la manera de
apoyar Cuál es la manera de ayudar un
poquito a todo este trabajo todo es
gratuito aquí nadie te va a cobrar por
hacer esto ni mucho menos pero veis esto
Star veniros al repositorio de roadmap y
pinchar en el botón de Start que es una
manera de dar un like en el repositorio
para que más gente lo conozca para que
más gente sepa que aquí hay eh código
para aprender a programar un segundo es
no sé cuánto puedo llevar esto espera
uno no sé un segundo de vuestro tiempo y
y ayuda a que esta actividad pues se
siga haciendo todo lo que podáis eh
compartir abrar a la gente a vuestros
compañeros a más gente que esté
Aprendiendo la propia página de retos de
programación abajo de todo tiene un
compartir Eh bueno si podéis hacer que
este recurso llegue a más gente pues os
lo agradezco porque así eh significará
que por supuesto va a haber más gente
para aquí pero eso significará que yo
voy poder seguir creando contenido y que
podremos mejorar esta actividad quién
sabe en qué se acaba convirtiendo esto
empezamos este tercer año de directos y
cada año yo creo que hemos ido mejorando
cosas así que quién sabe en lo que puede
quedar este roadmap y se acaba
convirtiendo en un recurso para aprender
programación para muchísima gente Ojalá
ojalá lo consigamos Vale ahora sí venga
vamos al primer reto el primer reto era
un reto muy fácil para empezar a dar ahí
esos primeros pasos vale lo tenéis en
retos programación comom bar roadmap OK
Así que el primer reto reto cero se
llamaba sintaxis variables tipos de
datos y hor mundo Este era el reto para
que empezar a tomar alguna decisión
sobre vamos a empezar la ruta de estudio
Qué lenguaje de programación o por qué
lenguaje de programación quieres
comenzar vale Así que te decía preparado
para aprender a repasar el lenguaje de
programación que tú quieras repito y
Siento ser pesado Esto vale para
cualquier lenguaje de programación
Aunque a mí me veis haciéndolo con
python eh después nos iremos a las
correcciones de la comunidad y flipar
porque hay más de 200 correcciones que
ya ha enviado la comunidad en un montón
de lenguajes Vale dice Recuerda que
todas las instrucciones de participación
están en el repositorio leer la web y
leer repositorio lo primero ya has
elegido el lenguaje No todos son iguales
pero sus fundamentos suelen ser comunes
Este primer reto te servirá para
familiarizarte con la forma de
participar enviando tus propias
soluciones Okay es mi propia corrección
es mi manera de explicar la manera en la
que yo explico los retos o la manera en
la que yo elaboro el elaboro el código
no es ni el código más profesional del
mundo ni el código más cutre del mundo
me intento quedar a medias Por qué
Porque Habrá gente que esté viendo Este
vídeo y que diga br yo empiezo de Cero y
habrá gente que dirá Bray yo ya tengo
experiencia entonces me intento quedar
en una corrección que tanto la gente que
está empezando como la gente que lleva
más tiempo pues puede entender No suelo
hacer cosas muy propias del lenguaje o
cosas muy complejas de entender porque
creo que eso pediría perdería todo el
sentido si lo que estamos intentando
pues aprender o mejorar nuestra lógica
okay Así que eh Por favor ya digo Aquí
Este primer reto te va a servir para
familiarizarte con la forma de
participar enviando tus propias
soluciones si no habéis participado en
este primer reto por favor podéis seguir
participando Aunque hoy eh Ya me ponga a
corregirlo o lo explique o ya publique
el segundo reto Ahora aquí llegamos al
ejercicio Cuál es el ejercicio crea un
comentario en el código y coloca la URL
del sitio web oficial de lenguaje de
programación por qué Para así ya también
tengáis la referencia del lugar donde
Vais a aprender programación o donde
está la documentación de cada uno de los
lenguajes y os digo Aquí representa la
síntesis de los comentarios crea
variables y constantes si se soportan
crea variables representando todos los
tipos de datos e imprime por terminar el
texto Hola y el lenguaje que hayas
elegido y te digo Aquí al final fácil No
te preocupes Recuerda que esta es una
rota de estudio y debemos empezar por el
principio okay Así que porfa que nadie
diga bu esto ya lo sé calma las cosas
las tenemos que hacer poquito a poco y
ya veréis como en el siguiente reto que
voy a publicar pues ya va a haber una
parte muy básica pero ya va a haber una
parte para bueno intentar hacer un
poquito más si pinchara aquí en
ejercicio esto s iba a llevar a gih vale
en giob está el ejercicio y aquí ya
podéis ver lo siguiente ya os lo voy a
enseñar haciendo un poco de spoiler aquí
tenéis las correcciones que ya ha
enviado la comunidad fijaos bash csharp
c+ Plus c cobol Dart Go haskel Java
javascript coling Lua ocam Pascal php
prolog python Ruby rust lecheo cuas
Swift y types la comunidad ha enviado
correcciones En todos estos lenguajes
que falta algún lenguaje que sea que tú
quieras aprender Envía tu corrección así
on tendremos muchísimas más cosas vale
así tendremos muchísimas más cosas así
que por favor en comunidad todo esto es
mucho más fácil todo esto es muchísimo
fácil que decir bry me importa nada que
tú lo expliques en python a mí Yo lo que
quiero aprender es go pues me voy a la
carpeta de Go y dices Diego Kevin Miguel
y deera han enviado correcciones de Reto
en Go Así que vale con mi explicación
más comparando también con lo que han
hecho otros miembros de la comunidad que
ejercicio no tiene por qu ser exacta
exacta Exactamente lo mismo que yo lo
corrija de una forma no quiere decir que
tengan que ser copy pastes todos los
ejercicios cada persona lo va a entender
de una manera lo va a abordar de una
manera distinta Eso es lo importante que
tú te pelees contra el código porque si
no no se aprende a programar ya sabes
que se aprende programando vale pero
junto con la parte explicación quizás
más teórica que me vas a escuchar a mí
más ejemplos en el código o en el
lenguaje que tú quieres aprender pues
aún mejor vale Así que os queda por aquí
eh todo vale teniendo esto nos vamos a
resolver reto programación lo tengo por
aquí el enunciado vamos a ir leyéndolo
poquito a poco y vamos a ir eh
explicando un poco todo vale Así que yo
lo voy a corregir en python como os he
dicho qué tenéis que hacer os venís a la
carpeta del lenguaje si no existe la
carpeta del lenguaje la creáis vale Si
no leer las reglas para saber cómo
tenéis que participar crear el fichero
etcétera Pero básicamente es en una
carpeta dentro del directorio donde está
el reto de programación en el que
queréis participar dentro de la carpeta
del lenguaje escrito en minúsculas
tenéis que crear un fichero con el
nombre de vuestro usuario en github
revisar por favor Cuál es el nombre de
vuestro usuario en github Vale entonces
el mío es mouredev la extensión es Spy
porque va a ser python el ejercicio y
ahora teniendo esto voy a empezar a
hacer un poco toda la corrección del
ejercicio lo tenemos aquí abierto vamos
a ir hablando vamos a ir viendo eh qué
es lo que nos pedía el ejercicio el
ejercicio nos decía lo siguiente decía
crea un comentario en el código y coloca
la URL del sitio web oficial del
lenguaje de programación que ha
seleccionado vale Y cuál es la web
oficial de python que yo he elegido pues
me voy a venir a Google y voy a poner
python yo que sé vale veo python España
porque hay el propio dominio dentro de
España Pero bueno eh en realidad la
propia web oficial Aunque entremos
dentro del dominio de España en realidad
la web oficial general para todo el
mundo es python.org aquí es donde está
la documentación Cómo instalarlo bla bla
bla eh absolutamente todo lo del
lenguaje lo Vais a encontrar aquí y
eh elijáis el lenguaje que elijáis va a
tener su web oficial con sus recursos
con su documentación y y con su forma de
acabar obteniendo una respuesta a lo que
yo os estoy pidiendo los ejercicios de
rad map vale Así que vengo por aquí y lo
primero que pedía el ejercicio era que
era un comentario Vale pues lo primero
que teníamos que estudiar aunque esto os
suene como muy básico es y Cómo creo un
comentario en python Qué es un
comentario a la gente que tendrá que
empezar por aquí Bueno un comentario es
un código que no se ejecuta es un
comentario porque yo puedo escribir lo
que yo quiera pero no es código
programado como tal no es código que va
a acabar desencadenando una ejecución
concreta vale nos sirve para en cierto
modo pues intentar aclararnos cosas a
nosotros mismos a nuestros compañeros o
a nuestro yo de futuro vale no quiere
decir que habitualmente se tenga que
comentar mucho pero sí cuando es
necesario sobre todo cuando estamos
empezando Así que no tengáis miedo lo
vuelvo a repetir cuando estáis empezando
a dejar comentarios por encima de lo que
se cree que suele ser lo habitual así
que me voy a poner me voy a venir por
aquí y escribir un comentario Vale y en
ese comentario decía que pusieras la URL
de la web Vale y la URL de la web
oficial de python es
python.org Okay pero lo siguiente que
nos decía era indica las diferentes
formas que tienes de escribir un
comentario en el lenguaje que hayas
seleccionado Pues mira ya lo hemos visto
esto es un comentario eh en una línea en
python Pues bueno con una almohadilla en
otros lenguajes pues suele ser con dos
barras inclinadas o como sea vale Y
también nos dice que si existe en tu
lenguaje crear comentarios en varias
líneas Pues que indiques Cómo es en
python el formato para escribir
comentarios en varias líneas es con tres
dobles comillas al abrir y al cerrar y
todo lo que yo escriba aquí en el medio
por ejemplo esto también es un comentar
en varias líneas Vale entonces ya tengo
un comentario en varias líneas si yo
ejecutara este código esto simplemente
serían anotaciones mías no podría hacer
fallar el programa ni desencadenar nada
vale Y en python encima aún son más
especialitas y otros lenguajes también
soportan esto que lo que son las cadenas
de texto se suelen utilizar estas
comillas dobles pero en algunos
lenguajes también se soporta o en
algunos lenguajes incluso solo se
soporta lo que son las comillas simples
Así que si yo ahora meto tres comillas
simples para abrir y tres para cerrar y
meto este texto aquí esto en realidad
también es otra forma de escribir
comentarios en python Así que tenéis que
buscar el equivalente en el lenguaje de
programación que estéis utilizando Okay
esto es bueno muy básico muy simple pero
que al fin y al cabo Si queremos empezar
por el principio de todo esto nos hace
falta Vale qué más cosas eh se nos ped
el ejercicio vamos por aquí decía
em Crea una variable y una constante si
el lenguaje lo soporta Vale pues voy a
crear una variable Cómo se crea una
variable en python pues simplemente
darle un nombre no hace falta Ninguna
palabra reservada que algunos lenguajes
este la palabra bar o parecido Pues no
yo quiero crear una variable pues le
llamo my variable en python Y esto es
algo que también habría que explorar
cuando estáis empezando cualquier
lenguaje que hayáis seleccionado es como
es la sintaxis Cómo escribo yo hago sí
my variable con la primera en mayúscula
o todas o separo por gu bajo pues esto
es algo que también tiis que descubrir
Cuál es la sintaxis por defecto Cuáles
son las diferentes convenciones que
tiene vuestro lenguaje de programación
para en este caso nombrar variables en
python es lo que se llama el snake Case
snake de de de de serpiente vale que por
cada nueva palabra hay un guion bajo y
todo escribe en minúsculas y lo
siguiente que ties que hacer para darle
eh el valor una variable ya es colocar
algo a continuación del Igual yo voy a
crear una variable de tipo cadena de
texto entre dos comillas dobles ya que
hemos visto que bueno se puede escribir
texto así vale Y yo digo que esto es mi
variable Okay Vale entonces esto es una
variable Qué es una variable en
cualquier lenguaje de programación Pues
un dato que pueda acabar mutando Yo
podría cambiar aquí y venir my variable
y decir nuevo valor de mi variable la
variable originalmente tenía un valor
queda una cadena de texto que decía mi
variable pero he acabado cambiando por
otra cadena de texto a medida que se va
ejecutando línea a línea vale decía
también el ejercicio que creéis una
variable pero que también crearé una
constante Uf qué es esto una constante
Pues bueno como una variable pero no
varía por eso se llama constante vale
python tiene constantes Pues en realidad
no tiene constantes decir si y esto que
aplique a todos los retos de
programación que voy a publicar durante
el año en este radm si no lo tiene
vuestro lenguaje Pues no hay nada que
hacer es decir se trata un poco de que
también conozcáis Qué cosas existen a
nivel conceptual a nivel fundamental los
lenguajes Pero qué cosas en concreto
tiene vuestro lenguaje o no tiene o se
pueden hacer de más maneras igual hay
otros lenguajes en el que tú no puedes
escribir comentarios con esta comilla
simple Ok y en otros que sí y en otros
que lo puedes hacer Pues con otro
carácter yo que sé no entonces en python
no existen las constantes todos son
todos los datos que yo creo pueden
mutar Vale pues mala suerte Pues yo no
crearía constante pero sí que es cierto
que si nosotros queremos alguna forma de
representar una constante en python
Aunque pueda variar lo que se suele
hacer es por convención hacer esto si yo
ahora vengo por aquí hago my constant
voy crear una variable que se llame mi
constante constant si yo escribo el
nombre de una variable en mayúsculas yoo
presentando aunque esto pueda variar es
que por favor no me cambies el valor de
esta constante tengo por aquí y le voy a
llamar también mi constante va a ser un
texto Pero nos tenemos que dar cuenta
que esto es una convención vale esto es
por convención yo ahora si viniera aquí
y llamara a my constant le podría dar el
valor que me diera a mí la gana que esto
va a compilar va a funcionar si yo
arrancara el ejercicio veis aquí dice Uy
qué pasa aquí dice Uy igual tienes aquí
un carácter que igual no te gusta que
estoy poniendo aquí vale nos dice revisa
a ver si me estás metiendo caracteres
que no vale Pero si yo ahora cierro y
vuelvo a arrancar vemos que no da error
entonces estaba fallando por el tipo de
carácter porque no lo acepta dentro de
su coding pero en realidad Cuando yo le
quité el carácter ese raro que era la
diéresis porque no permite las diéresis
como tal pues lo que hemos visto aquí o
no las permite así de buenas a primeras
hay maneras de escribirlas no vemos que
aunque yo diga que es una constante que
este mayúscula deja Modificar el valor
okay Así que es una constante de mentira
pero que sirve para que la gente que en
este caso sabe python en el momento que
ve esto dice Ah vale Esto me está
intentando representar que es una
constante Así que no tiene que cambiar
vale no tiene que cambiar vale más
cosillas que nos pedía por aquí ya
tenemos lo de las variables y las
constantes existían dice crea variables
representando todos los tipos de datos
primitivos del lenguaje cadenas de texto
enteros buanos los que sea también esto
era un poco una labor de de de de
trabajo por vuestra parte queréis
empezar en un lenguaje pero Cuáles son
los tipos de datos primitivos eh
programar no deja de ser Pues acabar
creando datos instrucciones piezas de un
puzzle y mezclándolo entre ello Qué pasa
que bueno todo se puede llegar a un
nivel que acabamos creando Pues el
software que nos de la gana pero
inicialmente todo va a partir de cosas
muy muy básicas eso os lo prometo todo
empieza por por lo que estáis viendo
aquí y el lenguaje de primeras ya tiene
lo que se llaman esos tipos de datos
fundamentales o
primitivos veis que yo sin hacer
prácticamente nada ya he podido escribir
una cadena de texto con lo cual ya
entiendo que la cadena de texto es un
tipo de dato primitivo cada lenguaje
tiene 3 cu 5 10 tipos de datos
primitivos dependiendo del lenguaje en
python en realidad existen cu tipos de
datos primitivos que realmente existen
en todos los lenguajes de programación
vale Así que vamos a ver cuáles son esos
tipos de datos primitivos el primer tipo
de dato primitivo es el que llamamos in
entero integer
eh un tipo de dato que nos sirve para
representar números enteros que son
números enteros pu los que no tienen
decimales vale Así que le voy a llamar
aquí a mi variable my int le podría
llamar ya sabéis como me de la gana y
cómo hago para asignarle a esta variable
llamada my int un número entero Cómo
hago para crear una variable de tipo
entero pues simplemente le meto un
número ya está como le he metido un
número y le he metido un número sin
comillas esto automáticamente pasa a ser
un número pasa a ser un int vale hay
algo que podríamos hacer para
representar todo esto que es e bueno os
lo hago al final vamos a ir viendo los
tipos de variables pero igual que
tenemos números enteros También tenemos
números decimales Cómo puedo representar
yo un número decimal Pues para eso
tenemos un tipo de dato que se llama
float no de coma flotante básicamente
float es como se llama en python Cómo
hago para asignarle un número decimal
pues escribo un número decimal 1,5 esto
ya significará que esta es una variable
que acepta pues números decimales Okay
qué tenemos más aquí tercer tipo de dato
primitivo he dicho que hay cuatro
tenemos los buanos vale Bull en realidad
Bull bullan vale eh un bullan es algo
que en realidad solo atiende a a lógica
boleana es decir algo que puede ser
verdadero o que puede ser falso y que la
gran mayoría de los lenguajes lo que
hacemos es esto poner true O my Bull
vengo aquí y Pongo false aquí le estoy
cambiando el valor a mi variable primero
he dicho que es verdadera después he
dicho que es falsa estos son los únicos
dos valores que puede tener una variable
de tipo bullan y ya por último Tenemos
aquí pues la que ya hemos visto al
principio mi cadena de texto No mi str
Pon aquí
lo que es un String vale String
simplemente pues yo que sé Eh mi cadena
de texto pero igual que puedo crear la
cadena de texto entre comill con estas
comillas dobles si yo pongo my other
stram otra variable digo mi otra cadena
de texto y cómo la podré representar
Pues con comilla simple ya veis que si
pongo comilla doble al principio y
simple al final no vale son o las dos
simples o las dos dobles con esto ya
tengo todos los tipos de datos
primitivos primitivos que tiene el
lenguaje según el lenguaje que hayáis
elegido lo repito Habrá más o menos
tipos de datos primitivos vale Y ya lo
último que nos pedía el ejercicio nos
decía imprime por terminar el texto Hola
y el nombre del lenguaje vale tendríais
que haber buscado Cómo podéis imprimir
texto por consola en python es tan fácil
como escribir print y entre comillas lo
que le queremos pasar qué le quiero
pasar Pues esta cadena de texto no es un
Stream lo que tengo que acabar pasándolo
entonces Bueno digo Hola Y en mi caso el
lenguaje de programación es python pero
pensar en alguien que nunca haya
programado esto le vale para ver el
lenguaje y decir Ey he programado algo
si yo ahora ejecuto esto vemos por aquí
por consola Hola python Ey un hola mundo
una buena ejecución por aquí y lo que os
Decía si queréis comprobar los tipos de
datos esto ya va un poquito Aparte
también tenemos en cada uno de los
lenguajes Este es un pequeño extra
tenemos la manera de obtener Cuál es el
tipo de dato que estamos representando
sobre todo el lenguajes que son
débilmente tipados como es en este caso
python python Aunque yo le esté dando
aquí un número después si quisiera
asignarle un valor entero o decimal O
bullan podría cambiarlo en tiempo de
ejecución y no daría un error no pasaría
nada pero vamos a ver inicialmente cuál
es el tipo de dato de cada uno de ellos
voy a poner un print y voy a llamar a
una función del sistema que no tenéis ni
que saber lo que es una función del
sistema pero le voy a ir pasando
cada una de las variables que tengo por
aquí vamos a hacer aquí un print de los
cuatro tipos de datos de My in my Bull y
mystream y vamos a lanzar nuestro
programa y vamos a ver lo que pasa o lo
que pinta vemos int float Bull Y str
aquí están los cuatro tipos de datos si
nosotros especificar el tipo de dato que
queremos crear aún así podríamos indicá
selo de una forma más implícita yo le
podría decir con dos puntos decir mira
esto es un int Pero bueno aún así podría
cambiar el tipo de datos simplemente es
un poco para dar información igual que
my constant yo la ponía en mayúsculas
para indicar que era una constante
Aunque podía variar vale y le hago entre
dos puntos y le meto el tipo de dato int
float eh Bull String str en realidad
serviría para indicar a resto de
personas o a mi yo futuro Oye que yo he
creado esta variable y yo lo que quiero
meter aquí son enteros no me hagas el
lío y no me vengas ahora aquí my int y
me digas eh mi entero o me digas cuatro
y no no no este cuatro ahora ya será una
cadena de texto porque va entre comillas
ya no será un número así que no me la
líes que te he dicho que era un entero
Okay entonces Esto inicialmente es lo
que teníais que haber hecho en el primer
ejercicio queríais hacer más habéis
visto más casuística lo habéis resuelto
de otra manera no pasa absolutamente
nada porque Incluso si yo ahora me voy
aquí a las correcciones de la comunidad
vamos a irnos a alguien de javascript
por ejemplo aquí a ver vale pues vemos
Berto Cómo ha creado variables Cómo ha
creado constantes os fijáis cómo le mete
tipos de datos Big int décimal entero
veis no son Exactamente lo mismo pero
entendéis que esto está representando un
número entero esto un número decimal
aquí un número eh mucho más grande vale
vemos un bullan vemos que hay algo
parecido vale Vámonos a otro lenguaje de
programación que a Swift nos vamos venga
vengo por aquí aquí lo veis ya es un
lenguaje tipado ya está indicando que
esto es un Stream que esto es un bullean
un in float veis es otro lenguaje
Vámonos a ras que ras seguramente es muy
diferente Ah mira led para crear
variables lo que sea le estamos dando
los tipos de datos tienen otro nombre
pero está representando números enteros
cadenas de texto buanos etcétera Así que
la dinámica Esta es la que vamos a
intentar cumplir vale todos sabemos
Vámonos a cobble Por qué Claro cobble
claro cobble creado hace 500 años eh se
seguro que es muy diferente Pues si es
diferente Pero mira una variable que
hemos creado por aquí y aquí hemos
definido una constante y aquí hemos
definido un número un entero un float un
float negativo una cadena lo veis
entonces Oye es una locura cobble Eh sí
pero Fijate display qué será display un
print Hola cobol loco Sí pero a que
realidad está pasando por los mismos
pasos que pasamos nosotros Mira
comentarios aquí tenemos los comentarios
No veis no es tan complicado lo dicho
que al fin y al cabo tenéis eh recursos
para todos porque solo con verme a mí o
solo con ver las soluciones y hacer así
no os va a valer de mucho Lo importante
es pelearse y que vale estás diciendo
que es muy fácil y yo no di pasado ni de
la primera línea no pasa nada eso eh te
ha pasado a ti y me ha pasado a mí y ya
está pero por eso tienes que pasar si no
no hay manera vale dicho esto Cuál será
la siguiente dinámica ahora que hemos
explicado este reto de programación Pues
cómo continúa esta dinámica la dinámica
por lo que va a continuar ahora que
hemos visto pues alguna corrección de la
comunidad y explicado Pues todos los
pasos que tenemos que seguir la dinámica
Es que yo voy a publicar un nuevo reto
de programación Okay vamos a publicar un
nuevo reto que ya será el siguiente
asociado a roadmap Este era el reto o el
ejercicio eh 00 pues vamos a pasar al
ejercicio
[Música]
01 crea ejemplos utilizando todos los
tipos de operadores de tu lenguaje aquí
ya entraba algo muy concreto que es vale
Qué lenguaje habéis elegido el que sea
pues os toca revisar Cuáles son todos
los operadores y aquí seguro que más de
uno ha descubierto un nuevo operador
porque es probable que los más
habituales o los que utilizamos más a
menudo que estamos más acostumbrados a
ver pues que sí los tenemos vale más que
aprendidos pero en el momento que nos
ponemos a indagar un poquito decimos Uy
Y este operador existía en mi lenguaje
Pues bueno vamos a hacer un repaso por
diferentes operadores en este caso yo
voy a hacer el repaso por operadores de
python pero que ya veréis como la
mayoría son comunes aún así ya veremos
qué ha hecho la comunidad en otros
lenguajes también así que voy a venirme
por aquí me voy a crear aquí un
comentario y voy a poner operadores
venga vale Y aquí vamos a empezar a
hacer un repaso por los diferentes
operadores porque hay 300,000 operadores
vamos a empezar por los que seguramente
más gente conoce que son los operadores
aritméticos no os decía que de cada uno
de los ejemplos que utilizáis porque
ponía crea ejemplos para poner en
práctica los operadores por ejemplo el
operador de suma el más bueno no me
digas que está el más no Hazme un
ejemplo súmame dos números no y enséñame
cómo funciona Vale pues había que hacer
ejercicios e imprimirlos cada uno y
Bueno siempre en cuenta un poco qué
tiene vuestro lenguaje vale Así que me
voy a ir haciendo prints de los
diferentes operadores aritméticos que
tiene por ejemplo el operador de suma y
voy a empezar a hacer ejemplos para que
veamos los más normales bueno los más
simples o los aritméticos sobre todo que
en mayor o menor medida todo el mundo
conoce pues no tiene mucha dificultad
Así que simplemente voy a ir creando
ejemplos para ir repasando todos los que
existen vale por ejemplo voy a hacer 10
+ 3 el operador aritmético de suma es el
símbolo más aquí lo que estáis viendo
con la f esta y entre las llaves Es que
voy a interpolar valores Esta es una
manera de imprimir una cadena de texto
en la que yo voy a colocar código
entonces Cómo podemos utilizar el
operador aritmético de suma pues
simplemente utilizando el símbolo más
por eso yo voy a poner suma 10 + 3 = y
aquí sí que voy a utilizar código esto
es una cadena de texto si yo ahora me
pongo a imprimir esto veis suma 10 + 3 =
13 porque esto es texto como tal esto no
lo está operando simplemente es texto
pero aquí esto que estoy interpolando el
10 + 3 entre eh llaves en python sí que
estoy utilizando Pues bueno el lenguaje
de programación para realizar la
operación Vale qué más Qué más cosas
podemos tener por aquí Esto es algo más
avanzado bueno la interpolación como
queráis Imagínate que lo queríamos hacer
más fácil o lo que fuera siempre
podríamos poner 10 + 3 y después Aquí
imagínate un más y ponerle la otra
cadena de texto o imprimirlo en dos
líneas o guardar en una variable
imagínate zoom y que yo viniera aquí y
la suma hiciera eh 10 + 3 y que esta
suma pues fuera lo que muestro en otro
print hago así entonces Bueno aquí un
poco pues simplemente avanza así un
pelín pero como vosotros más o menos
pensaris que se puede imprimir ya digo
Este es un concepto el de interpolación
en cadenas de texto que existe muchos
lenguajes de programación para poder
dentro de una cadena de texto utilizar
también código programado en cada
lenguaje hay una sintaxis distinta en
python en concreto es esto metiendo la F
y entre las llaves metiendo el código al
que nosotros queremos hacer referencia y
creo que como vamos a escribir tantos
operadores creo que así nos queda
bastante fácil para que no nos queden
muchísimas líneas Bueno vamos ir
haciendo el repaso tampoco vamos a echar
muchísimo tiempo sobre todo los más
fáciles una resta el operador aritmético
menos vale qué más una multiplicación
pues la multiplicación la hacemos con el
operador asterisco Aquí está Y qué más
Tendremos una división Vale pues la
división con esta barra inclinada Vale
ahora aquí puede aparecer alguno Que
igual no suena tanto por ejemplo el
módulo el módulo es el resto de la
división es lo que nos queda después de
dividir vale por ejemplo vamos a
pararnos aquí módulo si nosotros fijaos
para que nos vayamos aquí al módulo
módulo se hace con el símbolo del
porcentaje módulo de 10 3 1 por qué
Porque la división entera sería 103 a 3
o
3,3333 no pero en cambio después de la
división entera que sería 9 3 sí que nos
daría 3 10 3 nos sobra uno el resto Pues
el módulo Calcula ese resto vale veáis
que también tenemos operaciones para
poder Hallar el módulo otra operación
que puede que igual no la conociera
tenemos operaciones exponenciales
también en la gran mayoría de los
lenguajes exponente por ejemplo por
ejemplo en python cómo hacemos el
exponente Pues con dos símbolos de
multiplicar Okay Vale por eso aquí veis
pues 10 a la TR Pues nos da un 1000 por
aquí vale Y ya el último operador
aritmético así habitual es la división
entera Pues justo la inversa ahí al al
módulo que teníamos antes la división
entera es en vez de con dos símbolos de
multiplicar como el exponente con dos
símbolos de dividir por aquí claro
fijaos lo que nos sale por aquí en el a
si nosotros dividimos 10 3 nos da tres
periodo eh 3 con3 periodo Pero en cambio
la división entera es que el resultado
nos tiene que dar un número entero
redondeado vale 10 3 división entera 3
ya evita la parte decimal os fijéis como
hay pues muchos operadores Ya solo
dentro de los aritméticos es posible que
igual no conocieras todos pero tenemos
montonazo de operadores vamos a seguir
con más operadores operadores de
comparación por ejemplo est nos sirven
para comparar pues valores valores de
variables creo que la igual la la manera
más fácil de explicarlos es con números
vale pero pensar que en muchos casos
algunos operadores los aritméticos
suelen estar asociados a números pero
por ejemplo el operador más también se
utiliza bastante en cadenas de texto
pero los operadores de comparación
Aunque lo podemos utilizar mucho con
números También lo podríamos utilizar
con variables Solo que yo lo voy a
explicar con números porque Bueno
estamos empezando la ruta de estudio
tampoco me quiero pasar de complejidad
pero entender que a veces estos
operadores No únicamente eh se tienen
que usar con lo que yo los voy a
explicar sino que estos operadores
combinados Pues con los diferentes
elementos del lenguaje pueden acabar de
bueno dar muchas más cosas así que vamos
a verlos de comparación cosas que nos
servirían para comparar Pues el más
utilizado de todos el operador de
comparación de igualdad vale Qué es el
el operador de igualdad pues por ejemplo
igual a igualdad bueno no igualdad voy a
poner aquí Imagínate que quiero comparar
si 10 es igual a TR Pues yo pondría dos
veces símbolo igual la igualdad
habitualmente es con dos símbolos igual
así que yo puedo decir mira 10 es ig a 3
aquí puedo decir 10 = 3 es y le hacemos
Aquí también la interpolación y ahora
Aquí sí que metemos código 10 = 3 Bueno
si yo ejecuto esto lo que veremos es
igualdad 10 = 3 es false vale los
operadores de igualdad nos van a dar
como resultado si es verdadero o falso
qué significaría esto claro los números
es como muy fácil de ver pero con los
operadores de igualdad también podemos
comparar valores de variables valores de
cadenas de texto claro podríamos
utilizar para varias cosas aún así ya
digo lo voy a poner con números pero
tenerlo en cuenta que lo podéis utilizar
con más cosas vale vamos por aquí vamos
a ver más operadores de comparación
igual que tenemos el de igualdad tenemos
el de desigualdad vale Cómo es el de
desigualdad en python por ejemplo es con
el símbolo de admiración y el igual 10
es distinto de tres ahora si ejecutamos
esto sí que nos daría 10 distinto de
tres es true efectivamente 10 es
distinto de tres vale vamos a más vamos
a seguir tirando aquí por ejemplo mayor
que 10 Mayor que 3 es que bueno en este
caso pues sería verdadero igual que el
mayor que también tenemos el menor que
con el símbolo menor igual que tenemos
el mayor y el menor que tenemos el mayor
o igual que y el menor o igual que mayor
o igual que menor o igual que y sería
con el mayor y el igual pues tal cual
suena y el menor y el igual y aquí más
de lo mismo aquí podríamos cambiar el
valor y decir e 10 es mayor o igual que
10 y aquí podría decir es menor o igual
que tres este lo puedo dejar así para
que el primero por ejemplo pues nos dé
un true ya que es 10 Es mayor que 10 no
pero es igual mayor o igual con lo cual
nos vale perfectamente Entonces todos
estos son los operadores de comparación
que habitualmente pues suele tener un
lenguaje línea 19 está mal esperar mayor
o igual que mayor o igual que 10 ahí
estamos gracias Qué más operadores
tenemos por aquí operadores lógicos
también comunes a la gran mayoría de
lenguajes de de programación esto sí que
la gran mayoría Pues nos suelen sonar
vale seguro que os suena el operador and
que en algunos lenguajes escribe and en
otros lenguajes se escribe Pues con dos
ampersan vale Cómo o qué acaba para qué
acaba valiendo el and bueno el and lo
que intenta es que dos condiciones pues
sean iguales Okay pues vamos a ver esto
un and imagínate 10 + 3 es ig a 13 and m
5 - 1 es ig a 4 qué nos acabará dando
esto venga Lo Interpol y metemos
exactamente este código por aquí vale es
y le voy a meter el código vale 10 + 3 =
13 and 5 - 1 = 4 esto significa 10 + 3 =
13 y 5 - 1 es = 4 10 + 3 = 13 verdadero
y 5 - 1 = 4 también verdadero verdadero
y verdadero es verdadero con lo cual el
and está cumpliendo pues las dos
operaciones que tenemos por aquí por eso
este and es true okay Bueno totalmente
cierto por supuesto se han cumplido
ambas condiciones a la derecha y a la
izquierda de este operador lógico Pero
en cambio tenemos un operador lógico que
es el or o a veces también representado
en algunos lenguajes de programación con
este pip no Y si yo ahora cambiara esto
y pusiera or aquí or nos va a volver a
decir que es true Pero por qué vale
porque el or lo único que pide es que
sea verdadera por lo menos una de las
condiciones ahora vamos a hacer que esto
es mentira por ejemplo voy a hacer 10 +
3 voy a poner 14 Pero en cambio Si Yo
corro el programa me va a seguir
diciendo que este or es true Por qué
Porque 10 + 3 no es 14 pero 5 - 1 sí que
es 4 entonces como se cumple una de las
condiciones de esta operación lógica es
verdadera vale así funciona el operador
o al final lo tenemos que leer uno u
otro si uno u otro es verdadero es
verdadero en cambio para que este an sea
verdadero tiene que ser tien que ser
verdadero ambos tiene que ser verdadero
este tiene que ser verdadero este por
aquí y cuál es el tercero operador
lógico que solemos tener la gran mayoría
de lenguajes de programación Pues el not
o representar muchos lenguajes de
programación con el símbolo de
admiración voy a hacer otra porque creo
que así lo vamos a ver bien aquí no
tenemos que andar combinando nada vale
voy a poner por ejemplo 10 + 3 = 14 y yo
ahora vengo por aquí y digo 10 + 3 es =
14 esto al ejecutarlo me daría false
porque 10 + 3 no es igual a 14 Pero en
cambio Si yo negara esto y pusiera not o
le pusiera el not aquí delante qué
significaría que sería verdadero en caso
de que esto no se cumpliera okay Así que
vengo por aquí y ahora al correrlo ahora
ya me da true veis ya pasado a ser
verdadero perfectamente vale más
operadores hay bastantes no y al final
parece que solo usamos dos o tres
operadores de asignación qué es esto de
los operadores de asignación Pues bueno
son operadores que en realidad estamos
utilizando en conjunto pues por ejemplo
con el valor de las variables voy a
venir por aquí y me voy a crear una
variable que le voy a llamar my number
por ejemplo y a my number le voy a dar
el valor 11 me he creado una variable
venga y la voy a imprimir print pues my
number aquí ya estoy haciendo una
asignación Aquí tengo el operador de
asignación el igual sirve para asignar
el valor 11 a la variable que se llama
en este caso my number esto ya es una
asignación Pero qué más operadores por
ejemplo tengo yo por ejemplo tengo el
más igual Imagínate que hago my number +
= 1 Qué significa este operador más
igual esto es suma y asignación dejadme
que que imprima muchas veces aquí el
valor de My number que así voy metiendo
los diferentes operadores de asignación
Qué hace esto pues le suma uno al valor
que ya tiene my number veis que aquí no
aparece el 11 en ningún momento o que no
aparece my number sumándole uno que no
estoy haciendo igual my number + 1 que
esto podría valer aquí estaría
utilizando este operador aritmético pero
no hay operador de asignación que ya me
permite directamente sumarle uno uno o
lo que me dé la gana o cinco fíjate
imprimo Esto me da 16 Por qué Porque al
valor que tiene my number le he sumado
cinco vale Pero igual que tenemos la
suma y la asignación vamos a ver qué más
cosas tenemos Pues por supuesto vamos a
combinar estos operadores aritméticos
que vimos antes si ponemos - = 1 es
resta y asignación qué más podemos
utilizar si podemos utilizar la suma y
la resta seguramente podremos utilizar
la multiplicación multiplicación y
asignación más si podemos utilizar la
multiplicación y asignación podremos
utilizar la división y la asignación y
así no tenemos que andar repitiendo
código vale Y esto ya nos va a dar pues
una pista ya voy a poner aquí unos
cuantos más qué más operadores teníamos
aritméticos pues teníamos el de módulo
módulo y asign vale aquí lo que
podríamos hacer es acabar metiendo las
voy a poner por ejemplo en el de
multiplicación que ya sea por dos y la
división Pues que sea entre dos lo
podemos ir variando no pasa nada y aquí
podría calcular el módulo de dos porque
el de uno pues al final nos da el mismo
Vale qué más cosas recordáis que
teníamos el exponente pues tenemos aquí
exponente y asignación Y por supuesto
También tenemos división entera y
asignación con las dos barras es decir
podemos combinar estos operadores
aritméticos que vimos antes con las
operadores de asignación Así que vengo
por aquí ahora lanzo esto y podemos más
o menos echarle un ojo a ver si esto se
corresponde vamos a repasarlo tenemos 11
11 + 1 12 12 - 1 11 que vemos por aquí
11 * 2 y asignado 22 aquí lo vemos vale
en cambio Si después lo dividimos entre
dos ya nos da otra vez 11 y después que
ya nos ponemos a hallar el módulo de dos
pues claro ya al final ya solo Tenemos
uno el exponente de uno es uno la
división entera de uno es uno fijáis
entonces Bueno aquí lo tenemos como con
los diferentes operadores y cómo los
Vamos combinando pues ya llevamos unos
cuantos operadores por aquí venga hemos
acabado ni mucho menos ni mucho menos
venga seguimos operadores de identidad
qué es esto los operadores de de
identidad los operadores de identidad
podemos pensar bueno identidad Qué es la
identidad nos sirven para comparar
valores pero valores de qué tipo No
Bueno en realidad los operadores de
identidad nos sirven para comparar el
valor no de la variable sino el valor de
la posición de memoria y os lo voy a
explicar muy rápido vale voy voy aquí
por ejemplo a crear una nueva variable
my New number Vale y a my New number le
voy a dar el valor 1.0 por qué porque le
estoy dando exactamente el valor que va
a tomar my number y ahora voy a hacer
aquí un print con un operador de
identidad también interpolando y voy a
hacer aquí my number is que es el
operador de identidad my New number y
vamos a ver si esto es igual my number
is my New number es y Aquí vamos a
interpolar esto a ver qué nos dice pyth
dice my number is my new New number es
false cómo es false Es imposible my New
number Vale 1.0 y my number en la última
ejecución vale 1.0 Cómo es false cómo
que es false a ver espera voy a imprimir
aquí my New number A ver cuánto daba
aquí lo tenemos 1.0 1.0 Entonces cómo
nos da false porque como os decía los
operadores de identidad la identidad lo
que intentan comparar es el valor en
memoria es decir tienen sí son dos
números que tienen el mismo valor pero
my New number ocupa una dirección de
memoria my number ocupa otra dirección
de memoria con lo cual no es el mismo
Pero en cambio Ahora imagínate que yo a
my New number le doy el valor de My
number ahora tenemos una variable que es
my number que tiene una posición de
memoria y my New number que ahora tiene
la misma posición de memoria que my
number lo lanzo y ahora ya nos dice aquí
my New number es true lo veis Aquí es
donde está el operador de identidad como
tal y igual que tenemos un operador de
igualdad con el is tenemos un operador
de desigualdad pero en identidad que es
is not si yo pusiera ahora not ahora
vemos por aquí es false porque ahora sí
que no lo es entonces aquí operador de
identidad bueno bastante fácil bastante
rápido pero que alguna vez nos puede
hacer falta para comparar si de verdad
dos objetos son iguales vale Y ya digo
que estoy haciendo todos los ejemplos
con números porque es una forma fácil de
verlo pero no os quedéis con que estos
operadores de identidad o cualquier tipo
de operador únicamente apliquen a
números porque es muy habitual que
apliquen a cadenas de texto que apliquen
a objetos conceptos que ya veremos más
adelante seguimos venga vamos por aquí
operadores hay bastantes no operadores
de pertenencia operadores de pertenencia
también muy fácil un operador de
pertenencia al final lo que nos ayuda es
si algo pertenece a algo así de fácil
cómo lo vamos a entender muy fácil sobre
todo cuando trabajamos con conjuntos con
estructuras se utilizan mucho pero como
aún no hemos visto ese tipo de conceptos
vamos a verlo de una manera muchísimo
más fácil voy a venirme por aquí voy a
hacer un print e Imagínate que yo quiero
comprobar que la letra a está en la
palabra brce imagínate o que la letra u
está en la palabra moure Vale entonces
voy a venir por aquí u os Lo pongo aquí
la letra u está en moure y vamos a
comprobar esto vengo por aquí y vamos a
hacer u in moure y el in este va a
comprobar que si esta letra o lo que sea
está dentro del texto dejarme que Lance
esto lo veis u in mour igual a true ojo
eh estos operadores de pertenencia no
existen en todos los lenguajes estos ya
ya empiezan a ser un poquito más raros o
a veces no son tan directos pero la gran
mayoría sí que existen digo para
comprobar que algo existe en otro
conjunto es muy muy rápido y por
supuesto igual que tenemos esta
pertenencia podemos comprobar que no
pertenece por ejemplo la B voy a decirle
not in moree o mouredev por eso ahora
vemos B not in mouredev y ahora sí que
nos dice true Okay Vale entonces bueno
operadores de pertenencia Buscar de que
más forma formas los podéis aplicar pero
a mí personalmente me gustan mucho y son
muy muy útiles y ahora vamos con los
operadores que existen en todos los
lenguajes y que seguramente menos
utilizan y en muchos casos que igual a
lo largo de tu vida solo los utilizas un
par de veces y la gran mayoría cuando
estás estudiando operadores de bit por
supuesto nosotros en los lenguajes
tenemos operadores para trabajar con
bits se usan para realizar operaciones a
nivel de bit sobre números enteros okay
Así que vamos a ver operadores de bits y
aquí ahora eh voy a aprovechar esta
clase esta le para casi explicaros
operaciones con bits que bueno son
bastante simples pero que así también
vais ver cómo aparecen otro tipo de
operadores vale vamos por aquí y voy a
crear unas variables vale voy a crear
una variable igual que teníamos antes
pues yo que sé una variable que valga 10
y otra variable B que valga 3 y antes de
nada vamos a pensar Cuál es el valor en
bits de 10 y de TR Bueno ya sabéis que
el cero se representa por cer0 el 1 por
un después sería el cómo sería dos vamos
y empezamos a avanzar los bits hasta que
acabamos dando ya sabéis 0 1 Después qué
tendría que ser pues le metemos cero a
la izquierda 10 vale después le metemos
el 11 no sabéis vamos a avanzar formando
números Únicamente con ceros y con unos
vale Así que el tres aquí lo tenemos el
tres por supuesto a ver esa lo hago con
dos bits 00 01 vale cómo sería el dos
cómo hacemos el dos Necesito que me
contéis en binario por lo menos hasta
tres Vale pues bueno sería 10 y el tres
sería 11 vale Así que en binario el 3 es
11 y el 10 en binario pues es 10 10 no O
lo que podría ser lo mismo 001 o si
queréis que los dejemos iguales vale por
los operadores con bits nos sirven para
trabajar con números enteros yo puedo
poner el 10 y el TR aunque no sean
binarios pero los operadores con bits
van a transformar estos números a bits a
ceros y unos y van a trabajar con ellos
vale Así que vamos a ver los diferentes
operadores con operaciones con bits
vamos a empezar aquí con la primera la
primera operación con bits es la
operación and las operaciones con bits
que sería por ejemplo and de 10 se
utiliza el ampersan para la operación
and y bueno los dos operadores que
tenemos por aquí pues cómo sería un and
bit bit de estos dos vamos a ver por
aquí vamos a ver el resultado que nos da
y os voy a explicar el Por qué Cómo está
operando este and básicamente Así que 10
and 3 Imagínate que yo lanzo esto y nos
da 10 ampers and 3 igual a 2 y aquí es
donde podemos decir eh vale Okay HM no
entiendo básicamente nada bueno pues el
operador como funciones que va a ir
comparando bit a bit Y si ambos bits son
uno el bit resultante pues es uno de lo
contrario es cero vamos a hacerlo a mano
no quiero ponerme Aquí muy loco
explicando cómo son las operaciones con
bits porque no creo que esto sea de esta
clase pero sí para que os hagáis un
poquito una idea vale el operador and lo
vuelvo a decir si empieza a comparar bit
a bit cada uno el bit C con el bit el
bit1 con el bit 1 el bit 2 con el bit 2
vale por posiciones y lo que decía es
que si los dos bits son uno el bit
resultante es uno no así que vamos a ver
el resultado aquí y os voy a poner que
nos daría 1 y o es uno no pues entonces
nos da c0 un y un es 1o pues nos da uno
0 y 0 es uno pues nos da o 0 y 1 es un
Pues nos da c vale Qué número es el 0 0
1 0 Pues básicamente es el dos qué nos
ha dado aquí como resultado dos ya está
y él se ha encargado de transformar a
binario y de operar vale Así que igual
que tendríamos este operador and
tendríamos el operador or tendríamos el
operador voy a venir por aquí or
tendríamos el operador xor y cada uno
Pues un poco siguiendo su su teoría Cómo
es el or con el Pipe Cómo eh es el xor
por ejemplo pues con el circunflejo Qué
hace cada uno en cada caso esperar
porque por lo menos os cuento Aquí muy
rápido Qué hace cada uno en cada caso
vale el or lo que hace también es
comparar bit a bit por son operadores
para bits vale pero en este caso el
operador compara cada bit Y si al menos
uno de los dos bits es uno el resultado
es uno lo hacemos aquí si al menos uno
es uno vamos a empezar desde el
principio uno y C uno es uno vale 1 y 1
es 1 0 y 0 es 0 Y aquí y nos da 10 11
vamos a ver el resultado aquí lo tenemos
11 el resultado 10 1 1 es el valor es el
valor binario asociado al número 11
fijaos es fácil porque el 10 era 10 10
Pues el 10 11 es el 11 y en cambio xor
lo que hacemos Es que el operador va a
comparar cada bit Y si los bits son son
diferentes el resultado es uno en cambio
si son iguales es cer0 vamos por aquí
son diferentes uno y cero es diferente
Vale pues entonces uno uno y uno es
igual pues entonces es 0 0 y o son
iguales pues entonces es c0 uno y o son
distintos con lo cual es uno por eso nos
da el nu 10 0 1 es el nu y el 10 10 era
el 10 entonces aquí operaciones bita
bita hay más operadores binarios o
operadores bit bit vamos por aquí voy a
pillar más y os voy a enseñar muy rápido
porque porque bueno no me quiero parar
mucho tenemos el operador not el
operador not lo que hace es intercambiar
el valor bit bit de cualquiera de los
elementos Imagínate que yo ahora el Note
lo hacemos con la virgulilla fijaos aquí
lo tenemos y ahora le voy a lanzar el
Note sobre el 10 y vamos a ver el
resultado Mira veis 10 y me da -11 por
qué Por qué vemos un -11 vale porque en
realidad lo que está haciendo es
invirtiendo el resultado bit bit sobre
esa representación del 10 entendéis esta
parte vale en realidad ese ese
complemento va negando bit a bit
invierte Al fin y al cabo los bits de es
operando más cosas vale desplazamientos
vamos al desplazamiento vamos a hacer
desplazamientos Ya solo nos queda
desplazamiento a la derecha y
desplazamiento a la izquierda y vamos a
ver muy rápido que esto desplazamiento
Porque también yo creo que también nos
enteramos bastante bien desplazamiento
desplazamiento a la derecha vale el
desplazamiento a la derecha lo hacemos
pues utilizando el mayor que dos veces
Imagínate que yo ahora hago aquí 10
desplazamiento a la derecha Dos dos y
vamos a ver cuál sería el resultado
vamos a ponerlo por aquí con código y
vamos a ver lo que pone aquí
desplazamiento a la derecha nos dice dos
vale Cuál era la representación del 10
la representación del 10 era esto que
veíamos aquí 10 10 Ahora imagínate que
empezamos a desplazar sus bits todos a
la derecha Pues claro este uno Este
pasaría a ser un cero y esto pasaría a
estar aquí y esto pasaría a estar aquí
eso sería desplazamiento hacia la
derecha un bit pero hemos dicho dos bits
Entonces esto pasa a ser un cero
cubrimos desde la izquierda con ceros
desde la derecha con cero según hacia
donde nos desplacemos esto pasaría a ser
un cer0 y el uno que teníamos antes en
esta posición pasa aquí Qué es 00 1 0
bueno 10 es el valor binario que le
asociamos al número dos por eso nos da
dos okay Por eso acabamos teniendo este
resultado que veíamos por aquí vale
igual que tenemos el desplazamiento a la
derecha tenemos a la izquierda que lo
hacemos así qué nos daría Pues mira
desplazamiento vemos lo que nos da 40
eso qué significaría si tenemos 10 10
qué es lo que teníamos inicialmente 10
10 vale si desplazamos dos vitas hacia
la izquierda quiere decir que cubrimos
con estos dos ceros entonces 1 0 1 0
esto básicamente es 40 en binario Y
estos Ahora sí Estos son todos los
operadores básicamente que tenemos en
python según el lenguaje que hayáis
elegido quién sabe si más o si menos por
eso se trata de que al final Aquí hay
una teoría Aquí hay una clase en la que
tenemos que empezar a revisar en cada
uno de nuestros lenguajes Cuáles son los
operadores sí que es cierto que aún así
Hay alguno más que puedo meter pero
prefiero quedarme con operadores que
suelen ser más comunes en todos los
lenguajes ahora si empezamos a comparar
diferentes lenguajes hay alguno más del
que podría hablar por aquí en python Y
por supuesto en otros lenguajes que
hayáis elegido Pues también va a
aparecer otros Así que fijaos Hacia
dónde lo podríamos llevar pero creo que
sirve más que de sobra para ejemplificar
por lo menos los operadores que tenemos
comunes en gran parte de los lenguajes
como son operadores aritméticos de
comparación lógicos de asignación de
identidad y estos que tenemos aquí por
último de pertenencia y vitavit más
cosas que nos pedía El ejercicio es
bastante fácil pero ya veis que lleva
algo de tiempo dice utilizando las
operaciones con operadores que tú
quieras cree ejemplos que representen
todos los tipos de estructuras de
control Hala Ahora nos tenemos que poner
aquí a hablar de estructuras de control
Pues bueno a ver qué tenemos de
estructuras de control Aquí también
dependerá un poco del lenguaje yo me voy
a quedar con lo más clásico vale que
tenemos en los lenguajes que esto
también forma parte de los fundamentos
Pues bueno qué estructuras de control
podríamos tener pues las primeras Son
estructuras de control condicionales y
esto lo Vais a entender rapidísimo
porque igual Nunca habéis pensado Cuál
es el nombre de una estructura de
control condicional la estructura de
control Al fin y al cabo nos sirve para
que nosotros le indiquemos a nuestro
código Cómo tomar diferentes caminos
pues Qué es la estructura de control por
antonomasia en cualquier lenguaje de
programación Pues el If el Sí si algo se
cumple haz algo si no se cumple Pues haz
otra cosa voy a crear por ejemp por
ejemplo aquí Pues un String no my String
una variable que se llama my String se
va a llamar mouredev esta cadena de
texto y le voy a poner si my String es
igual ahora ya vemos e ya estamos
utilizando aquí un operador ya estamos
comparando si my String es md Pues aquí
voy a hacer algo con mi código voy a
lanzar un print por terminal que diga my
String es m y si no se cumpliera cómo
funcionan estas estructuras de control
condicional Pues igual que tenemos el If
el si tenemos el Else que es que se va a
desencadenar una instrucción en caso de
que esta condición no se cumple esta
condición o como la querramos complicar
esta condición sería venir por aquí
poner pues my String que es lo que
estamos revisando alguna forma no es
mouredev si yo ahora corriera este
código veis que lo que imprimimos es
mystream es mouredev Pero si yo ahora
pusiera mouredev con muchas vves vemos
que lo que imprime es my String no es m
de porque lo que tiene es muchas subes
pero también le podemos indicar que haga
comprobaciones intermedias vale que muy
bien Igual no se cumple este If Pero
igual hay otra comprobación o
comprobaciones por el medio que podemos
hacer eso es lo que llamamos un el sif
podría comprobar no Bueno pues igual no
es murd pero a mí me interesa hacer algo
con mi código en caso de que sea bry sea
mi nombre entonces Aquí voy a poner un
print que sea my String my String es bry
Vale entonces ahora nos dice que es md
Pero si yo ahora le cambio aquí el texto
y lo cambio a bry me dice my stram es
brise no ha entrado por este If ya que
no se ha cumplido esta condición pero sí
que se ha cumplido esta condición aquí
solo se va a ejecutar una de ellas la
que se cumpla o que myin sea igual a m o
que myin sea igual a brce o que no sea
ni mev no es mdev ni price aquí tenemos
la estructura de control condicional
pero igual que las tenemos condicionales
también las tenemos iterativas
iterativas habitualmente solemos tener
dos la primera suele ser el for para
crear bucles Bueno un for muy simple un
for que es una estructura iterativa nos
vale para recorrer estructuras que
tienen más de un elemento o para
ejecutar una acción varias veces
Imagínate que yo lo que quiero hacer es
imprimir los números del C al 10 pues en
python esto ya iremos viendo pues
sintaxis no yo tengo algo que se Rango Y
si yo pongo Rango de 11 y aquí lo que
hago es lanzar un print de I esto para
qué me servirá para por pantalla mostrar
los números del 1 al 10 aquí lo veis
Rango significa una estructura que va
meter todos los números desde el cero
hasta el número que yo le indique aquí
sin tener en cuenta ese número claro he
puesto 11 con lo cual el último número
será el 10 no tiene en cuenta el último
y el for lo que hace es venga voy a
ejecutar esto que tengo dentro del
propio bucle tantas veces como elementos
existan en este Rango en este Rango hay
el elemento c el un el 2 el TR el cuat
hasta el 10 por eso se ha lanzado el
print en concreto 11 veces no desde el
cer0 hasta el 10 okay igual que tenemos
el bule for también sol ahora según el
lenguaje hay otros que son for each o
igual en estructuras condicionales habrá
otra gente que diga Ey que también
tenemos el Case bueno en python hay algo
parecido pero ya digo me suelo quedar
con lo más común Lo más habitual hay du
wils por ejemplo en otros lenguajes
bueno vamos a quedarnos con los más
simples for donde yo lo que tengo es
bueno una estructura que voy a acabar
recorriendo y el While que lo que yo
intento plantearla aquí es una condición
para que el bucle se ejecute mientras
Esa condición sea verdadera imaginemos
que ahora yo creo por aquí una variable
y un índice que vale cer0 Y yo ahora le
digo Mira mientras el valor de I sea
menor o igual que 10
ejecútalo esto el valor de I siempre va
a ser cero entonces va a imprimir sos si
yo lo lanzo veis esto hasta que prenda
fuego mi ordenador va a estar
imprimiendo cero porque es el valor que
tiene y entonces este bucle es lo que
llamamos un bucle infinito okay Pero en
cambio Si yo Después de ejecutar esto le
hago I y le hago esta asignación más = 1
qué pasaría que cada vez que se ejecuta
el bucle se le suma uno al valor
entonces fíjate cer0 pasa a valer uno
después pasa a valer dos pasa a valer
tres pasa a valer cuatro Entonces ahora
yo lanzo esta ejecución y vemos que con
el for imprime de 0 a 10 y con el While
también imprimir de 0 a 10 porque en el
momento que no se cumpla esta condición
del While se sale del bucle y se acabó
Ya está Vale bastante fácil Estos son
las estructuras de control iterativas
más habituales que solemos tener pero
sabíais que existen estructuras de
control para manejo de excepciones y que
también se llaman estructuras de control
vamos a provocar una excepción en
nuestro código por ejemplo voy a
imprimir 10 entre C no Qué pasa aquí
Hala una visión entre cero esto no
no se puede el mundo se acaba si tú
divides algo entre cero por supuesto
Imagínate que tú tienes un programa que
están utilizando millones de usuarios y
Tú metes todo en este código pues le
explotaría el programa a la gente le
daría un no lo podría seguir
utilizando y tu jefe te acabaría
despidiendo vale por no manejar
excepciones Bueno pues lo que solemos
tener también es un control de flujo
pero en este caso no basado en estas
condiciones bas operaciones estructuras
sino basado en problemas que pueda tener
nuestro código eso es lo que soléis
conocer muchas veces en la gran mayoría
de lenguajes como TR no como yo le puedo
decir Mira vamos a intentar ejecutar
este código pero en caso de que falle
por favor programa no te rompas intenta
recuperarte de tu error controlamos el
error puede que el programa no acabe
haciendo todo lo que yo quería porque se
nos ha ido la olla pero que el programa
no rompa que no pase esto que el
programa no se detenga que siga
ejecutando bueno el Catch en python es
except vale entonces yo le podría poner
TR except y aquí podría ponerle Se ha
producido un error entonces si yo ahora
ejecuto Esto me dice mi programa se ha
producido un error pero mi programa no
ha petado te fijas por lo menos si esto
ha petado se ha ido a esta línea lo ha
intentado manejar y el programa ha
continuado feliz vale Y aparte tenemos
una última instrucción que nosotros le
podemos también poner que es el Finally
que esto es esta es una instrucción que
se va a ejecutar siempre que finalice el
manejo de error se produzca error o no
se produzca y voy a poner aquí ha
finalizado el manejo de excepciones
entonces vemos que ahora por consola se
nos va imprimir Se ha producido un error
y ha finalizado el manejo de excepciones
print 10 entre C ha petado se ha ido a
qu hace cuando Peta y al acabar el
manejo del error ha ido por el Finally
porque lo va a ejecutar siempre ahora
voy a poner 10 / 1 10 / 1 no va a petar
vemos que ha imprimido aquí 10 no ha
petado no ha mostrado Se ha producido un
error porque no se ha producido entonces
lo que ha hecho es el print se ha
ejecutado correctamente y se ha ido al
Finally directamente ha finalizado el
manejo de excepciones vale Y este Ahora
sí Este es el último el último el último
elemento que tenemos habitualmente para
controlar estructuras de control aparte
de las condicionales y las iterativas
fijaos ejercicio simple pero 96 líneas
llevamos de código para hacer un repaso
solo de ese control y esos operadores
que tenemos en la gran mayoría de
lenguajes según el lenguaje que hayáis
seleccionado acabaría viendo que existen
Pues más o menos controles vale os decía
que estos ejercicios de lo que se trata
es ya no solo de hacer la parte del
ejercicio sino si ya tenéis
conocimientos pues os iré poniendo pues
unas partes con una dificultad un
poquito extra para que así vosotros
también podáis hacer algo más a medida
que vais aprendiendo o si ya teníais
este conocimiento Pues que ya
directamente hagáis el extra para que a
todo el mundo no Se le haga tan simple
aún así cualquier persona con un poquito
de experiencia este este extra es muy
facilito Pero bueno así poco a poco pues
vamos creando el recurso vamos por aquí
dificultad extra a ver qué contaba decía
creo un programa que imprima por consola
todos los números comprendidos entre el
10 y el 55 incluidos Vale pues voy a
venir por aquí y voy a hacer una otra
sección con el extra y vamos a ver lo
que nos iba pidiendo creo un programa
que imprima por consola todos los
números comprendidos entre 10 55 vale Yo
sé que esto es un for voy a poner aquí
number in y va a ser un Rango Pero cómo
va a ser el rango si yo quiero hacer que
sea entre el 10 y el 55 Pues será Rango
entre el 10 que lo tengo en cuenta y el
56 vale esto ya era un ejercicio como
para aplicar lo que hemos visto a lo
largo de la lección dice vale incluidos
Así que yo con esto ya podría hacer aquí
un print de cada número number Y si yo
lanzara esto vemos que va a imprimir
desde el cero ta ta ta hasta el 55 vale
Ya soy capaz de esto pero me dice ey
pero todos los números comprendidos
entre 10 55 incluidos pero que sean
pares Uf tengo que comprobar que sean
solo los pares Mira es muy fácil puedo
hacer un If porque quiero controlar el
flujo y cómo compruebo si los números
son pares yo por una definición
matemática sé que un número es par si al
Hallar el módulo de dos de ese número el
resultado es cero decir que esa división
entera el resto me da cer0 Así que si yo
ahora hiciera esto sé que por aquí ya
Solo se van a imprimir los números entre
el 10 y el 55 que sean pares y aquí lo
veis 24 26 28 30 32 son los pares Pero
qué más decía y que no son ni el 16 Ah
bueno pero yo ahora esto ya lo sé ya le
puedo meter aquí una condición and que
el número sea distinto no del 16 le
puedo decir que sea distinto el 16
Entonces el número 16 que ahora se
imprimía como vuelvo a lanzar esto voy a
tener el número 14 y voy a saltar al 18
directamente ya no tiene en cuenta el 16
y qué más cosas decía y ni los múltiplos
de tres ala Y cómo son los múltiplos de
tres Pues también es Otra condición más
an y Cómo sé si un número es múltiplo de
tres pues muy parecido también con el
módulo si el módulo de tres es distinto
de cero de cero veré que se está
cumpliendo lo que tenemos aquí que
tampoco es múltiplo de tres si es
distinto de cero no es múltiplo de tres
y ahora se acaba imprimiendo todo esto
que vemos por aquí que vemos Que bueno
en gran medida pues no cambia mucho era
un ejercicio s simple pero que nos valía
para ir razonando y poniendo en práctica
cosas que hemos visto antes
[Música]
el ejercicio os proponía esto crea
ejemplos de funciones básicas que
representen las diferentes posibilidades
del lenguaje sin parámetros ni retorno
con uno varios parámetros con retorno
bueno básicamente la idea era entender
entre muchas más cosas que os voy
pidiendo aquí paso a paso que es esto de
las funciones si nunca habéis tenido un
contacto con un lenguaje así que me voy
al apartado de funciones al proyecto me
voy a la carpeta de python y voy a crear
un ejercicio que se llame mouredev punp
mi nombre de G que es lo que tenéis que
hacer y la extensión pun p porque lo voy
a hacer en python Okay y vamos a ir poco
a poco pues resolviendo el ejercicio y
explicándolo lo tengo por aquí abierto
para tenerlo también a mano dice crea
ejemplos de funciones básicas que
representan las diferentes posibilidades
de un lenguaje Bueno yo creo que lo
primero que tenemos que explicar con
todo esto es que qué es esto de una
función no una función Al fin y al cabo
es un bloque de código y un bloque de
código que lo creamos en forma de
función para poder reutilizar una acción
específica eh nos van a proporcionar
pues una forma de organizar el código en
bloques lógicos para como he dicho
reutilizar el código e intentar que sea
más legible hacer que el código sea más
limpio que se cometan menos Bag que sea
más fácil de escalar de mantener
etcétera Así que esto es lo primero que
teníamos que entender Qué es una función
como tal y ahora vamos a ir
implementando por los diferentes bloques
de funciones aquí decía Pues bueno que
lo primero las funciones básicas no
vamos a intentar hablar de las
diferentes funciones básicas que existen
en la gran mayoría de lenguajes para
entender bien el concepto de funciones
Son son las que llamamos esas funciones
definidas por el usuario funciones
definidas por el usuario no no hablamos
de funciones ya creadas en el sistema
eso será otro apartado del ejercicio
pero vamos a centrarnos primero en las
funciones que crea el usuario como le dé
la gana Pues bueno hay diferentes
funciones vamos a hacer un repaso por
ellas y os voy contar pues De qué trata
cada una lo primero es lo que llamamos
las funciones simples una función eh
según el lenguaje pues tiene una
sintaxis concreta en mi caso en python
Cómo definimos una función con la
palabra reservada Def sin más y a
continuación le tenemos que dar un
nombre yo voy a hacer una función que
salude no que imprima por terminal eh
Hola python por ejemplo Así que le voy a
llamar grip en plan saludo sin más
nombre de la función dos puntos y qué es
lo que hace la función pues como he
dicho en este caso va a hacer
simplemente un print que sea pues Hola
python vale Esta es mi función Entonces
yo ahora aquí ya tengo ese bloque de
código reutilizable que hace una que
responde a una tarea concreta que tiene
una responsabilidad única en este caso
eh Pues saludar es una chorrada de
función pero no sirve para eh
ejemplificar Qué es una función Cómo
hago si quiero que ahora se ejecute este
código pues tengo que llamar a la
función sin más grid si yo ahora
ejecutara este código qué vemos por
terminal Hola python si yo ahora llamara
en dos sitios a la función grid qué
veríamos por terminal pues dos veces o
la python claro Imagínate que aquí
hubiese mucho código o una lógica muy
concreta tendría sentido estar
repitiendo copiando y pegando la lógica
a través de todo nuestro código No eso
es una locura a nivel de de buenas
prácticas pues por eso creamos funciones
funciones que tendrán una accesibilidad
concreta y cuando yo quiero hacer la
función por ejemplo que mi aplicación
tuviera que saludar en muchos sitios
tendría sentido que yo replicar todo
esto no Simplemente me quiero la función
que realiza mi lógica y cuando hace
falta saludar pues llamo a grit a saludo
y ya está igual que tenemos funciones
simples que realizan toda su lógica
dentro y nada más tenemos funciones con
retorno una función con retorno
significa que va a ejecutar una lógica y
va a acabar devolviendo algo le
podríamos decir pues mira una función
que se llame eh return grid Devuélveme
un saludo esta sería la función por
ejemplo aquí podríamos especificar Pues
que queremos devolver por ejemplo un
String una cadena de texto o lo que sea
en python como es un lenguaje de tipado
Dinámico aunque no pongamos que se
devuelve algo podríamos devolverlo y no
pasaría nada no entonces Yo podría venir
aquí y para devolver algo simplemente
haría un return Qué significa que ahora
yo tengo que retornar algo voy a
retornar una cadena de texto qué
significaría si yo ahora llamo a la
función return gd yo hago esto lo lanzo
y veo Hola python solo una vez esta no
esta llamada que teníamos aquí pero
ahora nos está imprimiendo este segundo
a la python Por qué Porque ahora tenemos
un return no tenemos un print que es lo
que lo imprime por terminal con lo cual
tendríamos que acabar capturando este
retorno lo que fuera pongo grid me lo
guardo en una variable porque llamamos a
return grid esto retorna una cadena de
texto que yo me voy a guardar en una
variable Y ahora yo podría venir por
aquí e imprimir el contenido de la
variable y ahora ya veis que ya hay dos
H la python porque ya tengo este valor
guardado en variable y metido aquí si
quisiéramos sin más yo podría imprimir
directamente return gd no me quiero
guardar el retorno en ninguna variable
simplemente lo quiero imprimir Pues mira
voy a imprimir el resultado de llamar a
la función return git sin más bueno ya
veis que es algo como muy muy simple Al
fin y al cabo qué más tipos de funciones
tenemos pues Vale tenemos funciones que
llamamos con argumentos no con un
argumento voy a venir por aquí función
con un argumento Qué significa esto que
nosotros le podemos pasar parámetros a
la función de momento aquí la función la
lógica dependía únicamente de lo que
había en el bloque de código en este
caso retornar en este caso imprimir Pero
y si yo quiero pasarle algo a la función
para que opere con ese algo pues se lo
podrí podía pasar con parámetro creamos
una función que le voy a llamar pues por
ejemplo arg de argumento eh grid Un
saludo pues con un argumento y yo ahora
Aquí le voy a pasar el nombre que quiero
acabar utilizando para el saludo me
vengo por aquí podría hacer el mismo
saludo pero ahora ya tenemos una
variable una variable que yo le paso
como argumento Y ahora yo No querría que
fuera python digo no no Yo quiero que
utilices ahora el nombre que yo te pase
así que yo lo Interpol por aquí y
utilizo este valor name lo voy a
utilizar dentro del texto con lo cual si
yo ahora Quiero llamar a argd si
intentara ejecutar esto Esto me iba a
dar un no ves arrid e Oye se
requiere un argumento posicional que se
llama name no puedes llamar a esta
función porque ahora necesitas Sí o sí
pasarle un parámetro Pues yo ahora por
ejemplo pues quiero saludarme a mí mismo
y le paso el argumento bry y vemos que
lo que imprime es Hola bry tiene un
argumento esto Pues mira con un
argumento puedo poner con argumentos o
lo pongo aparte me voy a copiar este
código y voy a hacer aquí con argumentos
porque por supuesto le puedo pasar más
de un argumento más de un parámetro
ahora le voy a pasar por ejemplo el
saludo y el nombre grid y el name
Entonces ahora el Hola también está
parametrizado entonces si ahora yo
quiero llamar a arx le voy a llamar esta
función porque es varios argumentos y
ahora lo quiero llamar solo con el
nombre brce veis no no no necesitas
pasarle un parámetro que es grit y otro
parámetro que es name Imagínate que yo
quiero saludar en inglés y pongo High
brce le paso dos parámetros tiene dos
parámetros los tengo que separar por
comas Ahora cuando arranco esto vemos
High briis ya se ha cambiado este valor
pero imaginemos que queremos darle
valores por defecto a estos parámetros a
estos argumentos le podríamos dar
imagínate voy a hacer otro tipo de
función con un argumento predeterminado
voy a poner Imagínate que yo quiero
llamar le voy a llamar default argd de
momento tenemos lo mismo pero imagínate
que yo quiero dar la posibilidad de
llamar a mi función Uy qué mal puse Aquí
default rgd Imagínate que yo quiero
llamar a mi función sin pasarle nada
porque digo mira cuando tú quieras
pasarle un nombre como era el caso este
que yo le pasaba a bryce pásaselo pero
en caso de que no quieras pasar nada que
tenga un valor por defecto pues algunos
lenguajes de programación esto ya sabéis
esto es como todo No todos los lenguajes
de programación tienen los mismos tipos
de funciones pero sí que es cierto que a
nivel fundamental la gran mayoría van a
tener casi todas las que yo explique
igual puede aparecer otro lenguaje que
tiene más tipos de los que yo os voy a
contar ahora mismo en python pero que
funciones sin parámetros con parámetros
con retorno con más de un argumento con
valores por defecto esas van a existir
en todos los lenguajes de programación
Okay eso también hay que tenerlo muy muy
en cuenta vale digo que imaginemos que
le queremos dar un valor por defecto
entonces en python por ejemplo se le
puede decir mira cuando name no tenga
valor Dale por defecto el valor python
por eso yo ahora podría llamar a la
función Def F arc grid con o sin
parámetro veis la segunda llamada no
tengo parámetro Y qué me va a imprimir
Hola python porque si no le paso el
nombre le mete el valor por defecto que
tenemos pensar que ahora aquí en el
momento que empezamos a saber que hay
parámetros más de un parámetro valor con
defecto retorno sin retorno todo esto se
puede combinar Yo podría hacer por
supuesto una función con un parámetro
por defecto Y retornarlo en vez de hacer
el print por supuesto esto pensar que
ahora es cuestión de combinar los
diferentes tipos de funciones que
tenemos Vale qué más cosas podríamos
hacer aparte de con un argumento con
varios argumentos con argumentos por
defecto nosotros podríamos hacer que
también todo esto fuera posicional
Imagínate que yo ahora quiero pasarle
estos argumentos en sentido inverso
Quiero pasarle bry y Hi al revés veis lo
que me imprime bry High Uy qué
equivocación lo que yo puedo hacer en
muchos lenguajes es decirle no no no si
yo los paso en orden y sin indicarle con
cuál se corresponde va a seguir el ord
orden de entrada de parámetros de la
función Pero si yo se los Quisiera pasar
en otro orden veis que bry en realidad
es el nombre yo podría decirle Mira
bryce es el nombre y High es el grid
ahora veis que ya lo imprime ordenado
porque aunque yo no lo he pasado en
orden sí que le he indicado con cuál se
corresponde cada uno entonces aquí por
defecto lo Pilla a nivel de posición
siguiendo el orden Pero si yo quiero
variar la posición puedo hacerlo siempre
que indique Pues cuál es cada uno de los
parámetros más cosas que podemos hacer
por aquí venga tipos de funciones si
queréis podemos hacer con argumentos con
argumentos y retorno Imagínate que yo
ahora me quiero devolver todo con
argumentos y retorno return arx grid que
yo le quisiera llamar así Qué podría
hacer esta función con retorno bueno es
algo cutre lo que voy a hacer Pero
sinceramente podríamos sin más venir por
aquí y decir Oye retorno todo esto venga
una función a la que le podemos pasar
varios parámetros y que también puede
acabar realizando un retorno pues si yo
quisiera hacer un retorno Ya lo hemos
visto antes simplemente con hacer un
return lo tenemos aquí esto puede
parecer una tontería No yo me podría
venir por aquí a hacer un print return
return y podría imprimir simplemente el
resultado de llamar a esta función ahora
ya no lo imprime dentro simplemente
Retorno a la cadena de texto como
teníamos antes Uy Perdón no le he puesto
la interpolación la cadena de texto que
teníamos antes y ya está y nos dice H
brce ahora lo retorna bueno otro tipo de
función pero una función puede recibir
varios parámetros pero en realidad puede
retornar más de un valor vale en
realidad sí que puede podemos hacer una
función con retorno con torno de varios
valores lo que llamamos por ejemplo una
tupla de valores más de uno Pues venga
voy a crear una función que se llame
múltiple return imaginemos esto sin más
y cómo haría yo para retornar varios
valores bueno depende podríamos tener
estructuras pero aún no hemos visto que
son las estructuras para retornar varios
valores pero sin más aunque no tengamos
muy claro a qu es esto de las
estructuras yo por ejemplo en muchos
lenguajes tengo esos formatos para poder
devolver más cosas Imagínate que quiero
devolver pues todas las cadenas de texto
que yo pintaba en el saludo el Hola una
coma y el python no entonces de esta
forma yo ya estoy retornando dos valores
veis que tenemos una coma y que estamos
separando las cadenas de texto no estoy
retornando ya solo una cadena de texto
estoy retornando dos cadenas de texto y
cómo podría hacer para recuperar estas
cadenas de texto digamos que ahora
tendría que desacoplar estos valores si
yo ahora llamo a esta función por
supuesto yo esto lo podría imprimir pero
cuando yo lo imprimo mira lo que se nos
muestra Bueno en realidad aquí con
paréntesis separados por una coma en
realidad aquí lo que tenemos es una
estructura que ya veremos lo que es no
pero yo podría desacoplar estos valores
pues simplemente como sé que va a
retornar dos Pues voy a intentar crear
dos variables con este retorno una
variable para el saludo grid y otra
variable para el lenguaje que era python
o el name no que le llamamos antes vale
entonces fijaos separo por comas el
nombre de las variables llamo la función
y ahora imagínate que imprimo por un
lado el grid este saludo y que imprimo
por otro lado el name veremos que tengo
en uno el Hola Y en el otro el python ya
veis más de un retorno porque puede que
tengamos una casuística muy concreta en
que no llegue con que nuestra función
retorne una cosa sino que ya queremos
retornar las cosas separadas para
tratarlas de manera independiente Pues
por supuesto también se puede y algo
ahora voy pasar ya a un par de funciones
más como decía el ejercicio crea
ejemplos de funciones básicas funciones
básicas no me voy a ir a funciones por
si al Alguien ha pensado Oye podemos
crear funciones recursivas o funciones
lambda Yo creo que es es algo que ya se
puede ver más adelante pero no está
dentro de las funciones más simples que
podemos crear dentro de un lenguaje si
alguien ha creado ya lambdas ha creado
recursividad está perfecto ya sabéis que
cada uno puede interpretar el ejercicio
como le dé la gana pero yo creo que como
aún estamos en el tercer ejercicio pues
quedarnos con funciones más simples
después ya tendremos clases y ya
tendremos lecciones para pararnos en el
concepto de lambdas o en el concepto de
funciones recursivas okay Así que voy a
hablaros de un par de funciones que son
bastante especiales en python aunque
también esto existe en muchos otros
lenguajes por ejemplo con lo que
llamamos funciones con un número
variable de parámetros o de argumentos
como lo estamos llamando vale deos Pero
esto ya lo hemos visto br ya hemos visto
por ejemplo esta con dos argumentos ya
pero si vengo por aquí y hago variable
ar grid por ejemplo un saludo con
argumentos variables fijaos lo que voy a
hacer Aquí le voy a decir que esto
Recibe un nombre pero delante le voy a
pasar un asterisco esto lo que le está
indicando es que en realidad le podemos
pasar más de un nombre y cómo lo
pasaremos pues separado por comas
argumento separado por comas qué va a
hacer esto Claro si yo aquí tengo más de
un resultado esto ya lo veíamos en la
clase anterior cuando entraba la
importancia de los bucles cuando
queríamos recorrer por ejemplo un objeto
cuando queríamos iterar más de una vez
una variable Pues claro este name puede
llegar a guardar más de un resultado Así
que yo voy a tener aquí un for con el
nombre dentro de los nombres names le
voy a llamar este parámetro names Por
qué Porque le voy a hacer un print con
el saludo que teníamos antes pero que se
va a imprimir una vez por cada nombre
que nos entra aquí Así que voy a venir
por aquí me cargo el python y le meto
name qué significaría esto que si ahora
llamo a esta función con un número
variable de parámetros yo le podría
pasar pues python como hacíamos antes Y
si Yo corro el programa vemos Hola
python pero le voy a pasar más lenguajes
o más nombres va a ser python Va me va a
saludar a mí va a saludar a mouredev y
va a saludar a la comunidad Ahora yo
lanzo esto y veis Hola python hola bry
hola mouredev o la comunidad le he
pasado varios argumentos separados por
comas y aquí ya no estoy definiendo un
número finito de argumentos aquí le
puedo pasar todos los argumentos que yo
quiera lo veis entonces bueno en este
caso que quisiera pasarle pues más de un
nombre para que hiciera el print para
que hiciera el saludo con cada uno de
estos nombres o con lenguajes o con lo
que fuera y parecido al número variable
de argumentos tenemos con un número
variable de argumentos pero con palabra
clave ya veréis qué es esto Esto no es
tan habitual en todos los lenguajes esto
es ya un poquito más exclusivo de de
python Okay cómo definimos esto Pues
venga vamos a crear aquí otra vez esto
porque se nos va a parecer mucho pero
aquí va a tener otra peculiaridad que es
que aparte de tener un número infinito
de argumentos Nosotros le podemos
indicar una clave a cada argumento y
para eso lo haremos con dos asteriscos
dentro de names y esto significará que
cada argumento estará formado por una
clave y por un valor con lo cual ahora
este names que teníamos por aquí va a
tener un nombre pero va a tener por
ejemplo el nombre del parámetro que yo
le quiero pasar entonces ahora aquí
tendremos el param y el name es decir un
nombre que yo le voy poder indicar Qué
tipo de parámetro es así que lo voy a
imprimir también por aquí para Y cómo
llamaríamos ahora bueno primero vamos a
cambiar el nombre le vamos a llamar
variable qar grid porque va a tener una
clave y un valor y vamos a llamar a esta
nueva operación y vamos a pensar que le
queríamos pasar esto esto podría ser
parecido y yo podría correr el programa
pero dice Uy no no no no con esto no
llega en realidad tú me tienes que pasar
ahora todos estos valores pero le tienes
que dar una clave okay Así que vamos a
pensar que le meto diferentes datos I va
a ser el lenguaje que estoy utilizando
el nombre de la persona el alias en mi
caso mouredev y la edad 36 todo con
cadenas de texto si tenéis un lenguaje
Dinámico Pues yo le podría pasar esto
sin ser mezclando pues una cadena de
texto y con un entero pero aquí nos dice
que falta la clave cómo le indicamos la
clave pues directamente dándole el
nombre a la clave lenguaje y un igual y
esto podría ser mi nombre y esto podría
ser mi alias y esto podría ser mi edad h
y ahora si imprimo todo esto que uy aquí
no puse un igual Perdón puse un más la
llamada bonita aquí ya que tiene varios
parámetros para dejarlo bien formateado
si yo ahora llamo a esta función que
admite infinidad de parámetros pero con
clave Qué estamos haciendo en este caso
Bueno en realidad esto es exactamente
como os lo conté que en realidad
nosotros lo que le podemos dar es una
palabra clave es decir ya no solo
pasarle el listado de diferentes
parámetros dejarme que este 36 lo
devuelva aquí a un entero nosotros lo
que tenemos que hacer es le pasamos el
listado de parámetros y después dentro
con esta función que ya existe dentro
del lenguaje que es items acaba
descomponiendo cada uno de los elementos
que nosotros tenemos aquí en una clave y
en un valor nosotros volvemos a
descomponer y nos quedamos con dos
variables para asignarle Pues venga Lo
que tienes como clave en el nombre de
esta variable que yo yo le he llamado
aquí y en este nombre de el valor de la
de la clave Pues nos lo quedamos en
value y ahora aquí me pongo a imprimir
los dos os digo que esto es algo
Bastante específico de lengu el poder
pasar pues con este con esta pinta no lo
que haríamos en otros lenguajes igual ya
es pasar una estructura que es un
diccionario que si no sabéis lo que es
un diccionario no os preocupéis porque
precisamente de estructuras es de lo que
vamos a hablar en el siguiente reto de
roadmap Okay así que bueno creo que
estas a grandes rasgos son los
diferentes tipos de funciones que hay en
la gran mayoría de lenguajes sobre todo
las simples con retorno con un argumento
con más de un argumento con argumentos
predeterminados con argumentos y y
retorno Okay y después ya esta parte de
variable con argumentos y variable con
argumentos y palabras clave no es tan
habitual en todos los lenguajes el que
sí es este también varios retornos así
que estas son las diferentes los
diferentes tipos de funciones que
nosotros Tendremos que ver según la
lógica que queremos desarrollar Pues
bueno qué tipos de funciones acabamos
creando ya digo si alguien ha
implementado funciones que llamamos
lambda o funciones recursivas también
son funciones que puede crear el usuario
pero que ya siguen una lógica muy
concreta o una lógica de ejecución
también muy concreta Así que hablaremos
de ellas más adelante pero yo no las voy
a meter en esta parte de roadmap qué nos
decía más el ejercicio nos decía aquí
por otro lado comprueba si puedes crear
funciones dentro de funciones ostras
Pues venga vamos a crear aquí una
sección de funciones dentro de funciones
esto para ver si vuestro lenguaje lo
soporta porque también puede ser un
concepto a explorar por ejemplo voy a
crear por ejemplo aquí una función ahora
ya no va a ser una función de estas como
de saludo como estábamos haciendo antes
pero voy a poner ouder function voy a
poner una función la función externa
pero yo por ejemplo en python o en
algunos otros lenguajes Yo dentro de una
función puedo crear otra función Inner
function qué significaría que yo creo
una función dentro de una función que yo
ahora sin más en la Inner function
Imagínate que yo ahora hago un print Y
que ahora en este print sí que pues voy
a imprimir lo que sea el Hola python que
teníamos aquí vuelvo otra vez a copiarme
el Hola python Entonces yo ahora voy a
venir por aquí y voy a llamar a ou
function voy a poner función interna dos
puntos Hola python para que sepáis que
estamos imprimiendo esto veis lo último
que imprime hola 36h muy mal esto Bueno
le voy a quitar el Hola incluso aquí
para que veamos que estábamos
imprimiendo la clave y el valor el Hola
creo que sobraba en este print bueno
volvemos a esto veis que yo ahora llamo
a other function pero no Se imprime
función interna o la python Por qué
Porque en realidad dentro de esta
función tenemos otra función y esta
función que está dentro de la función
nunca se llama como nunca se llama yo
ahora lo que tendría que venir aquí es
Llamar a la función dentro de la función
Ahora yo llamaré a ouder function ouder
function va a llamar a Inner function
Inner function se va a ejecutar y
acabaré imprimiendo el función interna o
la python lo veis por aquí entonces Esto
es algo que tenéis que comprobar si
vuestro lenguaje o que tenéis que
comprobar si vuestro lenguaje lo soporta
por qué porque también es una forma de
dejar vuestro código limpio que vosotros
llaméis una función pero pero que esa
función imagínate quiera desencadenar
más cosas y que querrás dividir el
código de la función o lo que sea
incluso algunos lenguajes lo que
permiten es pues concatenando por puntos
empezar a llamar a funciones dentro de
funciones esto python en concreto no lo
soporta pero en algunos lenguajes lo
podéis hacer así que bueno quedaros si
de verdad esto tiene sentido qué más
cosas teníamos que hacer en el ejercicio
nos dice utiliza algún ejemplo de
funciones ya creadas en el lenguaje esto
son funciones como os decía por aquí
funciones definidas por el usuario pero
vamos vamos a crear una sección eh
funciones de lenguaje lo que se suele
Llamar las eh buildin functions No
funciones que ya están construidas
dentro del lenguaje Qué funciones hay
dentro de un lenguaje llevamos viendo
una ya muchas clases cada vez que
nosotros estamos haciendo print esto es
una función lo veis esto es el formato
de una función es una función que se
encarga de imprimir por terminal el
texto que nosotros le pasamos Entonces
en realidad nosotros ya llevamos viendo
una función propia del lenguaje
muchísimo tiempo por ejemplo tenemos una
función que es len una función que
nosotros le pasamos un texto por ejemplo
m de o lo que nosotros querramos y nos
dice ocho veis que es una función len es
una función que retorna un entero Qué
hace esta función en concreto Nosotros
le pasamos algo y cuenta si le pasamos
una cadena de texto pues nos va a acabar
contando Cuántas letras tiene esa cadena
de texto si nosotros le pasáramos un
conjunto de datos contaría el número de
esos datos vale más funciones que
nosotros podemos tener mira vamos a ir
haciendo print de resultados de
funciones hay otra función por ejemplo
el lenguaje que es type y le voy a
volver pasar mouredev pero qué va a
hacer type en concreto ahora imprime
Class str nos dice el tipo de esta
variable es una cadena de texto si yo le
si yo le pasara un número 36 y lo
lanzara me imprime int veis que nos está
dando el tipo de dato que nosotros le
estamos pasando a type Okay entonces
bueno igual que tenemos esto Existen un
montonazo qué os diría yo por favor por
repasar Cuáles son las funciones con las
que ya cuenta el lenguaje por supuesto
según el lenguaje pueden ser decenas y
cientos pero sí que es cierto que hay
algunas funciones que Pues igual nos
resultan un poquito más fácil yo que sé
hay funciones que veis que estoy yo aquí
poniendo apper y digo Uy esto parece que
no que no funciona en cambio Si yo vengo
aquí y veo apper Ah hay funciones que
nosotros también podemos utilizar
asociadas a los tipos de datos qué
significaría que yo ahora venga por aquí
y por ejemplo imprima mouredev pero
llame con un punto a apper como función
típica de las cadenas de texto pues que
lo que se va a imprimir es mouredev en
mayúscula esta función que ya existe
dentro del lenguaje en realidad lo que
está haciendo es utilizando el propio
texto que nosotros tenemos y lo está
modificando claro aquí ya son otro tipo
de funciones que ya están modificando el
propio dato si nosotros nos vamos a
apper apper no deja de ser una función
que nosotros ya tenemos dentro del tipo
de dato que es la cadena de texto por
eso vemos que igual funciona de una
manera diferente Pero bueno también
tenerlo en cuenta Así que per no deja de
ser una función Si nosotros leemos la
especificación veis Def apper pero lo
que dice que va a recibir es self self
es una palabra reservada en python que
hace referencia a la propia instancia la
que está ejecutando es decir si Def es
una función que está dentro de la cadena
de texto self significará que es la
propia cadena de texto entonces hace
referencia al propio contenido del texto
que en este caso es m entonces bueno
algunos unos tipos de funciones que ya
existen dentro del lenguaje en este caso
ya no solo dentro del lenguaje a nivel
general que podemos utilizar De
cualquier manera sino que esto es una
función que ya está asociada a el propio
tipo de dato que esto es algo que ya
veremos más adelante cuando veamos sobre
todo el concepto de clases Vale qué más
cosas se nos estaba pidiendo por aquí
dice bueno tienes que también poner a
prueba el concepto de local y de global
pues una cosita más que teníamos que ver
aquí pues bueno venga otro bloque otro
bloque que voy poner aquí que sea
variables local y globales y Qué es el
concepto de variable local y global Pues
aquí entra otra cosa que tenemos que
aprender en prácticamente todos los
lenguajes de programación que es el
concepto de ámbito lo que llamamos scope
vale es decir cuándo tenemos acceso a
según qué nuestro código claro voy a
crear una variable y le voy a llamar
global variable y por ejemplo le voy a
decir que tiene el valor python muy bien
entonces Imagínate que yo ahora vengo
por aquí y quiero imprimir la variable
por supuesto tengo acceso a la variable
la he definido aquí puedo acceder aquí
vale aquí tenemos se nos imprime python
pero ahora voy a crear una función por
ejemplo Def y le voy a poner Hello
python le voy a llamar a esta función y
esta función pues va a hacer la tontería
de antes no que va a tener un print y va
a acabar imprimiendo pues por ejemplo el
texto que dice Hello y voy a intentar
acceder a esta variable Pero dentro de
la función vengo por aquí y llamo a la
variable veis que puedo acceder Y si yo
ahora llamara a la función Hello python
a ver que imprime Hello python okay es
decir imprime el texto y el valor de la
variable pero fijaos esta variable está
fuera de la función Este es el concepto
de variable global es decir que su
ámbito es superior a lo que queremos
ejecutar todo lo que se encuentra fuera
de la propia función esto es como si
fuéramos anidando código a medida que
nosotros vamos realizando código Incluso
si estuviéramos Pues no lo sé creando un
If por ejemplo estamos anidando el
código y hay cosas que vamos poder
ejecutar dentro del If y otras a las que
vamos poder ejecutar fuera y otras que
vamos poder acceder dentro del If o en
este caso ya que estábamos con funciones
os pongo Este ejemplo pero ahora dentro
de esta función me voy a crear otra
variable y le voy a llamar local
variable le voy a llamar bar para que
sea un poquito más corto así lo tendemos
mejor y hago local bar y ahora el local
bar le voy a dar el valor Hola y ahora
yo dentro voy a sustituir este valor el
Hello que tenía aquí ahora lo voy a
sustituir por el valor de local bar bar
cuando yo imprimo esto vemos Hola python
decir puedo acceder a esta variable pero
igual que yo aquí imprimía esta variable
global ahora voy a intentar imprimir
local bar Qué pasará tenemos un Y
si yo ejecuto esto dice Uy local bar no
está definido Cómo que no está definido
si tengo aquí local bar igual a Hola
pero local bar como es una variable
local solo funciona dentro del ámbito de
la función ya que la he definido dentro
de la función por eso yo no puedo
acceder fuera aquí depende un poco del
lenguaje hay lenguajes que este concepto
varía incluso que existe el concepto de
de variable global y local pero que
tienen funcionamientos ligeramente
distintos entonces tenéis que entender
También muy bien Cuándo se puede acceder
a una variable global cuando se puede
acceder a una variable local es
recomendado no es recomendado depende
nosotros tenemos que entender cuando una
variable tiene sentido que sea global y
que nosotros podamos acceder desde
digamos subconjuntos de nuestro código a
cuándo tiene que ser local una buena
práctica siempre intentar restringir al
máximo el ámbito de todo vuestro có
se entiende esto por qué Porque igual
que nosotros podemos acceder a variables
podríamos cambiarle el valor Entonces
siempre en este caso qué tendríamos que
hacer Mira empiezo a picar Mi código y
veo por aquí y llego Ah Mira vamos a
imprimir esto digo Ah mira Hola pyon y
digo para qué voy a definir una variable
global si yo solo lo utilizo dentro de
mi código que después llega una
casuística en la que como teníamos
nosotros antes hay que imprimirla fuera
y digo Bueno pues igual tiene sentido
que la haga global porque la tengo que
utilizar dentro de una función pero
también la tengo que utilizar fuera pero
por ejemplo este ola aquí es lo que
hablamos que ya nunca lo voy poder
utilizar porque aquí el ámbito Este sí
que es local dice no se puede acceder
desde fuera de la función Entonces
siempre intentar restringirlo al máximo
Y a medida que vayan apareciendo nuevas
casuísticas valorar no directamente
paséis de variables locales a globales
porque hagan falta No no no no de
valorar si tiene sentido el acabar
llevándolo hacia fuera y ahora aquí y
que también lo estáis diciendo por ahí
es donde pueden entrar también lo que se
llama modificadores de acceso que en
algunos lenguajes este ámbito este scope
posee palabras reservadas para poder
acceder desde diferentes partes del
código modificadores como public como
package como private por ejemplo como
protected siempre intentar limitar al
máximo y conocer Cuál es el rango de
actuación que soporta vuestro lenguaje
para poder hacer vuestro código pues más
seguro y qué más cosas nos pedía el
ejercicio dice bueno que haga Sprint por
consola de los resultados con ejemplos y
que cualquier lenguaje puede tener más o
menos posibilidades por supuesto pero lo
que os digo que van a tener estos
ejercicios esta parte pues es bastante
simple porque son los fundamentos del
lenguaje pero os ponía aquí una parte
extra para ya practicar pues algo más la
parte de lógica un extra Y qué nos decía
que tenía que hacer este extra Pues mira
dificultad extra Quiero una función que
reciba dos parámetros del tipo cadena de
texto y retorno un número vale Así que
voy a intentar ver qué hace esto dice
bueno que reciba dos parámetros voy a
crear una función y qué tenía que acabar
haciendo tenía que acabar imprimiendo
pues Vale imprime al parecer tenía que
acabar imprimiendo números del un al 100
Yo le voy a llamar print numbers por
ejemplo y recibía dos parámetros me dice
que recibe un texto uno y un texto dos
así que le voy a llamar text 1 text 2 y
que acaba retornando un número entero
por ejemplo yo le voy a acabar aquí Def
Endo también todo esto y qué tenía que
hacer la función la función imprime
todos los números del un al 100 Entonces
ahora aquí ya empezamos a combinar cosas
que aprendimos en otras clases Cómo hago
para imprimir números del uno al 100 yo
por ejemplo en python tengo un Rango
para que me cree todo ese conjunto de
números del uno al 101 porque el último
lo excluye si yo hiciera ahora mismo
aquí un print de Number y yo llamara la
función que es print numbers le tendría
que pasar dos textos de momento con los
textos no hago nada entonces Bueno lo
dejo vacío corro el programa ya veis
imprime del 1 al 100 que vemos por aquí
perfecto pero el programa pedía hacer
dos cosas Si el número es múltiplo de
tres muestra la cadena de texto del
primer parámetro Ah vale pues vamos a
ponerlo aquí texto uno texto dos dice si
el número If el número es múltiplo de
tres nos decía por aquí muestra la
cadena de texto del primer parámetro
vale esto lo vimos también como
deberíamos hacer pues al número si
nosotros le hallamos el módulo de tres y
esto es cer0 significa que es múltiplo
así que en este caso lo que tendría que
acabar imprimiendo es el texto el texto
uno que yo tengo por aquí y en caso
contrario els aquí es donde tendría que
imprimir el número Vale qué tenemos por
aquí vamos al principio 1 2 texto 1 4 5
texto 1 7 8 testo 1 por qué Porque el
tres es múltiplo de tres El Seis es
múltiplo de tres el nu es múltiplo de
tres el 12 es múltiplo de tres por eso
en vez del número imprime el texto pero
nos decía también que si el número por
caso contrario es múltiplo de C que
muestre el valor de la segunda cadena
Cómo resolveremos eso pues con un el If
no el If en este caso pues no múltiplo
de tres sino múltiplo de cco y no
imprimiendo en este caso el texto un
sino imprimiendo el texto dos aquí lo
tenemos y nos dice un último caso que es
Oye si el número es múltiplo de TR y de
5 a la vez imprimir los dos textos
concatenados Claro si yo ahora hago aquí
otro elif y hago mira que sea múltiplo
de tres and también sea múltiplo de C
así tengo en cuenta la casuística y aquí
lo que tengo que acabar imprimiendo pues
es el texto un más el texto dos los
concatena Pero si yo lanzo esto vamos a
ver que en ningún caso voy a ver el
texto uno y el texto dos concatenados
por qué Porque en realidad se está
colando por una de estas situaciones
antes porque antes de ser a la vez
múltiplo de tres y de c Puede que sea
múltiplo de tres solo o múltiplo de
cinco solo con lo cual lo que tendríamos
que hacer es esta condición tendría que
pasar a ser la primera por si se da el
caso en el el número es múltiplo de los
dos a la vez vamos a verlo ahora ahora
sí que lo veremos veis y lo tenemos
claro el tres solo es múltiplo de tres
el cin solo es múltiplo de cinco por eso
imprimimos tres texto dos pero el 15 es
múltiplo de tres y de cinco a la vez por
eso imprimimos texto un y texto dos a la
vez esto es un ejercicio muy típico que
le llamamos fis bas por si alguna vez
así escrito fis bas es un ejercicio muy
típico en programación para imprimir fis
bas o fis bas por si lo veis en algunas
especie de prueba técnica o ejercicio de
lógica o algo así pero el ejercicio nos
mandaba un extra decía la función
retornará al número de veces veis que no
estamos haciendo ningún return dice
retornar el número de veces que se ha
impreso el número en lugar de los textos
dónde imprimí el número solo aquí aquí
teníamos textos entonces aquí deberíamos
llevar un contador tener aquí una
variable por ejemplo que yo le voy a
llamar count que inicializo cero y que a
este count cada vez que Se imprime el
número count yo lo que hago es
incrementarlo un para que lo cuente y al
acabar este bucle for yo retorno el
contador Así que yo ahora no solo voy a
llamar a print numbers sino que voy a
imprimir el resultado del ror ahora se
va a encargar de lanzarnos todo aquí lo
veis y al fin lo que va a hacer es
imprimir el número de veces que ha
mostrado números 53 y 53 veces ha
mostrado un número en vez de imprimir
las palabras Fish o bas o Fish B
vamos con este reto que decía
estructuras de datos Este era el reto
que teníamos que acabar resolviendo hoy
y decía esto muestra ejemplos de
creación de todas las estructuras
soportadas por defecto en tu lenguaje
claro aquí de lo que se trata es de que
esto sirva para cualquier lenguaje de
programación Así que en cierto modo los
enunciados de estos ejercicios están
pensados para que se tengan que ir
adaptando no es lo mismo si yo estoy
programando aprendiendo Java que si
estoy aprendiendo python Okay aún así S
como todos estos ejercicios corresponden
a fundamentos que me veáis a mí
programável fundamental la explicación
que yo voy dar es la misma para python
que para Java que para javascript que
para Swift que para colding que para
Cesar que para el que sea aún así lo de
siempre aquí tenéis los ejercicios Este
es el reto tres que es el que vamos a
resolver hoy y si tenéis dudas si
también queréis ver correcciones en
otros lenguajes aquí tenéis todo lo que
ha enviado la comunidad y vosotros
podéis seguir enviando correcciones de
este reto Y de todos los anteriores que
se sigue revisando Así que voy a venir
por aquí como os decía voy a abrir el
ejercicio y también como os decía lo voy
a resolver en python voy crear un nuevo
fichero le voy a llamar mde se tiene que
llamar con el nombre de nuestro usuario
en giop y Vamos a ponernos a resolverlo
vamos a ir leyendo el ejercicio y vamos
a ir
primero y después resolviendo el
ejercicio lógico avanzado qué nos decía
el ejercicio muestra ejemplos de
creación de todas las estructuras
soportadas por defecto en tu lenguaje
claro ahora llega alguien aquí y dice
pero qué son las estructuras Ah De eso
se trata aprender a programar que
nosotros también tenemos que aprender a
buscar que nosotros también tenemos que
buscar nuestras fuentes de información y
ser capaces de ir entendiendo los
diferentes conceptos que acaban
conformando los fundamentos del lenguaje
No yo ahora lo voy a explicar Pero me
gusta el punto este de búsqueda inicial
que tenéis que hacer con cada red para
que así también os peleéis un poquito y
de verdad ir ganando esa soltura a la
hora de Buscar información y de tener
que pelear o y igual que no sois capaces
de resolver el ejercicio tampoco pasa
nada siempre Vais a aprender hagáis el
ejercicio no lo hagáis lo hagáis mejor
lo hagáis peor Pero si poco a poco
estáis peleando ya con el lenguaje
estáis aprendiendo eso eh darlo por
sentados así que qué son las estructuras
Al fin y al cabo una estructura en un
lenguaje nos sirve para organizar datos
nosotros ya hemos visto en fundamentos
en clases anteriores que tenemos pues
diferentes tipos de datos fundamentales
primitivos bueno según como los nombres
lenguaje no las cadenas de texto los
números los decimales los buanos bueno
esto ya lo hemos visto pero qué pasa si
nosotros ahora queremos agrupar varias
variables No pues aquí es donde entran
las estructuras y hay diferentes
estructuras en todos los lenguajes en
unos lenguajes más en otras menos pero
sí que es cierto que hay ciertas
estructuras que se repiten en
prácticamente todos los lenguajes aquí
como ya os digo Bueno tenéis que un poco
Mostrar las estructuras soportadas por
defecto después hay lenguajes que se
extienden y que acaban creando
estructuras super complejas Pero bueno
digamos a nivel fundamental Cuáles son
las estructuras de vuestro lenguaje
entonces teníais que buscar eso y ahí
teníais que empezar a trabajar con ellas
así que me voy a venir por aquí y vamos
empezar a revisar un poco Cuáles son las
estructuras por defecto de python en
vuestro lenguaje hay más hay menos se
llaman diferentes es posible pero que
van a hacer algo prácticamente igual o
muy parecido eso también lo podéis dar
por seguro Así que vamos con la primera
estructura que hay por defecto en python
que son las llamadas listas vale una
lista es una estructura ordenada donde
nosotros empezamos a guardar pues Oye
cada uno de los elementos las listas hay
lenguajes que separan el concepto de
lista del concepto de array o de arreglo
que puede que os suene también en python
como tal el array puramente no existe lo
que existe son las listas vale
básicamente una estructura que nos sirve
para guardar varios elementos de forma
ordenada Okay entonces yo ahora me voy a
venir por aquí y le voy a llamar por
ejemplo ya AC había que poner ejemplos
my list y me voy a crear una lista Qué
es una lista como tal pues donde puedo
guardar varios elementos qué podría
acabar guardando en esta lista Pues no
lo sé vamos a guardar pues nombres por
ejemplo le voy a poner a guardar nombres
de
personas de la comunidad pues bry estoy
leyendo a Black estoy viendo a wolfy
bionos Entonces esto es una estructura
Qué significa que ahora lo que tengo es
una variable que se llama my list que si
yo imprimiera por aquí print esta lista
lo que está guardando es un conjunto
ordenados de datos de datos de qué tipo
Estos son strings esto ya los hemos
visto simplemente son strings Entonces
nosotros de esta manera hemos podido
agrupar diferentes datos en una única
variable Ok entonces eso es para lo que
sirve una estructura pero la principal
función de una estructura no es solo
guardar más de un dato es poder trabajar
y manipular estos datos de manera más
fácil Qué quiere decir que yo por
ejemplo he creado esta lista pero qué
nos dec el ejercicio utiliza operaciones
de inserción borrado actualización y
ordenación Uy uy uy eso ya nos está
dando una clave significa que las
estructuras en los lenguajes de
programación nos permiten hacer estas
cosas y tiene todo el sentido que
nosotros tengamos estructuras que yo
ahora por ejemplo estoy aquí con mi
lista y digo Hala en mi lista estaba
guardando Imagínate los usuarios de un
chat no y ahora entra una nueva persona
en el chat y yo quiero guardar la
referencia a esa nueva persona que está
entrando digo okay Entonces qué tendría
que hacer pues la lista tiene una
operación que se llama appen que en cada
lenguaje se va a llamar de una forma
pero las listas o los arris si son
mutables si permiten su modificación
pueden llegar a hacer operaciones como
esta Añadir datos por es una estructura
Así que imagínate que ahora llega a este
punto de mi código y quiero añadirle un
nuevo usuario pues veo a Castor Pues
venga ha entrado Castor y ya está con lo
cual si yo ahora vengo aquí y imprimo mi
lista vemos que primero la lista tiene a
cu pero después entra una persona más
Castor y aquí vemos otra de las
características de las listas o de los
arr que su orden es el orden de de
inserción de cada uno de los elementos
el orden Lo estamos marcando aquí pero
ahora llegado a este punto yo voy a
Añadir un nuevo elemento dónde lo añade
lo añade al final hay operaciones para
Añadir Al principio para Añadir por el
medio para Añadir en una posición
concreta Sí pero por defecto Esta es una
estructura que va a ir añadiendo al
final también es posible que vuestro
lenguaje ya que estamos hablando de
listas igual lo que tenga implementado
Son estructuras de pila o de cola que
nosotros también podríamos trabajar con
listas un poco simulando ese tipo de
estructuras pues quizás más puras en
lenguajes de programación pero ya digo
depende un poco del lenguaje en mi caso
como lo que tengo es una lista para
Designar ese tipo de estructura ordenada
pues aquí estamos Entonces le meto esto
sería pues la inserción que nos estaba
pidiendo el ejercicio no Pero y si
quisiera borrar Pues tengo una operación
que dice remove y ahora digo Pues mira
quiero eliminar a abráis esta sería la
operación de eliminación en mi caso pues
una opción que se llama remove esto es
eliminación vamos ahora a volver a
imprimir la lista A ver qué muestra la
lista lo veis bry ya no está se lo ha
cargado qué más cosas dice Ah mira
actualización ostras para poder
actualizar un elemento de la lista
primero tenemos que saber Cómo acceder a
un elemento de la lista Así que yo ahora
vengo aquí a my list y algunas listas
pues como dejan acceder es por la
posición que ocupa el elemento imagínate
Esta es el la pinta que tiene la lista
ahora después de eliminar a bly en la
posición eh eh cero empezamos a contar
desde cero está Black en la un wolfy en
la dos visions y en la tres Castor
Imagínate que quiero cambiar a wolfy
porque digo Bueno Quiero actualizar
ahora en la posición dos wolfy ya no
está y va a estar otra persona Entonces
qué podría hacer podría eliminarlo y
después intentar insertarlo reordenar y
no sé qué Pero yo lo que puedo hacer es
acceder a una posición primero voy a
acceder a la posición uno black enl cer
wolfi en la uno okay Qué pasa si yo
ahora accedo a esta posición a la
posición uno quién está en la posición
uno aquí lo vemos wolfy esto es como el
acceso Pero si yo ahora quisiera
actualizar a wolfy pues tendría que
acceder a su posición y darle un nuevo
valor Pues que ahora wolfy va a ser
cuervillo por ejemplo así de claro ahora
venimos por aquí e imprimimos otra vez
toda la lista esto en realidad sería la
actualización vamos ahora a imprimir qué
tenemos teníamos a Black a wolfy a
Visión no sa Castor pero wolfi estaba en
la posición uno y ahora lo hemos
cambiado por cuervillo y ahora tenemos
ya veis en la posición uno a cuervillo
una actualización para esto para lo que
nos vale la estructura y por supuesto
para más cosas más Pero aquí lo tenemos
inserción borrado actualización
ordenación ostras Cómo co ordenación
claro una estructura ya que tiene
diferentes elementos pues llegado el
caso podríamos llegar a ordenarlo Yo
podría acceder a mi lista y en python
por ejemplo hay una operación que se
llama short que por efecto lo que va a
hacer es seguir un criterio designado
por el sistema Por supuesto si nosotros
quisiéramos podríamos modificar este
criterio para por ejemplo ordenar
siguiendo lo que a nosotros nos diera la
gana pero en cadenas de texto si yo
ahora vengo por aquí y le hago esta esta
ordenación y ahora imprimo mi lista
vamos a ver lo siguiente qué tenemos
Black Castor cuervillo y visions Qué ha
hecho pues se ha ordenado
alfabéticamente por defecto si yo le
hago un short a un listado en el que hay
cadenas de texto como es en en este caso
pues lo va a hacer de forma alfabética
si hubiera eh números lo iba intentar
ordenar de forma ascendente si hubiera
números y textos pues haría un mix
primero con los números después con los
textos etcétera Pero ya digo esto lo
solemos hacer cuando los datos son muy
básicos si nosotros tenemos objetos que
acaben siendo mucho más complejos que
eso ya lo veremos cuando sigamos con la
ruta de estudio Nosotros le podemos
acabar indicando el criterio que a
nosotros nos dé la gana para que esto se
ordene precisamente como querramos no
como el sist tema tiene implementado por
defecto entonces Bueno aquí tenemos un
poco todo esto Esta es la primera
estructura que tenemos por defecto en
python lo repito dependiendo del
lenguaje tendréis más o menos
estructuras con nombres más o menos
parecidos con operaciones más o menos
parecidas pero el fundamento de
estructura que sirve para guardar datos
que podemos acceder modificar actualizar
borrar no sé qué eso lo vamos a poder
hacer en todos los lenguajes vale otro
tipo de estructura también muy típico en
lenguajes de programación es lo que
llamamos tuplas le voy a llamar una
variable maí tuple Qué es una tupla una
tupla vuelve a ser una estructura en la
que nosotros podemos guardar más de un
dato Pero hay una peculiaridad Y es que
las tuplas son inmutables es decir como
creemos la tupla inicialmente Ahora aquí
este tipo de cosas que veíamos inserción
eliminación actualización esto no va a
existir es un tipo de estructura muy
segura en el que nosotros ya en su
momento de creación tenemos clarísimo lo
que va a llevar imagínate una tupla en
la que yo quisiera guardar Pues mis
datos personales mi nombre mi apellido
mi alias vamos a llamarlo así por
ejemplo @ mouredev y mi edad por ejemplo
aquí con int que sea 36 pues veis lo que
yo he hecho ya no lo he hecho con el
corchete que es como creamos las listas
en realidad en python que esto no lo
hemos hecho pero si hacemos un type de
My list aquí veremos lo siguiente Class
List nos está diciendo que es una lista
si no os creíais el tipo de dato que es
esto el tipo de dato que tenemos aquí es
list Okay igual que esto que vemos aquí
que vemos tuple qué es esto vale venga
voy a mirar el type de tuple a ver qué
es en este caso y vemos ahora es una
tupla porque la he creado con paréntesis
básicamente un tipo de dato reservado
que se llama tuple vamos a ver si es
verdad esto de que es inmutable no es
inmutable fijaos qué operaciones tengo
en la tupla tengo un count aquí poco más
eh pero ya no tengo operaciones para
Añadir para eliminar lo lo único que
podría hacer yo con la tupla son
operaciones de acceso vengo por aquí
solo podría hacer un acceso vengo aquí y
que tengo por ejemplo en la posición uno
vemos moure y que tengo en la posición
tres Pues tengo 36 mi edad y que tengo
en la posición cuatro Tengo un Por
qué Porque tengo elemento cero elemento
un elemento dos elemento 3es en la
posición cuatro no tengo nada con lo
cual nuestro programa acaba petando Okay
pero qué podría hacer con la tupla por
efecto en python hay una operación del
sistema que se llama short Entonces yo
le podría pasar a la tupla podemos
utilizar la operación sorted y pasarle
la tupla y Alguien podría pensar Okay
pues me voy a guardar el resultado otra
vez en mi tupla y me dice Uy sorted
tupla Uf Por qué está fallando Esto vale
porque en realidad sorted lo que está
devolviendo es algo que aún no sabemos
lo que es pero que le llama iterable es
decir nos está devolviendo un objeto
pero que en realidad Esto inicialmente
va a ser una lista y el sorte de este
que vemos aquí me dice ostras no puedo
acabar utilizando este comparador menor
que entre un entero y un String acabamos
teniendo un problema de ordenación por
culpa de los tipos de datos en una tupla
Pues dice Oye me has metido números me
has metido cadenas de texto y no sé muy
bien que hacer Bueno podemos modificarlo
para que nos funcione y decir mira para
no rompernos la cabeza voy a cambiar la
edad a una cadena el texto y ahora lo
voy a lanzar vale Y ahora vemos Que sí
que funciona pero cuando imprimimos el
tipo de tupla qué nos dice lista o esto
era una tupla y nos ha cambiado a lista
por qué Porque el sorted lo que nos
devuelve es una lista si nosotros
quisiéramos que ahora con el sorted
volviera a ser una estructura inmutable
llamada tupla tendríamos que utilizar el
constructor de tupla decirle no no no
tuple así nos sirve para crear un objeto
de tipo tupla que ya veremos también lo
que es el concepto de objeto pero de
momento entender así yo puedo hacer que
la lista que tengo aquí la voy a
transformar la voy a castear en realidad
a tupla le voy a cambiar el tipo de dato
y ahora Cuando vengo por aquí veis lo
que dice ya pone Clash tupla vuelve ser
una tupla y tenemos la manera de ordenar
una tupla la podemos imprimir si queréis
Para que veamos cómo ha ordenado esto y
veamos fijaos os acordáis lo que yo os
decía que si tenía números y textos lo
que hace primero seguir el criterio de
ordenación por números y después por
textos Pero eso sí siendo todo textos lo
primero que ha metido es el 36 lo
segundo está a por la roba y después ya
ha metido la b y la m me ha ordenado la
tupla pero gracias a que ha acabado
generando una lista y después yo la he
vuelto a transformar en tupla otra vez
inmutable así que puedo hacer la
ordenación pero ya veis que con un
ligero truco no entonces ya vemos que
las tuplas Pues bueno nos dejan hacer
menos cosas Si quisiéramos trabajar con
tuplas Pues casi tendríamos que acabar
transformando la tupla en una lista
trabajar con la tupla como si si fuera
una lista modificando eliminando
cambiando lo que sea y después igual si
queremos que vuelva a ser inmutable pues
otra vez volviendo a transformarlo en
una tupla qué caso se utilizan las
tuplas básicamente cuando queremos una
estructura de datos que sea inmutable
que no queremos cambiar como este caso
si yo no quisiera que nadie tocara Mis
datos Porque en realidad mi programa lo
que quiero que uses es esto y no quiero
que le metas la mano para cambiar
absolutamente nada porque sé que eso
puede acabar suponiendo un peligro y
también para el programa Va a ser más
eficiente porque es una estructura que
ya está reservada en memoria que no va a
crecer que no va a decrecer Y eso se
maneja muy rápido pero claro en realidad
tiene cosas a favor pero también tiene
limitaciones Okay aún así estudiar cómo
funciona si existe la tupla en vuestro
lenguaje de programación Y de qué manera
tenéis que interactuar con ella porque
ya digo que pueden existir pues ligeras
modificaciones Así que venga más
funciones qué más funciones tenemos en
python en python tenemos algo que se
llaman set o sets ya que estamos
poniendo todo en plural Qué son los sets
pues por supuesto los sets es otro tipo
de estructura así que me voy a crear una
estructura que se llama myset en este
caso cómo vamos a crear el set bueno en
python está bastante Guay porque con
corchetes creamos listas con paréntesis
creamos tuplas y con llaves creamos sets
y yo ahora puedo venir por aquí todo
tranquilo y me voy a crear un set igual
que la tupla y vamos a imprimir el tipo
de myset para que veáis que en el
sistema también existe un tipo de dato
que se llama set aunque aún no sepamos
Qué hace aquí lo tenéis cl set Vale
tengo un set Qué hacen los sets serán
inmutables los sets no no Para eso ya
teníamos las tuplas a ver qué
operaciones nos tiene el set Ah mira ya
Uh esto ya deja hacer muchas cosas
parece que esto es una lista Mira update
ad vemos aquí ostras igual Tiene
bastantes cosas Bueno pues vamos ir
haciendo lo que nos pedía el ejercicio
lo primero vamos a imprimir por aquí el
set para ir viendo si de verdad Esto va
cambiando no imprimo mi set y lo primero
que se nos pedía y que ya habíamos hecho
la lista era esto inserción Pues cómo
insertaremos un dato en un set a ver
tenemos un ad Imagínate que yo ahora
quisiera Añadir Pues no lo sé mi email
no y Pongo aquí mouredev
gmail.com me añado Okay vamos a ver si
de verdad el set ahora añadido esto
vuelvo a imprimirlo Okay Uf habéis visto
esto había un set aquí que era bry mour
36 @ mouredev Pero si yo había metido
primero bry moure @ mouredev 36 Cómo
imprime esto desordenado y ahora le
metido el email y lo ha vuelto a
desordenar Pues bueno vamos a partir de
que el set por definición es una
estructura desordenada aquí no os podéis
fiar de la posición de un elemento los
sets Son estructuras buenísimas para
guardar muchos datos buenísimas para
recorrer esos datos pero no para
intentar Buscar datos Porque en realidad
aquí lo estáis viendo si yo ahora me
guiara por esto diría okay Pues si me
voy a mys a la posición cero del set que
vamos a presuponer que yo puedo acceder
así no igual que hacíamos con las listas
igual que hacíamos con las tuplas voy a
venir por aquí esperar primero esto Esta
era la creación esta era la operación
que teníamos aquí de inserción y ahora
con esta teóricamente yo debería acceder
y digo Oh error Por qué por qué no tengo
una operación de acceso porque no tiene
ningún sentido en realidad Qué hago yo
con esto si en realidad yo nunca voy a
saber que hay en cada posición Por qué
querría yo acceder a la posición cero si
no hay nada que me esté asegurando que
va a haber en esta posición los sets se
estructuran de manera super óptima Y eso
se basa en que todos los datos que están
guardando en la estructura Al fin y al
cabo lo que tienen por debajo toda la
lógica para su inserción para su
eliminación que veremos ahí es en forma
de Hash por eso en algunos lenguajes de
programación igual lo encontraréis con
el nombre de Hash okay Porque lo que
está haciendo es transformar todos sus
datos en un Hash para que sea mucho más
fácil de localizar estos valores y
diremos vale pero aún no sé para qué me
vale todo esto acabaremos llegando
vuelvo por aquí y ya vemos que no
podemos acceder pero imagínate que yo
ahora aquí en mi lista quisiera Añadir
dos veces a Castor vamos a ver cómo
quedaría nuestra lista he añadido dos
veces a Castor tengo dos veces a Castor
en la lista tiene sentido si yo tengo
una bolsa donde tengo una naranja y
metro otra naranja pues hay dos naranjas
no decir hay como dos cadenas de texto
este caso que son iguales pero imagínate
que ahora vengo yo por aquí y añado dos
veces el email Oh qué ha pasado si yo he
añadido dos veces mouredev @gmail por
qué Aquí no se muestra pues de ahí que
se esté utilizando un set esa manera de
serializar los datos para que sea tan
fácil accesible a ellos de manera
interna sirve principalmente los sets
para evitar duplicados es una est dura
no ordenada pero que como es super
rápida a la hora de Buscar nos sirve muy
bien para guardar una integridad de que
los datos no estén duplicados Así que
aquí lo tenéis yo he metido dos veces
mouredev @gmail pero no es que se haya
insertado solo una es que en realidad
Cuando se ha intentado insertar la
segunda vez ha visto que ya existía y
sin más pues lo que ha hecho es No
insertarlo si nosotros en una lista no
quisiéramos guardar duplicados sería un
proceso más lento porque tendríamos que
buscar si de verdad existe un elemento
en la lista y Lo tendríamos que buscar
por el propio valor del elemento en
cambio el set por debajo lo que hace es
crear una clave alfanumérica un Hash
básicamente que le va a permitir
trabajar con estos datos superrápido
vale más cosas que podemos hacer vale la
inserción funciona de esta manera no
tenemos los duplicados pero en realidad
podemos borrar ya que el acceso no lo
podíamos en realidad sí que podemos
borrar un pop update discard Clear veis
que tenemos aquí un pop igual si
quisiéramos trabajar pues con con esas
estructuras que hablábamos antes de cola
de pila Pues bueno estas estructuras por
defecto en python pues algunas ya nos
permiten interactuar de esta manera
digamos eliminando elementos Pues por el
principio por la cola según el tipo de
estructura que estemos intentando
simular tenemos una operación que es
remove Y si ahora vengo aquí a remove y
le paso Pues no lo sé moure podré
eliminar pues vamos a verlo okay pues
vale la eliminación sí que funciona y
tiene todo el sentido claro acceder a
una posición concreta no tiene sentido
duplicar no tiene sentido porque es un
set pero eliminar o insertar sí que
tiene todo el sentido qué nos faltaba
ahora que ya Hemos llegado a la
eliminación Pues nos falta la parte de
actualización de verdad creéis que
tendrá sentido una actualización como
tal que yo viniera por aquí myset no sé
update y vemos aquí Uf el update en
realidad aquí no significa que esté
actualizando un valor en concreto en
realidad aquí el update lo que hace Es
simplemente ampliar los datos que ya
tenemos en este set por si le quisiera
vamos concatenar más datos a esta propia
estructura Así que no lo mal interpreté
como que pueda ser el cambiar un dato
por otro si queréis actualizar un dato
por otro lo mejor siempre es eliminarlo
e insertarlo porque en realidad Este
cambio no es como una lista que le
estamos guardando la posición aquí la
posición nos importa nada porque la
posición es variable okay Así que aquí
la actualización sería eliminación
inserción Pero lo que sí que podemos
hacer es la parte de ordenación digo
cómo cómo la parte de ordenación A ver
vamos a probar la técnica esta que
utilizamos antes el shorted porque un
short Tenemos aquí algo así short no no
tenemos pero sí que podemos hacerle el
shorted porque esto prácticamente se lo
podríamos aplicar a cualquier objeto y
después ya veremos si nos falla o no y
vemos tenemos el shorted Esto me lo voy
a guardar en myset y vamos a imprimir
Qué tipo de dato es después de hacer el
s y vemos lo que vuelve pasar Hala otra
vez en realidad lo hemos ordenado pero
claro si queremos ordenarlo qué nos
tiene que acabar devolviendo Pues nos
tiene que acabar devolviendo una
estructura mutable y ordenada el set por
definición no es ordenado con lo cual no
nos puede devolver un set Así que mismo
problema aquí lo tenemos que le
intentamos hacer la magia esta del set
vamos a imprimirlo primero como lo
ordenaría nuestro ser ordenado tendría
esta pinta pues lo que vimos antes no
números la @a bry tal Okay vamos a
hacerle la trampa de transformarlo a set
igual que hicimos con la tupla y vamos a
ver ahora esto ya vuelve a ser un set
por Class Pero qué problema Tenemos aquí
que no se ha ordenado se ha vuelto a
desordenar porque lo repito por
definición el set no se puede ordenar
Okay no se puede ordenar en realidad el
set no es una estructura ordenada Así
que aunque le hagamos esto y la trampa
de lista generación nos da igual porque
si os dais cuenta ya cuando creamos la
inserción inicial esta inicialización ya
cuando lo imprimí Ya podía no darnos ni
este orden así que olvidémonos de la
parte de ordenación y ya por último hay
otra estructura básica existe más
estructuras sí pero a nivel decore del
lenguaje a nivel fundamental a nivel
primitivo la última estructura que
tenemos en python es el diccionario lo
repito que vuestro lenguaje tiene más
menos está perfecto el ejercicio se
trataba de que lo teníais que buscar y
ahora que conocéis que existen estos
Pues también tenéis que ver pues bueno
Cuáles son comunes Cuáles no son comunes
Cuáles tiene y cuáles no tiene vale Qué
es un diccionario de momento vamos a
crearlo como hicimos lo otro a ver si
somos capaces de ir viendo que hace el
diccionario voy a crear aquí algo que se
llama myd vale un set que no lo he
puesto antes el tipo de dato es set no
Aunque ya lo vimos aquí cuando lo
estábamos creando de nuevo Qué es un
dicionario el tipo de datos dict Y cómo
creamos un diccionario lo creamos
también entre llaves y ahora me podéis
decir cómo entre llaves entre llaves
creamos el set cómo voy a saber yo que
esto es un diccionario en vez de un set
si yo ahora le empiezo a meter aquí
datos entre llaves por qué Porque la
manera de guardar estos datos no sigue
esta estructura de meterle datos y
separarlos por comas en realidad
Nosotros sí que separamos datos por
comas pero el formato de los datos que
guardamos es clave valor Nosotros le
asociamos una clave a cada uno de los
datos que tiene este diccionario
Imagínate que ahora intento transformar
todo esto en un diccionario Pues claro
Así no sería un diccionario tan fácil
como que ver esto voy a imprimir el tipo
de m dict me dice set me da igual que
aquí le pongas dit esto es un set
obviamente pero si yo ahora lo que hago
es asociarle una clave a cada uno de
estos valores que es una clave pues lo
que entendemos por clave al final es ese
punto de acceso que nosotros tenemos
para acabar llegando un dato por ejemplo
la clave de name que podría la clave de
bry podría ser name Y cómo separo la
clave del valor con dos puntos así
estaré indicándolo mira aquí tengo un
diccionario con clave name y valor bry y
moure podía ser el apellido aquí y mour
de podría ser el alias y 36 podía ser la
edad se pueden crear claves de
diferentes tipos de datos sí
efectivamente Pero bueno Aquí vamos a
intentar hacerlo todo con strings porque
creo que queda muchísimo más y porque
suelen ser criterios de búsqueda
bastante fáciles que la clave podría ser
un entero si alguien le diera la gana
hacer esto de clave esto podría ser una
clave perfectamente Y esto compilara y
vemos que ahora ya tenemos aquí que esto
es un diccionario pero en mi caso creo
que es como mejor se entiende de hecho
lo vamos a hacer así con un salto de
línea para que quede mejor estructurado
vemos que lo que tenemos es un
diccionario con clave name valor brise
surname alias y h y ahora que ya tenemos
este diccionario vamos a intentar ver
cuáles son sus propiedades cómo funciona
todo esto qué teníamos que probar pues
Vale teníamos la parte de la inserción
Pues venga vamos a intentar insertar
datos en myit qué operaciones tenemos
bueno vemos que hay aquí unas cuantas
operaciones tenemos montonazo de
operaciones que queremos insertar un
dato lo que hicimos antes si nosotros
queremos insertar un dato en este caso
Aunque podríamos insertarlo directamente
qué se suele hacer solemos Acceder al
dato que nosotros queremos insertar
Imagínate que yo ahora quiero insertar
el email pues la manera de Acceder al
email si existiera veis esto sería igual
que con la con la lista pero en vez de
una posición porque aquí no tenemos
posiciones volvemos tener algo muy
parecido a la estructura de set de que
todo lo que tenemos aquí en nuestra
estructura o si la queréis imprimir
antes fijaos veis aquí en realidad
nosotros no tenemos una estructura como
tal en la que podamos acceder a cada uno
de los elementos vemos que esto nos da
un intento Acceder al elemento
cero ya que volvemos a lo mismo los
diccionarios por definición no son
ordenados Aunque en python sí que es
cierto que desde hace unas cuantas
versiones pero por a nivel de diseño no
a nivel conceptual en realidad un
diccionario sí que acaba guardando los
datos ordenados pero es por cómo han
decidido implementarlo en python pero no
porque la estructura de diccionario
fundamentalmente sea ordenada porque lo
que tenemos son claves valores claves
valores que también van a funcionar por
un Hash Okay solo que en python en
concreto han decidido que los
dicionarios acaben siendo ordenados pero
ya digo por una decisión más a nivel de
entación Entonces yo no puedo acceder a
un elemento cero porque conceptualmente
no estaríamos seguros de lo que va a
haber en el elemento cero Entonces cómo
accedo yo a los valores en realidad yo
tengo que acceder por clave Cuál es la
clave name surname alias lo que sea si
yo ahora hago esto vemos Que si accedo a
name lo que me devuelve es bry el valor
asociado a la clave Esta es la operación
de acceso que teníamos aquí pero antes
estábamos haciendo la parte de inserción
Cómo tendría que insertarle un Val valor
lo que decíamos antes yo primero lo que
tengo que hacer es como si quisiera
acceder a una clave email no lo tengo
pero yo de esta manera le puedo indicar
que ahora lo que voy a tener es una
clave email y que ahora el valor de
email va a ser igual a lo que teníamos
antes mouredev mouredev
@gmail.com y si ahora imprimo mi
diccionario completo vamos a ver lo
siguiente que al final de todo tengo una
clave email con el valor mour dep y ya
os digo en este caso sí que es ordenado
porque en python el diccionario es
ordenado pero no os fiéis de Okay Por
favor no os fiéis de eso vale aquí
tenemos la inserción Pero y si yo
quisiera hacer actualización Pues en
este caso los dicionarios suele ser
bastante fácil porque el concepto de
acceso o de inserción en realidad es el
mismo que el de actualización que yo
ahora lo que quiero es actualizar mi
edad pues accedería primero a la edad a
mi dicionario a la edad age Imagínate
que ya cumplo años y le digo que ahora
mi edad es 37 si yo ahora vengo por aquí
e imprimo el diccionario lo que Vais a
ver aquí es que ahora ha pasado la edad
de 36 a 37 pero si no existiera el campo
edad como nos ha pasado con el email lo
iba a acabar insertando ya veis que
podemos acceder de una manera muy segura
a todos los datos del diccionario Okay
Cómo podríamos acabar ordenando los
datos del diccionario Ahora aquí sí que
tenemos el punto ese de que los
diccionarios son ordenados en python lo
vuelvo a repetir lo vuelvo a repetir voy
a poner que esto es una actualización
bueno no hemos No hemos hecho el borrado
Qué pasa si yo quiero borrar qué
hacíamos aquí insertamos si había una
operación que era remove después de
haber hecho una inserción o lo que fuera
me voy a cargar el apellido Pues a ver
Vengo al diccionario Cómo haré la
eliminación Yo sé que el apellido está
en surname y aquí podríamos pensar igual
tengo una operación delete remove no
tengo nada pero lo que sí tengo es una
operación reservada del sistema que se
llama Dell de delete entonces si yo
ahora ejecuto Esto del de este elemento
me lo va a acabar borrando y lo vemos
aquí print mi diccionario esto sería la
eliminación y vamos a ver esto Dónde
está el apellido No está se lo ha
cargado ya veis que hay ligeras
modificaciones nos falta la ordenación
tendremos ordenación aquí o no tendremos
bueno mismo truco volvemos al dicionario
sorted Ah no hay nada pero si le paso
sorted y el diccionario por defecto va a
intentar ordenar algo a ver que es capaz
de hacer esto sorted del diccionario e
imprimo el diccionario Y esto es lo que
yo entiendo por ordenación a ver si lo
ordena qué tengo Uf tenía un diccionario
y de repente Ahora solo tengo las claves
Eso sí las claves ordenadas pero claro y
dónde están los datos se perdieron y el
diccionario ahora es una lista Uf no no
no no en realidad yo lo que tengo que
hacer para ordenar es acabar accediendo
a todos los ítems Al conjunto de claves
y valores ya que por defecto si yo se lo
paso sorte solo me va a pillar las
claves Pero en cambio Si yo vengo aquí a
my dict y voy a items ems es una
operación de los diccionarios que en
realidad me devuelve todos estos datos
las claves y los valores a ver qué tengo
ahora aquí aquí ojo H alias pero vemos
que no está devolviendo como una lista
que contiene tuplas una lista que tiene
una tupla que es h37 otra tupla que es
alias mouredev otra tupla que es email y
ya parece que está ordenado parece no a
la e la n lo ha ordenado por clave pero
claro no tengo un diccionario me lo ha
acabado convirtiendo en una lista qué
tendré que hacer pues mismo truco de
antes acabo transformando esta lista de
tuplas en un diccionario y esto
finalmente volverá a ser un diccionario
veis y ahora ya tenemos un diccionario
que se ha ordenado de esta forma hemos
visto las estructuras que existen en
python cada uno de vosotros pues tenía
que haber visto pues Cuáles son las
estructuras de su lenguaje una vez
tenemos el ejercicio hay esta parte que
digo dificultad extra opcional Bueno
sobre todo la parte opcional la debería
poder implementar todo el mundo pero si
estáis empezando muy muy de cero Pues
que os centré en aprender el lenguaje y
que nos pongáis aquí a hacer esta parte
opcional donde de verdad practicamos un
poco más lógica aún así yo os
recomendaría que si inicialmente veis
que no sois capaces de asumir la parte
esta de dificultad extra que más
adelante lo intentéis resolver o que lo
intentéis resolver aunque no lleguéis a
una corrección pero por lo menos
intentáis ahí pelear un poquito con esta
parte extra Porque aquí es donde De
verdad vamos a poner en práctica lo
aprendido Bueno pues vamos a hacer algo
parecido me voy a venir Yo por aquí y le
voy a llamar a esta parte extra voy a
poner aquí estructuras y aquí extra y
vamos a intentar resolver el ejercicio
este extra que decía Crea una agenda de
contactos por terminal entonces Bueno
aquí es donde De verdad nos tenemos que
pelar un poquito más con qué teníamos
que hacer en este ejercicio dice debes
implementar las funcionalidades de
búsqueda inserción actualización y
eliminación de contactos ya veis un
ejemplo real para el que podríamos
utilizar alguna estructura dice
implementar funcionales búsqueda
inserción actualización eliminación de
contactos cada contacto debe tener un
nombre y un número de teléfono vale y
vemos el eh Por aquí el programa
solicita en primer lugar que es la
operación que quiere realizar Okay pues
venga vamos a empezar a implementar
nuestro programa mi programa Va a ser
una función Estos son cosas que ya vimos
anteriormente Y le voy a llamar pues my
agenda Aquí tengo una función que yo voy
a acabar llamando por aquí cuando quiero
que se ejecute mi programa y mi programa
Va a estar todo dentro de esta función
llamada my agenda y el programa
inicialmente lo que decía es que tiene
que acabar preguntando pues qué es lo
que queremos hacer si queremos insertar
borrar actualizar eliminar por aquí
inserción borrado actualización
ordenación venga dejármelo tener por
aquí que lo voy a ver más fácil vale
tenemos búsqueda entonces podría decirle
aquí en el momento que se arranque pues
lo que quisiéramos hacer no escribe un
uno que sea insertar contacto un
programa interactivo por terminal
también podríamos hacer por aquí varias
opciones Pon aquí búsqueda inserción
actualización eliminación Bueno pues voy
a empezar por búsqueda Buscar contacto
insertar contacto actualizar contacto y
eliminar contacto se escribe 1 dos 3 o
cuatro y el programa decía que Oye
también se debe proponer una operación
de finalización del programa Pues si
teclea cinco el número cinco esto por
poneros lo mucho más fácil no podría ser
todo lo complejo Que quisiéramos pero
sin más voy a poner aquí salir okay Esto
es lo primero que le vamos a presentar a
nuestro usuario y aquí lo que tendríamos
que hacer en el momento que se arranca
Este programa sería obtener qué es lo
que va a escribir el usuario qué
responde el usuario Pues mira para eso
Por ejemplo en python tenemos una
operación que se llama input que esto lo
que acaba recogiendo es lo que teclea el
usuario y pulsa enter así que voy a
venir por aquí y le voy a escribir
selecciona una opción y Esto me lo voy a
guardar en una variable que se llama
option qué haría nuestro programa si lo
arrancamos vemos esto dice tat ta ta
selecciona una opción lo vemos por aquí
selecciona una opción Bueno aquí podría
escribir lo que quisiera cinco enter
Bueno mi programa finaliza porque no
estoy tratando este dato vamos a hacer
varias cosas primero vamos a hacer aquí
un salto de línea inicial para separar
estas ejecución o simplemente le voy a
hacer Bueno lo vamos a hacer así esto y
ahora Aquí sí que le voy a hacer un
barra un salto de para que más o menos
se vaya separando toda la ejecución Okay
pero ahora que ya tengo esta opción qué
tendría que hacer pues bueno si el
usuario If la option Esta es igual a uno
pues haríamos una cosa y el If si option
es igual a 2 pues haríamos otra cosa
okay Ahora aquí podemos utilizar ya que
estamos aquí un poco haciendo cosas más
avanzadas hay una estructura que
funciona bastante bien para esto cuando
estamos examinando el valor de una única
variable que es el switch que eso lo
tenéis en muchos lenguajes y en python
desde la versión 310 creo tenemos el
match Entonces qué quiero acabar
revisando el valor de option y una vez
lo reviso Qué diferentes casos de uso de
este valor tengo Pues tengo el Case de
que valga uno esto es como hacer
diferentes els If no un If y varios
elsif el Case de que valga dos 3 4 5 2 3
4 5 no en cada caso voy a hacer una cosa
y después también tengo el caso por
defecto que simplemente en Case con gu
bajo que esto sería que por supuesto el
usuario puede acabar escribiendo algo
que
no sea 1 2 3 4 5 vale en realidad Cuando
utilizamos If el sif cuando utilizamos
el llamado switch o en este caso Cómo se
llama en python que smch pues bueno
habitualmente en el momento que tenemos
condiciones complejas ahí solemos
utilizar el el If el el shif y cuando
estamos revisando valores de diferentes
variables pero en este caso si os fijáis
yo lo que quiero es hacer diferentes
cosas pero siempre observando Cuál es el
valor que va a tener una única variable
no quiero revisar varias cosas Solo
quiero saber los diferentes valores que
va tomando option entonces tiene más
sentido utilizarlo Pues con un switch o
en este caso con un match Okay vale Y
ahora Aquí vamos a ir haciendo pues
diferentes cosas vamos a irnos al caso
más más fácil Qué pasa si no escribe Ni
uno ni dos ni tres ni cuatro ni cinco
Pues yo le voy a acabar diciendo al
usuario Ey escríbeme una opción válida
le voy a decir No lo sé opción no válida
y le puedo poner por favor elige una
opción elige una opción del uno al cinco
que son las opciones que que yo en
realidad hago algún tipo de lógica no
con las otras no hago nada vale vamos a
irnos ahora sí que a otra que podría ser
bastante fácil el caso de salir pues
bueno si hay cinco yo le voy a decir
aquí al usuario print saliendo de la
agenda ya está pero claro Ahora aquí
tenemos otro problema que es qué pasa
con esto Esto se ejecuta de forma
secuencial primero está línea después
está línea después está línea pero en el
momento que selecciono algo la función
llega al final finaliza en realidad yo
tengo que hacer que esta preguntas se
repitan De qué manera se repitan en
bucle no Entonces qué voy a hacer voy a
meter toda mi lógica dentro de un bucle
dentro de un bucle que en realidad se
ejecute de manera infinita no así que
qué podemos hacer un bucle que funciona
muy bien para repeticiones en base a un
criterio es el While el bucle While que
también existe en la gran mayoría de
lenguajes y que también lo vimos en un
reto anterior le voy a decir While true
Qué significa While true pues While true
esto es una condición que indica que
siempre es verdadero mientras sea
verdadero y cuándo va a cambiar esta
condición en realidad no va a cambiar
nunca Entonces esto se va a ejecutar
infinito Cómo podemos hacer que se
detenga que se rompa este bucle bueno en
la gran mayoría de los lenguajes también
hay funciones de lenguaje de ruptura en
python el nombre que tiene es break un
break lo que hace es salir del bucle que
se está ejecutando en el momento que se
ejecute esta línea break se va a salir
del Wild Aunque este Wild en realidad
sea infinito hay otra gente que le crea
un flag por ejemplo pues yo que sé voy a
crear una función que se llame is on
como que está arrancado y yo le voy a
decir que vale true y le voy a decir
mira Mientras esté funcionando esté
encendido repítete qué podría hacer yo
aquí is on y le cambio el valor A false
qué haría cambiaría el propio criterio
que está haciendo que se ejecute de
forma infinita este While como ya lo
cambiamos a false se saldría Pero bueno
ya veis que esto lo estamos
implementando pues con más líneas
realidad yo en python tan fácil como
hacer un break y se me va a salir del
bucle en el que esté así Así que esta es
la manera de yo parar la ejecución de mi
programa si me salgo del bucle se acabó
Entonces le puedo dejar aquí
tranquilamente que esto se ejecute de
manera infinita que no voy a tener
riesgos y ahora ya sí que nos tenemos
que ir a las operaciones difíciles nos
vamos a ir a las operaciones difíciles
que es empezar a implementar la búsqueda
de un contacto la inserción la
actualización y la eliminación y lo
primero que tenemos que pensar es Okay
Cuál es la estructura que vamos a
utilizar para modelar los datos de
nuestra agente qué tenemos por aquí ah
vamos a ver qué nos pedía el ejercicio
debes implementar funcionalidades bla
bla bla y dice el programa solicita en
primer lugar Cuál es la operación que
quiere realizar eso ya lo estábamos
haciendo y los datos necesarios para
llevarla a cabo a ver qué datos el
programa no puede dejar introducir
números de teléfono okay Pero qué es en
realidad lo que tiene que guardar dice
Crea una agenda de contactos de terminal
y lo que nos dice es ta ta ta cada
contacto debe tener un nombre y un
número de teléfono Qué estructura se nos
adapta en el momento que tenemos que
guardar Pues un nombre y una estructura
un nombre y una estructura un nombre y
una estructura una lista no es muy
óptimo porque una lista solo guardábamos
un dato podíamos guardar una lista de
tuplas ig damos tuplas porque cada
elemento de la lista que sea una tupla
doble con el nombre y con el número de
teléfono podríamos hacer eso Okay Eh no
está mal lo podríamos hacer así o en
realidad podríamos utilizar un
diccionario un diccionario en el que la
clave pues pueda ser el nombre digo cada
contacto no sé qué digo Ey
funcionalidades de búsqueda tal digo
claro con el diccionario que la clave
sea el nombre y que el valor sea el
número de teléfono por ejemplo o si os
ha dado la gana y que la clave sea el
número de teléfono porque queréis Buscar
por número de teléfono Pues venga
hacerlo Aunque habitualmente la búsqueda
la solemos hacer por nombre para Buscar
el número de teléfono por supuesto
podríamos acabar implementando que se
busquen los dos sentidos Pero bueno aquí
un poco Depende de lo que quisieres
complicar Bueno vamos a partir por lo
primero dijimos que vamos a necesitar
una estructura de diccionario así que me
voy a crear agenda y voy a inicializar
un diccionario a vacío ya está Esto para
mí es un diccionario cuando le meta
datos pues Ya veré aunque esto ya sabéis
esto inicialmente es un set Pero bueno
inicialmente es un set pero que yo voy a
acabar transformando en un diccionario
en el momento que le meta datos vamos
para ir probando voy a llamar a la
operación pas en todos porque pas lo
único que hace Es simplemente no
ejecutar nada para que nos desaparezcan
los errores ya que cada condición Case
necesita código yo le estoy metiendo pas
para que no ejecute nada y así ya
podamos empezar a probar vale vamos a ir
implementando siguiendo una especie de
orden lógico en lo que tenemos que hacer
claro cómo voy poder buscar y cómo voy
poder actualizar o eliminar si no he
insertado Así que vamos a empezar por la
operación dos vamos a insertar y voy a
venir por aquí y vamos a pensar Cuál es
la lógica que tenemos que desencadenar
si nosotros queremos insertar un usuario
qué tendríamos que hacer Pues bueno le
tendríamos que pedir el nombre si yo
selecciono el dos sería insertar así que
ya sabemos Cómo podemos hacer las
labores de inserción tan fácil como que
tengo que venir por aquí y decir
introduce un nombre introduce el nombre
del contacto del contacto y el nú número
no font primero uno y después le pido el
otro introduce el teléfono del contacto
Okay ya tenemos esto qué tendría que
hacer con name y con f pues me tendría
que ir a la agenda la clave cuál sería
el nombre y cuál sería el valor el
teléfono buo ya está ya estaríamos
guardando la clave y el valor Pero qué
pasaría vamos a venir por aquí el
programa no puede dejar introducir
números de teléfono no numéricos Y con
más de 11 dígitos o el número de dígitos
que queráis porque empezasteis a decir
en mi país son 12 en mi país son 300 en
mi país hay números de teléfono de cinco
Bueno he puesto 11 por poner algo pero
le ponía lo que os diera la gana Okay
entonces antes de insertar tenemos que
realizar una comprobación que todos sean
números If voy a poner por aquí por
ejemplo F y Aquí empieza a entrar La
magia de cada uno de los lenguajes por
ejemplo en python podíamos venir por
aquí y decir habrá algo así como is
digit ostras una operación que nos torna
verdadero falso y nos dice si F Está
compuesto por dígitos genial Vale
entonces si son dígitos and qué más la
longitud de teléfono leng phone qué
tenía que ser para poder insertar en
realidad decía aquí e ta ta ta ta número
de teléfono y no puede tener más 11
dígitos bueno Qué entendemos por esto
que la longitud de fo yo voy a decir que
sea mayor que cer0 and la longitud de
font tiene que ser menor o igual que 11
para yo así permitir insertar en caso de
que no se cumpla esto tendremos un els
querrá decir que no se ha cumplido este
criterio y yo ahora aquí le podría
lanzar un print al usuario y decirle
debes introducir un número de teléfono
con menos de 12 dígitos por ejemplo este
podría ser mi criterio y así lo aviso y
solo lo dejo insertar si en realidad son
todo dígitos y está entre 1 y 11 bueno
podríamos decir no porque claro Debería
ser un número con más de nueve da igual
Es decir ahí la lógica la que nos diera
la gana inventar en mi caso os he puesto
que controlara que tuviera como máximo
11 Entonces esta es la lógica que
estamos desencadenando por supuesto aquí
se trata más de practicar el tema de
estructuras que que esto sea aquí la
agenda definitiva y he visto aquí que
hay un error que he puesto len len y es
len font un máximo máximo de 11 dígitos
ponemos este criterio por ejemplo okay
Así que ya ya tenemos la parte de
inserción ya tenemos la inserción qué
más cosas podemos hacer vale ahora que
ya hemos insertado podríamos hacer el
buscar vamos a intentar implementar eh
la búsqueda para implementar la búsqueda
yo le tendría que pedir el nombre
introduce el nombre del contacto a
buscar podría poner por aquí y cuando ya
tenemos el nombre qué haría Pues con el
name si el nombre está en qué in agenda
otra operación muy típica con las
estructuras realizar tareas de búsqueda
por ejemplo yo para buscar si una clave
existe en un diccionario en python es
tan fácil como esto si la clave está en
el diccionario si se cumple esto nos va
a entrar por este If si no pues
tendremos aquí un Else Okay qué
tendremos en el Else por empezar por el
caso de que no lo ha encontrado pues
podemos tener vamos a interpolar esto le
voy a pasar el nombre pues el contacto y
el nombre que me ha pasado el nombre que
hemos escrito name no existe puedo poner
no lo hemos encontrado Pero en cambio Si
lo hemos encontrado Ahora aquí sí que
podré hacer un print y le podré decir el
número de teléfono del contacto le podré
decir el número de teléfono de el nombre
que H has introducido es Y ahora cómo
accedemos al valor asociado a la clave
me voy al diccionario que era agenda me
voy a la clave que era name y así accedo
al valor ya está otra operación más
implementada la operación de búsqueda
actualizar contacto vamos a eliminar
porque eliminar seguro que es mucho más
fácil qué Tendremos que qu hacer pedirle
el nombre más de lo mismo introduce el
nombre del contacto a eliminar cómo
hacemos la búsqueda lo mismo If aquí si
el nombre está en la agenda cómo hacemos
la eliminación ya vemos que eso era muy
fácil lo habíamos visto aquí arriba para
eliminar de un contacto simplemente del
el diccionario y la clave del el
diccionario agenda y la clave name lo
que acaba de meter el usuario en caso
contrario qué será el els Pues
básicamente lo mismo que pusimos aquí el
contacto no sé qué no existe le
pondríamos lo mismo ya está última
operación que nos falta la operación
tres la operación de actualización de
contacto qué tenemos que hacer Pues lo
mismo introduce el nombre del contacto a
eliminar que aquí lo puse mal a
actualizar si lo encontramos o si no lo
encontramos en caso de que no lo
encontremos o otra vez lo mismo este
contacto pues no existe pero en caso de
que exista qué hacemos ahora le tenemos
que pedir el nuevo número de teléfono
cuál es el nuevo número de teléfono
introduce el teléfono del contacto y una
vez ya ha introducido el teléfono del
contacto qué tenemos que hacer más de lo
mismo aquí lo tenéis otra vez tendríamos
que repetir este código el que nosotros
lo que estamos haciendo es otra vez
revisando si es un son todo dígitos si
cumple este criterio etcétera lo veis
claro Ahora aquí nos puede surgir algo y
es que este código todo este código lo
he repetido Exactamente igual aquí y
aquí qué podríamos hacer podría
centralizar recordáis que en una lección
anterior hablamos de de la posibilidad
de crear funciones dentro de funciones
Venga pues yo que sé podría crear una
función aquí dentro que sirviera para
insertar o para lanzar toda esta lógica
de inserción lo que vemos aquí lo
podríamos hacer esto ya es un poquito
más avanzado y yo no os quiero complicar
la vida entonces en cierto modo os lo
voy a dejar así como todo super indicado
pero con vistas a que tengáis claro que
esto en realidad es una mala práctica en
el momento que nosotros tenemos esto y
estamos repitiendo código algo estamos
haciendo mal esto todo esto debería
convertirse en una función de inserción
de usuario o semejante Okay yo podría
venirme por aquí y crear una función
imaginaos aquí Def insert contact y yo
venir por aquí y decirle Pues mira todo
esto que tenemos aquí Dónde está toda
esta parte toda esta parte en realidad
desde aquí el pH valdría Pero bueno
podríamos decirlo pues no Mira desde la
parte del font que es donde yo le voy a
hacer esta lógica pues yo me podría
venir por aquí y que todo esto formara
parte de esta lógica vemos todo esto
aquí está podría valer que yo ahora
quiero lanzar esta lógica tan fácil como
que yo ahora sin más vengo por aquí y
llamo insert contact Y dónde estaba
haciendo también toda esta lógica no sé
qué aquí igual que el debes introducir
todo esto todo esto todo esto Esta parte
de font insert contact hemos reutilizado
este código por supuesto hay más código
repetido pero para que veáis con este
que era el código como más complejo que
teníamos como lo estábamos reutilizando
Okay incluso podríamos revisar que el
Case fuera el dos o el tres y aquí
desencadenando si fuera el uno o otro
Bueno en realidad Hay muchas formas de
optimizar el código pero ya digo como
estamos a nivel de fundamentos tampoco
quiero pasar vale vamos a ver si ahora
corro mi programa que acabo encontrando
vamos a ir viéndolo por aquí digo Buscar
contacto insertar contacto no sé qué
pues vamos a ir haciéndolo Pues voy
poner un número que no existe El Seis
qué ha dicho opción no válida elige una
opción del uno al cco una a opción no
válida elige una opción del uno al cco
vale Voy a insertar contacto el dos y me
dice introduce el nombre del contacto
brce introduce el teléfono del contacto
ves como me lo está poniendo bien 666
6666 61 por ejemplo Hala ya me lo ha
insertado podríamos lanzar un mensaje
diciendo que se ha insertado
correctamente podríamos en realidad
Bueno yo en mi caso tiro para adelante
cuando ya inserto vuelvo a preguntar
insertar un contacto actualiz el
contacto Pues voy a volver a insertar
uno y ahora voy a insertar a mouredev y
el número es 666 66 66 6 2 ya está voy a
buscar el contacto el nombre del usuario
que quiero buscar moure dice Hala el
contacto moure no existe vale es verdad
voy a buscar porque en realidad era
bryce y me dice el número de teléfono de
bry es 666 no sé qué un y ahora voy a
buscar a m dep y me dice es66 no sé qué
dos okay Y ahora Quiero actualizar el
número vamos al tres Yo quiero
actualizar a moure Bris Qué tonto si
moure no existía Aquí está no no en
realidad quería actualizar a mour de
porque ahora el nuevo número es 666 66
66 6 3 ya no dos vengo por aquí
actualizado vamos a buscarlo lo busco
Busco a mouredev y vemos que ahora ya
acaba en tres qué quiero eliminarlo el
cuatro A quién quiero eliminar a
mouredev eliminado porque no nos ha
dicho que hay un fallo Ahora cuando
Busco el contacto y Busco a mouredev me
dice el contacto de no existe y ya por
último cinco sale del programa se cierra
lo veis estamos creando la lógica que
demuestra que entendemos Cómo funcionan
las estructuras vale eso es un poco lo
que tenéis que pensar pero aplicado este
ejercicio y aplicado a cualquier
ejercicio que haga yo no estoy
intentando cubrir todos los casos de uso
para la agenda perfecta estoy intentando
cubrir algunos casos de uso de un
proyecto que podría ser medio real pero
que lo más importante es que con esto
hemos visto Cómo podemos con una
estructura llevarlo a algo más real por
supuesto podríamos hacer más cosas y
pedir confirmar o decirle cuando se
inserte correctamente mostrárselo al
usuario pues podríamos hacer 1 cosas o
que yo ahora Claro si ahora pongo un
nombre con minúscula y lo busco con
mayúscula pues no me lo va a encontrar
es así es decir esos errores existen en
nuestro programa pero no se trata de eso
se trata más de la parte eh asociada a
lo que estamos aprendiendo en esta
lección más que cómo la llevamos a la
práctica vosotros en vuestro ejercicio
podéis hacer lo que queráis y es bueno
yo aquí porque Oye tenemos un tiempo
límite y si ahora me pongo a aquí a
hacer esa agenda perfecta Pues nos
tiramos 10 horas no Y si nobre tiene
apellidos podríamos hacerlo y podréis
hacer un buscador que solo buscara por
nombre o por una parte del nombre aquí
el nombre en realidad o es completo o no
lo encuentra fin de la historia así es
como va a funcionar pero poneros a
implementarlas Y si cubrís 50 casos de
uso más de los que yo os propongo eso
está genial dec está bien porque eso os
va a servir para aprender a vosotros
ya digo esto nunca se trata de
demostrarme a mí lo buenos o malos que
sois con el lenguaje se trata de que
vosotros os demostré a vosotros mismos
que estáis aprendiendo el lenguaje
Entonces si le veis eh mejoras a mi
ejercicio meter todas las que podáis
porque eso os va a valer para
practicar quién nos decía este ejercicio
número cuatro decía muestra ejemplos de
todas las operaciones que puede realizar
con carena con cadenas de caracteres en
tu lenguaje algunas de estas operaciones
podrían ser Busca todas las que puedas
esto es muy importante Por qué digo
Busca todas las que puedas porque
dependiendo del lenguaje de programación
Puede que haya operaciones comunes entre
todos los lenguajes pero Puede que haya
algunas un poco más más propias del
lenguaje yo os pongo ejemplos también
para que os deis cuenta de que qué es
esto de operaciones con cadenas de texto
y veis aquí acceso a caracteres
específicos subcadenas longitud
concatenación petición recorrido
conversión a mayúsculas a minúsculas
reemplazo división Unión interpolación
verificación veis ejemplos de
operaciones con cadenas de texto con
cadenas de caracteres muy habituales
haciendo vuestra búsqueda vuestro propio
estudio que es lo importante Igual
encontráis más o menos es un poco lo que
teníais que Representar en el ejercicio
y después pues ya veremos la dificultad
extra pero primero vamos a quedarnos con
el ejercicio Así que vengo como siempre
aquí a visual Studio code yo lo voy a
resolver en python m.py como si y ahora
aquí me voy poner un poco A contaros qué
podríamos hacer con las cadenas
simplemente voy a hacer aquí operaciones
voy a poner aquí y vamos a empezar a
operar con cadenas de caracteres para ir
aprendiendo Qué cosas podíamos hacer a
ver si vosotros también tenéis esto no
lo tenéis o si más o menos llegamos a un
consenso en diferentes cosas que podemos
hacer con el lenguaje de programación
vamos a ello cadenas de caracteres
primera cosa que se me ocurre operación
de concatenación os tenemos cadenas de
caracteres voy a poner aquí un ejemplo
por ejemplo le voy a llamar s1 y le voy
a llamar Hola s2 le voy a llamar python
dos cadenas de texto sin más lo que os
dé la gana Por qué Porque seguramente
las voy a empezar a utilizar a lo largo
de las diferentes operaciones que yo
puedo realizar con cadenas de texto Cómo
es la concatenación Pues bueno la
concatenación es tan fácil como que y la
por supuesto las tenéis que ir
imprimiendo para ir viendo los
resultados la concatenación es tan fácil
como a una cadena de texto sumarle otra
imagínate cadena de texto String 1 más
String 2 si yo ahora imprimo esto que
acabaremos viendo H la python todo junto
bueno por supuesto la concatenación
puede ser algo más compleja y yo ahora
le quiero meter Pues un espacio en el
medio pues le meto un espacio en el
medio y le quiero meter una admiración
al final o un espacio con una coma por
ejemplo Y ahora qué pasa y falta por qué
porque tenemos que concatenar todo con
mases así tenemos cadenas de texto
creadas con anterioridad y otras que las
estamos creando en el propio print sin
ser una variable las concatenando todas
con mases y ahora veo aquí Hola python
Pues bueno concatenación muy bien Qué
más cosas podemos hacer podemos repetir
cadenas de texto vuelvo vuelvo a repetir
hablando de repetición que que yo
implemente estas operaciones no quiere
decir que existan en todos los lenguajes
ni quiere decir que en todos los
lenguajes se hagan igual vale pero sí
que os sirve un poco para entender esas
diferentes operaciones que hay y
buscarlas en vuestro lenguajes o Buscar
operaciones extra que sirvan para tratar
cadenas de caracteres por ejemplo cuando
hablamos de repetición voy a venir por
aquí y voy a hacer otro print Imagínate
que yo quiero repetir tres veces la
cadena s1 Pues yo podría hacer esto no
s1 + s1 + s1 al imprimir esto Hola hola
hola pero en python Por ejemplo si yo
quiero repetir una misma cadena n veces
es tan fácil como hasta utilizar el
símbolo de multiplicación y las veces
que lo quiero repetir s1 por TR en
realidad es Hola hola hola tan fácil así
es tan fácil hacer una repetición de una
cadena de texto en python también tengo
la parte de indexación por ejemplo cómo
haría la parte de indexación la parte de
indexación básicamente es acceder a un
carácter concreto de una cadena de texto
en realidad eh Acceder al índice vamos a
la cadena de texto me voy a quedar con
la s1 y Imagínate que yo quiero acceder
a la letra que está en el índice cero si
yo me voy a la letra que está en el
índice cer0 qué tendré la H Y si
empezamos a concatenar diferentes
índices el índice cer0 el un el dos el
tres el cuatro así estos primeros índice
1 dos y tres desde el cero empezando a
contar qué acaba imprimiendo aquí Hola
Pero cómo la acaba imprimiendo en
realidad Porque yo he accedido a cada
una de las letras si yo accediera solo a
la cer Esto me imprimiría solo la H Ya
está entonces una forma de acceder por
índice a cada uno venga qué más longitud
Cómo podemos combinar una cadena de
texto con alguna operación del sistema
como es en el caso de python o con
operaciones propias de caracteres como
puede ser en otros lenguajes yo puedo
obtener la longitud de una cadena de
texto con una función en este caso que
es la longitud leng si yo me fuera a la
segunda cadena de texto y le digo Ey
Cuál es la longitud de la segunda cadena
de texto me dice seis Por qué Porque en
realidad python tiene seis letras tan
fácil como eso qué más cosas podría
hacer lo que se llama slicing no voy a
poner porción quizás el término que más
me gusta cadena de texto por ejemplo la
s2 otra vez Cómo puedo hacer para
quedarme con una porción por ejemplo
solo me quiero quedar con esto h o y n o
con el ton este final Pues en realidad
yo en python le puedo decir ahora que
conocemos la indexación los índices le
puedo decir en qué índice quiero que
empiece y en qué índice quiero que acabe
claro la p es el índice cer 1 2 es decir
quiero empezar la t índice 2 Y a dónde
quiero llegar a la n 2 3 4 5 decir
empiezo en el do le indico dos puntos el
dos es el índice inicial el cco es el
índice final hago el Play digo to Por
qué Porque en realidad este slicing
vamos a verlo 0 1 2 3 4 5 Oh Cómo es
esto Cómo es esto por qué Porque en el
slice el índice final no se tiene en
cuenta es es decir va del dos al cinco
como nosotros teníamos aquí excluyendo
el cinco por eso pone top si yo ahora le
pongo el seis que veríamos t pero
también tenemos otra forma que hacerlo
El Seis esto si en realidad queríamos un
slice concreto pero si queremos que el
slce vaya del dos hasta el final Mira me
imprime lo mismo yo le puedo indicar que
en realidad quiero que llegue hasta el
final de la cadena de texto le digo que
empiece en el dos y que no le pongo nada
al final con lo cual se va justo hasta
el final y si lo quiero hacer al revés
si quiero que empiece desde el principio
pero que vaya hasta el dos le podría
decir que empiece en el cero o en
realidad le podría decir que vaya De
nada a dos y veis que hace p en ambos
casos índice cer0 e índice uno aquí lo
tenéis Pues bueno diferentes formas de
obtener porciones vamos a hacer una
búsqueda Yo podría intentar Buscar si de
verdad un carácter existe o pertenece a
una cadena de texto vamos a hacer esto
voy a intentar Buscar si la palabra Hola
pues tiene la letra a Pues yo le podría
decir Ey a in s1 que es Hola A ver qué
me responde me dice true dice ostras es
verdadero y si yo pongo o Ho me dice
true también es verdadero lo veis
entonces en cierto modo así podemos
estar buscando si un caráter o una
cadena de caracteres está contenida
dentro de otra cadena de caracteres en
cambio Si yo le pusiera pues la i que me
va a decir false bien fácil no hacer la
búsqueda más cosas que podemos hacer con
caderas de caracteres porque en realidad
podemos hacer muchas por eso os digo que
a veces nos ponemos a aprender un
lenguaje pero cuando nos ponemos a
repasar cada parte es Cuando
verdaderamente acabamos entendiendo la
potencia del lenguaje y creo que quizás
con todos los tipos de datos Pues bueno
podemos evitarlo un poquito pero las
cadenas de texto es un tipo de dato tan
tan tan tan común y tan tan potente
Quizás es uno de los que tiene más
posibilidades que está bien aunque sea
de vez en cuando hacerle un repaso para
entender que tenemos todas estas
posibilidades y cuando tengamos que
tratar pues con cadenas de caracteres
que muchas de estas cosas después se
pueden aplicar a otros tipos de
estructuras saber que existen y después
intentar llevarlo a nuestras necesidades
búsqueda hacemos reemplazo deir
podríamos reemplazar podríamos decirle
Ey yo tengo una cadena de texto por
ejemplo la s1 y le puedo decir que donde
aparezca la o tengamos una a por ejemplo
entonces para eso en las cadenas existe
una operación que se llama replace y yo
le puedo indicar cuál es el carácter que
quiero reemplazar o la cadena de
caracteres en este caso la o y por lo
que yo lo quiero reemplazar por una A
qué me va a acabar imprimiendo esto me
va a escribir ala en vez de Hola otra
cosilla más que podemos hacer por
supuesto revisar porque es casi
imposible hablar de todísima las
posibilidades incluso todas las
variantes que hay dentro de cada
posibilidad pero en el momento que
sabéis que existe la opción de reemplazo
de despues si hay otras opciones de
reemplazo que podemos hacer Pues con
ciertas variaciones revisarlas porque
las vais también a acabar encontrando
Okay igual que tenemos es reemplazo
tenemos la división podemos dividir
cadenas de caracteres para ello cómo lo
hacemos venga me vengo un print otra
operación que tenemos dentro de las
cadenas de caracteres igual que tenemos
el el replace tenemos el Split le podría
decir Pues corta la cadena por dónde No
lo sé en este caso voy a poner la cadena
dos le voy a decir que la corte por la t
a ver qué acabo obteniendo qué tengo p
por un lado on por otro claro el corte
indica Uy Me he cargado el lugar por
donde corto podríamos hacer muchas cosas
para que esto no se perdiera pero
habitualmente por defecto los lenguajes
por donde tú dices que corte suelen
desechar ese criterio de corte porque
muchas veces decimos e corta por los
espacios en blanco por los espacios en
blanco cierto modo ya los acaba
eliminando aquí le he dicho que corte
por la t pues la t ya no existe por
supuesto podríamos acabar va recuperando
la t no hay ningún problema pero en
principio aquí lo tenemos tenemos p y on
Y qué estructura vemos por aquí pues
seguramente esto es un array un arreglo
una lista claro tenemos ahora dos
cadenas de texto al hacer el corte por
la t qué acaba significando esto que
realidad tenemos Pues bueno dos
elementos metidos en una estructura que
es lo que nos va a acabar devolviendo
que tuviéramos imagínate p tonton corte
lo veis acortado por las dos tes esto en
que lenguajes puede ser ligeramente
diferente a veces corta por la primera
aparición del criterio que nosotros le
estamos marcando depende el lenguaje ya
os lo digo depende un poquito del
lenguaje pero quedaros con que en el
momento que lo hagáis de verdad entender
cómo se está comportando más cosas que
podemos hacer aparte de la división
hablaba en el enunciado de la conversión
a mayúsculas mayúsculas y minúsculas yo
puedo venir a una cadena de texto por
ejemplo a la s1 y decir decirle e lo
quiero convertir a mayúsculas apper pero
también puedo venir a la misma cadena de
texto y decirle lo quiero convertir a
minúsculas lower Así que vengo por aquí
ya veis Hola en mayúsculas Hola todo en
minúsculas que sabéis que la H estaba en
mayúsculas la primera y hasta Mira
mayúsculas minúsculas y primera letra en
mayúsculas voy a poner otro ejemplo
vamos a hacer un print me voy a crear
una cadena de texto por ejemplo mi
nombre Bright moure y voy a llamar a una
operación que es title a ver qué hace
title title acaba devolviendo bry moure
ha puesto la primera letra de cada
palabra en mayúsculas pero he puesto I
letras en mayúsculas voy a volver poner
la misma cadena de texto y ahora voy
Llamar a capitalize a ver qué hace
capitalize solo pone la primera letra de
la cadena de texto mayúscula veis que el
moure Sigue estando minúsculas es más
habitual utilizar estas operaciones yo
creo que de lo que parece o yo lo he
utilizado bastante sobre todo para
formatear para guardar con una misma
estructura para mostrar por pantalla que
no haya problemas si igual en base de
datos he guardado una forma y tú después
en la parte gráfica ya quieres que tenga
esa homogeneidad o lo que sea Pues venga
le aplicas este tipo de operaciones este
tipo de funciones que ya veis que son
bien simples más cosas voy a poner otra
operación que también tenemos dentro de
la propia cadena de texto eliminación de
espacios al principio y al final que
esto también es muy típico usarlo un
poco a veces hasta para asegurar el tipo
de dato vuelvo aquí y voy a poner bry
mowy y le voy a dejar este espacio
delante y este espacio detrás y voy a
llamar a una operación que se llama
strip esta operación strip lo que va a
acabar haciendo es venga si tiene
espacios al principio y al final se los
quitas aquí veis que bry ya aparece a
esta altura lo que significa que lo ha
quitado y al final Por supuesto que
también los ha quitado si quisiera
podríamos hacer esto strip y ahora le
concatenados ver br moure @ mouredev y
veis que @ mouredev aparece al lado de
moure quiere decir que este espacio al
final de la cadena de texto se le ha
quitado vale hemos hecho antes la parte
de búsqueda vamos a hacer otra que
también es bastante común que es
búsqueda al principio y al final
búsqueda al principio y al final ya que
hemos visto aquí Cómo elimina los
espacios al principio y al final vamos a
hacer Prim y le voy a decir e la cadena
de texto la s1 Le puedo preguntar Start
with le puedo decir e cadena Tú empiezas
por la por la cadena de texto por la
letra o por lo que sea o h o Y qué me va
a decir true en cambio Si le digo si
empieza por la palabra pie por python me
va a decir false quien empieza por pie
es la segunda cadena de texto no la
primera igual que le puedo preguntar si
empieza le puedo decir ends with le
puedo decir e terminas por la o terminas
por zong y me va a decir true en el
primer caso porque la cadena uno termina
por la pero la cadena 1 No termina por
th Otra cosita más venga tengo otra
tengo otra lo que podemos hacer también
es encontrar la posición búsqueda de
posición Qué significa esto que
imagínate que yo tengo una frase pues
más larga digo bry moure @ mour y yo le
digo Me gustaría saber dónde está
la palabra mour en la cadena Porque
igual le quiero acabar haciendo algo o
lo que sea tendríamos la posibilidad de
utilizar una operación que se llama find
y aquí le podría acabar pasando esa
cadena de texto y le digo moure y a ver
qué nos dice 13 Qué significa este 13
qué creéis que va a significar el 13
vamos a contar no 0 1 2 3 4 5 6 7 8 9 10
11 12 133 ojo aquí está por ejemplo el
find nos da la posibilidad de encontrar
la posición donde está empezando esta
cadena y si yo le pusiera la m
únicamente veis que el primer moure no
lo encuentra porque empieza por m
mayúscula veis que si yo ahora pongo
mour con m mayúscula me aparece el seis
igual que si yo ahora pusiera solo esta
m me aparecería El Seis también pero que
si yo ahora vengo por aquí y paso todas
minúsculas le digo e lower Case y
después le hago un find por la m
minúscula lo que me retorna también es 6
es decir se queda con la primera
ocurrencia que coincide con el criterio
de búsqueda también más de lo mismo
funciona así en todos los lenguajes
depende en python en concreto Si yo le
digo Ey Búscame la posición de la m me
va a decir cuál es la primera vez que
aparece la m Hay posibilidad de Buscar
la última m por supuesto Hay posibilidad
de buscar la m del medio por supuesto
pero son variantes que ya digo no me
quiero parar tantísimo en eso para no
echar eh tiempo excesivo Pero por
supuesto si tenéis estas posibilidades
existe una posibilidad más o menos
compleja de acabar haciéndole porque por
ejemplo yo le podría decir ahora voy a
poner búsqueda de ocurrencias vamos a
venir por aquí voy a poner esta frase
que teníamos antes de hecho es que lo
estoy utilizando tanto voy a hacer una
cosa voy a venir por aquí y le voy a
llamar S3 y voy a meter todo esto porque
ya que la estoy utilizando tanto y vamos
a repetir vale digo búsqueda de
ocurrencias Qué es las ocurrencias las
ocurrencias que nos diga Cuántas veces
aparece un criterio de búsqueda que
pongo yo aquí cómo lo hago operación
count lanzo esto que me dice dos deir
Cuántas MS hay en brightmour @ mouredev
dos y si pongo moure que me va a
retornar me dice dos y si pongo mour dev
me dice uno okay es decir puedo poner un
carácter pero pensar que casi en todos
estos casos estamos trabajando con
cadenas de caracteres que en unos casos
en una casuística vamos a necesitar
Buscar un carácter solo en otros casos
vamos a necesitar buscar más de un
carácter más cosas qué podríamos hacer
podríamos pues formatear una cadena que
esto ya lo hemos visto no formateo voy a
poner formateo Qué significa esto que yo
ahora mismo vengo por aquí y hago print
de una cadena de texto y digo saludo
coma o saludo dos puntos lenguaje dos
puntos esto es una cadena de texto Yo
podría imprimir esto sin más Pero y si
yo quisiera Añadir a esta cadena de
texto estas dos cadenas de texto h y
python de hecho Aquí voy a acabar con
signo de admiración Cómo podría acabar
metiendo esos valores dentro Alguien
podría pensar Pues mira empieza a hacer
concatenaciones Ah saludo dos puntos
concatenación Hola concatenación coma
espacio lenguaje dos puntos
concatenación python concatenación signo
de admiración Pero y si yo supiera que
ya en concreto lo quiero meter aquí pues
vamos a hacer lo siguiente voy a poner
estas llaves aquí y dónde quiero que
vaya el otro texto pues quiero que vaya
aquí y una vez ya estoy indicando dónde
quiero que vayan mis cadenas de texto
puedo llamar a una operación que es
format y se las paso concatenadas por
coma name Cuál era el saludo este este
nombre la cadena uno y Cuál era el
lenguaje la cadena dos Esto va a ir por
orden primer sitio donde están las
llaves voy a sustituirlo por la cadena
undo uno segundo sitio donde están las
llaves por la cadena dos lo lanzo y
ahora el print este que tendría que
acabar mostrando saludo Hola lenguaje
python admiración tan fácil como esto
igual que tenemos el formateo en
realidad tenemos la posibilidad de la
interpolación decir que nosotros podemos
interpolar valores directamente dentro
de la cadena de texto y es muy fácil
vemos que tenemos estos valores
Imagínate que yo quisiera meter Ahora
aquí el s1 y el s2 sería maravilloso
Incluso se entiende mucho mejor que esta
parte y da menos lugar a errores porque
ya estoy sustituyendo justo lo que que
quiero en el lugar donde yo quiero vengo
por aquí y veo saludo s1 lenguaje s2
Pero tenemos algo que se le llama F
String por ejemplo en python Pero bueno
que la gran mayoría de los lenguajes es
el término interpolación si yo escribo
una F delante de la cara de texto ahora
lo que vamos poder interpretar es que
todo lo que esté entre llaves puede
hacer referencia a una variable ahora si
vuelvo a lanzar esto ya veo que muestra
lo mismo que la cadena de arriba ya que
ahora sí que ha sustituido el valor de
s1 y el valor de s2 aquí lo tenemos más
cosas que se nos ocurran transformación
en lista de caracteres Cómo es esto
claro yo tengo una cadena de texto por
ejemplo la S3 esta larga que veíamos
antes y si yo digo que quiero crear una
lista tenemos un tipo de dato que es
lista con la S3 qué pasará en este caso
Mirad lo que imprime la B la r la a la i
la s el espacio la m la u ha creado una
lista con todos los caracteres que hay
en mi cadena de texto otra cosilla más
rara Sí pero ahí está la posibilidad
Pero y Qué pasa si lo tenemos al revés
voy ahora aquí poner otra cadena de
texto la S4 Imagínate que yo ahora lo
tengo por separado y digo tengo una
cadena de texto que es Hola o
simplemente le meto el s1 otra cadena de
texto que es un espacio en blanco y una
coma la s2 y otra cadena de texto que es
la admiración veis que esto en realidad
he creado S4 en realidad Debería ser
lista uno porque aquí tenemos el formato
listado el formato array como tengo
cuatro elementos separados por comas
Pero y si yo ahora tengo un array Ya
vimos Cómo éramos capaces de pasar una
cadena de texto a una lista pero si yo
ahora tengo una lista y lo que quiero es
acabar creando una cadena de texto pues
tan fácil como yo venirme aquí y voy a
poner transformación de lista en cadena
qué podría hacer podría utilizar una
operación que se llama join que es para
concatenar resultados de una lista yo le
puedo decir mira tengo una cadena de
texto vacía a la que le voy a aplicar
join y lo que vas a concatenar con ese
criterio de espacio vacío es la lista un
qué me va a acabar mostrando Hola python
ha unido todo si yo le metiera un guion
como criterio de concatenación veis lo
que hace Hola gu la siguiente cadena que
era la coma y el espacio guion python
guion Ese es el criterio de Unión si yo
dejara un espacio un espacio Pero le
digo espacio en blanco une esta lista
siguiendo el criterio de espacio en
blanco nada mal no otra otra cosilla más
que tenemos aquí pero igual También
existen lo que llamamos transformaciones
numéricas por ejemplo con una cadena de
texto en cual estábamos en la S3 era la
última Pues yo puedo tener una cadena de
texto que represente un número 1 2 3 4 5
6 Esta es mi cadena de texto claro yo
ahora imprimo esto y esto va a ser una
cadena de texto Pero si yo en realidad
Quisiera que esto fuera un número si yo
lo que quiero es transformarlo en un
número en vez de una cadena de texto
sería tan fácil como que yo ahora al S4
este le digo Mira transfórmate en un
número entero y guárdate otra vez en s4
y ahora lo que tendría en realidad sería
un número entero lo mismo que tenemos
con números enteros lo podríamos hacer
con números decimales Imagínate que yo
tengo este número decimal S5 Pues yo
podría hacer toda la transformación Pero
si yo quiero que se transforme en número
decimal vemos que tenemos aquí int Uy Y
este dice estás intentando
transformar en número entero un número
que inicialmente voy a considerar
decimal tenemos un tipo de dato para
números decimales float funcionará ahora
me dice aquí lo tienes transformación
perfecta en número decimal y cómo lo
estoy mostrando por aquí vale Y ya
alguna última operación esto podríamos
seguir toda la clase sacando cosas que
podemos hacer con caracteres pero ya
veis que bueno hemos visto unas cuantas
y Espero que alguna no la conociera O al
contrario Espero que las conociera todas
y que yo no esté enseñando aquí nada
nuevo porque eso sería una buena señal
voy a hacer comprobaciones varias vamos
a comprobar por por ejemplo sí la cadena
s1 pues es alfanumérica y vemos esto Is
alfanum A ver qué me dice y me dice true
en realidad es alfanumérica tiene o
letras o números Pero y si le digo si es
solo cadena de texto le podría decir e
contienes o letras is Alfa y me va a
decir pues sí contiene solo letras Pero
y si yo intentara comprobar esto con la
S4 que veíamos aquí que tenemos un
Por qué un Porque habíamos
transformado el tipo de dato de stram a
entero si quisiéramos que volviera a ser
una cadena de texto me voy a redefinir
por ejemplo otra vez aquí la S4 como
cadena de texto ahora lo lanzamos y me
dice false dice ey es4 en realidad tiene
números no tiene letras como tú lo
intentabas hacer Pero en cambio también
tenemos una operación para que yo
compruebe veis esto is numeric podría
ver si esto es un número dice true Okay
podríamos hacer Bueno diferentes cosas
tenemos is numeric is digit Hay un
montón de diferentes operaciones y con
esto podríamos seguir infinito porque
operaciones de caracteres aquí veis un
poco todo lo que hay esto son todo
operaciones que podíamos hacer con los
caracteres solo por ser caracteres sin
otras combinaciones y otras funciones
del sistema que ya crean Pero bueno creo
que es suficiente ver un poquito todo lo
que hemos revisado aquí para que os
hagáis una idea de las capacidades que
tiene dicho esto Espero que hayáis
encontrado También muchas cosas cosas
diferentes en vuestros lenguajes lo
siguiente que yo quería hacer ahora era
la parte de dificultad extra y voy a
crear aquí otro bloque que diga extra y
Aquí vamos a intentar ir resolviendo los
diferentes ejercicios que esto ya era
como esa pequeñita parte un poco más
avanzada para la gente Pues que se ha
visto más fuerte con esta lección o que
ya tenía conocimientos y que dice ey
vale Bris yo ya sé un poco las
operaciones Dame algo de lógica para ver
si yo ahora de la manera en la que yo sé
manejar cadenas de texto pues puedo
resolver un problema lógico y os ponía
no un problema lógico os ponía tres os
decía aquí creo un programa que analice
dos palabras diferentes y realice
comprobaciones para descubrir si son
palindromos anagramas e isogram okay Así
que me voy a crear aquí una función yo
que sé le voy a llamar check sin más
porque va a hacer comprobaciones me
daría un poco igual y en realidad lo que
nos cuenta es vale muy bien tenemos esto
Qué pasa si yo tengo que realizar todas
estas comprobaciones y un programa que
analice dos palabras yo le podría decir
Word 1 Word 2 y le digo Pues mira estos
son strings en realidad y vamos a ver si
somos capaces de analizar todo lo que
nos pide aquí dice y realice
comprobaciones para descubrir si son
palindromos aquí ya se nos empieza a
complicar no palindromos Qué son
palindromos en realidad una palabra
palindroma que esta es otra de las
dificultades de los ejercicios que es
Okay Igual tenemos claro Cómo hacer la
lógica si supiéramos en realidad Qué
significa palíndromo porque igual no lo
sabemos Pues bueno esto nos va a pasar
en nuestro día a día y en nuestro
trabajo que a veces hay definiciones que
no conocemos y que tenemos que hacer
como una búsqueda extra ya no solo sabe
programarlo sino que buscar algo que
igual no tiene que ver con la
programación así que palindromos qué es
palindromos en realidad es que si
nosotros invirti el orden acabaríamos
encontrando una palabra igual Okay se
entiende decir una palabra palindroma
qué podría ser decirme ejemplos de
palabras palíndromas Pues bueno una
palabra palindroma por ejemplo podría
ser radar pensar en radar radar leído
Empezando por la izquierda es r d a r
Empezando por la derecha es r d a r es
lo mismo Entonces ahora tendríamos que
buscar la forma de comprobar si una
palabra es palindroma cómo hacemos esto
pues vamos a hacerlo de la siguiente
manera vamos a hacer las diferentes
comprobaciones ir poco a poco cómo lo
hacemos voy a acceder a la primera
palabra y tengo tengo que saber si es
palindroma Word un claro hemos dicho que
una palabra palíndromas si se lee igual
de derecha a izquierda que de izquierda
a derecha aquí habría pues diferentes
formas podríamos hacer una mucho más
compleja que es empezamos a recorrer
cada una de las palabras en la primera
empezamos por la derecha la segunda
empezamos por la izquierda comparamos
sus caracteres y en el momento que
comparamos sus caracteres vemos que de
verdad tienen ese sentido Pero y si le
diéramos la vuelta al orden de las
letras de la segunda la palabra Así
podríamos ver si las dos palabras son
iguales si yo ahora agarro la palabra
Word 2 y alguien decía reverse no sé qué
bueno Eso depende un poco del lenguaje
nosotros en python para dar la vuelta
podemos hablar un poco del slicing que
decíamos antes no podemos decirle desde
el principio hasta el fin y con ese
criterio de menos un para ir de atrás
adelante así le daría la vuelta
básicamente a la Word 2 vamos a ver lo
que nos imprime vamos a ir haciendo
pequeñas pruebas para ver qué pasaría en
este caso vamos a hacer por ejemplo la
impresión de esta palabra y la impresión
de la supuesta inversa de la Word do y
voy a llamar a check y le voy a pasar la
palabra uno que qué decíamos antes radar
y la palabra dos que le voy a pasar por
ejemplo pues python que teníamos antes a
ver qué imprime ves lo que imprime en el
primer caso imprime radar en el segundo
caso ves No tip pero claro si yo ahora
le pasara la palabra radar al la inversa
Y si la pasamos al revés claro en este
caso es como muy básico porque lo
tenemos Exactamente igual tenemos
Exactamente igual esto y estoy
utilizando esta forma de darle la vuelta
ya que vimos antes el slicing por
supuesto hay operación para darle la
vuelta de maneras más directas no
importa es decir el método que vosotros
encontréis si nosotros le damos la
vuelta a radar en realidad sería
Exactamente lo mismo Vale entonces qué
sería lo mejor en cada caso en este caso
tendríamos que comprobar si una palabra
palindroma con ella misma no palindroma
con otra palabra Esto es algo que
teníamos que tener en cuenta no tiene
sentido que yo ahora le pasa aquí radar
radar no radar radar Claro en realidad
en este caso no tiene mucho sentido
podríamos controlar si de verdad dos
palabras son palíndromas entre ellas
podríamos hacerlo en realidad es tan
fácil como encontrar que esa palabra es
palindroma Pues con ella misma podríamos
hacerlo ya que se le efectivamente al
revés es el palindromo en realidad es
con el mismo así que yo lo que debería
hacer es he si yo ahora le doy la vuelta
a la misma palabra y en realidad son
iguales eso significa que es palindrom
fijaos voy a poner un fstring por aquí y
le voy a decir la palabra uno es un
palindromo lo que voy a hacer es meterle
el valor de este resultado un true o un
false por ejemplo y lo mismo que hacemos
con la palabra uno lo vamos a hacer con
la palabra dos lanzo esto y me va a
decir radar es un palíndromo true y
ahora Aquí vamos pasarle una palabra que
no sea palindroma python dice radar es
un palíndromo true python es un
palíndromo false Okay este es el
significado verdadero de palíndromo otra
cosa que nos decía El ejercicio es
anagramas y ahora vengo por aquí hago
anagrama dice un anagrama es una palabra
que resulta de la transposición de todas
las letras de otra palabra ojo cambio de
orden de las letras letas bueno como
nosotros tenemos una palabra que en
realidad cambiándole ese orden de las
letras nosotros podemos acabar con
probando si de verdad es la misma
tenemos el palíndromo Okay vamos a ver
cómo es el anagrama claro y si yo ahora
hiciera una comprobación para los
anagramas Con amor y Roma Claro amor y
Roma que nos va a decir Ey ni amor es un
palíndromo ni Roma es un palíndromo Pero
cuál sería el criterio para los
anagramas el criterio para los anagramas
Es que yo podría venir aquí y hacer esto
y es los anagramas tienen que ser ahora
sí entre dos palabras no puede ser
anagrama con el mismo para eso ya
tenemos los palíndromos lo que
tendríamos que hacer es vale amor y Roma
tienen exactamente las mismas letras
Cómo podríamos comprobar esto de manera
rápida pues la manera más rápida que se
suele hacer en este tipo de ejercicios
es haciendo una ordenación si yo ordeno
la palabra uno y ordeno la la palabra
dos y en realidad el resultado es el
mismo Qué quiere decir que son la misma
palabra con lo cual estas dos palabras
si al ordenarlas alfabéticamente nos da
exactamente la misma palabra querrá
decir que son anagramas así que voy a
venir por aquí para ir un poquito más
rápido y voy a poner Word 1 es anagrama
de Word 2 y este es el criterio el
criterio de ordenación que nos tiene que
decir o false aquí ya no lo tenemos que
hacer en ambos sentidos nos llega con
esto y nos dice amor es anagrama de Roma
true pero claro cuando decimos radar es
anagrama de python Por supuesto que no
ahí está un poco el punto qué más cosas
nos pedía Ya solo una más isogram que
esto suele ser lo que nadie sabe que es
un isogram No sí que como no sabemos que
es un isogram vengo aquí isogram digo a
ver qué es un isogram dice un heterog
grama isogram no sé qué es una palabra o
frase que cada letra aparece el mismo
número de veces ojo entonces aquí entra
aquí un criterio está bien está mal en
una misma palabra nosotros tenemos que
comprobar si de verdad Aparecen las
letras el mismo número Cómo podríamos
hacer esto a ver vamos a leerlo por aquí
heterog grama dice un isogram es una
palabra en la que cada letra aparece el
mismo número de veces si cada letra
aparece solo una vez será un heterog
grama si aparece dos un isogram de
segundo orden y así sucesivamente Bueno
vamos a interpretar cóm que en realidad
nosotros en este caso podemos hacer Ey
las letras aparecen el mismo número de
veces vamos a darlo como que es válido
Okay o incluso nosotros podíamos llevar
el término isogram al heterog ya que el
heterog grama es como un isogram de
primer orden le podríamos Llamar aquí
tendríamos que buscar de verdad cuántas
veces se está repitiendo cada una cómo
lo hacemos Aquí sí que podríamos
complicarnos bastante vamos a ver cosas
que se nos puedan que se nos puedan
ocurrir podríamos comprobar si de verdad
la longitud de una palabra es igual
igual a la longitud de un set Pero qué
conseguiríamos con esto vamos a ver más
cosas por ejemplo eh voy a hacer la
longitud de la palabra de la Word 1 si
es igual al set de la palabra Word vamos
aquí set de Word y hago la longitud Qué
va a pasar en este caso esto en realidad
sería la forma de comprobar que existen
el mismo número de veces como aquí en
realidad nos da igual Que aparezca una
vez o dos o tres fijaos en la definición
no me voy poner a decir que es un
heterog un isogram de segundo orden de
Tercer orden no vamos a quedarnos con
esto dice ey un heterog grama es una
palabra o frase que no contiene ninguna
letra repetida en cambio Ahora aquí al
isogama es una palabra o frase que cada
letra aparece el mismo número de veces
qué hacemos Cómo podemos comprobar que
una palabra tiene letras el mismo número
de veces en realidad vamos simplemente a
imprimirlo por un lado la longitud de
Word 1 y por otro lado vamos a imprimir
la longitud del set de Word vamos a
hacer un caso un poco más limitado o
vamos a pasarle solo el primer caso y
vamos a ver qué nos dice qué nos dice 5
y 3 longitud de radar cco longitud del
set 3 por qué porque esta r lo vemos ojo
la r está repetida la a está repetida la
d no está repetida entonces un set no
guarda repeticiones Qué significa que
tenemos la r la a y la d no está mal no
en cambio Si nosotros le hacemos la
longitud de la palabra tenemos cinco Qué
significa el isogram el isogram volvemos
aquí cada letra está repetida el mismo
número de veces si yo ahora hago esto y
le digo si la longitud es igual a la
longitud del set qué significará
tendremos así un isogram vamos aquí otra
vez a lo mismo que hacíamos antes wordu
es un isogram si nosotros venimos por
aquí y le hacemos esto Dónde está esto
que veíamos aquí dice radar es un
isogram pols Y si le pasáramos las
segunda palabra Word do es un isogram
queé nos dice aquí true Por qué Porque
en realidad python tiene solo una vez la
p una vez la i una vez la t una vez una
o de esta forma seríamos capaces de
realizar el cálculo de ese heterog grama
o isogama de primer orden okay Pero y si
tuviéramos que comprobar si tiene dos
Claro Ahora aquí esto ya nos fallaría
Imagínate que yo ahora tengo una palabra
Simplemente repitiéndolas yo hago python
py python python es un isogram de
segundo orden porque cada letra se
repite el mismo número de veces y nos
dice python python es un isogama false
aquí ya tenemos un problema lo veis Qué
pasa habría formas de hacerlo mucho más
sencillo pero vamos a hacerlo como de
una forma como muy natural sin
complicarnos mucho Yo podría venir aquí
y empezar a revisar cada una de las
palabras y Podría empezar a almacenar
todas las letras de la palabra Cuántas
veces desaparecen vamos a intentar hacer
esto vamos a hacerlo como de una forma
muy muy muy indicada venga vamos a hacer
un for Word in Word 1 por ejemplo vamos
a ver cómo tendríamos que hacerlo en
este caso qué voy teniendo yo aquí si
hago esto Pues en el momento que lo
lanzo tengo cada una de las letras claro
y si yo hago aquí un diccionario voy a
crear Word 1 o Word Dick por ejemplo
vamos a hacerlo de esta manera aquí
podría acabar definiendo el diccionario
Cómo ya sabéis que tenemos la palabra
reservada adit o ya lo podemos indicar o
como nos dé la gana y podríamos ir
guardando Aquí Cuál es esa manera si os
fijáis nosotros estamos utilizando cosas
que ya hemos visto anteriormente
recordáis Cuál era la lección de
estructuras si yo me voy ahora aquí a la
lección de estructuras a cómo os lo
corregí yo el último día decíamos Ey un
diccionario aquí tenemos el diccionario
estamos ya empezando a aplicar cosas que
vimos antes tengo aquí el diccionario
qué podría ir haciendo al diccionario a
Word it le podría decir venga la palabra
que yo tengo podrías entar ir guardando
el número de veces que la tienes así que
voy a Acceder al dicionario Word dict
voy a hacer get voy a intentar acceder a
esta palabra al Word y le voy a decir
que cada vez que acceda le sume uno pero
que por defecto en realidad comience en
cero nosotros hacemos todo esto Y si
hacemos un print del Word vamos a ver
queé nos imprime Fíjate nos va a decir
aquí con esta palabra la r esta dos
veces la esta dos veces la de esta una y
si hiciéramos esto mismo con la palabra
dos que verí íamos la p está do la i
está do la t está do la H está do la o
está do la n está do lo veis aquí muy
bien pues ahora que ya tenemos esto
nosotros podríamos hacer otra
comprobación Que es en el momento que ya
hemos realizado todo esto por qué no
intento revisar si este diccionario no
podría irme al diccionario y empezar a
revisar Cuál es la longitud vengo por
aquí y empiezo a revisar Cuál es la
longitud de cada una de las letras
Cuántas ocurrencias hay de cada letra
este cer0 lo que significa es el valor
por defecto de en caso de que yo busque
este elemento y aún no esté Cuál es el
valor que yo quiero guardar cer0 Por eso
Después yo le voy incrementando uno
podría sin más ir accediendo al valor ir
sumándole uno 0 + 1 pero si ya existiera
sería Ey Cuánto es esto 1 + 1 2 etcétera
python python python lo que teníamos
venga lo voy a poner cuatro veces antes
de enseñaros aquí otra cosa más y vemos
fijaos aquí python python python no está
porque estoy con la palabra uno vamos
con la palabra dos vamos a imprimir el
diccionario y vemos 4 4 4 4 Okay venga
antes de esto yo ya tengo el diccionario
y ahora tendría que empezar a revisar
tendría que acabar viendo Okay Cuál es
el valor que tiene cada uno pues tan
fácil como yo podría decir isogama
crearme una variable que sea isogram
aquí isogram y le digo que el isogram es
true y que en el momento que revisamos
cada palabra yo digo bueno y Cuál es el
valor de ese isogram por defecto yo le
puedo decir decir mira el valor de ese
isogram en realidad es que nosotros
tenemos que acabar revisando cada una de
las ocurrencias y ver que tiene la
longitud yo puedo empezar aquí a revisar
cada uno de estos elementos o puedo
quedarme con el valor inicial de los
elementos del isogama de lo que fuera le
puedo decir eh len la longitud que fuera
isogram len voy a Acceder al primer
elemento del diccionario y yo podría
decirle Mira el primer elemento del
diccionario el elemento cero pues cuánto
vale No pues en este caso valdría cuatro
y yo ahora cada vez que reviso tengo que
decir e si la longitud de la palabra que
yo tengo por aquí que en realidad es la
longitud del isogama Word count es
distinto de la longitud del isogram esto
que va a significar que en realidad
isogram es igual a false y yo ya podría
decirle Mira break finaliza vamos a
revisar esto y vamos a ver qué acabaría
imprimiendo aquí esto se puede hacer
muchísimo más rápido pero os quiero
decir que ahora aquí os estoy enseñando
Cómo combinar muchas cosas que ya hemos
visto antes vamos a ver qué acaba
imprimiendo en isogram qué le está
pasando porque estoy intentando Acceder
al primer valor del diccionario estaba
yo aquí con mi listado todo feliz pensar
que los diccionarios Al fin y al cabo no
están ordenados Entonces nosotros si
queremos acceder a un diccionario
tendríamos que acceder a uno de los
valores de este diccionario a propósito
Entonces cómo podríamos hacer todo esto
puedo acceder a las kis puedo acceder a
los propios ves Vamos a ver ahora esto
vamos a ver ahora en estos ves que
tenemos ahora en los vus qué podría yo
hacer ahora Aquí vamos a los vus vamos a
acceder a los vus Pero dentro de estos
vus Yo podría acceder a uno de estos
valores podría acceder a uno de esos
primeros valores recordáis como lo
explicábamos en la clase anterior
también que nos íbamos a cada uno de los
dicionarios para que retomemos donde
estábamos y era venga yo tengo
dicionarios claro los dicionarios que
pas que si yo quiero acceder a un valor
tengo que ir Lo veis aquí lo tenemos
Okay pero veis que teníamos algo que
eran ems tras Y si yo me voy a los items
qué acabo encontrando si yo me fuera
aquí a los ems intentamos hacer los ems
a ver qué nos imprime porque es posible
que acabemos obteniendo algo que
nosotros queremos hce items Perdón items
dice Ah No mira en realidad esto no es
lo que quería qué más cosas teníamos
recordáis Qué sería lo perfecto que aquí
igual que nosotros podemos acceder a las
kis y las kis nos acaba teniendo este
resultado con todas las Kiss ahora vamos
a las Kiss qué tenemos r a d si nos
fuéramos a los vus qué tenemos en los
vellus que lo vimos antes do 2 1 Uh esto
ya tiene mejor pinta Qué pasa si y ahora
tenemos los vus toda esta implementación
la podríamos mejorar un poquito
podríamos acabar diciendo vale Yo ahora
tengo los vellus y voy a ponerle vellus
aquí tenemos todos los valores ya
tenemos el contador Qué nos falta la
longitud del isogram que podría acabar
yo haciendo pues la longitud del isogram
Ahora sí me voy a los vus y me quedo con
el primer elemento ahora la longitud del
isogama sí que está determinada por esto
vus nos da un fallo por qué Pero si
antes hemos imprimido por aquí vus
recordáis qué era este vus Qué nos está
retornando velus en realidad si nosotros
ahora le hacemos una transformación a
una lista veis como transformación tras
transformación dice Uy y ahora el len
qué es esto Por qué Porque en realidad
esto ya es un número igual que el
isogram blen y ahora nos dice e false
Por qué Porque por supuesto es 2 2 1 2 2
1 no es lo que estábamos buscando Pero y
si nosotros ahora aquí en vez de hacerlo
con la primera palabra la hacemos con la
segunda palabra qué nos va a decir por
qué porque ahora los valu es 4 4 44 y va
a empezar a comprobarlo Y va a ver que
en todos tiene el cuat ya veis que esta
es una forma un poco más rebuscada pero
os la quería hacer así para que veáis
cómo combinamos un montón de cosas que
ya hemos visto anteriormente para eso os
lo voy a dejar aquí un poco indicado lo
vamos a hacer con la palabra dos por
ejemplo y le voy a decir Word do y ahora
nos cargamos esto es un isogram ya
sabéis que todo esto podríamos hacerlo
aquí una función meterlo dentro lo que
fuera queréis que lo hagamos ya lo vimos
Este término funciones dentro de
funciones Def isogram le pasamos la
palabra Word que va a ser un String y le
vamos a decir que por ejemplo nos
retorne un boolean ahora hacemos todo
esto aquí dentro y en vez de Word 2 lo
que reviso es la Word Okay qué
tendríamos que hacer ahora aquí Word 1
es un isogram y aquí que tendríamos que
acabar metiéndole simplemente la llamada
a isogram con la Word 1 en este caso y
con la Word 2 en este caso y ver lo que
nos dice radar es un isogram vemos Non y
Non Por qué Porque lo que nos falta es
hacerle aquí un return de isogram y nos
dice radar es un isogram false eh python
python python python es un isogama y nos
dice aquí podríamos hacer una cosa Esto
lo está especializando aquí le podríamos
decir que esto es una letra o le
podríamos decir que es un carácter le
podíamos decir carácter ya que esto Solo
es un carácter y acaba revisando pu Solo
este carácter y vemos que nos daría
Exactamente lo mismo Okay pues aquí está
un poco la implementación del ejercicio
lógico no complejo pero que sobre todo
en este último caso teníamos que darle
un poquito de vuelta para acabar
entendiendo que quizás la comprobación
de ese geograma de primer orden es
bastante rápido pero en el momento que
cada letra se repitiera más de una vez
Igual aliá vamos un poco ya digo hay
maneras más óptimas de hacerlo pero no
con muchos elementos que hayamos visto
durante esta ruta de
estudio hoy creo que no era un reto
difícil pero es un concepto que muchas
veces tardamos tiempo en entender que
muchas veces pasamos tiempo programando
y no tenemos ni Claro que la gran
mayoría de lenguajes de programación
tienen este concepto interiorizado e
implementado que es el concepto de valor
y de referencia y ya veremos si incluso
la gente que cree que sabe lo que es
valor y referencia ya veremos si sabéis
Cómo se aplica el concepto de valor y
referencia en vuestro lenguaje por eso
el ejercicio que os propuse porque
encima el concepto de valor y referencia
digamos que es un estándar en
programación pero lo gracioso de todo
esto es que el concepto de valor y
referencia no funciona igual en todos
los lenguajes y de aquí el ejercicio de
que tuvieres un poco que descubrir Okay
y cómo funciona en vuestro lenguaje si
intentáis hacer estos ejercicios que yo
os propongo leemos el ejercicio y nos
ponemos a resolverlo valor y referencia
muestra ejemplos de asignación de
variables por valor y por referencia
según su tipo de dato muestra ejemplos
de funciones con variables que se le
pasa por valor y por referencia y cómo
se comportan en cada caso en el momento
de ser modificadas puf claro leemos esto
y qué pasa que si no conocemos cuál es
el concepto de valor y de referencia
pues igual es que no entendemos ni
simplemente qué nos pide el ejercicio
Vale entonces esto es un poco también
por qué yo prefiero ir planteando
ejercicios dejando esta semana y a la
semana siguiente explicarlo porque así
también os doy tiempo un poco a yo creo
que una de las partes más importantes en
programación que es aprender a pelearse
también con los conceptos y que yo
suelte esto y haya gente que lo tenga
muy claro claro y otra gente que diga es
que no sé ni cómo empezar Pues bueno hay
una cosa preciosa que se llama Google y
hasta otra que se llama ch gpt que le
podéis decir qué es paso por valor paso
por referencia y ahí lo entendéis igual
lo leéis la primera vez tampoco tenéis
ni idea tampoco os vais a enterar
absolutamente De nada y al cabo de un
rato acabaré viendo Ah mira mira esto ya
tiene un poquito más de sentido y lo
acabáis entendiendo todo vale Así que eh
Como yo digo lo suelo explicar en lo
suelo explicar en python pero aún así
que eso no os preocupe porque ya digo es
un concepto general Solo que hay que
elegir un lenguaje vale voy a crear un
fichero mover de.pie y vamos ir leyendo
el ejercicio no lo voy a leer entero
porque creo que leerlo entero serviría
solo para demostrar que sé leer pero no
para ir entendiéndolo poco a poco no así
que vamos a ir poco a poco hablando de
qué es esto de el valor la referencia o
lo que sea vale vamos a ir por aquí y
nos dice un poco que lo demostremos con
tipos de dato nos dice e Ponme algún
ejemplo de tipos de dato por valor vale
Esto es lo primero que teníais que haber
entendido Qué es eso de por valor Qué es
eso de referencia vale básicamente
pensar que hay un elemento común que
entra aquí y que diferencia al paso por
valor y al paso por referencia o a los
elementos guardados por valor a los
elementos que actúan como referencia
hablamos de que cuando un elemento es
definido por valor o se modifica
mediante valor hablamos de que ese
elemento básicamente es único y ese es
elemento único cada vez que nosotros lo
enviamos a otra instancia cada vez que
nosotros lo asignamos a otra variable lo
que estamos creando es un nuevo elemento
Okay Digamos que al modificar la
variable original no va a afectar a
otras variables a las que se le haya
asignado la variable principal esto
puede sonar bastante loco pero os
prometo que hoy acaba esta clase y
vosotros entendéis perfectamente que es
esto del valor y la referencia os decía
también que dependiendo del lenguaje de
programación habrá tipos de dato por
valor y por referencia no tienen que ser
en todos los lenguajes igual incluso
Aunque el tipo de dato en primera
instancia sea por valor o por referencia
puede no comportarse igual en según qué
lenguajes Okay pero bueno deciros que
habitualmente los tipos de datos
primitivos un entero una cadena de texto
un Flow suelen ser tipos de datos por
valor así que por ejemplo voy a definir
un tipo de dato por valor aquí en python
que quiero definir un entero por ejemplo
voy a llamar my int a y le voy a dar un
valor 10 esto es un entero vamos a meter
un print para ir viendo si de verdad
somos capaces de entender qué es esto
del valor y la referencia y lo voy a
imprimir sin más si yo imprimiera esto
obviamente vamos a tener 10 y si yo
creara otro entero que le voy a llamar
my int b y le voy a dar el valor 20 y lo
voy a imprimir por aquí my int a my int
B los enteros ya digo en py funciona
como variables por valor y qué tenemos
Pues bueno 10 y 20 Okay hasta aquí
tampoco hay mucho drama Porque en ridad
estos datos no se están ni mezclando si
yo viniera Ahora aquí y hago my int B es
igual a my int A qué pasaría ahora my in
B es my In A eso quiere decir que my in
B pasa a valer lo que vale a si yo ahora
comentar esta línea y lanzo Mi código
que acabo mostrando por sola 10 y 10 es
decir my in a vale 10 my in B vale lo
que vale My int a Y si yo me viniera por
aquí y lanzar esto ahora vale 10 y 20
porque my in B vale lo que vale My a
pero yo le cambio el valor y le digo que
vale 20 entonces el valor de a lo pierde
y de repente pasa a valer este nuevo
integer que es 20 Pero y si yo viniera
aquí a my in a y le dijera que Ahora
tiene otro valor que ahora tiene valor
30 esto significa aría algo cambiaría
algo no en realidad my in a vale 30 my
in B vale 20 ya está qué más cosas le
podríamos hacer a esto a ver si somos
capaces de marear los valores Pues no lo
sé que yo viniera aquí otra vez a
comentar esta línea y decirle le voy a
dar a my in a el valor de 30 y voy a
lanzarlo cuánto vale My in a 30 y my in
B cuánto vale 10 os fijáis que está
pasando aquí B se ha quedado con el
valor de se a en este punto pero que a a
futuro haya cambiado a vale 10 aquí b De
repente pasa a valer lo que vale a
cuánto vale a 10 entonces B vale 10 esta
my in a le volvemos a cambiar el valor y
le decimos 30 pero Qué ha pasado con b b
en este momento exacto se queda con el
valor de a que era 10 con lo cual la a
vale 30 y la b vale 10 que es justamente
lo que valía en el momento que se le
asignó a a b Qué significa que nosotros
una variable por valor cada vez que se
asigna otra variable a ella en realidad
nosotros estamos haciendo una copia del
valor le estamos diciendo Ey Ah cuánto
vales valgo 10 en este momento Okay pues
me quedo con tu valor y me lo asigno fin
de la historia me da igual lo que te
pase a ti valor a a lo largo de todo el
programa yo solo me voy a quedar con
cuánto valías en este momento porque te
voy a copiar el valor pero ya está Okay
Así de fácil así de fácil explicar un
poco Cuál es el HM de alguna forma eh
esas variables como llamamos por valor
Pero qué pasaría si hacemos tipos de
dato por referencia aquí os pediría algo
muy importante que es por favor estudiar
en el lenguaje en el que estéis Cuáles
son los tipos de dato por valor que
tenéis en vuestro lenguaje y cuáles son
los tipos de dato por referencia Porque
pueden variar entre lenguajes vamos a
los tipos de datos por referencia y
vamos un poco intentar hacer lo mismo
que hicimos antes voy a venir por aquí
voy a comentar esta línea y vamos a
hacer esto aquí vamos a ir un poco
comparando Qué pasaría en estos casos
por esta parte Ahora yo tendría que
saber en mi lenguaje Cuáles son los
tipos de datos por referencia Pues bueno
los tipos de datos por referencia en
python originalmente son todos los tipos
de datos que no son primitivos es decir
que no son ni un entero ni un float ni
una cadena de texto ni un booleano por
ejemplo tipos de datos pero que sí que
tenemos en el lenguaje imagínate una
lista una tupla un Dion
un set ya hemos visto esos tipos de
datos Pues bueno esos tipos de datos son
por referencia y Qué significa
básicamente la referencia lo vamos a
entender muy rápidamente voy a crear
aquí una lista le voy a llamar por
ejemplo my list a y voy a crear una
lista que tenga los valores 10 y 20 dos
enteros Bueno una lista sin más y vamos
a empezar a imprimir aquí mi lista a
pero también voy a crear otra lista que
se llame b y esta lista B va a tener los
valores pues por ejemplo 30 y 40 y vamos
a imprimir la lista a y la lista B por
supuesto lo que vamos a ver aquí es 10
20 que es la lista a 30 40 que es la
lista B intentamos hacer cosas parecidas
a las de aquí y si yo vengo por aquí y a
la lista a a la lista B Perdón le asigno
la lista A bueno vamos por aquí 10 20 10
20 tiene sentido no cuánto vale a pues a
vale 1020 cuánto vale B el valor de a 10
20 hasta aquí podríamos decir que se
comporta Exactamente igual que el caso
anterior que lo que aún sin entender muy
bien Por qué llamamos variables que
funcionan por valor No qué le hacíamos
antes aquí le decíamos e yo le daba un
nuevo valor tenemos myis b y le voy a
dar un nuevo valor digo 10 20 30 40 okay
No pasa nada Es decir myis B pasó a
tener el valor de a yo luego en la
siguiente instrucción le dije No mira yo
lo que quiero que valgas es 3040 vale
todo entendido Pero y si ah digo Mira yo
tenía la lista a pero ahora a la lista B
Le voy a Añadir un nuevo número en esta
lista le voy a hacer un append y yo sé
que ahora la lista B tiene el valor de a
10 20 le voy a meter un nuevo número
vale Y voy a comentar el valor de la
lista a y vamos a ver esto qué tengo en
la lista B Bueno yo creo que Eso está
clarísimo no en la lista B si teníamos
el valor de la lista A que era 1020 y
ahora le hemos añadido un 30 en la lista
B que es lo que estamos imprimiendo aquí
tenemos 10 20 30 pero voy a imprimir
ahora ahora el valor de la lista a ahora
Pero qué pasa se ha bugueado esto o qué
estoy imprimiendo aquí la lista a y
también la lista b y resulta que tanto
la lista A como la B tienen lo mismo
pero cómo es esto posible yo en realidad
a la lista a nunca le añadí el 30 yo en
realidad se lo añadí a la B Bueno pues
aquí es donde entra el concepto de
variable por referencia o de dato por
referencia nosotros decíamos que aquí
cada vez que se creaba una nueva
variable y le
[Música]
[Música]
valer a en realidad la dirección de
memoria de B es independiente y la
dirección de memoria de a sigue siendo
independiente Por eso cada una tiene su
valor por eso aunque yo siga modificando
y después les cambie los valores no pasa
absolutamente nada Es decir cada una
sigue ocupando su posición de memoria
pero ahora aquí tenemos lo que llamamos
la referencia tenemos la lista a y
teníamos la lista B esto lo podemos
entender como que esta lista a en
realidad había aquí una dirección de
memoria la M1 con lo que fuera y otra
dirección de memoria la m2 pues la a
apuntaba a esta M1 la B apuntaba a esta
m2 No pasa nada vale Pero ahora aquí
Nosotros hemos definido una lista hemos
definido una lista A que tiene una
posición de memoria la que sea la m3 y
la b que tiene la M4 creamos la lista se
crea una variable se crea otra variable
muy bien aquí lo tenemos todo
diferenciado pero llega un momento en el
que nosotros le decimos B igual a A qué
está pasando aquí que la dirección de
memoria esta de a ahora le estamos
diciendo e b ahora lo que pasa ya que tú
eres una lista y vas a actuar como
referencia en el momento que dicen B = a
no copia el valor de a y lo asigna al
valor de B lo que le hace es no no no a
Tú tienes la posición de memoria m3 pero
ahora B te estoy diciendo que es a y
pasa
esto ahora B pasa a apuntar a la
posición de memoria de a por eso lo que
veíamos aquí es lo siguiente que en el
momento que yo asigno la B a la a y la
añado 30 tanto lista A como lista B
están en la misma dirección de memoria
con lo cual no es que haya dos datos
aquí tenemos dos variables pero en
realidad los datos están almacenando
dentro de la misma posición de memoria
con lo cual al modificarse la B se ha
modificado la a no es que se haya
modificado es que en realidad los dos
estaban observando exactamente mismo
valor y esa es un poco la diferencia el
valor y la referencia Okay puede
resultar un poco confuso al principio
pero a veces y sobre todo cuando estamos
empezando nos ponemos a manipular datos
variables tipos de datos estructuras
primitivos y esto que me creo por aquí
no sé qué Y de repente hacemos cosas de
este estilo y llegamos a un punto que
dijimos ostra Sí sí si yo asign la B
porque le quería hacer unos cambios a la
lista b y la a la quería dejar inmutable
pues si tenemos valores por referencia
que sepáis que que la podemos liar que
lo que estemos tocando en la referencia
es lo que se va a modificar en todas las
variables que estén leyendo ese puntero
básicamente a la dirección de memoria
que tiene estos datos no copiamos el
valor nos quedamos con la dirección de
memoria de la variable original cuando
se modifica la nueva variable se
modifica también la variable original y
eso es algo que yo quería que de alguna
forma descubrieras por vuestros propios
medios porque si no hasta que no se
entiende No se ve no fallar pero hasta
que no se ve actuar como debe actuar el
valor y la referencia y entendéis el
porqué de ambos casos podemos estar con
un concepto equivocad himo y con un
concepto que es básico saber qué
funciona por valor y qué funciona por
referencia Okay es como tener punteros
son punteros en realidad Solo que tú
aquí por valor tienes un puntero a una
dirección y a otra dirección y cada vez
que aparece una variable se copia el
valor y se crea una nueva dirección de
memoria pero aquí se está aprovechando
la dirección de memoria pero el
ejercicio no acababa aquí decía muestra
ejemplos de asignación de variables por
valor y por referencia Bueno ya lo hemos
hecho no pero muestra ejemplos de
funciones con variables que se le pasan
por valor y por referencia y cómo se
comportan en cada caso en el momento de
ser modificadas Vale pues vamos a
quedarnos por aquí y ahora Aquí voy a
poner funciones con datos por valor y me
da igual me creo la función que a a mí
me dé la gana tan fácil como voy a crear
una función de datos por valor que se
llame my in Punk ya está tengo aquí una
función una función que va a recibir un
entero por ejemplo my int y vamos a ver
lo que pasa venga me voy a crear otro
entero para que no tengamos en cuenta
los anteriores my in C que va a tener el
valor 10 okay Y aquí dentro decía el
ejercicio que venga pasa por valor y por
referencia y cómo se comportan en cada
caso en el momento de ser modificadas
voy a modificar my Inc claro ya estoy
aquí my int le voy a decir que valga 20
Okay y voy a imprimir el valor de My int
y voy a llamar a my in fun y le voy a
pasar my int y ahora Aquí voy a acabar
imprimiendo print my ince Qué pasará en
este caso bueno my Inc qué tenemos aquí
de primero un 20 por qué Porque se llama
la función y primero Se imprime esto con
lo cual Pues bueno bien le paso my Inc
aquí tenemos el parámetro lo modifico a
20 y lo imprimo vale 20 todo el sentido
del mundo Y cuánto vale My Inc Pues
sigue valiendo 10 aquí lo tenemos una
copia del valor como el valor se
modifica y no pasa absolutamente nada my
Inc sigue valiendo 10 a pesar de que lo
pasemos por parámetro y yo aquí dentro
modifique su valor otra cosa es que yo
viniera aquí y hiciera my Inc es igual a
30 yo aquí en realidad estoy en el scope
modificando my Inc Y qué vemos aquí me
dice Uy dice Es que no puedo ni acceder
ahora mismo como lo tienes así
directamente no te vengas arriba porque
en realidad este my in C Mira yo sigo
valiendo 10 no lo estoy modificando Okay
habría maneras de modificarlo Pero bueno
entenderlo con que lo que le llega a una
función al fin al cabo se lo tenemos que
acabar pasando en la mayor parte de los
casos vale tenemos esta función con
datos por valor Pero qué pasa si el
ejemplo es funciones con datos por
referencia pues me voy a crear my list c
my list c que en realidad va a tener
1020 me voy a crear otra función que sea
my list fun que va a llevar una lista
que va a ser tipo list y dentro vamos a
hacerle una modificación qué le podemos
hacer a esta modificación pues le puedo
hacer my list le añado un valor como
hacíamos antes la añadimos 30 y ahora
vamos a hacer un print dentro de la
función de mylist y vamos a hacer un
print fuera de la función de mylist y lo
que nos falta es Llamar a la función
mylist fun y le pasamos mylist ya sabéis
que si veis este ma list podría venir
aquí igual esto si creeréis que queda un
poco más ordenado cóm definimos como
llamamos a la función con que esté
anteriormente definida es suficiente
vale hagan sus apuestas qué va a pasar
ahora my list c vale 102 yo se la paso
aquí le añadimos 30 my list bueno
podríamos estar casi seguros de que my
list va a ser 10 20 30 pero qué va a ser
my list qué tenemos 10 20 30 valor de My
list 10 20 30 valor de My list c aquí se
está cumpliendo la referencia fijaos que
a pesar de que nosotros llamáramos a la
función con un valor 1020 que el nombre
del parámetro de la función sea distinto
si yo ahora aquí le hago el appen Qué
pasa problema eh se modifica igual es un
puntero apuntamos a la dirección de
memoria lo cambiamos dentro de la
función se cambia fuera porque mylist en
realidad lo que tiene es la referencia
al valor de mylist C Que es 1020 por eso
aunque lo cambiemos dentro no estamos
libres de que se cambie también fuera en
este caso okay Así que muy muy
importante pero aquí es donde puede
pasar otra cosa aquí en el medio me voy
a crear my list d y my list d ahora
vamos a intentar hacer la misma jugada
vamos a decirle que my list d es my list
okay Y ahora a my list d le vamos a
Añadir otro valor le voy a Añadir el 40
y voy a imprimir my list del vale esto
es tan fácil ya hay dudas qué pasaría
ahora qué nos dice nuestra lógica que
claro yo tengo un puntero un puntero de
C con los valores 1020 yo se lo paso
aquí y por eso al Añadir la my list el
30 yo ya tenía un 30 tanto en My list
como en My list d si yo ahora my list se
lo asigno a my list d y hago un append
lo veis aquí qué deberíamos suponer que
yo ahora cuando corro el programa que
tenemos 10 20 30 40 10 20 30 40 10 20 30
40 vemos cómo en realidad este puntero
sigue afectando la dirección del puntero
sigue siendo común y me importa bien
poco que yo lo haya modificado aquí
porque por supuesto lo va a cambiar en
My list pero también lo va a cambiar en
My list C Que es lo que venía de antes
que en realidad ha era el valor este que
teníamos aquí vale hacemos otra cosa
vamos a hacer un cambio voy a hacer
ahora aquí igual que teníamos la d voy a
crear my list e y my list e va a ser my
list y yo voy a dejar de trabajar dentro
con my list yo la asigno a una nueva
Porque quiero trabajar con varias y le
digo ahora mira my list e es lo que yo
tengo aquí y lo que asigno a my list e
es lo que tengo aquí y lo que acabo
imprimiendo es my list e my list solo
vale Para darle el nombre al parámetro y
yo aquí ya lo asigno a una nueva
variable lanzamos el programa que
tenemos Bueno no importa es decir este
comportamiento no lo voy a repetir más
tenemos el puntero sigue apuntando
etcétera Así que no valdría para nada
darle esta especie de vueltas no porque
en realidad seguimos teniendo este
puntero eso significa que esta relación
no se puede romper nunca no en realidad
sí que existen mecanismos sí que existen
mecanismos para nosotros crear una nueva
referencia en la gran mayoría lo podéis
Buscar como mecanismos de copiado o algo
así es decir para intentar simular el
comportamiento que tenemos en El Paso
por valor o de las variables por valor
Okay en algunos lenguajes Pues igual si
la hacemos a la lista un copy hay una
función que se llama copy pues a veces
funciona o si tenemos la lista y el
contenido de la lista creamos una nueva
lista con ese contenido a veces funciona
también No eso lo que tenéis que acabar
haciendo es buscando en vuestro lenguaje
Cuál es la manera en la que podemos
romper esa especie de relación con el
puntero así que por favor también tener
muy presente cómo hacerlo en ese caso
Pero bueno Esto no acaba aquí esto era
como para entender el concepto general
de lo que era el valor y referencia que
espero que hayáis entendido aunque le
hayamos dado alguna vuelta creo que era
importante estar intentando romper todo
eso para que así vosotros bueno os
quedará un poquito más claro Qué pasa
cuando yo trabajo con valor Qué pasa
cuando yo trabajo por referencia y lo
fácil que es que si no lo tenemos claro
lo fácil que es meter la pata pensando
que nosotros ahora tenemos nuestra
función que está haciendo maravillas
pero en realidad nos está cargando el
código de todo lo que tenemos fuera
también así que eso también es bastante
importante vamos a seguir haciendo otros
ejemplos porque ahora me voy a ir a la
parte que yo suelo proponer como
avanzada no lo que os digo Siempre de de
estos ejercicios que hago es bueno os
pongo la parte del ejercicio que es para
entender el concepto y practicarlo ya
con código pero para la gente que lo
tenga ya un poquito más claro o si os
veis más fuertes o o si con el paso del
tiempo ya queris decir Ey me meto a él
porque ya tengo muy claros los conceptos
yo os recomiendo que siempre hagáis esa
parte que os digo Aquí dificultad extra
pero que es dificultad extra con muchas
comillas no a veces será más fácil y
otras veces será más difícil vamos a ver
qué nos pedía el ejercicio a ver qué qué
pasaba con una manera pues un poquito
más avanzada de poner estos conceptos en
la práctica crea dos programas que
reciban dos parámetros cada uno
definidos como variables anteriormente
cada programa recibe en un caso dos
parámetros por valor y en otro caso por
referencia estos parámetros los
intercambia entre ellos y su interior lo
retorna y su retorno se asigna a dos
variables diferentes a las originales a
continuación imprime el valor de las
variables originales y las nuevas
comprobando que hayan invertido bueno
esto en cierto modo Pues
con las variables por valor es bastante
fácil nos dice que quemos primero por
valor por aquí vamos a crear un par de
variables igual que hicimos antes pues
me voy a crear una variable que se llame
my int d y le voy a dar el valor 10 y my
int e y le voy a dar el valor 20 y ahora
aquí nos decía que creá una función que
recibiera estas dos variables primero
por valor y después por referencia a ver
cómo éramos capaces de hacer el
intercambio hacer el intercambio
devolver reasignar y pintar su valor
veis aquí comprobando que se ha
invertido el valor pues vamos a crear
una función que sea capaz de realizar
ese intercambio creo una función y le
voy a poner value sin más para que
entendamos Que Esto va a hac un cambio
por valor me da igual le podríamos poner
que llamarle como si queremos con todas
las palabras de intercambio por
referencia o lo que nos diera la gana
pero bueno le voy a poner value y esto
tiene value a que va a ser un entero y
value b que va a ser otro entero y lo
que nos decía El ejercicio es vale Ahora
tienes que hacer la lógica que sea capaz
de intercambiarlos ostras vale Cómo
puedo hacer ahora que tenga un retorno
en el que el valor a que va a valer 10
cuando llamemos aquí a value yo le voy a
pasar my in d y my int e que lo de antes
si queréis lo pasamos para aquí abajo yo
tengo Esto se lo paso Esto va a acabar
retornando algo y yo lo que tengo que
hacer ahora es guardar en dos variables
nuevas podría decirle venga Lo que te
venga aquí es my int F y my int G Esto
es lo que voy a retornar porque en
realidad yo le podría indicar que esto
retorne por ejemplo una tupla un par de
valores pero Y cómo hago yo eso cómo
puedo hacer yo el intercambio para que
value a valga lo de B Val B valga porque
claro lo primero que podemos caer es
value a le digo es igual a V B digo yo
ya pero ahora ya le cambiaste el valor y
ya no sabes lo que vale a porque lo has
machacado te has cargado el valor de a
con el valor de B ya la estás liando
aquí lo que suele hacer es utilizar lo
que se llama una variable auxiliar no
voy a crear aquí una variable que se
llame temp y a la variable temp le voy a
dar el valor de a por qué Porque yo
ahora aquí en temp me quedo lo que vale
a que era justo el valor que yo iba a
perder cuando lo machacar con el valor
de B en el momento que yo ya tengo esto
y que value a vale el de B yo le puedo
decir que el value de B es el de temp he
invertido los valores teóricamente y
ahora aquí los voy a retornar el value
de a y el value de B vamos a hacer lo
siguiente voy a hacer un print aquí
donde voy a imprimir my int d y my int
que son las variables originales 10 20
no y ahora voy a imprimir aquí F y G
primero vamos a hacer esto voy a
comentar toda la lógica de nuestra
función intercambiadora voy a lanzarlo
qué vemos 10 20 10 20 claro d vale 10 e
vale 20 lo tenemos F y G No hemos hecho
nada hemos devuelto a y b ningún
misterio pero ahora vamos a la lógica
esta de intercambio y vamos a lanzarlo
que tenemos 10 20 20 10 ha funcionado la
lógica de intercambio hemos sido capaces
de al valor de a darle el de b y al de B
darle el de a y aquí lo tenemos
intercambiado vale eh No hay mucho
misterio aquí como casi se copian los
valores siempre por qué vamos a tener un
problema vale Pero y si nos vamos a por
referencia con todo el rollo ese de
antes de que se conserve el puntero no
sé qué por referencia venga y vamos a
intentar hacer algo parecido me voy a
copiar esto y de voy a llamar ref value
a value b pero en este caso van a ser
listas para que sean por referencia Esto
me lo cargo y ahora aquí va a ser my
list e my list F my list G y my list h y
llamamos a la función que le hemos
llamado ref y esto tiene que ser una
lista 10 20 primera lista 30 40 40
segunda lista y hacemos la impresión lo
lanzamos que tenemos 10 20 30 40 10 20
30 40 no se han invertido para que se
invirtiera tendríamos que tener 10 20 30
40 30 40 10 20 qui decir que de verdad
se han cambiado okay Vale intentamos
hacer la lógica copiamos la lógica del
cambio vale temp Val a Val a = a Val B
Val B ig a temp lanzamos esto pum qué ha
pasado funciona el intercambio ya pero
cómo ha funcionado pero si si esto de
las referencias y el puntero Y qué ha
pasado en este caso Bueno pues vamos a
ver rápidamente qué ha pasado y por
porque aquí esta misma lógica de verdad
ha funcionado tenemos temp y un puntero
el puntero de la lista a Okay ahora
tenemos aquí la lista A que pasa a tener
el puntero de la lista B sin ningún
problema y ahora la lista B que ya está
el puntero en la lista a pasa a tener la
B el puntero de la lista A lo veis Aquí
sí que podemos hacer el intercambio sin
ningún problema porque en realidad
tenemos esta variable que está
quedándose no con el valor en este caso
se está quedando con el puntero este
temp tiene su puntero guardado a buen
recaudo que es el valor de a el puntero
a y el puntero a a en realidad lo veis
aquí este puntero a ya está almacenado
en temp con lo cual Aunque cambie el
puntero de la A a la B que es el
problema que teníamos antes cuando
tocábamos los datos en realidad el
puntero sí que ha quedado almacenado en
una nueva variable vamos a hacerle un
appen con un 50 por ejemplo y vamos a
lanzarlo y vamos a ver que okay Sí sí la
referencia era nueva pero pero fijaos
como aquí sí que se está conservando el
puntero tenemos esa nueva referencia
asignada que se ha generado con temp
pero el puntero que sigue apuntando a
los valores así que si yo ahora aquí
dentro sí que modificara tanto a como B
vemos que esto fuera sí que se aplica
incluso Y si yo viniera aquí a temp y
ahora temp le hago un appen de 50 y
borro estos veis el temp que aquí nos
vale para esa nueva posición de memoria
que estamos ahora guardando para que
pierda esa Referencia para
intercambiarla vemos que en realidad sí
que está añadiendo este 50 Así que a
veces hasta tenemos que hacer esa
pequeña diferenciación de que Uy pero
hast hasta dónde va eso del paso por
valor en este caso el paso por
referencia habitualmente cualquier
objeto que sea por referencia si lo
estamos asignando a otra variable ya nos
tiene que saltar algo así en la cabeza
para decir e e por qué yo necesito
asignarlo a otra variable Cuál es el
motivo por qué yo tendría que asignarlo
a otra variable si tengo una variable
con los datos que yo quiero por qué iba
yo a querer esto que veis aquí claro
para un intercambio pues puede tener
sentido me parece genial pero si lo que
quiero es modificar los datos digo Por
qué pues en el momento que tú quieras
modificar datos de una variable por
referencia cópiala si quieres dejar una
como estaba y otra con un nuevo estado
Imagínate que no lo sé lo que tienes es
un usuario estás editando los datos del
usuario y y yo me llamo bry en mi objeto
que se llama bry o en mi lista que tiene
mis datos bry moure y edad y yo ahora
Quiero actualizar la edad y le quiero
poner una nueva porque voy a cambiar mi
fecha de nacimiento Pues claro si yo
quiero guardar la referencia a la nueva
y a la vieja porque le quiero recordar
imagínate por un mensaje en pantalla
algo así como e que antes tu valor era
36 y ahora lo quieres poner 37 claro ahí
tienes por ejemplo la lógica en la que
deberías conservar los dos objetos
Entonces eso ya te implica cambiarlo
pero si lo único que quieres
actualizarlo no tienes ningún motivo
para cambiarlo aún así no es una
práctica tan habitual estar asignando
referencias a otras variables porque no
tendría ningún sentido solo tendría
sentido si de verdad tú necesitas una
copia pero si de verdad tienes lo mismo
piensa que van a acabar siguiendo el
mismo flujo y lo que tú cambies en una
se va a cambiar en otra y que vas a
acabar perdiendo el control porque si
ahora estas dos variables que tienen la
misma referencia toman caminos muy
distintos por la aplicación igual tu
variable se cambia en no sé que pantalla
y empieza a cambiar lo que tenías en
otro lado cuando igual sus caminos se
han separado Así que intentar que o que
sea única o que se copie no separarla O
reasignar la porque sí cuando
seguramente No ganis nada es un poco la
idea y sobre todo pensar que lo que yo
he explicado aquí con python a nivel
teoría y práctica lo de variable y
referencia en teoría Sí en la práctica
puede que vuestro lenguaje tenga algunas
diferenciaciones y que justo la lista
pues que no que no es por referencia no
es lo habitual no es lo habitual Pero
hay ha lenguajes que por ejemplo
trabajan todo por valor se hacen copias
de todo no existe la posibilidad de
apuntar a una dirección de memoria así
que por favor eso mirarlo muy muy bien y
si no lo mejor de todo es comprobarlo
Cómo funcionan Porque así es como os
vais a enterar bien concepto muy básico
Pero quizás no tan fácil la primera
[Música]
vez Hoy estamos con este es el que vamos
a resolver hoy y vamos a explicar qué es
esto de la recursividad pero la la
semana pasada le programamos algo a la
web que es esta parte que veis aquí que
son estadísticas reales de la web
estadísticas reales de cómo está
participando la comunidad en el roadmap
en la ruta de estudio veis que ya han
enviado 33 lenguajes
1711 contribuciones poquita broma eh Es
decir tenéis
17711 ejercicios diferentes aportados
por la comunidad y 457 personas
distintas que han aportado estos 1700
ejercicios eh Y si os vais aquí a
ranking completo que es algo que
programamos como digo la semana pasada
podéis ver estas estadísticas que estas
estadísticas se regeneran una vez al día
Estos son datos reales pero cada 24
horas se actualiza la web y podéis ver
pues bueno Cuáles son los lenguajes que
más están utilizando en Qué porcentaje
por ejemplo python es el más utilizado
un
38,4 por de los ejercicios enviados
están hechos en python un 18,41 están
hechos en javascript Java Y bueno ya han
ido apareciendo nuevos lenguajes hasta
un total de 33 leng lenguajes y que esto
yo creo que es lo más divertido ahora
también hay ranking de usuarios según lo
que participéis enviando correcciones y
según el número de lenguajes que
utilicéis vais subiendo En el ranking y
aquí tenéis el ranking Bueno pues desde
Miguel que está loco y ha enviado 64
contribuciones en 15 lenguajes distintos
o Ángel o coden bueno pues aquí tenéis
que aparecer Seguiremos implementando
más cosas Seguiremos metiendo yo que sé
un buscador para que os encontréis más
fácil o lo que sea Pero bueno de momento
tenemos esta parte de estadísticas que
es lo que implementamos la semana pasada
Así que hoy vamos a explicar qué es esto
de la recursividad y vamos a resolver
varios ejercicios y vamos a crear un
nuevo fichero llamado
mdp ya que yo voy a resolver el
ejercicio en python ejercicio
recursividad ese concepto que la primera
vez que lo vemos Yo creo que asusta
tanto porque no no Lo acabamos
entendiendo bien no Entonces vamos a
leer primero el ejercicio y después ya
veremos cómo lo explicamos no bueno
decía ejercicio entiende el concepto de
recursividad creando una una función
recursiva que imprima números del 100 al
cer claro yo ahora llego aquí y lo
primero que podemos pensar es Okay no
tengo ni idea Qué es eso de recursividad
os ponía algo s s s simple esto es muy
simple Pero quería que entendiera bien
Cuál es el concepto de recursividad
primero con un ejercicio muy simple y
después os ponía dos ejercicios extra ya
más complicados que tienen mucho más
sentido acabar utilizando la
recursividad Así que vamos a ello Qué es
la recursividad vale el concepto de
recursividad básicamente para que lo
entendáis es una función que se llama a
ella misma ya está eso a grandes rasgos
es la recursividad Qué significa que yo
ahora me voy a crear aquí una función y
digo Hello Y si yo dentro hago Hello
esto Qué pasa bueno Esto básicamente
acaba resultando un bucle infinito yo
ahora si llamara a la función Hello
llamaría a esta función y cada vez que
entran a esta se llamaría ya misma qué
significaría Esto bueno bucle infinito
ya sabéis hasta que prenda fuego el
ordenador se estaría ejecutando o hasta
que matáramos el proceso dónde podemos
encontrar una semejanza con las
funciones recursivas pues con lo que
entendemos como concepto de bucle de
ciclo un bucle for un bucle While lo que
sea vale porque imagínate que yo ahora
Quiero plantear un bloque de código que
se tenga que ejecutar ese mismo bloque
de código n veces ahí es cuando cuando
empezamos a pesar Ey tengo que hacer un
print de un ola 10 veces podría decir Ah
vale tengo que hacer print de un ola 10
veces Pues claro hago un bucle for que
se ejecute 10 veces y hago Hola Hola
Hola Bueno pues entendamos Que la
función recursiva lo que va a hacer Es
que este código se ejecute una vez tras
otra vale Y aquí es donde podemos
aplicar ese concepto de recursividad qué
pasa que ahora alguien puede pensar Vale
y la recursividad A qué aplica la
recursividad
Entonces yo ahora cuando tenga que hacer
un bucle for hago una función recursiva
no Eso es lo importante que yo puedo
utilizar el ejemplo para que entendáis
que es un bloque de código que se va a
ejecutar más de una vez por eso es
recurrente por eso es recursivo y por
eso podemos explicar que se parece a un
bucle for por ejemplo pero es cierto que
tenemos que de alguna forma entender
cuándo tiene sentido utilizar
recursividad y cuándo tiene sentido
utilizar un bucle eso algo Bastante
importante porque si no claro podemos
pensar Pero de qué me vale a mí la
recursividad si a nivel conceptual hasta
puede ser más complejo y lo que es más
importante a nivel de recursos igual
puede acabar haciendo que nuestro
programa pues sea menos óptimo Okay
entonces bueno de momento vamos a
intentar diseñar la función recursiva
que haga lo que nos pedía el primer
ejercicio para entender el concepto y
después explicaré por qué utilizar uno
Por qué utilizar otro y ejemplos que de
verdad sí que aplican mejor ese concepto
de recursividad que quizás Este primer
ejercicio que como quería que fuese muy
simple nos va a valer para entender la
recursividad pero no es una buena
práctica justo lo que vamos a hacer vale
decía que yo tengo que acabar creando
pues una función de Cuenta atrás no que
diga los números del 100 al cero Qué
significa que necesito acabar
imprimiendo por consola 19 99 98 97 Vale
entonces por qué no hago una función que
se llame Cuenta atrás por ejemplo
Countdown ya está Esta es una función y
qué podría acabar haciendo la función
imprimiendo un número okay Y por qué no
le paso un número a la función Pues
venga number le puedo decir y un int y
la función nos dice Cuenta atrás lo que
nosotros intuimos que va a hacer esta
función es empezar a contar hacia atrás
decir que si yo llamo a la función
Countdown con un 10 esta función lo que
debería hacer es hacer esa cuenta para
atrás muy bien lo primero que yo podría
hacer es un del número ejecutamos esto
qué vemos por consola un 10 bueno quizás
una cuenta atrás pues no eh vale pero
entendiendo que una función recursiva es
aquella que se llama a sí misma Cómo
podríamos hacer una cuenta atrás resulta
bastante obvio si yo ahora imprimo el
número que se me pasa y me llamo a mí
mismo pero restándole uno al valor que
se me pasa en realidad pensemos esto voy
llamarme a mí mismo y al número que le
llega a esta función le voy a restar uno
Cómo entendemos esto llamo la función
inicialmente con 10 10 llama con down
imprime 10 se vuelve a llamar a ella
misma pero ya no con el valor 10 con el
valor 10 - 1 9 se llama ella misma
imprime nueve se llama all misma imprime
ocho se llama all misma imprime siete
entendéis Este es el concepto de
recursividad Entonces yo ahora lo lanzo
Y qué pasa dice qué va a pasar aquí qué
creéis que va a pasar esto lo va a
imprimir bien va a hacer hacer una
cuenta atrás Sí sí En realidad lo va a
hacer bien pero qué va a hacer 10 9 8 7
6 5 4 3 2 1 0 -1 -2 -3 -4 -5 claro se va
hasta el infinito buque infinito
fuego eh muerte y destrucción en el
proyecto Vale qué tenemos que hacer
siempre sí o sí en una función recursiva
una función recursiva que lo único que
hace es llamarse a ella aunque esté
variando su criterio Tendremos que
acabar indicándole e recursiva Sí pero
según qué criterio hasta cuándo quiero
que sea recursivo no pues en este caso
es también muy fácil le puedo decir mira
si el número que me estás pasando Es
mayor o igual que Cero en realidad Pues
haz tu lógica de recursividad imprime el
número y réstale uno Okay qué acabará
pasando imaginemos que le pasamos el 10
10 9 8 7 6 eso lo va a hacer todo
perfecto llega al 0 c es mayor o igual
que 0 Eh sí 0 es igual a 0 imprime 0 y
se llama a ella misma con 0 - 1 Cuánto
es 0 - 1 -1 -1 es mayor o igual que 0 no
ya no cumple el criterio Qué pasa cuando
no cumple el criterio no se ejecuta más
se sale de ese ficticio bucle que al fin
y al cabo se estaba sucediendo gracias a
llamarse allá misma Vamos a ver si
funciona nuestro nuestra Cuenta atrás
Pues venga vengo por aquí y dice Uy
lánzate qué tenemos 10 10 9 8 7 a ver
vale esto ya funciona pues Cómo era el
caso de uso que se nos pedía en el
ejercicio nos decía Crea una función que
cuente de 100 a cero placa tenemos una
función que cuente de 100 a cer ya está
100 99 98 hasta que llega a cer0 el os1
ya no lo tiene en cuenta porque ya no
cumple el If fin de la historia aquí
tenéis un concepto para entender la
recursividad Cómo hay que cumplir dos
cosas que se llama ella misma y que y
que en algún momento
se detenga vale eso para empezar es una
función recursiva esto es una función
recursiva es el mejor uso de una función
recursiva no esto también era algo que
quería que entendiera porque esto para
qué nos valdría hacer algo así tan
complejo teniendo que controlar esto
cuando yo le puedo decir mira Hazme un
bucle que empiece en 100 que acabe en
cero y ya está Hazme un for Hazme un
Wild Hazme lo que sea y ya está y se
acabó y no tenemos que tener una función
que podemos decir Uf Y qué complejidad
pueda acabar ganando esto y si acabo
creando un B infinito aquí porque no me
doy cuenta y el criterio lo pongo mal lo
que sea vale Y por eso os ponía la parte
extra esto de dificultad extra que
Siempre os digo por favor intentar hacer
la dificultad extra porque no no es tan
difícil como puede parecer no Al fin y
al cabo lo único que tenéis que pensar
es hay una parte de ejercicio para
entender el concepto para practicar el
concepto y después la dificultad extra
quizás ya para sí acabáis de entender el
concepto para que sigáis practicando yo
os recomiendo que tarde o temprano le
hagáis esa dificultad extra a todos los
ejercicios que yo voy proponiendo que
igual esta semana decir buf ya me costó
entender lo de recursividad porque era
un concepto que yo nunca Viera Pues
bueno sigue estudiando Sigue practicando
pero vuelve a esta parte intenta sacar
adelante esta parte porque aquí con la
dificultad extra es como verdaderamente
vas a acabar entendiendo y practicando
más el concepto de recursión okay Así
que vamos a ver la parte extra que la
parte extra Es la que a mí me va a
servir para poder explicaros verdad
Cuándo hay que utilizar recursividad la
parte extra nos decía utiliza el
concepto de recursividad para calcular
el factorial y calcular el valor de un
elemento concreto la sucesión de
fibonacci claro aquí lo de siempre
decimos Bris tío eh Me acabo de enterar
más o menos ahora de que va la
recursividad cómo te atreves a ahora a
decirme un factorial y un fibonacci que
yo eso igual lo estudié hace tiempo y ya
no me acuerdo ni lo que era bueno esto
son conceptos muy básicos a nivel de
matemática que no recordáis lo que era n
número factorial digo Qué es la función
factorial y cómo usarla y dice el
factorial de un entero positivo n el
factorial n se define por el principio
que se produce como el producto de todos
los números positivos desde un hasta n
Bueno lo entendemos Qué es el factorial
de 5 1 por 2 por 3 * 4 por 5 ya no Bueno
buscabais pero esto Ahora ya tiene que
saltar un clic en nuestra cabeza y decir
ostras para para para Cómo que parece
que hay una sucesión de números y el
ejercicio lo que me pedía en esta
primera parte de la dificultad avanzada
era calcular el factorial de un número
concreto Vale pues venga vamos poco a
poco y vamos a ver si ahora os puedo
explicar un paso más dentro de Cuándo
usar recursividad y cuando no usar
recursividad vale voy a crear una
función y le voy a llamar factorial vale
porque va a ser esa función que me va a
servir para calcular el número factorial
Imagínate que yo ahora quiero calcular
el factorial de cco pues qué Tendremos
que hacer pasarle un número el número
que queremos calcular un entero okay Y
qué tiene que acabar haciendo la función
me tiene que acabar retornando el valor
factorial con lo cual le puedo decir que
me va a retornar también un entero y voy
a llamar a esta función imaginando que
nosotros queremos decirle Mira calcúlame
el factorial de cco y como lo va a
retornar imprimelo vale muy bien Qué
dijimos que era el cálculo del número
factorial dijimos que en realidad si yo
le paso cinco tendría que ser algo así
como eh 1 * 2 * 3 * 4 y por 5 el
resultado de multiplicar todo esto
acabaría dando el número factorial vale
en realidad aquí vemos una sucesión Y si
yo partiera del cinco en realidad todo
esto es lo mismo que 5 * 4 * 3 * 2 y por
1 no por cer0 porque si le llego aquí al
cer0 ya todo pasa a valer cero Okay
entonces bueno empezamos a entender que
el número factorial de cer Y esto es
algo que teníamos que haber endido
dentro de nuestra búsqueda de Cuál es la
definición Cuál es el factorial de cero
el factorial de cer0 en realidad si
nosotros nos dicen Ey calcula el
factorial de cer0 si no tuviéramos ni
idea y nos pusiéramos aquí a buscar las
reglas o lo que sea digo factorial de
cero a ver a ver no sé factorial de cero
dice ostras el factorial de cer0 es uno
vale Okay teníamos que entender teníamos
que acabar llegando a esa conclusión de
que okay Si a nuestra función en
realidad le pasamos un cero esta función
nos tiene que acabar retornando un uno
ya no vale hacer todo el rollo este
porque en realidad el cero necesitamos
que sea ese número positivo y que al fin
y al cabo Pues el número sea vamos a
intentar que sea mayor de de cero por
ejemplo para poder calcular ese
factorial Bueno pues podríamos poner
diferentes criterios que no tenemos ni
idea factorial de un número negativo
esto existe Existen los factoriales de
números negativos alguien se ha
preocupado en controlarlo cómo nos decía
la representación como nos decía el
factorial de un entero positivo entonces
podríamos eh intentar controlar algo y
decir Oye si a la función que me pasan
Pues el número no es positivo Pues
podría intentar Pues imprimir algo es
decir que está mal o lo que sea o
devolver un cero como vosotros quisiera
aquí podríais utilizar diferentes
criterios podríais hacer criterios algo
así como Mira para representar que de
verdad el factorial si me retorna a cero
podría decir que es el factor tutorial
de un número que a mí en realidad no me
está valiendo puede decir Bueno pues If
number por ejemplo es eh menor que cer0
yo sin más voy a hacer return 0o porque
para mí no es un número válido esto en
un programa Eh pues que de verdad
tuviera que controlar el factorial
podría dar una excepción pero aún no
sabemos lo que es una excepción
podríamos imprimir un mensaje podríamos
poner muchas cosas podría venir por aquí
y decir pues le pongo un print y digo
los números negativos no son válidos yo
que sé ponemos lo que nos da la gana no
podríamos hacer eso y retorno un cero
como Pues mira ya no me vale o retorno
un número negativo o retorno una
excepción o lo que sea ya os digo que la
interpretación que vosotros le queráis
dar al ejercicio se la dais vosotros que
no habéis controlado Esto bueno entender
el por qué Sí o por no lo habéis hecho
no se trata de que la solución acabe
siendo exactamente lo que yo hago pero
bueno ver como yo lo intento ir
razonando vale Pero en cambio sí que
teníamos otra opción por aquí que era el
If ostra Y si el número en realidad es
cer0 Claro si el número era cero qué
teníamos que acabar retornando uno
porque esto ya lo teníamos claro
entonces ostras vale a ver qué nos va
haciendo nuestro ejercicio si yo le paso
el cero porque el ejercicio ya va a
hacer algo concreto ya va a empezar a
saber qué hacer Mira uno el factorial de
0 es 1 y si le paso el factorial de -1
qué acabaría diciendo mi programa Pues
mira los números negativos no son
válidos si me retorno un cero bueno la
interpretación que nosotros quisiéramos
Estos son como los casos fáciles Pero
qué falta en realidad falta el caso
complejo vamos a decir que yo le pase de
verdad un número entero positivo cómo
calculamos el factorial Cómo dijimos que
era el factorial de 5 1 * 2 * 3 * 4 y *
5 o lo que es lo mismo 5 * 4 * 3 * 2 y *
1 vale entendiendo lo que hicimos en el
ejercicio anterior cuál podría ser la
regla a aplicar en este punto podría ser
que el número factorial es igual al
número que yo le paso multiplicado por
el número -1 así empezaríamos a crear la
secuencia que acabe retornando el número
factorial Bueno vamos a hacer un retor
de Esto vale le paso un cinco o vamos a
hacerlo más fácil Le intento pasar un
dos claro el número factorial de 2 es 2
* 1 2 * 1 2 qué tenemos aquí qué nos
dice ostras factorial un 2 2 por qué nos
dice un tres por qué Por qué tenemos
aquí un tres quién me lo explica este
number es menor que cer0 no ay que tenga
que explicar estas cosas bueno entender
un poco cómo funciona al final la
agrupación según el tipo de operando que
estamos lanzando okay fijaos que aquí lo
que estaba haciendo en realidad era 2 *
2 4 - una 3 por eso nos daba 3 en
realidad lo que tenemos que hacer es 2 *
2 - 1 bien vale claro el factorial de 2
nos lo calcularía bien okay Pero y si le
paso el factorial de uno factorial de
uno qué tendría que dar Uy nos da cer0
ostras claro la acabo de liar aquí por
qué Mm porque estoy multiplicando por
cer0 igual aquí tenemos un problema
estoy multiplicando el número por el
número os1 que sería 1 y C no vale Pero
nos empezamos un poquito a acercar a la
solución volvamos al caso que teníamos
al principio que le paso cinco qué tengo
20 Ah vale 5 * 4 y si yo ahora quisiera
que hiciera 5 * 4 por 3 por 2 por 1 en
realidad yo tendría que seguir metiendo
Pues bueno y el número en este caso -1 y
-1 no cada vez Tendría que ir restándole
uno al número vale Y esto tendría que
esta operación vamos a quitar la parte
del final sí lo empezamos a pensar bien
esta operación el número por el número
-1 en realidad Lo tendríamos que repetir
hasta que de verdad el número valiera
cer0 pensarlo 5 * 4 y después 4 * 3 y
después 3 * 2 y después uno y ya está y
tendríamos que acabar acumulando todo
eso podríamos pensar Okay igual ya lo
tenemos claro cómo podremos hacer eso de
forma automática es bastante fácil
pensar que si yo ahora multiplico el
número que le llega por la llamada
recurrente a factorial pensar que sería
esto 5 por el factorial de 4 por el
factorial de 3 por el factorial de 2 por
y yo ahora lanzo esto y veo 120 120 no 5
* 4 * 3 * 2 * 1 y cuando llegara a cer0
porque voy a llegar en algún momento a
cer0 en realidad lo que voy a tener es
return 1 ya no me llamo a mí mismo
llegará un momento en el que yo no voy a
tener que llamar a mí mismo que esto
sería lo mismo que si queréis hacerle
aquí un Else vale si yo hiciera un Else
aquí esto sería Exactamente lo mismo la
condición por defecto Entonces tenemos
en realidad una función factorial que es
capaz de romper su ejecución va a romper
su ejecución en el momento que el número
llega a cero o que en realidad el número
se lo pasemos mal y ya sea un número
negativo entonces sin más esta función
factorial ahora empieza a cobrar un
poquito más de sentido Porque podríamos
pensar sí esto lo podríamos hacer con un
bucle por supuesto prácticamente todas
las funciones recursivas las podemos
resolver con bucle pero ahora vamos a
intentar entender un poco la lógica de
cuándo yo recomendaría empezar a
utilizar funciones recursivas en vez de
bucles como tal Vale cuando un una
función se puede acabar dividiendo en
otros subproblemas esto es un
subproblema no que el número valga menor
que que sea menor que cer0 que el número
sea cer0 que el número sea mayor que
cero Estos son como pequeños problemas
dentro del problema general y en
realidad lo que tenemos es toma de
decisiones y la ejecución exacta de esos
problemas según pues una variable que
tenemos aquí número Vale cuando en
realidad podemos empezar a descomponer
un problema o cuando tenemos jerarquías
vale esto seguramente ya nos esté dando
un indicio de que Okay si lo tengo que
hacer esto con un bucle podría hacerlo
pero en realidad entender ese bucle nos
podría resultar hasta más complejo y
esto si ya lo llevamos a tipo de
problemas más complicados cuando
hablamos ya de estructuras de árbol
estructuras que se acaban dividiendo
tiene muchísimo más sentido por qué
porque nosotros le podemos acabar
indicando diferentes caminos de
excursión para seguir profundizando en
distintos niveles aquí en realidad lo
único que queríamos era contar de cinco
a cero no algo parecido a lo que tenemos
aquí pero en realidad pensar que lo que
vamos haciendo es acumulando ese
resultado porque aquí tenemos esta
multiplicación pero esta multiplicación
que en realidad va a llegar hasta el
nivel más bajo hasta que el número valga
cero y se va a ir acumulando todo por
eso acabamos teniendo el 120 acabamos
multiplicando siempre este número por el
resultado del factorial que es a su vez
otra vez la ejecución del factorial otra
vez la ejecución del factorial otra vez
la ejecución del factorial Qué es más
rápido bcle recursividad depende porque
no es cuestión de rapidez muchas veces
es cuestión de optimización de recursos
y muchas veces hasta es cuestión de
inteligibilidad de acabar entendiendo
Qué hace nuestro código porque nosotros
podremos después acabar llegando a este
punto decir Ey claro qué hacemos en un
bucle quizás romper esa ejecución de una
manera más abrupta o tener que acumular
ular este resultado si tuviéramos un
bucle que tiene que acabar acumulando
resultados qué tendríamos que hacer una
variable fuera y eso le puede acabar
añadiendo complejidad al propio
ejercicio en este caso si os fijáis el
factorial es autoconclusivo él mismo se
encarga de acumular valores y el mismo
se encarga de resolver noos el resultado
no tenemos que depender de un bucle con
variables externas con criterios
externos y un poco intuyendo Hacia dónde
va a ir todo nuestro flujo Así que en
este caso ya se ve muchísimo más claro y
si no lo veis claro des con este caso
Aún se puede llegar un poquito más lejos
por supuesto se puede llegar lejísimos
pero no me quería complicar en exceso no
que os ponía por aquí calcular el valor
de un elemento concreto según su
posición en la sucesión de fibonacci y
ahora manos a la cabeza sucesión de
fibonacci ya estamos otra vez bry qué es
esto de la sucesión de fibonacci Pues
bueno Google qué tal venga vamos por
aquí y venimos y decimos he fibonacci y
ahora ya vemos aquí sucesión de
fibonacci ostras en matemática la
sucesión de fibonacci se trata de una
serie infinita de números naturales que
empiezan desde 0 1 y continúa añadiendo
los números que son la suma de los dos
anteriores Qué nos está diciendo esto ya
nos tiene que hacer clic dice sucesión
números dos anteriores repetir
operaciones vale puede acabar teniendo
sentido repetir la misma lógica porque
vemos lo que tenemos aquí la sucesión de
fibonacci empieza cero 1 Okay 0 + 1 1 1
+ 1 2 2 + 1 3 3 + 2 5 5 + 3 8 vemos como
se empieza aquí a acumular y digo vale
Okay pues a ver si somos capaces de
hacer esto mismo pero con un ejercicio
vale bueno venga vamos a crearnos una
función una función que se llame
fibonacci a ver si ahora dándole una
lógica que pueda aplicarle a una función
recursiva somos capaces de resolver este
número de fibonacci qué tenemos que
pasar la función un número igual que
antes number un entero y este nos tiene
que acabar dando un resultado otro
entero Vale pues ya tengo por aquí el
número entero y el resultado vamos a
llamar a fibonacci cómo nombre de la
función le pasamos Pues en este caso lo
mismo el cinco vamos a empezar con un
número bajo y el resultado lo vamos a
imprimir print Okay pues venga vamos a
imprimirlo y vamos a ver qué tendríamos
que hacer aquí volvemos a lo mismo Qué
pasa si de verdad nos entra un número
negativo aquí hablábamos sucesión de
fibonacci números positivos pues
podríamos decirle Okay vale vale calma
vamos a controlarlo vamos a ir a los
casos fáciles hasta llegar a la parte de
recursividad Y cómo acabamos
resolviéndolo Vale pues vuelvo a decir
lo mismo si el número es menor que cer0
qué tengo que acabar haciendo pues le
puede decir mira pues voy a hacer esto
voy a acabar retornando este cero y voy
a acabar diciendo Mira la posición pues
tiene que ser mayor que cer0 porque aquí
le teníamos que indicar cuál era la
posición concreta a la que queríamos
llegar es decir cuántas veces queremos
hacer esa suma acumulada hasta llegar a
un punto concreto es decir cuántas veces
quiero ejecutar fibonacci Vale pues digo
pues puedo poner la posición tiene que
ser mayor que cero tiene que ser mayor
que cero el ejercicio nos contaba aquí
Ey según su posición la función recibe
la posición pues Vale digo pues la
posición tiene que ser mayor que cer0 y
retorno un cero lo de antes esto un
ejercicio tendríamos que calcular este
caso límite de manera e no es que valga
cero esto podría acabar desencadenando
un error en el programa pero como
nosotros aún no llegamos a esas partes a
Cómo controlar esos errores pues vamos a
quedarnos en la parte tema simple que es
Mira voy a retornar un cero como que yo
le he pasado un número y voy a retornar
un cer0 valor mínimo para que todo esto
siga funcionando Vale qué más cosas
Tenemos que tener en cuenta cuando
ejecutamos fibonacci Qué pasa si nos
piden el fibonacci de uno el If pensar
cuando vimos la sucesión si nos piden la
primera posición de fibonacci que es
cero claro no tenemos dos números como
para acabar calculando porque dice que
es la suma de los dos anteriores 3 y 5
dan 8 o y 13 dan 21 21 y 34 dan 55 pero
si le digo Ey Y si te digo Esa primera
vez Qué pasa si te digo calcúlalo en la
posición uno pues en la posición uno
sabemos que vale cer0 Porque así es la
regla al contrario si nos dicen y
calcúlame la posición cer0 porque aquí
estoy viendo los números negativos Pero
tiene que ser menores o iguales que cero
es decir cualquier número menor o igual
a cer es un número no válido porque
tiene que ser una posición si es
una posición la posición cero no existe
como tal si en programación s en
estructuras pero si quiero la posición
cero del número de fibonacci no la tengo
es que no he empezado a hacer fibonacci
vale Pues imagínate que yo ahora le digo
que ahora sí quiero la posición uno qué
me va a retornar la posición uno pues ya
lo vimos si le pasamos en la posición
uno va a ser un cero y en la posición
dos aquí claro tampoco tengo dos atrás
aquí no tenía ninguno Y si le mando la
posición dos en realidad no tengo dos
números anteriores para sumarlos Solo
tengo uno entonces la posición dos tengo
que saber también que por otro lado la
posición dos también es un caso digamos
especial Que es que en la posición dos
vale uno Estos son como los casos más
simples los casos un poco siguiendo la
regla un poco los casos que nosotros
cuando nos pusimos a buscar qué es
fibonacci y vemos de la manera en la que
se calcula el número de fibonacci
dijimos vale cer0 menor que cer0 no nos
vale si es posición uno cer0 a muerte
porque no tengo dos números atrás si es
posición dos uno a muerte porque no
tengo dos números atrás Solo tengo uno y
llegamos a lo difícil y Qué pasa si el
número que me pasan ahora ya me dice que
es una posición por ejemplo la tres se
puede simplificar los dos sifs se puede
simplificar lo que tú quieras Se podría
simplificar por supuesto es lo de
siempre lo voy a repetir una vez más
porque creo que esto es importante
porque a veces confundimos la manera en
la que yo explico con la manera perfecta
óptima pensar esto es una ruta de
estudio la ruta de estudio hay gente que
sabe más y hay gente que sabe menos y yo
tengo que explicar de manera que todo el
mundo se entere de lo que yo estoy
haciendo aquí podríamos hacer algo así
viendo estos ifs podríamos acabar
concluyendo Ey si el número es menor o
igual que dos yo lo que podría es acabar
retornando el número -1 porque sé que
con dos vale uno y sé que con Uno Vale
c0 podríamos hacerlo y haríamos una
optimización pero en realidad con esto
estaríamos perdiendo en cierto modo la
explicación purista del cálculo del
número de fibonacci eso tenerlo en
cuenta porque cuando explico a veces Leo
ese tipo de cosas de eh bry ese código
es mejorable es optimiza este If se
puede condensar en uno Sí pero es la
manera de que yo ahora si pongo esto
fijaos que no vemos bien representado lo
que es la propia regla acabando por
entender de que Ey si la posición es la
uno o la dos pues son posiciones raras
que no me van a acab permitiendo Pues el
cálculo directo porque aún no tengo los
números suficientes atrás para calcular
Okay entonces por eso a mí me gusta
dejaros esa manera más indicada por
supuesto Esto no es una clase para si
quisiéramos aprender programación al
máximo nivel no estaríamos haciendo este
ejercicio tan tan tan tan simple para
alguien que sepa programar bien pero
pensemos que aquí lo que estamos
explicando en primer lugar es el
concepto de la lección que es qué es
recursividad y después de eso con el
ejercicio intentamos Pues que que quede
lo más entendible siguiendo la regla que
nos manda aplicar vale Por eso yo lo
dejo de esta manera vale incluso lo
podríamos optimizar y aún poniéndolo
aquí menor igual que dos y podríamos
hacer el círculo aú lo podríamos hacer
aún más No pero no es la forma en la que
a mí me gusta acabar explicando Pero
ahora sí que llegamos al punto en el que
y si me pasa la posición tres ostras en
la posición tres yo ahora sí que
posición 3es posición un posición dos
posición tres si me manda a calcular el
valor del número de fibonacci en la
posición 3 yo ahora sí que ya tengo dos
números atrás ya podría sumar 0 + 1 y me
da 1 Entonces ya todo lo que sea tres o
mayor que tres que es justo este els ya
haría referencia a números que yo
verdaderamente puedo acabar calculando
okay Y cómo lo acabo calculando Pues si
a mí me pasan este número sería el
cálculo de este número cómo sería el
número de fibonacci de la posición
anterior más el número de fibonacci de
la posición dos veces anterior que
Alguien podría pensar no es este número
-1 más el número -2 podríamos allegar a
pero en realidad es esto Claro en el
primer caso podríamos pensar posición 3
3 - 1 2 a ver a ver Vámonos a los
números de fibonacci posición 3 esta
posición 0 1 posición 1 2 3 3 - 1 no no
no no no no confunda dais la posición
con el número que tiene que calcular que
yo le paso un tres ya veis que aquí no
tenemos un tres ni de broma y que
restarle a 3 1 en realidad no es el
valor 3 - 1 2 no es el valor del número
anterior y 3 - 2 es 1 no da la posición
del anterior en realidad lo que tenemos
que hacer es calcular el número de
fibonacci en esa posición Eso es lo
importante intentemos hacerlo con ese
caso más fácil posición que nos pasan la
tres y quién me calcula el número de
fibonacci yo dónde tengo la posibilidad
de calcular el número de fibonacci de
vamos a irnos aquí a tres quién se
encarga de calcular el número de
fibonacci en realidad esta función me
está calculando el número de fibonacci Y
si yo en vez de hacer esto a secas le
digo no no no calcúlame el número de
fibonacci de este número por qué no me
llamo a mí mismo y por qué no me llamo a
mí mismo con el valor -1 y el valor -2
simplemente con esto nosotros tenemos el
cálculo vamos a ejecutarlo y vamos a
entenderlo me dice uno la posición tres
se corresponde con el uno sí le voy a
pasar la posición cuatro Ya veis que nos
debería dar dos dos la posición 5 tres
estamos bien posición 5 1 2 3 4 5 3
ostras cómo está funcionando esto vamos
a entenderlo posición cinco llega
nuestro programa nos viene por aquí un
cinco posición cinco nos va a decir Ey
calcúlame el fibonacci en la posición cu
más la posición Pos 3 porque la suma de
esos dos en la posición cco si quiero
calcular 1 2 3 4 5 esto que vemos aquí
tengo que calcular el fibonacci en la
dos y posición en la uno y os decía Cuál
es el resultado de calcular fibonacci en
la posición 5 1 2 3 4 5 pues es el
resultado de fibonacci en la posición 4
y fibonacci en la posición 3 vale Y eso
ya nos lo hacía la función entonces va a
acabar teniendo como resultado fibonacci
la posición 4 un dos fibonacci la
posición tres un uno lo Suma 1 + 2 3 y
eso es justo lo que está imprimiendo
aquí y aquí aún lo vemos mucho más claro
cómo en realidad pensar ahora que esto
lo tenemos que hacer con un bucle sería
ejecutar esta lógica la lógica que
nosotros aplicamos a fibonacci veis que
aquí lo llamamos dos veces y lo llamamos
con distintos valores ahora pensar cómo
Lo tendríamos que hacer con un bucle
Sería más complejo a la hora de
entenderlo Porque aquí sí que tendríamos
que acumular los valores de una manera
distinta en cambio nosotros no seg amos
que e yo te digo que te calcules con lo
que tú quieras pensar que si yo ahora le
dijera
calcúlala para la posición tres Y cuánto
da uno entonces 2 + 1 en realidad es la
posición 5 y por eso nos acaba dando un
tres y por eso yo ahora si quiero y
decirle aquí la posición 10 vamos a ver
ostras qué tenemos aquí 34 esto lo está
haciendo bien venga posición 10 1 2 3 4
5 6 7 8 9 10 aquí lo tenemos lo veis
fijaos cómo nos va resolviendo todo esto
y ahora Aquí vemos que esto es muy fácil
de resolver pero ahora intentar pasar
esto a un bucle Ya verás como sí que os
resulta más complejo a la hora de
entenderlo porque tenéis que utilizar la
misma operación con dos criterios dos
veces pero ahora pensar en un problema
mucho más complejo en una recursión con
un criterio mucho más complejo en una
estructura mucho más compleja si esto lo
tenemos que acabar controlando con un
bucle sí que lo que acabamos vendo Mira
las torres de hanoi por ejemplo es un
ejercicio muy muy clásico ahí tenemos
que estar
desapilar lo con un bucle nos puede
costar mucho más y nos va a obligar a
utilizar pues diferentes variables
diferentes datos para guardar esos
resultados temporales en cambio aquí
dejamos que sea la propia función la que
se resuelva all misma no se trata ahora
de que de repente como entendemos el
concepto de recursividad todo vaya a ser
recursivo tengamos que utilizar la
inclusividad en cualquier problema que
nos aparezca se utiliza muchísimo Back
tracking por supuesto todo lo que sea
revisión revisión revisión de mí mismo
de mí mismo de mí mismo de mi estructura
qué tengo qué tengo en esos casos es muy
habitual más que ya digo de que ahora
sepáis que existe este concepto y
empezar a utilizarlo en todos los lados
es el que acabéis desarrollando la
propia lógica que hace que entendáis el
por qué esto funciona así porque eh
sinceramente es algo que cuesta porque
no acabamos visualizando de primeras qué
está pasando aquí porque estoy haciendo
un ror pero un return de llamarme a mí
mismo por favor seguirlo hacerlo con
ejemplos muy simples por eso quería
empezar por el ejemplo más tonto del
mundo que no tiene ningún sentido
utilizar recursividad en este caso y en
estos hasta podría ser según para qué
hasta medio cuestionable mucho más claro
lo vemos en fibonacci por la propia
llamada varias veces a la función que
igual lo vemos en el número factorial
pero por favor quedaros bien con por lo
menos que existe este concepto para que
llegado el caso cuando lo tengáis que
utilizar que sepáis que existe y si no
lo tenéis que usar nunca tampoco os
preocupéis ya digo no es algo que
tengamos que utilizar mucho Y puede que
igual en vuestra vida según en que
trabajéis pues no lo tengáis presente en
la gran mayoría de las veces pero es uno
de los conceptos más básicos en
programación pero que de verdad Nos
empiezan a despertar algo a nivel lógico
que dice Uy esto tengo que sentarme y
tengo que razonarlo con calma para
acabar entendiendo entonces bueno Espero
que de verdad hayáis entendido por lo
menos este concepto tan recursivo pero
que no es tan complejo de verdad de
entender y las picolas dice ejercicio
implementa los mecanismos de
introducción y recuperación de elementos
propios de las pilas stacks lifo y las
colas q fifo utilizando una estructura
Ray o lista dependiendo de las
posibilidades de tu lenguaje y claro si
aún no teníais ni idea de esto y queréis
empezar a hacer ejercicio podéis pensar
Bris no he entendido eh Nada básicamente
las pilas y las colas son dos
estructuras básicas en la grandísima
mayoría de lenguajes de programación por
qué porque tienen un mecanismo a la hora
de trabajar con datos muy concretos
Entonces habitualmente cuando se está
estudiando sobre todo estructuras de
datos o asignaturas parecidas o cuando
estamos un poco introduciéndonos en el
mundo de la programación pues aunque ya
hemos visto lecciones de array listas
diccionari sets sí eh contábamos la
teoría de esas estructuras pero en
realidad no nos hemos parado a revisar
bien sobre cuál es el funcionamiento
como tal sí que es cierto que las pilas
y las colas son dos tipos de estructuras
fundamentales que han servido para
generar muchas otras estructuras y mucho
muchos otros mecanismos dentro de los
lenguajes Okay entonces no es porque
digamos utilicemos pilas y colas ahí
constantemente no Sí pero no solo que lo
utilizamos de manera encubierta muchas
veces pero quería que le dedicáis el
tiempo a decir vale la mejor manera de
aprender programación es entendiendo el
porqué de las cosas así que os decía que
aunque las utilicemos de forma
encubierta Pues creo que está bien
acabar entendiendo un poco dónde radica
ese funcionamiento vale Así que os puse
el ejercicio de Okay no vamos a
implementarlo ahí desde císaro
Cómo funcionaría si nosotros
basán algo mucho más fundamental por
ejemplo en un array o en una lista según
lo que tengáis según la estructura que
tengáis en en el lenguaje que hayáis
elegido vale Así que venga me voy a
venir por aquí y voy a crear Pues un
comentario ejercicio voy a poner por
ejemplo y después haremos la parte del
extra pero vamos a empezar por esta
parte y nos decía que implementándose
decía algo así como lifo dijo Oh vale
vamos a detenernos Qué es una pila
vosotros qué entendéis por una pila
Bueno pues la acción de apilar en muchos
casos No pues yo tengo este muñeco y
apilo y apilo no bueno Y empezamos a
Pilar cosas bueno pila de folios pila de
libros pila de lo que os dé la gana y os
daba la pista por si alguien estaba muy
despistado y nunca ha visto nada
parecido os ponía por aquí lifo bueno
son unas siglas que pertenecen con la
forma en la que nosotros trabajamos con
las pilas y son unas siglas que en
realidad hay que traducirlo de inglés es
Last in first out que es Last último en
entrar el primero en salir Entonces eso
ya nos da la clave de cómo suponemos que
funcionan las pilas nosotros tenemos una
estructura que va guardando elementos
que va apilando dice Last in first out
ahora pensar que empezáis a Pilar un
libro encima de otro vale Last in Cuál
es el último elemento que ha entrado el
libro que hemos puesto arriba de todo y
si nosotros quisiéramos empezar a sacar
libros cuál sería el primero que saldría
el en realidad el último que ha entrado
último en entrar primero en salir Okay
ahora vamos a pensar en una estructura
que nosotros ya tengamos en nuestro
lenguaje por ejemplo una lista pero
vamos a intentar darle el funcionamiento
de un una pila a una estructura que
nosotros por ejemplo ya hemos visto y
que ya conocimos le voy a llamar a esta
variable stack sin más porque vamos a
intentar que funcione como un stack como
una pila imaginaos que yo ya tuviera una
lista aquí vacía Vale y ahora vamos a
pensar lo de los libros que decíamos
antes claro cómo funciona una lista por
ejemplo en python Yo tengo un elemento
que se llama appen para Añadir elementos
en la lista Okay entonces yo venía por
aquí y por ejemplo añado el elemento uno
y vamos a ir imprimiendo por ejemplo
aquí qué tenemos en el stack vale Yo
lanzo esto y qué me va a decir pues
tengo uno y si yo añadiera varios
elementos dos un tres Vale qué
acabaríamos teniendo acabaríamos
teniendo una lista con un uno un dos y
un tres Okay pero esto de momento es una
lista pero cómo funciona una lista si yo
ahora Quiero obtener un elemento claro
por una lista nos podemos desplazar
libremente también por un array porque
son elementos ordenados Pero si yo
quisiera que esta lista se comportara
como una pila yo lo que tendría que
hacer es que tendría que acabar
implementando una operación en este
stack que me permitiera recuperar un
elemento y eliminarlo desapilar el
elemento y cuál es el elemento que yo
tengo que desapilar cómo era la regla
que acabamos de decir de la pila dijimos
Last in first out Cuál es el último que
ha entrado el tres Pues yo tendría que
buscar una forma de Recuperar el
elemento tres de desapilar el elemento
tres Cuál es el elemento 3 Cómo
accederías en una lista en un array Pues
el elemento tres es el último es decir
la forma que yo tendría de acceder a
este elemento sería en realidad la
longitud de la lista vale pero la
longitud os1 porque le voy a decir e
Cuál es la longitud de la lista y me va
a decir tres porque tienes tres
elementos pero claro la posición tiene
que ser la dos Entonces el el total de
elementos de la lista os1 Okay entonces
yo ahora aquí si hiciera esa opción de
de alguna forma desapilar vamos a a
llamarle voy a quedarme con el stack
item Por ejemplo yo así de alguna forma
podría decir Ah vale ahora voy a
imprimir el elemento que voy a desapilar
stack item y antes de desapilar voy a
imprimir el stack a ver cómo estaba
vamos a ver eh teóricamente Así vamos a
desapilar esto en realidad hablando más
a nivel puro cada vez que nosotros
metemos un elemento en una pila Esto es
lo que se le llamaría la opción de Push
Cómo estamos tiendo un elemento Push y
la opción de desapilar en realidad es lo
que Nosotros llamamos voy a dejar esto
esto sería el Push y esto sería lo que
Nosotros llamamos pop como nosotros
estaríamos haciendo un Push de elementos
y llega un momento en el que nosotros le
decimos Vale ahora tienes que desapilar
empieza a hacer pop Okay pero qué
pasaría vamos a lanzar esta ejecución Y
qué vemos tenemos una pila que tiene el
elemento 1 2s y TR nosotros desapilar Ah
vale ostras mira Está bien yo he apilado
el elemento correcto Last in el último
en entrar fue el tres el que yo he
recuperado Ah sí Mira es el tres pero
cuando yo vuelvo a imprimir vuelve a
estar los tres Qué pasa que la opción de
desapilar es recuperar un elemento y
eliminarlo es decir que la opción de
desapilar tendría que ser también
eliminar este elemento el elemento del
índice que yo justo he desapilar
Entonces ahora si lanzamos esto vemos lo
que tiene 1 2 3 desapilar
Ahora solo tiene uno y dos Okay entonces
Oye esta es la opción aún así de
desapilar qué pasa podría dar fallos
podría lo que quiero es que entendamos
de forma muy muy muy muy muy pura Cómo
es la acción basándose en una estructura
que conocemos que es la lista de apilar
de Push y de desapilar de pop Okay pero
sí que es cierto que la lista por
defecto por ejemplo en python si yoora
accediera al stack yo tengo tengo una
operación que es directamente pop Pero
tenemos algo que es Push no pero tengo
pop pues pop en realidad vamos a hacer
este print aquí el primer desap que
nosotros hacemos y ahora vamos a
imprimir qué pasaría con pop esto no
tiene porque estar en todos los
lenguajes Pero la realidad es que por
ejemplo nuestra lista ya tiene el
mecanismo y decimos pop y hace ostras
Qué ha hecho el pop el mecanismo este
manual que montamos des apila el tres y
el pop nativo de la lista des apila el
dos que es el elemento que quedaba
después del tres y vemos que después la
lista pasa a tener solo el uno lo veis
en realidad pues bueno en python la
lista lo que nosotros entendemos por
lista en python internamente es una pila
porque tiene la operación pop que hace
justo lo que se supone que haría una
estructura que funcione internamente con
el mecanismo de con el mecanismo lifo
okay Así que esto es a nivel conceptual
así que ya tenemos lo que es una pila
Pero qué pasaría con la cola vamos ahora
a hacer una cola A ver cuál es la
diferencia de la cola en este caso y
pensar que entender cómo funcionan
estructuras y conocer diferentes tipos
de estructuras nos pueden acabar
sirviendo para según la lógica que
nosotros tengamos que montar en nuestra
app que trabajar con una estructura así
metiendo elementos y quitándolo de una
manera concreta es algo más que habitual
Así que vamos a ver ahora qué pasaría
con una cola cola en español Q en inglés
que no me quiero liar y aquí también os
decía el mecanismo que tiene que
utilizar Pues en vez de ser lifo es fifo
vale si lifo significaba Last in first
out Qué significará fifo significará
First in first out Qué es eso First in
el primero en entrar es el primero en
salir y ahora cómo será esto Pues bueno
vamos a hacer una estructura también con
una lista y vamos a añadirle elemento
Cómo añadiríamos elemento Pues bueno
idad yo puedo seguir añadiéndolo igual
porque el mecanismo que tiene la lista
para Añadir elementos Aunque nosotros
podríamos Añadir elementos en sitios
concretos y tal por defecto Nosotros le
podríamos volver decir lo mismo Pues
mira quiero Añadir otra vez tres
elementos comento el uno el dos y el
tres y voy a imprimir como está la cola
vale a la acción de Añadir elementos hay
gente que le llama también Push a esta
opción bueno eh digamos que aquí sería
encolar desencolar sería en que
básicamente emp a meterle elementos pero
ahora Llegará el momento en el que
nosotros tenemos que retirar elementos
de que cómo hacemos esto claro yo aquí
ya no puedo venir e intentar hacer por
ejemplo esto digo Bueno pues le hago pop
no Qué pasará si le hago pop a la cola
si le hago pop a la cola lo que
acabaremos teniendo es que lo que está
desencolado en realidad es el tres en
realidad está haciendo que funcione como
una pila pero nosotros queremos que
funcione como una cola es decir que el
primero que ha entrado el uno es el que
nosotros tendríamos que quitar Okay pues
cómo podríamos hacer esto con la
operación de pop en realidad claro la
lista digamos que no deja de ser una
estructura más inteligente y más
compleja que la pila y la cola la lista
en realidad es una estructura ordenada
de elementos que nos permite hacer con
los elementos lo que querramos acceder a
ellos como nos dé la gana eliminarlos
por donde nos dé la gana la lista es un
mecanismo pues como decía es una
estructura mucho más compleja pero que
por debajo tiene que implementar
mecanismos de pila y de de cola cómo
sería ahora eh la interacción de la
lista si fuera una cola puramente Pues
nosotros tendríamos que decirle pop pero
hace el pop del elemento cero el
elemento cero Cuál es el elemento cero
siempre va a ser el primer elemento de
la lista el elemento más viejo de la
lista o por lo menos a nivel orden que
es lo que importa pensar una cola Vale
ahora nosotros nos ponemos en una cola
estamos en una cola para entrar al cine
y empieza a llegar gente y se empieza a
situar una persona detrás de la otra
Cuál es la primera persona que van a
atender la persona que llegó de última
No eso era la pila pero en la cola si tú
estás para entrar o para comprar el
boleto del cine y te has puesto a la
cola Cómo se llama Okay pues la cola de
la persona que va a comprar es la
persona que está delante de todo la
primera persona que ha llegado allí
básicamente entonces aquí es cuando
entra el fifo First in first out la
primera persona que ha llegado es la
primera persona que van a atender Aunque
hayan llegado muchas personas y se hayan
colocado tocado por detrás por eso aquí
el pop lo hacemos de el elemento cero
ahora hago esto que desencolar de 1 2 3
desencolar el uno y queda el dos y el
tres Okay lo podríamos hacer también de
una manera manual por supuesto pensar
que teníamos aquí el mecanismo de
desencolado manual le voy a llamar u
item y claro cómo desencolar aquí
tenemos la cola y aquí tendríamos que
acceder aquí por defecto al elemento
cero ya está y aquí tendríamos el
elemento cero que yo podría acabar
eliminando el elemento cero siempre de
la q y el Q item en realidad ahora si
corremos el programa veis que lo que
primero desen colola es el uno lo
segundo que desen colola es el dos y
queda el tres al contrario que aquí que
en realidad quedaba el uno veis que le
ha dado la vuelta lo voy a cambiar
incluso para que queden enteros que no
hace falta ni que sean cadenas de texto
así lo dejamos como mucho más simple y
esto básicamente es el mecanismo de una
pila y de una cola entonces pensar que
utilizando esta estructura podéis hacer
que la lo
sea distinto aquí quiero que os quedéis
con el concepto más puro pensar que
ahora según el lenguaje en el que
estemos la estructura en la que os basé
si os basán array tendréis que
implementar más cosas porque la array sí
que es una estructura mucho más básica y
fundamental pero por ejemplo la lista ya
es una superestructura sobre la Ray que
en realidad Está implementando estos
mecanismos que también actuarían por
encima de la Ray Así que quedaros con la
teoría sobre todo y de cómo yo he
utilizado una estructura que ya
conocíamos para implementar el
funcionamiento de pila y de cola yo qué
haría en vuestro lenguaje Buscar có
implementar pilas y colas con una
estructura como un array y como una
lista porque igual el pop que yo tengo
aquí en vuestro lenguaje igual no existe
y hay que hacerlo a mano como yo hice
aquí al principio pero lo importante más
que nada Lo importante de verdad es que
entendáis el cómo funciona y como yo
ahora me he puesto a retocar una
estructura y cómo he sido capaz de ular
dos tipos de funcionamiento distintos
uno para pilas otro para colas y ahora
lo que os ponía aquí en el extra que yo
creo que esto también es muy importante
porque ahora dijimos bueno Bray sí
fantástico lo que acabas de hacer pero
como yo es la primera vez que veo esto
de verdad me valdría para algo en la
vida real y lo que os puse en la
dificultad extra que se llama dificultad
extra Pero simplemente son un ejercicio
extra no porque sea especialmente más
difícil por ejemplo en este caso no es
muchísimo más difícil Vale y os ponía
caso real
os ponía un caso real para que tengáis
que implementar el mecanismo de una pila
y por otro lado el mecanismo de una cola
vamos a leer el primer subejercicio y
vamos a implementarlo para entender Cómo
podríamos llegar a necesitar una pila
para resolver un problema lógico y os
ponía un problema lógico que podría
acabar siendo un problema real no os
decía utiliza la implementación de pila
y cadenas de texto simula el mecanismo
adelante y atrás de un navegador web
crea un programa en el que puedas
Navegar a una página o indicarle que te
quieres desplazar adelante o atrás
mostrando en cada caso el nombre de la
web y os decía que si escribía la
palabra adante navegaba hacia adante la
palabra atrás navegaba hacia atrás y
desencadena estas palabras son las que
desencadena la acción y si no nosotros
lo que metíamos era una URL vale Así que
vamos a ver cómo ahora implementar una
pila en un caso pues que podría estar
más pegado a la realidad vengo aquí a la
parte extra y voy a hacer aquí como la
implementación esto que dijimos de una
web Y decía que creamos un programa que
simular el mecanismo de una navegación
de una web Entonces yo que sé voy a
crear una función web navigation por
ejemplo un programa cualquiera sin más
vale Y voy a llamar a mi programa Aquí
web navigation qué decía el programa que
tiene que simular el mecanismo de una
web con una pila entonces me voy a crear
un stack por qué porque esta pila es la
que va a ser capaz de almacenar las webs
que como si nosotros empezáramos a
navegar una web pinchamos un enlace nos
vamos a otra web pinchamos otro enlace
nos vamos otra web okay Así que vamos a
intentar representar lo más fácil claro
Imagínate que yo en mi programa de
momento aú no tengo nada le dijera Ey
navega a la web moure.drapp.com.ar
por ejemplo podamos trabajar desde
terminal así que me voy a hacer un W
true por ejemplo para que esto se
ejecute en un bucle infinito y voy a
recoger una acción del usuario adelante
atrás o una web y yo le voy a meter un
extra para poder salir del programa vale
Así que voy a recuperar una acción
action le voy a llamar y al usuario se
le va a pedir algo le puedo decir añade
una URL o navega con las palabras
adelante atrás salir para que así el
usuario pues puede introducir pues lo
que él quiera Okay entonces yo me voy a
guardar en esta variable lo que me pida
el usuario si yo ahora arrancara el
programa veis que va a quedar aquí va a
ejecutar todo lo que teníamos antes pero
se nos va a quedar aquí la consola añade
una URL o interactúa con palabras
adelante atrás una URL como si nosotros
estuviéramos navegando a algún sitio
Vale qué va a poder pasar este action
Pues en realidad action igual lo que nos
vale es salir Qué pasa si sale pues
Tendremos que hacer una opción pero
también action igual vale la palabra
adelante y Igual también vale la palabra
atrás tilde y ya por último si no es ni
salir ni adelante ni atrás nosotros lo
interpretamos como que es una navegación
a una web ya digo esto es más entender
la lógica de la pila y de la cola que no
lea el chat y alguien me esté diciendo
es que bry podría fallar porque no sé
qué Y si mete una URL que no es una URL
no se trata de eso es decir el programa
no se trata de controlar urls sino de
utilizamos esta excusa sobre algo que
para nosotros es tangible que es un
navegador y movernos por el navegador
para poder entender el funcionamiento
por ejemplo aquí de una pila Okay lo de
siempre también si vosotros Mi misión
explicando este ejercicio es centrarme
en pilas y colas si vosotros queréis
meterle más controles y que esto acabe
siendo un programa donde si no mete una
URL válida que falle y no la deje
introducir o lo que sea implementar todo
lo que querrás pensar que estos
ejercicios sirven para que vosotros
liquis y vosotros mejoré Así que vamos a
intentar de momento voy a ponerle aquí
un pas Porque nada va a hacer nada esto
ya sabéis que podría ser también un Case
bueno Siempre os lo dejo en los casos
más simples para que todo el mundo lo
entienda tenga más o menos nivel lleve
más o menos tiempo aprendiendo vale Esto
va a empezar a preguntarle a modo de
bucle infinito siempre al usuario le va
a decir he usuario allá de una URL el
usuario va a teclear algo va a pulsar
enter y se va a desencadenar una acción
y le va a volver a preguntar y le va a
volver a preguntar le va a volver a
preguntar hasta cuá Hasta que el usuario
escriba salir Entonces cuando escriba
salir qué voy a hacer voy a hacer un
break para que se rompa este bucle
infinito y me acabe mi programa Ya está
si yo escribo salir puedo hacer aquí un
print y le digo saliendo el navegador
web Imagínate si yo hago salir digo esto
es todo fantasía pero para que
entendamos Que aquí pararías vale qué
haríamos en realidad si metemos algo
pues cómo hacíamos en un stack para
Añadir elementos pues lo añadí en este
caso con python con un append Así que
vengo por aquí y que qu meteríamos el
action lo que ha metido el usuario el
texto que ha metido el usuario Porque si
llega a este els significa que el texto
que ha escrito no es ni salir ni
adelante ni atrás que son los textos que
desencadenan alguna acción con lo cual
nosotros lo interpretarías como que es
una web ya digo Aquí ya depende de
vosotros si queréis controlar la web o
no Yo no lo voy a controlar porque no
importa porque así no nos va a servir
para entender ni mejor ni peor el stack
entonces tendríamos esto y qué podríamos
hacer una vez añadimos una web pues
podríamos empezar a imprimir aquí en qu
web estamos y cómo sabríamos En qué web
estamos Cómo funcionaba el stack
nosotros empezamos a a Pilar cosas pero
claro yo podría decirle Claro pues yo
ahora vengo por aquí al stack y lo que
imprimo es el último elemento vengo por
aquí len del stack os1 Y así pues claro
si yo no si no navego ni adelante ni
atrás fijaos en el programa vamos a
intentar probarlo vengo por aquí y le
digo Ey salir y qué me dice saliendo el
naveg web Ah mira el salir funciona Okay
venga vamos a probar ahora a navegar a
algún sitio voy a ponerle algo que no
sea ni salir ni adelante ni atrás moure
deev como si fuera una URL pincho aquí y
me dice moure deev y ahora veis que me
vuelva a preguntar añad una URL claro he
navegado Book infinito me vuelve
preguntar y ahora dem mour deev
imagínate que yo pinchara un enlace que
me lleva a moure.drapp.com.ar
Por qué Porque el stack siempre está
añadiendo al final el elemento y yo
siempre estoy printe el último elemento
digo vale Okay pero qué pasa cuando yo
ahora me ponga a navegar igual así ya no
me va a quedar tan bien todo esto pues
primero lo que voy a hacer aquí es poner
un texto que diga has navegado a la web
y Aquí vamos a poner lo que ya estábamos
imprimiendo vale pero decía y si ahora
me voy atrás si ahora me voy adelante
claro yo ahora me voy atrás y yo
seguiría imprimiendo la última web qué
pasaría en realidad yo tendría que
guardar alguna especie de referencia a
la web de que claro yo me estoy
desplazando atrás Cómo podríamos hacer
eso Okay vamos a pensar que yo ahora voy
atrás y tenemos que utilizar el
mecanismo atrás este que tenemos aquí
pero que en realidad tendría que acabar
representando cómo funciona una pila
Cómo haríamos todo esto vengo atrás qué
hacía el atrás Si nosotros tenemos que
intentar utilizar un stack decíamos algo
así como que nosotros podíamos venir al
stack y hacerle pop Okay entonces vamos
a ver a ver si somos capaces de ahora
haciéndole pop a ver si seríamos capaces
de ir hacia atrás vamos a lanzar el
programa voy a meter una web Le digo que
me voy a moure deev y me dice Has
navegado a m.dv y yo ahora le digo ahora
voy a seguir navegando htps m.dv bar
cursos vale Y me dice Has navegado a la
web cursos y ahora le voy a decir atrás
qué me ha dicho has navegado a la web
https moure.drapp.com.ar
soy capaz de imprimir nada aquí qué
podríamos hacerle vamos a hacer lo
siguiente le voy a hacer If si el stack
este que tengo por aquí la longitud del
stack tiene que ser qué mayor que cero
me debería tener algún elemento si no
esto sería algo así por fingir el
mecanismo sería algo así como que
nosotros estamos en la página de inicio
nosotros Claro partimos de una página de
inicio y ahora hago otra vez atrás y
navego a m.dv y ahora hago otra vez
atrás y me dice estás en la página al
inicio y ahora hago otra vez atrás y
Por qué Porque el atrás lo ves aquí
estoy intentando cargarme elementos de
una lista que en realidad no tiene nada
Qué Tendremos que acabar controlando
aquí más de lo mismo en realidad yo
tengo que hacer POP si la lista en
realidad tiene elementos entonces así ya
controlamos que también pueda yo querer
eliminar un elemento que en realidad ni
tenga Y ahora esta era la trampa que os
dejaba qué pasa con el Adelante esta era
la trampa esta era un poco la parte de
pensar que os quería dejar yo claro cómo
implementamos el adelante porque Alguien
podría pensar sí me voy al último
elemento o intento avanzar fijaos fijaos
que el explorador web no es una pila el
explorador web como nosotros lo
utilizamos en realidad es una lista es
una lista que muy bien Nosotros podemos
apilar podemos ir hacia atrás pero en
realidad con el mecanismo de stack
simplemente nosotros el adelante nunca
lo tenemos porque cada vez que nosotros
vamos para atrás nos cargamos el
elemento Entonces sería imposible con el
stack puramente hacer el mecanismo hacia
delante el mecanismo hacia delante sería
como en realidad quedarnos en la misma
página no haríamos nada esta Era una
pequeña trampa Porque alguien podía
pensar vale Y yo ahora me empiezo a
desplazar por la lista de webs pero
claro si me empiezo a desplazar por la
lista de webs En realidad tú no estarías
utilizando una pila porque la pila se
está cargando el último elemento en
realidad ahí sí que tendrías que
utilizar una lista como tal donde tú no
te estás cargando los elementos en
realidad un explorador lo que está
haciendo siempre es está funcionando
como una lista y en el momento que
navegamos hacia atrás y pinchamos en un
elan en un enlace él se carga todo lo
que tenía hacia delante imagínate a ver
si soy capaz
de de pintarlo imaginaos cómo
funcionaría el stack de un explorador yo
navego a esta web y después desde esta
web navego a esta web y después desde
esta web navego a esta web Entonces
digamos que yo ahora mismo tengo como un
cursor que está apuntando aquí dice ey
Esta es la web que se está visualizando
y yo ahora pincho en el explorador atrás
y Qué hago cuando pincho atrás que en
realidad el cursor se sitúa aquí pero no
se ha cargado este elemento este
elemento sigue existiendo porque yo
ahora si hago adante me voy aquí pero
qué pasaría que yo ahora estoy aquí y le
digo atrás Me voy atrás y yo ahora desde
esta web navego a otro sitio Entonces
qué pasaría navegaría a otra web Y
entonces en el momento que navego a otra
web el sí que se carga este elemento o
todos los que tuviera hacia delante y
empieza como una nueva lista claro Así
que esto era un poco la trampa para que
vosotros vierais decir Ey si yo con un
stack es que no lo puedo hacer no sería
un stack como tal pero pensar que tiene
una parte que podría funcionar con como
él era trampita para que no fuera tan
simple para que llegáramos a ese
funcionamiento si le habéis dado vuelas
si lo habéis implementado pues
desplazando sin eliminar o lo que sea
bueno que por lo menos tengáis claro el
Por qué un stack puramente no podría
hacer eso porque en el stack siempre que
nosotros queremos acceder a un elemento
lo estamos eliminando le estamos
haciendo el pop que vimos antes lo
estamos quitando Así que quedaros con
esa parte Entonces el adelante en
realidad es algo que así tal cual con el
funcionamiento del stack puro y duro no
lo podríamos hacer vale listo esto y si
quisiera yo ahora hacer el otro
ejercicio a ver qué nos pedía el otro
ejercicio el otro ejercicio nos decía lo
siguiente utilizando ahora la
implementación de cola y cadenas de
texto simula el mecanismo de una
impresora compartida que recibe
documentos y los imprime cuando así Se
le indica la palabra imprimir imprime
cada elemento de la cola el resto de
palabras se interpretan como nombres de
documentos para que veáis pues otro
funcionamiento pues algo parecido voy a
comentar este web navigation para que no
se llame no y me voy a crear una función
Def y le voy a llamar impresora printer
o online printer no porque era
compartida o shared printer vale share
printed ponemos por aquí y esta es como
esa función que va a intentar simular
una impresora pero en este caso con una
cola y qué pasa la cola inicialmente
también la explicamos con una lista y
nosotros vamos a tener un programa que
le va a ir pidiendo cosas al usuario es
decir más de lo mismo el wil TR este que
veíamos antes vamos a hacerlo igual y el
action pero aquí en este caso bueno no
le decimos lo de Navegar le tenemos que
pedir otra cosa le voy a decir pues no
lo sé añade le voy a decir añade un
documento o m selecciona imprimir o
salir Le puedo meter aquí lo podríamos
hacer así vale qué haría en este caso
qué tendríamos en este caso qué pasaría
ahora en este caso pues que lo que
podría pasar igual que antes teníamos el
salir el Adelante el atrás Pues ahora
action puede valer salir que este ya
sabemos lo que tenemos que hacer un
break acabamos pero también lo que puede
valer Es que este action sea imprimir o
un caso por defecto imprimir le ponemos
pas de momento porque no hacemos nada y
el pas y el último caso que sería Pues
que teóricamente se añada un nuevo
documento lo tenemos fácil no Añadir un
nuevo documento esto ya lo hemos visto
un montón de veces hoy voy a la cola le
hago un append y le meto la acción que
teóricamente va a ser un documento hasta
aquí perfecto pero qué pasa
Si queremos imprimir yo aquí podría
estar consultando directamente la cola
de mi impresión podríamos poner aquí
como está toda la cola de la impresión
perfecto podría hacer un print y hacerle
cola de impresión e imprimo lo que yo
tengo la cola para ir viendo un poco
pues queé tenemos aquí vale que lanzo mi
programa Vamos para aquí añado un
documento o selecciona imprimir salir
voy a probar el salir ya veis sale
perfectamente vamos ahora a meterle algo
imagínate que fuera pues un documento
que sea pues me da igual que yo quiero
imprimir una factura
factura.pdf pues como yo he puesto algo
distinto de salir o imprimir veis cola
de impresión ahora está factura PDF y
voy a Añadir otro documento por ejemplo
Pues no lo sé factura
2.pdf ahora la cola de impresión tiene
factura PDF y factura 2 PDF Qué pasa si
yo ahora selecciono que quiero imprimir
si yo selecciono que quiero imprimir me
voy al último elemento le hacemos un un
pop no antes lo explicamos lo que le
tenemos que hacer en realidad es un pop
del primer elemento lo vimos aquí en la
explicación en la cola es First in first
out que es el primer elemento que yo
metí factura PDF con lo cual cuando yo
escriba imprimir tiene que imprimir el
primer elemento que entró en la cola Así
que voy a hacer un print y voy a poner
imprimiendo Y qué voy a imprimir Pues de
mi cola el pop pero del elemento Cero en
este caso más de lo mismo Imagínate que
pulsan imprimir y ya no hay elementos
aquí ya hacíamos un control y decíamos
Ey que haya elementos no me la vayas
liar voy a venir por aquí y voy a hacer
Mira yo voy a imprimir en realidad sí en
este caso no el stack si la cola tiene
más de un elemento Okay lanzamos esto a
ver venga vamos a meter elementos
factura PDF y voy a meter ahora factura
2.pdf aquí tenemos cola de impresión y
ahora pongo imprimir y me dice
imprimiendo factura PDF Qué se ha puesto
a imprimir se ha puesto a imprimir el
primer elemento que entró y ahora voy a
venir por aquí y hago imprimir otra vez
y qué imprime ahora factura dos y la
cola de impresión ya está vacía imprimir
no hace nada aquí le podríamos poner un
mensaje de la cola de impresión está
vacía o lo que fuera salir y esto
básicamente es pues dos pequeños casos
de prueba para que podáis llevar no sé
algo más real aunque no sea esto una una
fantasía de aplicación lo podéis llevar
algo más real para qué podríamos
utilizar el caso de una pila y una cola
con el mecanismo que yo os propuse
[Música]
concepto de clases nos dice explora el
concepto de clase y crea un ejemplo que
implemente un inicializador atributos y
una función que los imprima teniendo en
cuenta las posibilidades de tu lenguaje
os pedía que buscaréis información sobre
Qué es una clase en cualquier lenguaje
orientado objetos que son la gran
mayoría el concepto de clase es un Pilar
básicamente Qué significa esto los
objetos son entidades son entidades con
unas características y ya hemos visto
algunas estructuras que hay en el
lenguaje de programación algunas
funciones Bueno ya hemos visto cosillas
que podemos utilizar los lenguajes de
programación Pero qué pasaría si ahora
nosotros quisiéramos empezar a crear
nuestra propia lógica nuestras propias
entidades nuestros propios objetos pues
sobre esto es sobre lo que se construye
toda la programación orientada a objetos
y vamos a ver qué nos pedía el ejercicio
a ver el concepto de clase esto qué tan
complejo es decía expa el concepto de
clase y crea un ejemplo que implemente
un inicializador atributos una función
que los imprima teniendo en cuenta las
posibilidades de tu lenguaje una vez
implementada créala establece sus
parámetros modifícalo imprímelos
utilizando la función vale el concepto
de clase tenéis que ver un poco cómo
funciona en cada lenguaje pero
básicamente en python Quiero crear una
clase Quiero crear mi propio objeto un
objeto que voy a modelar yo con mis
parámetros con mis funciones con esas
cosas que digo vale algo que yo quiero
acabar extrayendo una clase un objeto
hasta ahora lo que hacíamos era utilizar
clases mecanismos objetos que ya
existían dentro del lenguaje pero ahora
imagínate que yo quiero hacer algo que
no existe en el lenguaje Imagínate que
yo ahora lo que quisiera era definir un
programador Necesito un objeto
programador Pues bueno el objeto
programador no existe en el lenguaje
pero como tenemos la posibilidad de
crear clases tengo la posibilidad de
modelar a mi gusto esta entidad Cómo
creamos una clase habitualmente con la
palabra reservada Class todo depende un
poco de los lenguajes pero ya digo la
explicación es bastante genérica y a
diferencia de en python que todos lo
escribimos en minúsculas en snake cas
separado por gu bajo el nombre de las
clases sí que va en apper camel Case es
decir la primera palabra de cada frase
tiene que ir o si son palabras
compuestas o lo que sea es decir el
nombre cada palabra tiene que ir la
primera mayúscula en este caso que le
voy dar a esta entidad el nombre
programer voy a hacer una clase llamado
programador Okay entonces ya tengo la
entidad y ahora la entidad yo la podría
definir como a mí me diese la gana
Imagínate que yo ahora lo que quiero es
vale Quiero modelar un objeto que sea un
programador y este programador pues qué
podría tener un programador un un nombre
y una edad imaginemos un nombre y una
edad y un lenguaje imagínate Pues para
eso es el siguiente concepto que quiero
introducir que es lo que veis aquí la
parte del inicializador okay Así que yo
puedo venir por aquí y escribir init Qué
sería init init es una función Entonces
yo ahora podría crear una función de
inicialización que veis que lo que
recibe es self Es decir el objeto mismo
pero aparte de self aparte del objeto lo
que puede definir es diferentes
parámetros
Yo quisiera que un programador tuviera
un nombre simplemente se los paso como
parámetros separados con comas como si
fuera una función de hecho esto es una
función pero es una función reservada
propia del sistema Okay así que sin más
lo único que tenemos que hacer es name
que yo le quiero pasar el H y el
Language por ejemplo y esta sería la
manera de decir yo ahora ya tengo un
objeto que va a poder tener estos tres
valores en concreto Si lo quisiéramos
definir un poco más sería tan fácil como
decirle Mira mi objeto en realidad el
nombre va a ser un String el H va a ser
un int y el lenguaje que sea una lista y
le digo pues va a ser una lista aquí
dice retorna Non porque de momento no
retorna nada Pero para qué nos va a
servir el inicializador el inicializador
es lo que Define los valores iniciales
de nuestra clase de nuestro objeto y lo
que hay que hacer siempre es acabar
asignándoles esto lo tenemos que hacer
de forma obligatoria es decir yo ahora
le voy a pasar un parámetro que es name
h y languages pero tengo que acabar como
almacenándolos en la clase decir dentro
de self le tengo que decir vale Y dónde
quieres guardar Por ejemplo el H
imagínate edad y le digo que en edad voy
a acabar almacenando H habitualmente
también como buena práctica se le suele
dar el mismo nombre pero qué pasa esto
es una función aquí podríamos hacer
operaciones aquí podríamos acabar
haciendo extras vale Simplemente yo me
voy a guardar Esto entonces yo ya
tendría el inicializador okay Y qué me
dice aparte el ejercicio me decía Mira
tienes que crear una función con un
inicializador atributos y una función
que los imprima mi objeto programmer va
a ser inteligente porque por una parte
va a tener los parámetros que a mí me da
la gana que cuadran con la lógica que yo
quiero montar y también me dice que va a
tener la capacidad de imprimirlo
entonces voy a crear una función que por
ejemplo le voy a llamar print sin más
las funciones de una clase tienen que
acabar recibiéndose a sí mismo vale para
poder interactuar precisamente con estos
parámetros que ahora ya son propiedades
de clase y sin más esta función va a
imprimir qué puedo imprimir Puedo
ponerle nombre y aquí el digo sería el
name Uy no sabe lo que es el name por
qué no sabe que es el name porque tengo
que acceder a él a través de self nombre
edad self ag y lo último lenguajes y
aquí los lenguajes sin más pues la lista
languages self languages con esto sería
suficiente Y ahora cómo interactúo yo
con este programador pues imagínate que
ya existe este objeto que ya existe la
clase programador qué tendría que hacer
yo ahora tendría que instanciar la clase
recordáis que nosotros creamos una
variable por ejemplo my programmer y yo
ahora podría acceder a un objeto que es
programmer lo veis por aquí y yo puedo
instanciar el nombre de la clase y abro
y cierro los paréntesis para instanciar
para crear ese objeto Pero qué pasaría
este programmer veis lo que dice aquí
dice no no no no tú no puedes instanciar
si no le dices que necesita un nombre
una edad y unos lenguajes Entonces yo
vendría por aquí y diría Ah okay Okay
Perdona este es bryce su edad es 36 años
y los lenguajes decía que le que
pasáramos una lista pues le digo python
cotlin y Swift y aquí me da igual lo que
esté haciendo dentro fijáis Yo ya tengo
un objeto inteligente este objeto podría
acabar haciendo la lógica que a nosotros
nos diera la gana que esto lo veremos en
la parte más avanzada pero Qué significa
que yo ahora por ejemplo puedo venir al
programador al que yo he creado y dentro
de programador qué acabaré teniendo
ostras si también tengo una función que
Sprint Qué pasará en este caso si yo
ejecuto este código Vais a ver lo
siguiente nombre brce eda 36 lenguajes
ta ta ta ta ta ya tenemos ese objeto
inteligente ya hemos creado algo a
nuestra medida yo he creado este
programador con los datos que
teóricamente me pedía él y después con
este print he llamado una función y esta
función ha hecho lo que a mí me ha dado
la gana pues imaginaos Cómo podemos
empezar a definir mecanismos o
parámetros dentro de esto okay Imagínate
yo aquí solo lleva el nombre Pero y si
quisiera por ejemplo que el apellido
pues fuera opcional o poderlo cambiar o
no sé qué Yo podría venirme aquí y decir
y si un apellido surname y el surname
este que sea un String digo Vale Voy
ahora a imprimir todo nombre edad
lenguajes y podría imprimir Aquí también
apellidos y dentro de self tendré Ah
mira si lo creo fuera claro inicialmente
no me lo va a requerir pero lo voy poder
setear Cuando quiera vale cómo lo podría
cómo le podría establecer el apellido
que no se me pide al principio yo acedo
a mi programador accedo a surname y aquí
le digo moure y ahora voy volver a
llamar a print fíjate qué me dice ostras
que no tiene el atributo Por qué no
tiene el atributo vale esto es muy
importante tenéis que tener muy en
cuenta cómo funciona esto y tenéis que
tener en cuenta cómo funcionan vuestros
lenguajes para que yo ahora llegue por
aquí y diga e dice ostras que me dice
que no tengo este surname ostra y qué
podemos pensar Será porque no existe
Será porque no lo he inicializado fijaos
Ahora qué pasa dice inicialmente mi
atributo claro Oye darle algún valor
Incluso le podrías dar un valor Non por
aquí decir Ah Mira según el lenguaje
esto dependerá todas las características
del lenguaje es posible que ya que este
parámetro en realidad no está dentro del
inicializador esta propiedad pues Yo la
voy a meter a Non por ejemplo podría ser
vacío O podría ser lo que quisiera para
en este caso Claro en el momento que
intentamos acceder a ella para que de
verdad acceda a algo pero ya veis como
inicialmente apellidos Non y después
acaba teniendo el apellido moure otra
cosa que nos decía esta primera parte
del ejercicio decía implementa la clase
Ya lo hemos hecho créala la hemos
inicializado establece sus parámetros
perfecto modifícalo ostras Qué significa
que yo ahora también podría ir a mi
programador y ahora voy a pensar por
ejemplo que he cumplido años Así que voy
a acceder a ag y le voy a decir que
ahora tengo 37 años veis que puedo
modificar mi objeto y ahora por supuesto
si volviera otra vez aquí y volviera a
hacer un print pues inicialmente me
diría que tengo 36 años pero cuando se
los actualizo ya tendría 37 ya veis este
es el concepto más simple de clase de
objeto que tenemos en la gran mayoría de
lenguajes este concepto inicialmente es
así de simple Qué pasa que las clases
nos permiten hacer muchísimas cosas las
clases podemos hacer infinidad de cosas
más que lo que yo os he enseñado Pero
bueno se trata un poco de yo creo ver un
poco cómo funciona al principio tener un
mecanismo que no sea especialmente
complejo pero que os sirva para ver La
potencia de ahora decir ostras es que
ahora ya puedo empezar a pensar las
cosas a nivel de clase sería muchísimo
más fácil a nivel inteligible y a la
hora de empezar a trabajar con nuestro
programa Pues trabajar con objetos que
nosotros sabemos lo que hacen y que
hemos creado a nuestra medida eso es lo
que significa programar si no veíais
claro esta parte os ponía la parte de
dificultad extra Así que voy a venir por
aquí vamos a hacer la parte extra
dificultad extra implementa Dos clases
que representen las estructuras de pila
y cola estudiadas en el ejercicio número
7 de la ruta de estudio deben poder
inicializarse y disponer de las
operaciones de Añadir eliminar y
retornar el número de elementos e
imprimir todo Su contenido es decir
tenemos que ahora representar los
mecanismos de pila y de cola pero con
clases para que acabemos viendo como
ahora con clases sí que vamos a ser
capaces de externalizar el
comportamiento y de que yo ahora puedo
utilizar una pila o una cola y que la
magia se haga por dentro y yo la utilice
directamente así que vamos a venir por
aquí y vamos a crear primero eh la pila
un stack entonces me voy a crear una
clase que se llama stack y vamos a
intentar darle el mecanismo que nosotros
hemos estudiado como stack vamos a
crearle un inicializador eso es lo
primero y en el inicializador qué
haríamos vale En qué tipo de estructura
decíamos que se basaba la pila decíamos
Claro yo con una lista decíamos con una
rray con una lista puedo ser capaz de
montar una pila con la lógica que
veíamos en el ejercicio anterior Así que
yo voy a utilizar mi inicializador y no
le voy a pasar nada para que el
inicializador de lo único que se
encargue es de crear una lista vacía
stack qué operaciones tiene la pila pues
tiene la operación de apilar y de
desapilar que habitualmente se le llama
Push y pop Qué cosas tiene que hacer
nuestra pila nuestra pila tiene que
apilar Push nuestra pila tiene que
desapilar pop qué más cosas nos pedía el
ejercicio nos decía aparte de poder
Añadir y eliminar que es el Push y el
pop tiene que retornar el número de
elementos e imprimir todo Su contenido
Así que puedo tener otra función que sea
count Y por último decía imprimir el
número de elementos pues sin más le voy
a llamar print esta serían las cuatro
operaciones que tiene mi pila qué va a
recibir Pues en principio no va a
recibir nada porque seguramente tengo
que trabajar internamente con la pila
que yo he creado en formato lista Así
que vamos a venir por aquí qué decíamos
que todas las funciones deben recibirse
a ellas mismas a self a la clase para
poder interactuar con el contenido de la
clase así que sin más voy a venir por
aquí esto ya lo habíamos creado más o
menos en la lección anterior pero ahora
lo estamos abstrayendo estamos
abstrayendo todo el comportamiento ese
que parecía un poquito Random un poquito
errático y que íbamos haciendo según
programamos ahora lo que estamos
haciendo es que nos lo va a hacer
mágicamente una clase que nosotros ya le
hemos llamado stack vamos a hacer las
partes fáciles si yo tengo que acabar
retornando la cuenta qué tendría que
poner por aquí pues sin más voy a
retornar la longitud leng de qué del
stack self stack de la lista si yo tengo
una función que sirve para contar sin
más retorno la longitud de la lista
inicialmente que nos va a decir cero
Okay vamos a pensar ahora la operación
de Push Cómo haría para Añadir elementos
Claro si quiero Añadir elementos le
tendré que pasar un elemento ítem lo que
yo le quiero Añadir a la pila yo lo voy
a hacer de manera digamos un poco
abierta no le voy a decir que le voy a
pasar un Stream depende de si el
lenguaje que estáis utilizando es
fuertemente tipado o débilmente tipado
como es python no tengo por qué decirle
Qué tipo de dato le estoy pasando voy a
hacer una implementación totalmente
abierta voy a hacer que se le pase un
ítem ese ítem podrá ser un entero podrá
ser un Stream podrá ser la clase
programador yo que sé lo que podría
acabar guardando aquí y Cómo era el
mecanismo de apilar nosotros decíamos
vale apil añadiéndole el elemento a la
lista Cuál era la lista el stack Cómo
añadimos elementos a la lista con appen
Así que simplemente le hago un appen y
le paso el ítem Ya está ya tendríamos de
manera mágica la operación de Push Qué
hace Push A quién le importa que lo haga
la clase que para algo no estás trayendo
el comportamiento si la lógica de la
pila es añadirlo de primero de último en
el medio no es mi problema Yo sé cómo
funciona una pila que se encargue la
clase de hacer la lógica por otro lado
tendríamos que desapilar cómo desapilar
en las pilas o en las listas en realidad
nosotros por defecto en python ya
tenemos una operación que es pop
entonces si yo hago pop de la lista ya
se va a encargar de funcionar como un
stack como una pila dijimos que el stack
era lo que nosotros llamábamos lifo
tenía el protocolo lifo lifo la sin
First out es decir el último que entra
es el primero que sale apilánez
out el C el último que ha entrado es el
primero que sale así funciona una pila y
lo que hace desapilar es elimina el
elemento y lo retorna Así que retornamos
el pop lo va a eliminar pero aquí
también podríamos hacer una cosa Vale y
si la lista es vacía esto iba a petar
Así que vamos a hacerle un If para
controlar que la lista por lo menos
tenga elementos si la lista self stack
es igual a c yo aquí lo que hago es
return pues por ejemplo de Non le digo
Mira es que no tengo ningún elemento
podríamos implementarlo aquí pero si ya
tengo una operación que cuenta Mira esta
operación cuenta es exactamente el mismo
código aquí que aquí y si ya llamo a
self count si yo hiciera esto Esto me
acabaría retornando el contador veis
como empezamos a reaprovechar código ya
hace una lógica Pues bueno un poquito
más inteligente y ya lo último que
faltaría sería imprimir Cómo imprimo
pues vamos a hacerle un for a todos los
elementos y los imprimimos sin más for
item in self stack y vamos a imprimir
voy a hacer print de cada uno de los
elementos a ver si esto está bien o está
mal fijaos esta lógica define un stack
que yo ahora quiero usar mi stack voy a
crear una una variable que se llame my
stack cómo hacemos Ya vimos el
funcionamiento de clases ahora ya tengo
una clase que es stack como la instanci
así ya está yo ahora ya tendría un stack
creado sin necesidad de pensar que yo
estoy inicializando una lista No sé qué
Yo quiero una lista una pila y ya está
accedo a mi stack que quiero Añadir
elementos para Pilar hacemos Push vale
Ahora quiero contar todos los elementos
hago un count Okay pero claro este count
Qué hace retorna el count retorna
Cuántos elementos hay así que voy a
hacerle un print para poder ver cuánto
vale ese count una vez ya he contado Por
qué no los imprimo Pues accedo a mi
stack y llamos operación que se llama
print y vamos a ver qué pasa lanzo Mi
código a ver qué hace mi stack Ah mira
después de apilarlos me dice que tengo
tres es correcto verdad yo no llegué a
hacer pop en ningún momento y cuando le
pido que me lo imprima me imprime A B y
C Hay algún error aquí Cómo es la pila
Cómo accedemos a la pila las ste First
la pila muy bien pamos primero el
elemento a el elemento b y el elemento c
pero ahora pensar en libros uno encima
de otro Cómo recorrería pila no
recorrería A B y C recorrería A
tendríamos que ver primero lo último que
hemos apilado después ver qué hay debajo
y después ver que hay debajo con lo cual
nuestra operación de print es incorrecta
para ello sería bastante fácil
corregirlo por ejemplo tenemos una
operación en python que es reversed que
se lo podemos aplicar por ejemplo
también a una lista y nos va a cambiar
el orden de los elementos simplemente
tiempo de ejecución para poder hacer un
for de manera inversa esto si ahora yo
vuelvo a lanzar vemos que lo que tenemos
aquí ahora ya es cba ya lo está
imprimiendo bien ya tiene sentido okay Y
qué nos falta por aquí probar Y si yo
desapilar y hago POP si yo ahora
volviera a hacer el count qué
significaría significaría que después de
hacer el pop el count ya me dice que
tengo dos elementos y si sigo haciendo
pops voy a hacer muchos pops Esto va a
hacer que el programa no Peta Y si
después de hacer un montón de pops hago
un count qué me va a acabar retornando
cero él para en cero él va a desapilar
Mientras pueda cuando no puede seguir
desapilar Non Cómo podríamos verlo esto
fácil vamos a acabar imprimiendo el
resultado del desap porque esto va
dentro de la lógica de la pila elimina
el elemento Pero te lo devuelve para que
veas que estás desapilar lo Ahora aquí
veis que desapilar b desapilar a y
después empieza a desapilar Non porque
ya ha desapilar todo porque tiene cero
elementos okay entonces aquí habéis
visto como una lógica la hemos abstraído
todo dentro de la clase stack igual que
teníamos la posibilidad de montar un
stack qué otra estructura vimos en la
siete pues Vimos una estructura que en
realidad en vez de ser lifo era fifo
First in first out que es la estructura
que se conoce como cola entonces voy a
crear la implementación de una cola
vamos a pensar qué operaciones tenía la
cola ahora ya hemos hecho la pila Esto
va a ser muy fácil no va a tener un
inicializador Cómo montábamos la cola en
la lección anterior pues Pues igual le
decíamos que la podíamos basar en una
lista entonces aquí tengo mi lista vale
inicialmente la cola va a ser una lista
qué operaciones tenemos en una cola
claro pesar la pila lo de los libros
pero la cola la cola del cine os decía
yo fifo Qué significa First in first out
Si Tú empiezas a llegar a la cola del
cine te empiezas a poner para comprar el
billete lo que sea el primero que ha
llegado es el primero que va a ser
atendido okay Entonces tenemos que
variar ligeramente el funcionamiento qué
operaciones tenemos en una cola igual
que teníamos el Push el pop en la en la
pila tendremos la operación que se llama
encar no en que tendremos la operación
ya le voy poniendo el self aquí
Tendremos una operación que sea
desencolar es decir tenemos la opción de
meterle elementos pero también de
quitarlos entonces de que por aquí y
Tenemos también las operaciones que os
dije que también tenéis que crearlo
Exactamente igual os decía que también
tenéis que poder contar elementos e
imprimirlos así que me voy a copiar Ya
esta función pero en este caso
accederemos en vez al stack vamos a
acceder a la que Cómo es la operación
de encolar pues la operación de encolar
decíamos que no encol vamos en la lista
y ya está sin más porque lo importante
es después Cómo manejamos a la hora de
quitar elementos no a la hora de meterlo
podemos guardarlos en la lista sin
ningún problema así que venga voy a
meterle el elemento voy a acceder a la
que le voy a hacer elen tengo que acabar
pasando el elemento em ya está esta es
la implementación que teníamos en la
clase anterior y si quiero desencolar
qué Tendremos que hacer lo podré hacer
con el pop directamente voy a acceder a
la cola le voy a hacer el pop pero el
pop qué acaba eliminando el pop elimina
el último elemento que ha entrado pero
nosotros queremos eliminar el primer
elemento decir Esa primera persona que
está en la cola que va a ser la primera
en ser atendida Entonces le tenemos que
decir que Haz pop pero haz pop del
primer elemento Vale entonces Esta es la
forma de desencolar haciendo pop del
primer elemento y esto este control se
lo podríamos hacer Igual le podríamos
decir vale Pero tú desencolar elementos
mientras existan si la lista vale Cero
en realidad retorna n Porque no eres
capaz De desencolar nada y ahora vamos a
hacer nuestra implementación voy ahora
crear myq tenemos una cola Aquí está
vamos a inicializar la vamos a empezar a
a meter elementos en la cola podemos
intentar Reproducir Exactamente lo mismo
Para que veamos si esto tiene sentido o
no voy a venir por aquí voy a acceder a
my queue y ya sabéis en vez de Push hago
en queue aquí vale tengo los elementos A
B y C en la cola tendré A B y C bueno en
principio me dice que tengo tres
elementos con lo cual tiene pinta de que
la cola está bien y si yo ahora igual
que hicimos aquí hiciera un print a ver
cómo los imprime vengo por aquí hago un
print tenemos tres elementos e imprime c
b A qué pasa ahora aquí justo lo
contrario que el caso anterior ahora no
necesitamos el reverse porque ahora sí
que queremos imprimir sí que queremos
recorrer en el orden de entrada de los
elementos primero entró el elemento a el
primero que yo quiero ver a la hora de
imprimir es el a después el B después el
camos la cola en el orden que tiene que
ser consumida por eso si ahora yo me
viniera aquí a myq hiciera el qué el de
que Qué pasaría en el deq Ahora aquí es
donde va a quitar un elemento igual que
hacíamos antes igual que nosotros le
decía Mira una vez hayas quitado el
elemento vamos a volver a imprimir la
longitud Qué significaría esto que una
vez hay tres elementos se hace el deq de
uno de ellos pasamos a tener dos pero
tenemos los correctos vamos a hacerle lo
mismo Aquí voy a empezar a desencolar
cada uno de los elementos pero de manera
así un poco infinita voy a my stack
ahora es myq y vamos a hacerle un dq
aquí masivo a ver qué va imprimiendo
según desencolar Teníamos dos elementos
desencolar la B desencolar la c y
después empieza a desencolar n porque no
tiene porque ya vale cero veis ya
tenemos la implementación ahora sí ya
real ya en forma de clase Ya de manera
que no nos tengamos que liar como el
otro día y para poder utilizar como
nosotros querramos con la lógica propia
de pilas y de colas pues esto es lo que
una clase nos resuelve el Cómo
empaquetamos lógica asociada a un
elemento sin más
[Música]
el ecio nos decía exp por el concepto de
herencia según el lenguaje la herencia
es un mecanismo que le permite una clase
que en este caso al hablar de herencia
tendremos lo que se llama Las clases
padre las clases hijas las subclases las
clases derivadas bueno digamos que se le
puede llamar de muchas formas cuando
hablamos de herencia A cómo se establece
una jerarquía entre clases básicamente
lo que tendremos es una clase y después
otras subclases que van a poder heredar
atributos y métodos o funciones de lo
que llamamos la clase padre la
superclase la clase base significa que
la subclase puede extender el mecanismo
de esa superclase o de esa clase padre o
como le querramos llamar para qué nos
vale la herencia la herencia para lo que
nos sirv es para intentar promover esa
reutilización de código y permitirnos
pues crear nuas clases basadas en las ya
existentes sin tener que estar
reescribiendo el código desde cero y
aquí os decía el ejercicio esper el
concepto de herencia según todo lenguaje
crea un ejemplo que implemente una
superclase animal y un par de subclases
perro y gato junto a una función que
sirva para imprimir el sonido que emite
cada animal yo aún no sé muy bien Qué es
todo esto no Pero me voy a crear una
clase que se llame animal qué podríamos
hacerle a esta clase le podríamos dar un
inicializador recordáis es que bueno las
clases habitualmente tenían algo que era
el inicializador que nos servía para
precisamente inicializar Qué valores qué
parámetros necesitaba esta clase para
poder ser inicializada lo podríamos
dejar así en Blanco sin más y decirle
Pues mira esto se inicializa sin nada no
tenemos que hacerle nada más O si
queréis le podemos hacer aquí un extra
ya que vamos a tener un animal pues le
vamos a dar un nombre a este animal
Entonces yo le voy a meter un parámetro
para inicializar esto no era necesario
Pero simplemente para que entendáis un
poquito que vamos a hacer Aquí le voy a
decir que esto Recibe un parámetro que
es un String es decir como si yo le
diera un nombre a este animal si tenéis
un perro o un gato en casa una mascota o
lo que sea y le tenéis un nombre puesto
básicamente para que identifiquemos que
yo voy a crear un animal y que le voy a
dar un nombre de esta manera yo ya
tendría la clase animal pero aquí Aún no
vemos ningún concepto raro que tenga que
ver con la herencia porque decíamos cóm
las clases podían heredar otras no Y
dice Bueno y también puedes crear un de
subclases llamada perro y gato Pues yo
sin más voy a hacer esto Me voy a crear
otras Dos clases que sea perro y gato
por ejemplo dog Cat yo ahora mismo tengo
tres clases claro estoy reutilizando
código no estoy poniendo en todos los
casos que me estoy creando unas clases
una que se llama animal una que se llama
perro otra que se llama gato por
supuesto yo podría venir por aquí y yo
que sé tener una variable my animal y si
yo quiero crear un animal Pues podría
crearlo así si yo quiero crear un perro
lo crearía así si yo quiero crear un
gato lo crearía así pero son todas
independientes en realidad ninguna tiene
relación entre ellas Pero para qué vale
la herencia lo voy a volver a repetir la
herencia es ese mecanismo que tenemos en
programación orientado objetos que nos
sirve para heredar por un lado
propiedades y por otro lado funciones o
métodos de una clase si yo ahora
quisiera que mi animal tuviera un nombre
perfecto parámetro nombre si yo ahora
quisiera que mi animal pues por ejemplo
emitiese un sonido pues me voy a crear
una función y le voy a poner Sound
Porque quiero saber cuál es el sonido de
este animal digo aquí pues sonido y yo
ahora aquí le podría hacer un print y
hago este animal emite un sonido no
determinado Por qué Porque es que un
animal es un animal genérico no sé cómo
lo hace este sonido Pero qué pasa si yo
ahora quiero hacer el sonido del perro
Pues yo vendría por aquí y haría Sound
Wow y si yo quisiera hacer el ido del
gato vendría por aquí y haría miau estoy
reutilizando código no estoy utilizando
herencia Aparentemente no lo que estoy
haciendo es copy paste de todo lo que
tengo por aquí y ya está pero ahora
vamos a poner en práctica el concepto de
herencia el concepto de herencia os
decía que sirve para heredar propiedades
funciones de una clase base de una clase
padre de una superclase como nosotros le
querramos Llamar Cuál es nuestra
superclase animal y Cuáles deberían ser
las subclases Pues todo lo que derive de
un animal clases en este caso un perro y
un gato y cómo puedo empezar a utilizar
herencia aquí lo tenéis que ver y por
eso os digo que por favor exploré en
cada uno de vuestros lenguajes comoo se
implementa la herencia en python si yo
quisiera que el perro heredas el
comportamiento base de animal es tan
fácil como decirle eso perro hereda de
animal y gato hereda de animal pero Y
qué estoy consiguiendo con esto
Aparentemente aún no estoy haciendo nada
pero ahora voy a hacerlo siguiente voy a
venir por aquí y voy a borrar esto y voy
a borrar esto qué podríamos hacer ahora
básicamente aquí tenemos un
inicializador este inicializador lo
queremos conservar tendría que hacerle
variaciones si es un perro un gato no
digamos que esta parte es común el
inicializador por ejemplo podría decirle
que es común sin más decir que un animal
tiene nombre pero un perro también le
puedo dar un nombre cuando lo inicializo
y un gato también le puedo dar un nombre
Entonces como yo no quiero retocar esta
operación que es de inicialización
simplemente ni la voy a poner aquí Y qué
va a hacer perro va a heredar el
inicializador de animal ya está pero qué
va a pasar con Sound claro Ahora aquí es
cuando yo de alguna forma debería
sobrecargar entender este concepto la
operación de Sound voy a poner aquí
Sound y vamos a intentar redefinir lo
cómo lo puedo redefinir sin más lo voy
volver a utilizar aquí y en este caso
voy a poner print Y qué voy a poner aquí
el Wow que veíamos antes y qué voy a
hacer con el gato voy a sobreescribir
esa operación miau y lo que voy a hacer
ahora es que en realidad este Sound en
la clase padre la superclase le voy a
decir que no haga absolutamente nada y
vamos a intentar ver ahora qué pasa
vamos a probar cómo funciona todo esto
que yo acabo de implementar a ver si así
tiene más o menos sentido lo que yo
estoy haciendo vamos a venir por aquí y
voy a crear pues por ejemplo un animal
my animal cómo lo haré me dice que Puedo
ponerle un nombre animal Por qué Porque
bueno Esto es un anim animal genérico
qué podría hacer si yo ahora me voy a my
animal por supuesto tendría la operación
Sound Okay si yo ahora lanzo mi programa
ves se ejecuta y no hace nada Por qué
Porque llamo Sound aquí lo tenéis y
Sound no hace nada pero si yo ahora me
creara otro animal por ejemplo pero en
este caso
redefinieron un perro voy a crear un
perro y cómo le voy a llamar al perro
pues me da igual me lo invento hago aquí
perro y voy a llamarle a esta variable
my dog si yo ahora lanzo este código
vemos que dice Wow y si yo ahora me
crear un gato Cat y creo un gato Cat
gato y lanzo este código vemos miau
hasta Aquí más o menos todo entendido
vemos como en realidad el nombre es un
atributo común correspondiente al
inicializador de animal y que yo ya lo
tengo dentro de perro y dentro de gato
Al decirle que estoy heredando el
comportamiento de animal y como yo en
realidad le estoy diciendo Mira Okay el
inicializador es el mismo pero la
emisión del sonido no es la misma cuando
seas un perro redefin Cuál es el sonido
y cuando seas el gato redefin Cuál es el
sonido del gato Este ejemplo se ve muy
bien con qué hacen los animales que un
pájaro al ser un animal pueda volar y un
pez pueda nadar y un perro pues pueda
correr Pues también lo podríamos hacer y
es serían operaciones propias igual de
cada uno de los animales o que le
pudiéramos dar propiedades de estos
animales ya lo veremos en el ejemplo más
avanzado pero aquí simplemente quería
introducir el concepto de herencia pero
aparte del concepto de herencia os
dejaba una pequeña trampa Y es que con
el concepto de herencia siempre suele
estar ligado el concepto de polimorfismo
y yo el concepto de polimorfismo me lo
callé para que así cuando vosotros
entendiera lo que es herencia y os
pusiera aquí a sobreescribir esta
operación y en realidad ya estáis
utilizando polimorfismo sin saber Quizás
que lo estabais utilizando o que
llegasteis a pensar que la herencia lo
es todo la herencia el concepto general
de precisamente heredar propiedades y
funciones pero después tenemos el
concepto de polimorfismo Qué es el
polimorfismo el polimorfismo es la
capacidad de un objeto para tomar muchas
formas en este contexto de la
programación orientada de objetos es la
capacidad que tienen las clases para ser
tratadas como instancias de una clase
padre pero desde el punto de vista de lo
que llamamos las interfaces de que sin
saber qué es que él pueda comportarse de
una manera distinta es decir sin saber
que si un animal es un un gato pueda
comportarse de manera distinta cómo lo
podemos ver bueno primero tenemos este
polimorfismo en tiempo de compilación
Nosotros hemos hecho polimórfico el
animal diciéndole que el animal si es un
perro suena de una manera si es un gato
suena de otra manera pero ahora Aquí voy
a crear una función me voy a crear una
función fuera de perro de gato de animal
y de todo y le voy a llamar print Sound
por ejemplo y aquí le voy a pasar el
animal animal que es un animal y qué
operación tiene animal animal tiene la
operación por ejemplo Sound esto es una
operación que tenemos por fuera y ahora
en vez de llamar por un lado a my animal
Sound a my dog Sound a my Cat Sound voy
Llamar a mi función print Sound y lo
único que le voy a pasar es el animal en
este caso el animal genérico en este
caso el perro en este caso el gato qué
va a pasar aquí las tres tienen la misma
operación porque heredan de animal pero
qué está pasando aquí que esto Recibe un
animal okay Y como Recibe un animal Yo
estoy llamando la operación Sound y Esto
va a saber si es un perro un gato o qué
es porque claro esta operación Sound
cuál va a corresponder Pues en realidad
como está heredando de una superclase
ahora Aquí vamos a ver cómo entra ese
concepto de polimorfismo ya no en tiempo
de compilación que es la sobrecarga que
tenemos aquí de las funciones sino en
tiempo de ejecución como inicialmente un
mismo objeto que es un animal va a tomar
también diferentes formas y vemos lo que
sale aquí Guau y miau de manera mágica
digamos que ha inferido que en algún
caso Quizás es el perro y en otro caso
es un gato veis hasta donde llega ese
concepto de polimorfismo ese concepto de
herencia Cómo nosotros podemos heredar
mecanismos comoo nosotros los podemos
sobreescribir y como nosotros a la hora
de invocarlos y trabajar con ellos ya se
encargará el propio polimorfismo de
decirnos A quién pertenece cada uno lo
veis yo he llamado a animal y no importa
lo que sea este animal porque cuando yo
le pase un animal que ha sido
sobrecargado especializado o que ha
heredado de animal y se ha especializado
en ser un perro o un gato aquí le va a
dar Exactamente igual vemos como le paso
el perro y el perro Sound que es una
operación que viene heredada de animal
en un caso va a imprimir Wow En otro
caso va a imprimir miau ya está el
polimorfismo no es para nada difícil ni
os lo nombré porque quería que entrara
con el concepto genérico de herencia
Solo que dentro de la herencia pues
tenemos esa parte del polimorfismo Okay
y incluso tenemos estos dos tipos de
polimorfismo El polimorfismo en tiempo
de compilación que es esa sobrecarga de
métodos como sobrecarguen Sound y como
tenemos el de compilación que esa
sobreescritura Al fin y al cabo se acaba
ejecutando a medida que el código se
está lanzando que se está ejecutando
cada línea va desencadenar una lógica o
otra Okay realmente el polimorfismo que
permite permite reutilizar código
permite acotar código y permite evitar
errores vamos a ver ahora cómo con el
ejercicio extra podemos entenderlo un
poquito mejor porque ahora aquí ya vamos
a ver un caso de uso quizás más
especializado implementa la jerarquía de
una empresa de desarrollo formada por
empleados que pueden ser gerentes
gerentes de proyectos o programadores
vamos a ir paso a paso y vamos a ir
entendiendo esta parte tenemos una
empresa donde hay empleados así que me
voy a crear una clase donde se llame
employe un empleado genérico Esto es lo
que acabará siendo esa superclase vamos
a llamarle no tengo aquí mi empleado y
mi empleado qué va a tener cada empleado
tiene un identificador y un nombre
pensar que esto puede ser una empresa
totalmente real Pues yo tengo aquí mi
empleado y el empleado va a tener un ID
que puede ser un entero y un nombre que
va a ser una cadena de texto entonces de
momento estoy creando una clase self ID
va a ser igual ID y self name va a ser
igual a name vale ya tengo mi empleado
creado por aquí pero qué va a poder
hacer este empleado me dice dependiendo
de su labor tiene propiedades y
funciones exclusivas de su actividad y
almacena los empleados a su cargo vamos
a ver cómo lo vamos manejando todo esto
de momento vamos a decir simplemente que
el empleado sin más tiene este
inicializador Pero qué nos decía que los
empleados Ahora cuando los empecemos a
especializar cuando creemos la
superclass claro un empleado es algo muy
genérico pero yo ahora Quiero conocer Sí
o sí si es un gerente un gerente de
proyecto o un programador por ejemplo en
Nuestra Empresa así que voy a crearme
otras tres clases que será por ejemplo
un manager un project manager y un
programador aquí lo tenemos Y de quién
van a heredar el comportamiento lo van a
heredar de la superclase employee tanto
el manager como el project manager como
el programador en realidad son todos
empleados con lo cual ya le estoy
diciendo que aunque ahora te intente
especializar y tú tengas un rol concreto
en realidad todos van a tener un
identificador y un nombre Okay hasta
aquí todo bien el manager Podría tener
algo más menos nos dice dependiendo de
su labor tienen propiedades y funciones
exclusivas de su actividad Qué significa
esto que yo por ejemplo voy a decirle
Por ejemplo el manager Yo solo quiero
que tenga ID y nombre con lo cual lo
vamos a heredar de employee Pero va a
tener algo propio de los managers una
operación que el manager en realidad se
ponga a coordinar proyectos y le voy a
decir Venga pues tiene una operación
coordinate projects Esto es algo propio
de los managers Así que como es algo
propio de los manager es una operación
que yo estoy creando en el manager vemos
que no lo tenemos en esta clase padre y
aquí hago un print sin más y le digo
self name está coordinando todos los
proyectos de la empresa Esto es algo que
solo va a hacer el manager Okay pero qué
va a hacer el project manager Pues el
project manager en vez de coordinar
proyectos le voy a decir pues mira tú
project manager tú vas a coordinar en
vez de projects project en singular y le
voy a decir está coordinando su proyecto
ya está haciendo otra cosa y el
programador qué va a hacer Pues el
programador le voy a decir que en
realidad no va va a coordinar sino que
va a programar le voy a poner code Y qué
va a hacer este programador voy a
meterle un print voy a acceder a su
nombre igual que hicimos antes name y le
voy a decir está programando en claro
Qué es algo que pueden tener propio los
programadores Pues el lenguaje de
programación en el que trabajan
imagínate jov va a mí me gustaría
guardarme el lenguaje de programación me
gustaría que cuando yo yo creo un
programador le podría decir no quiero
que te iniciales no solo con nombre y
con el ID sino quiero que te iniciales
también con el lenguaje de programación
así que me voy a venir por aquí y en
programmer le voy a meter un
inicializador propio del programador
porque aquí le voy a meter también el
Language que va a ser pues una cadena de
texto y yo podría pensar vale muy bien y
ahora aquí me guardo el Language y ya
está pero el ID y el name en realidad no
los tenemos ya el la superclase si yo me
voy a self ahora qué podría encontrar si
hago init a ver qué init tengo aquí self
me dice Ay no no no si te llamas a self
te llamas a ti mismo pero qué tendremos
ahora al ser un ABS clase tendremos la
capacidad vamos a llamarla así de llamar
a s y ahora voy a llamar a init de Super
Y qué me dice init de Super que tenemos
un ID y un name el super la superclase
Qué es la superclase de programmer
employee entonces ahora le podemos decir
venga superclase tú qué necesitas para
acabar funcionando Necesito el ID y el
name ya está Entonces estamos
reutilizando el inicializador de la
superclase y aparte le estamos añadiendo
una propiedad propia de los
programadores en este caso el manager y
el project manager no tiene propiedades
propias tienen operaciones propias pero
en este caso sí que le podemos decir he
el programador aparte de la posibilidad
de codificar sí que le vamos a pasar un
lenguaje y yo ahora aquí le puedo venir
y decir está programando en self
Language porque obligatoriamente yo
quiero que los programadores sí que
tengan un lenguaje lo veis y ahora
aparte qué podríamos acabar haciendo qué
nos decía el ejercicio dice dependiendo
de su labor tienen propiedades y
funciones exclusivas y almacena los
empleados a su cargo un manager puede
tener project managers a su cargo y un
project manager puede tener programmers
a su cargo Cómo podríamos hacer esto
Pues voy a crear aquí una operación que
se llame ad employee por ejemplo sin más
Y qué va a recibir este ad employee
Bueno lo primero el self y después va a
recibir el empleado que lo podríamos
hacer así ad y le paso el empleado
employee de manera digamos podríamos
pensar incluso genérica este employee en
realidad es el mismo lo que estamos
pasando aquí Bueno pensemos esto que
puede acabar suponiendo para nosotros
podéis pensar bueno self que acedo desde
employee en realidad nosotros como
estamos dentro de esta clase este acceso
a employe en realidad ya lo está
infiriendo Qué haremos aquí pues sin más
vamos a añadirlo a una lista de
empleados si tenemos una lista de
empleados self cómo puede ser claro
podríamos tener una variable que se
llame
emplo y aquí le puedo decir y ahora le
añado le hago un append del empleado que
quiero Añadir Pero qué pasa que no
tenemos ni inicializado esto qué podría
intentar cuando tú te instancias vas a
crear una variable que se llame
employees y Esto va a ser una lista
hacía vemos que también podemos utilizar
inicializador no solo para guardar las
propiedades sino para por ejemplo en
este caso estamos definiendo una nueva
así Yo sé que esta lista siempre va a
estar vacía cuando se arranque el
employee cuando se instancie y le voy
poder Añadir empleados Qué significa
esto que en el momento que tenemos este
ad ya está significa que el manager
ahora va a poder Añadir ya quereda el
project manager va a poder Añadir ya
quereda Y el programador qué pasa con el
programador el programador no queremos
que tenga nadie a su cargo Pues por qué
no vengo por aquí sobrecargo esta
operación y le hago pas digo No mira muy
bien me parece fantástico tú le puedes
meter por aquí usuarios pero en realidad
no quiero que imprima o sin más hago
aquí un print y le digo un programador
no tiene empleados azúcar y me vengo por
aquí Pillo el employe digo employee no
se añadirá estoy especializando su
comportamiento todo basado en una
superclase vamos a empezar a trabajar
con ellos a ver ahora qué podría amos
acabar encontrando y Vais a ver cómo
vamos a montar la jerarquía Vais a
intentar entender como ahora basándonos
en una superclase empezamos a modificar
su comportamiento según la clase
especializada que nosotros vamos a crear
basándonos por un lado en la herencia y
por otro lado en el polimorfismo como
estábamos comentando muy bien voy a
venir por aquí ahora tengo mi empresa
entonces voy a crear una variable que se
llame my manager entonces voy a crear un
manager qué me dice que debe tener el
manager el manager sin más me decía
tiene que tener un identificador por
ejemplo el uno y un nombre por ejemplo
de mi empresa el manager va a ser mour
vale Y voy a tener un par de proyectos
entonces voy a tener gerentes qué podría
acabar poniendo Y si yo quiero que ahora
el project manager en realidad tenga un
proyecto asignado le podría decir Okay
pues Por qué no intentamos hacer lo
mismo que el programador pero en caso
del project manager en vez del lenguaje
le pasamos el project Entonces le voy a
poner que aquí tenemos un project
entonces le estoy diciendo que se se
comporte de una manera totalmente
distinta y ya está ahora me voy a crear
un project manager my project manager
entonces voy a crear un project manager
el project manager qué tiene que tener
un identificador un nombre por ejemplo
bry va a ser un project manager y
necesita ahora un proyecto En qué
proyecto Pues en el proyecto uno le voy
a decir que está trabajando proyecto uno
pero claro puedo tener dos project
manager imagínate tengo dos proyectos y
mi empresa voy a crear otro project
manager tres este va a ser moure y va a
trabajar en el proyecto dos qué más
puedo tener a ahora la lista de
programadores me voy a crear mis
programadores my programmer y vamos a
tener Pues un programador programmer qué
necesita el programador el programador
necesita un identificador en este caso
el cuatro necesita un nombre por ejemplo
control y qué necesita un lenguaje Pues
en este caso por ejemplo control
programa en Swift vamos a meter más
programadores voy a tener programador 2s
el tres y el cuatro el dos el tres y el
cuatro vamos a cambiarle los ids el
cinco El seis y el siete entonces puedo
tener a Ross puedo tener a bushi y a
nasos bushi por ejemplo le podemos decir
qu programa en Dart y Ross por supuesto
programan cobol y nasos pues en python
de momento yo ya estoy creando aquí
diferentes empleados generales Pero qué
decíamos que por ejemplo ahora un
manager podía tener gente a su cargo
tiene a los project manager a su cargo
Okay pues yo voy venir donde mi manager
y tengo la operación ad ostras y la
operación ad Pero de dónde sale la
operación ad el manager no tiene ad Sí
porque manager hereda de employee y
employee tiene la capacidad de Añadir
empleados muy bien y qué me dice le
puedo meter un empleado Okay pues Cuáles
son los empleados que tiene el manager
el manager uno digamos y el manager dos
ya tiene dos personas a su cargo y los
project manager Qué tienen a su cargo
los project manager a ver tienen un ad
Ah También tienen un ad porque lo están
heredando y los project manager Qué le
puedo Añadir pues por ejemplo los
programadores el primer project manager
tiene el programador uno y dos y el
segundo project manager my project
manager 2 tiene el programador por
ejemplo 3 y el programador por ejemplo 4
ya está intentamos montar esta jerarquía
y esta jerarquía sobre qué la estamos
montando No lo sé y si yo vengo y le
digo mira el programador le voy a acabar
añadiendo porque también podría heredado
al programador dos es decir voy a hacer
que control en realidad mande sobre
Roswell el programador uno tiene a su
cargo el programador dos vamos a lanzar
tod ejecución Y qué acabamos viendo
acabamos viendo lo siguiente employee
vamos a acceder por ejemplo Dónde está
aquí lo teníamos este employee le
decíamos Ey Yo quiero sobrecargar esta
operación y le voy a decir que en este
caso pues no lo sé le voy a decir que
puede ser un empleado genérico employe
punn vamos a lanzar esta operación Y qué
dice un programador no tiene empleados a
su cargo Ross no se añadirá Pero en
cambio en los otros no ha protestado Por
qué Porque para mí tanto el manager como
el project manager se le pueden Añadir
no no he especializado nada en cambio en
el programador Aquí sí que tenemos un
problema nos vamos al programador Qué
puede hacer el programador me voy a mi
programador y le voy a decir por ejemplo
la operación code Qué hace control está
programando en Swift y si me voy a un
project manager y le digo qué puedo
hacer el project manager a coordinar el
proyecto dice pues bry está coordinando
su proyecto y si me voy al manager qué
va a hacer el manager Pues el manager
puede coordinar todos los proyectos y me
dice mour Deep está coordinando todos
los proyectos de una empresa y si Ahora
me voy por aquí y creo una operación en
la superclase que se llame print
employees por ejemplo Esto va a imprimir
todos los empleados que tiene a su cargo
voy a hacer aquí por employee in
employees self employees y va a hacer
print de los empleados employee punto
que es en este caso qué nos pasaba con
esto employee pun name recordáis tendrá
esto aquí ahora voy a venir por aquí
donde el manager y le voy a hacer print
employees esto funciona imprime a brce y
moure y si me voy al manager y hago
print employees qué tendrá aquí Pues
tendrá a control y Ross y si me voy a my
programmer y hago print employees Porque
a mi programmer le añadí el programador
dos qué pone Aquí vamos a verlo lo veis
dice price y mour control y Ross pero en
este caso no nos imprime nada aunque yo
he intentado añadirlo No nos imprime
nada porque en realidad no le damos ya
Añadir aquí lo tenemos un programador no
tiene empleados a su cargo veis como
estamos montando la jerarquía basándonos
todo en una clase base y en diferentes
clases que nosotros vamos especializando
que en algunos casos heredan mecanismos
y que en otros casos simplemente o lo
sobreescribir o le añadimos
comportamiento Este es el concepto de
por un lado herencia y por otro lado
polimorfismo y veréis lo fácil que sería
seguir modificando esta jerarquía sin
romper una estructura para esto es para
lo que vale el polimorfismo y la
herencia es un concepto Quizás
inicialmente algo complicado sobre todo
a la hora de visualizarlo pero pensar
que siempre es cuestión de definir un
padre que tiene diferentes hijos y que
esos hijos heredan o sobrecargan con
polimorfismo diferentes propiedades por
un lado o funciones por otro
lado hoy vamos a explicar el manejo de
excepciones básicamente el manejo de
errores en los lenguajes de programación
los lenguajes de programación por
supuesto cuando estamos programando
podemos cometer errores pero también
podemos controlar esos esos errores para
que nuestro programa no se detenga
súbitamente seguro que lo habéis vivido
alguna vez que estáis en un programa en
lo que sea y de repente el programa se
cierra Por qué el programa se cierra y
lo tenéis que volver a abrir porque
igual pasó yo que sé se ejecutó
cualquier código que ha cometido un
error y de repente la aplicación se
cierra Por qué pasa eso Porque no
estamos controlando los errores porque
se ha producido un error que seguramente
es inesperado y no se ha hecho nada con
esa acción Entonces el propio lenguaje
de programación empezó a propagar la
excepción y cuando vio que nadie sabía
qué hacer con ese problema pum se acabó
se cierra el programa y no tenemos nada
que hacerle tenemos que volverlo a
arrancar Pero por supuesto hay forma de
controlar excepciones y esto lo hemos
visto mil veces como teóricamente un
programa nos ha dicho que se estaba
contr controlando una excepción que a
veces sucede cualquier problema y nos
aparece un popup dice Se ha producido un
error inesperado bueno eso también nos
ha pasado muchas veces y es porque
quizás hay un error medio raro que no se
ha hecho gran cosa con él pero por lo
menos se ha evitado que el programa se
cerrara Entonces eso también es
importante y es justo la lección que
queremos explicar hoy explora el
concepto de manejo de excepciones Según
tu lenguaje fuerz un error en tu código
claro lo primero que tenemos que hacer
para empezar a ver cómo manejamos
excepciones es acabar provocando un
error en nuestro código captura el error
imprimir dicho error y evita que el
programa se detenga de manera inesperada
y os digo Aquí ya una pista prueba
dividir 10 entre C esto es como en
matemáticas si dividimos 10 entre 0 Qué
pasa Bueno cuando estamos dividiendo un
papel no nos da error pero en realidad
tenemos ahí no podemos dividir entre
cero tenemos un infinito Pues mira igual
que si yo me vengo aquí a un programa Yo
tengo mi ejercicio y hago print porque
voy a imprimirlo y voy a decir mira voy
a imprimir el resultado de 10 / 5 si yo
ahora ejecutar este ejercicio qué me va
a decir dos digo fantástico muy bien
claro 10 / 5 es 2 pero ahora me vengo
arriba y le digo 10 ent cer y qué pasó
pum el programa se detiene hay un error
nos saca el trace por aquí decimos Bueno
pues hay un error dice claro el error lo
tenemos aquí en el 10 ent 0 parece que
se ha cometido un error y nos dice cero
division error division by Pero bueno el
programa se detuvo es decir Qué
significa esto que si yo ahora aquí
tuviera otro print que dice hola qué
pasa pues vamos a ver qué pasa si
ejecuto el programa me dice Hala Peta el
programa y ya no imprímelo a la que pasa
en cambio Si esta línea funcionase me
dice 10 / 1 10 Hola Qué pasa estamos
haciendo que el programa se detenga
entonces aquí es lo que teníais que
investigar cómo somos capaces de
capturar una excepción para que nuestro
programa no se prenda fuego decía
esperar el concepto fuerza el error de
tu código Ya lo tenemos captura el error
vale Pues bueno aquí depende un poquito
del lenguaje que estéis utilizando
básicamente solemos tener una
instrucción en la gran mayoría de
lenguajes que se llama trycatch Bueno ya
digo cada lenguaje pues estas palabras
reservadas pueden variar por ejemplo
Incluso en python pues no es trycatch en
python esta captura de errores es con
try except es decir nosotros metemos un
bloque try y un bloque except okay Y qué
tenemos en este bloque try Step pues
bueno en el try es donde nosotros
tenemos que acabar metiendo el código
que puede que provoque un error qué se
hacen las aplicaciones a nivel
profesional en algún lado se acaban
capturando todos los errores de la
aplicación claro no se trata que
nosotros vayamos metiendo ese TR Catch
ese TR exep en cada bloque de líneas de
código que vayamos programando no lo que
suele tener Es bueno si de verdad hay
estamos ejecutando un código que sí que
sabemos que puede llegar a petar ahí sí
que lo metemos explícitamente pero si no
lo que tenemos es como una captura más a
alto nivel del programa para que si se
comete si era algún error pues que el
programa no prenda fuego Okay entonces
Pero bueno nosotros cómo lo vamos a
hacer aquí Imagínate que claro yo estoy
haciendo una división y digo Uf quién
sabe que igual me aparece una división
entre cero y esto acaba petando Así que
lo voy a intentar controlar bien qué
pasaría con esto que bueno vamos a ver
qué pasa el try nuestro código como
siempre en el exep cuándo se va a
ejecutar este código exep este código
exep se va a ejecutar cuando se produzca
error entonces yo voy a venir por aquí y
voy a decir Se ha producido un error
este bloque solo se lanza si en el try
hay un error inesperado un error que no
está controlado un error que hace que
rompa la ejecución de nuestro programa
Qué nos decía el ejercicio fuerza un
error en tu código captura el error
imprime dicho error de momento vamos a
hacer lo siguiente yo ahora voy a venir
por aquí y voy a poner lo mismo de antes
10 2 y ejecuto mi código vale 10 / 2 5
esto sigue funcionando pero si ahora yo
pongo 10 0 que esto es lo que hacía que
petar el programa ejecuto mi programa Y
qué ha pasado Se ha producido un error
recordáis el print que teníamos aquí y
decía íamos print Hola Qué pasa ahora
aunque se produzca un error fijaos lo
que pasa se produce un error como lo
estamos capturando como lo estamos
controlando dice Uy Pues claro en
la línea en la que Peta si yo ahora
mismo esto lo metiera aquí y lo ejecutar
el programa ves que ya solo imprime Se
ha producido un error digamos que ha
petado en esta línea ha fallado en esta
línea se va directamente al bloque del
step se va directamente a la captura del
error y en la captura del error lo
maneja cómo lo manejamos aquí Bueno no
lo manejamos digamos en lo único que
hacemos Es imprimir que se ha producido
un error bueno es una pseudo manera de
manejar qué se espera en un programa
profesional que de verdad intentemos
reponernos del error que de verdad
intentemos avisar al usuario que de
verdad intentemos controlar que hay un
error inesperado que está haciendo que
nuestro programa falle y que nos ayude a
que en futuras versiones lo podamos
controlar mejor Bueno aquí de momento
simplemente avisamos de que se ha
producido un error pero veis que aunque
hemos controlado este error ya nos
imprime loa que pasa porque la línea la
que falla salta al except y a otra cosa
pero si yo ahora me viniera aquí y sigo
mi programa ahora sí que diría Se ha
producido un error y Hola Qué pasa
continúa la ejecución hace todo lo que
tiene que hacer en el manejo de errores
que solo es el bloque trp y después
sigue con su vida el programa no ha
petado el programa nos ha detenido y
hemos acabado controlando el error Okay
entonces bueno casi de momento hemos
sido capaces de por lo menos capturar el
error pero nos dice imprime dicho error
claro ahora tenemos aquí un problema que
nosotros no sabemos que error Se ha
producido esto de momento habitualmente
también en los bloques del Catch del
except en el bloque que se ejecuta
cuando se produce un error somos capaces
de capturar el tipo de error básicamente
cada lenguaje de programación tiene un
error llamémosle un super error un error
padre un error que los maneja todos en
python se llama exception todos los
errores del sistema tienen que acabar
derivando de excep entonces si yo le
digo Mira captura aquí todas las
excepciones es decir poner except
exception es lo mismo que poner except
porque en realidad por except se va a ir
cualquier excepción sin más solo que
nosotros ya lo veremos que podemos
especializar las excepciones y yo le
digo Mira la exception es recógeme en un
parámetro para que yo sepa Se ha
producido un error y ahora por aquí
vamos a imprimir Qué es este e sin más
voy a imprimir el contenido de la
excepción y voy a lanzar mi programa
veis lo que pone Se ha producido un
error division by Zero ya tenemos el
error que ha hecho que nuestro programa
fallara claro podríamos tener más tipos
de errores voy a poner aquí 10 / 1 para
que no falle pero ahora me voy a venir
por aquí y me voy a crear una lista que
tiene números 1 2 3 y 4 y ahora voy a
venir por aquí voy a hacer un print voy
a acceder a mi lista y le voy a decir
accede al elemento cer lo lanzamos Y qué
vemos 10 / 1 es 10 y el elemento c lo
que hay es un uno en el elemento 1 lo
que hay es un dos en el elemento dos lo
que hay es un tres Bueno estamos
accediendo correctamente a los elementos
de esta lista pero ahora Yo vengo por
aquí qué vemos elemento cero elemento 1
2s y tres vengo por aquí le digo quiero
Acceder al elemento 4 qué va a pasar el
elemento cuatro no existe en nuestra
lista se produce una excepción se va por
aquí Y empezamos a leer Se ha producido
un error list Index out of Range otro
error decir Estos son errores que el
sistema sí que es capaz de saber qué
hacer con ellos ya hemos sido capaces de
controlar este error y este error dos
tipos de errores distintos esto ya sab
veis puedo venir aquí lo simplificamos
hacemos esto a ver qué pasa vemos que
tenemos el mismo error creamos la lista
y accedemos a continuación al elemento 4
entonces ya somos capaces de controlar
dos errores distintos y de imprimir la
naturaleza de esos errores esta era la
primera parte del ejercicio vamos a la
dificultad esta nos dice Crea una
función que sea capaz de procesar
parámetros pero también pueda lanzar
tres tipos diferentes de excepciones me
voy a crear una función y le voy a
llamar pues por ejemplo process params
no process param y esto lo que va a
tener es parámetros parámetros le
podríamos pasar varios parámetros o le
podríamos decir que recibe una lista de
parámetros nos da un poquito igual esto
como lo pensaris Vale tengo esta lista
de parámetros y aquí podría intentar
hacer cosas con los parámetros qué
podría intentar hacer ya que tengo una
lista de parámetros vamos a intentar
hacer lo mismo voy a venir por aquí y
voy a hacer un print y simplemente voy a
intentar Acceder al elemento tres por
ejemplo Entonces parameters 3 de momento
mi función lo único que hace es esto
Bueno al elemento tres en la lista al
elemento dos por índice algo así como si
yo ahora viniera aquí y llamara a
process params y yo le paso una lista
que tiene un dos y tres esto básicamente
si lo ejecuto vemos lo que pone aquí me
imprime un tres en el elemento tres hay
un tres vale de momento tengo un
procesado de parámetros que en realidad
es que no no hace nada No pero qué decía
el ejercicio que en realidad necesitamos
un programa que sea capaz de lanzar
excepciones porque de momento hemos
hemos visto un concepto de que es el
sistema el que lanza excepciones pero
también podríamos ser nosotros los
encargados de lanzar excepciones vamos a
ir primero con las partes fáciles voy a
venir por aquí y vamos a intentar
capturar excepciones voy a hacer un try
voy a hacer un except y de momento ahora
Aquí vamos a poner igual que antes que
se ha producido un error de momento por
lo que vemos aquí lo único que tenemos
es un control de excepciones sin más a
ver qué nos dice tiene que ser capaz de
lanzar tres tipos diferentes de
excepciones una de ellas tiene que
corresponder con un tipo de excepción
creada por nosotros Entonces lo primero
que nos dice es captura todas las
excepciones desde el lugar que llamas la
función ostras primero vamos a intentar
que este programa sea capaz de lanzar
excepciones para eso tenemos que
capturar las excepciones Entonces yo
puedo venir aquí y le digo Mira vas a
capturar la excepción y esto se va a
llamar e os decía que aquí controlarías
la excepción pero en realidad nosotros
tendríamos que ser capaces de lanzar la
excepción así las capturo pero imagínate
que yo tengo un programa muy inteligente
en el que quiero acabar lanzando yo las
excepciones Entonces vamos a por ejemplo
aquí mi programa voy a venir por aquí y
le voy a decir si la longitud de los
parámetros de la lista es menor que dos
Pues podría ser un problema pensar esto
claro yo a cualquiero Acceder al
elemento tres Pues le voy a decir si es
menor que tres Esto para mí podría ser
un problema porque en el momento que
vengo aquí y hago esto esto podría
acabar dando un error Entonces primero
tengo que controlar si de verdad me pasa
esto okay Ya tengo esto si fuera mayor
que dos sería la forma de yo ejecutar
esto muy bien Vengo por aquí pero qué
pasa si es menor que tres si la longitud
del listado es menor que tres yo no
podría ejecutar Esto me iba a acabar
dando un error con lo cual yo tendría
que ser capaz de lanzar un error cómo lo
lanzamos habitualmente en muchos
lenguajes se lanza con la palabra
reservada throw bueno en python tenemos
esta palabra reservada que se llama
raise Cuál es el error que tenemos si
nos pasamos de Rango al consultar una
lista aquí podríamos ver los errores más
habituales del sistema o consultarlos
esto todo por supuesto está en la
documentación o en el momento que
capturamos los errores aquí podríamos
saber qué tipo de error básicamente los
errores todos están documentados del
sistema y yo sé que podemos tener un
problema a la hora de consultar el
índice Qué problema podemos tener a la
hora de consultar el índice pues Pues no
lo sé decíamos list Index error podría
ser un Index error No lo sé vosotros
siempre intentar Buscar errores muy bien
Voy a la documentación Qué problema
tengo o en el momento que yo intento
lazar esta excepción esta excepción pues
qué clase sería o intentar sacar siempre
información sobre esto porque es lo
mejor que tenéis incluso vosotros
podíais venir aquí Bueno esto ya es un
poquito más avanzado pero os podríais ir
al tipo y dentro del tipo pasarle el e y
decirle Cuál es la clase Cuál es el name
de esta excepción dejadme que comente
esto simplemente para que veáis lo que
se me va a mostrar aquí y veis esto
Index error cuando yo hago fallar esto
mira lo vamos a poner así Index error
entre paréntesis para que veáis el
nombre del error y también el tipo del
error el e y el Index error para que se
muestre esto list Index out of Range que
es la descripción del error y el tipo de
error Index error Así que yo ya sé que
claro cuando me paso de índice yo voy a
tener un Index error Así que lo que voy
a lanzar yo a mano porque por la lógica
de mi programa Imagínate yo sé que voy a
tener que sí o sí Acceder al elemento
dos por la lógica que sea la que os
querrás inventar entonces tengo que
saber que si de verdad aquí tengo menos
de tres elementos me va a fallar porque
yo quiero consultar precisamente el
elemento tres Así que le voy a decir que
quiero lanzar un Index error sin más
podría decir venga lánzate excepción
lanza un Index error porque yo sé que si
no lo lanzo yo si no lo controlo voy a
tener un problema Vale ahora por otro
lado Voy a hacer otro print y voy a
decir Imagínate que yo ahora lo que
quiero hacer es el parámetro c lo quiero
dividir entre el parámetro 1 es decir
quiero dividir 1 entre 2 qué tendría que
aquí acabar controlando pues por ejemplo
para que esto pudiera funcionar tendría
que controlar que por ejemplo el
parámetro 1 no fuera un cer0 para que no
me petara el programa porque voy a
dividir entre cero Así que yo le podría
decir vale control este error pero Else
If en caso de que el parámetro 1 sea
igual a cer esto yo sé que me va a
acabar provocando otro error que haría
que se me detuviera el programa Así que
lo que hago es aquí yo a mano digo Ey
cuidado esto haría fallar a mi programa
le voy a decir que ahora quiero lanzar
otro error Cuál era el error si ahora
vengo por aquí digo a ver qué error se
produce cuando divido entre cero y
tenemos cero division error Así que
vengo por aquí y le digo lanza este
error cero division r ya está Y estos
dos los tenemos a mano qué pasaría ahora
vamos a intentar hacer que falle nuestro
programa por ejemplo aquí esto haría que
falle nuestro programa si le mando a
process params una lista que tiene dos
elementos Esto va a hacer que nuestro
programa PT lo voy a lanzar lanzamos el
programa Aquí lo tenemos Index error
ostras Pero por qué tenemos un error
aquí y hemos hecho que el programa se
detuviese Yo podría venir aquí y hago
print el programa finaliza para saber si
esto se ejecuta veis que en ningún
momento Se imprime el programa finaliza
Por qué llamamos a process params le
mandamos estos dos parámetros en la
lista y aquí va a comprobar Oye es menor
que tres la longitud sí es dos para
nosotros eso es un error por la lógica
que nos dé la gana lamos un error pum lo
estoy capturando el error no lo estoy
capturando vale Cómo capturamos
errores ya lo vimos try except Y ahora
yo pongo aquí igual que antes Sprint Se
ha producido un error lo lanzo se
detiene nuestro programa no se ha
producido un error y el programa
finaliza ya hemos por un lado en esta
función evitado que fallara porque hemos
capturado el error antes y lo hemos
lanzado para avisar a nuestra aplicación
de Oye cuidado me has pasado algo que me
va a hacer fallar ten cuidado lo que me
pasas y yo ahora aquí lo controlo y digo
Ah vale Se ha producido un error
perfecto y yo ahora aquí en mi
aplicación pues hago lo que sea notifico
al usuario o hago una prueba con otro
número lo que me dé la gana por supuesto
try Step lo podríamos meter aquí pero
estamos intentando ver también comoo los
errores se propagan y somos capaces
nosotros de capturarlos a lo largo de
toda la ejecución del programa pero que
nos el ejercicio decía captura todas las
excepciones ya soy capaz de capturar
todas las excepciones estoy poniendo
except con lo cual cualquier excepción
que se produzca aquí yo voy a ser capaz
de pillar Entonces hasta aquí estamos
bien y me dice imprime el tipo de error
Uy aquí ya tenemos un problema Entonces
aquí yo quería que también revisar lo
siguiente Cómo nosotros aparte de poder
capturar todas las excepciones podríamos
hacer algo Bastante Guay que es Y por
qué no intento capturar solo la
excepción por ejemplo del error de
índice dice en vez de poner aquí como
poníamos antes exception as e para
capturarla ahora digo no no no Yo solo
quiero venir por aquí y capturar el
Index error y digo el número de
elementos de la lista debe ser mayor que
dos por ejemplo este es justo el error
que estamos haciendo aquí que si es
menor que tres nos va a hacer un PT voy
a lanzar el programa veis esto el número
de elementos de la lista debe ser mayor
que 2 Bueno no está mal no ahora hemos
capturado únicamente Index error muy
bien voy a hacer que mi lista tenga tres
valores ahora ya no va a fallar el
programa finaliza fin Pero y si yo ahora
aquí me hago un poco el perro y le pongo
un cero ahora no va a fallar por aquí ya
que los elementos son tres O aunque le
metiera más le meto más elementos aquí
pero cuándo va a fallar cuando le dé por
inspeccionar el elemento uno de la lista
y en realidad valga cer0 eso provocaría
la división entre cero de nuestro
programa hago esto Qué pasó nuestro
programa se detuvo y no ha imprimido el
programa finaliza Pero cómo si yo he
hecho un try exep ya ya tú has hecho un
tryp pero en el que solo estás
capturando Index error qué podría hacer
Yo vengo por aquí digo porque quiero
hacer un código diferente justo para
este error Zero division error y digo el
segundo elemento de la lista no puede
ser un cero y ahora cuando yo lo lanzo
mi programa ya no se detiene súbitamente
nos Explica el error segundo elemento de
la lista no puede ser un cero y el
programa finaliza lo veis así ya no solo
estamos capturando excepciones de manera
genérica sino que estoy capturando una
excepción concreta de un tipo concreto y
estoy desencadenando el código adaptado
al tipo de excepción que se está
produciendo por supuesto Siempre es una
buena práctica a pesar de que nosotros
capturemos este tipo de cosas que yo
venga por aquí y que diga Bueno except
pues seguramente Oye Quédate con las
excepciones no esto también podría estar
bien excepción as e y ahora print y le
digo Se ha producido un error inesperado
y vengo por aquí y ahora imprimo este
eror inesperado porque en este caso
claro se va a ir por este bloque de
código en el momento que no se produzca
ni un Index error ni un cero divisón
error entonces la vamos a liar pero
estamos haciendo que nuestro programa no
vamos a hacer lo siguiente voy a
intentar lanzar otro error vengo por
aquí y esto ya lo hago bien y otra cosa
que va a hacer nuestro programa es
parameters voy a ir al elemento dos y le
voy a sumar cinco lanzo mi programa
perfecto Cuál es el elemento dos 0 1 2 3
+ 5 8 aquí tenemos ocho pero ahora lo
que os decía antes voy a hacer aquí un
poco el perro y le voy a poner bryce y
ahora voy a lanzar mi programa Qué ha
pasado claro ahora el elemento dos de la
lista es un texto al texto ya no le
puedo sumar cinco lo podría hacer con un
número qué ha pasado Se ha producido un
error inesperado no se ha producido ni
un Index error que lo controlamos no se
ha producido ni un cero division error
que lo controlamos Se ha producido otro
error que yo no tenía ni idea idea que
se iba a cometer Muy bien pues se ha ido
por el blo exception y nos ha dicho que
error hay no se puede concatenar una
cadena de texto no entera a otra cadena
de texto ya está he sido capaz de
controlar un error que yo no sabía ni
que se podía producir pero mi programa
es seguro el programa finaliza con lo
cual el programa finaliza sin detenerse
súbitamente digamos el programa finaliza
sin detenerse lo tengo aquí controlado
vale Pero y Qué pasa si yo quisiera
especificar algún tipo de excepción que
no está en el sistema porque imagínate
que yo ahora quiero por ejemplo aquí
esto iba a ser un problema yo ahora lo
que quiero lo que me gustaría controlar
es que si el parámetro dos es una cadena
de texto es decir si el type de esto si
esto fuera una cadena de texto podríamos
pensar esto le digo ostras si esto se
cumple esto es un error para mí porque
claro cuando yo intente hacer esto si es
una cadena de texto va a petar de
momento vamos a hacer esto Rise excepto
sin más a ver si ahora nuestro programa
o mira voy a lanzar esta el cero
division exception ahora sabemos que
nuestro programa donde Peta es en esta
línea A ver qué pasa lo lanzo veis el
segundo elemento de la lista no puede
ser un cero bueno es una excepción que
la estamos lanzando de manera incorrecta
ya que estamos lanzando una excepción
del sistema que no representa lo que de
verdad está pasando lo que de verdad
está pasando Es que para nosotros es un
error que el segundo elemento de la
lista sea una cadena de texto vale Así
que voy a venir por aquí y vamos a ir a
otro apartado que nos decía el ejercicio
decía una de las excepciones que
lancemos tiene que corresponderse con un
tipo de excepción creada por nosotros de
manera personalizada y debe ser lanzada
de manera manual Qué significa que yo
también puedo crear mis propias
excepciones al final las excepciones en
la gran mayoría de lenguajes seguramente
sean una clase y yo voy a decir str type
error no una excepción que me acabo de
inventar el nombre para representar que
el tipo es un String y que para mí eso
va a ser un error Qué tengo que hacer
para que de verdad esto se comporte como
una excepción simplemente le tengo que
decir que herede esto ya lo vimos en
otra clase Ya vimos Qué significa la
herencia simplemente lo que le digo es
Mira tú hereda el comportamiento de las
excepciones y sin más no hagas nada pas
pero yo ahora ya voy a tener una
excepción que se va a llamar así y vengo
por aquí y le digo ahora lanza mi
excepción mi excepción personalizada
Okay vamos a lanzar el programa y vemos
aquí Se ha producido un error inesperado
dos puntos nada Por qué Porque claro
nuestra excepción personalizada por
defecto es que no tiene ni un mensaje y
yo ahora le voy a poner un mensaje
personalizado yo le podría poner un
mensaje a mi excepción y le diría
el segundo elemento no puede ser una
cadena de texto Esta es mi excepción
ahora lanzo mi programa y veis lo que
dice Se ha producido un error inesperado
el segundo elemento no puede ser una
cadena de texto tengo una excepción
personalizada Qué significa esto que
incluso con mi excepción personalizada
yo ahora podría venirme por aquí y
decirle ahora también quiero capturar mi
sección personalizada la puedo capturar
igual que las del sistema le digo ahora
captura str type r y simplemente lo voy
a imprimir porque ya sé que ya me viene
con el texto y veis el segundo elemento
no puede ser una cadena de texto y si
ahora se produjese otro error que yo no
cuento con él ya se acabaría yendo por
exceptio es decir tenemos dos del
sistema Index error ther division error
una creada por nosotros str type error y
la captura de cualquier otro error como
buena práctica para que no tenga
problemas vale digo el segundo elemento
de la lista Bueno en realidad este dos
sería el tercer elemento de la lista no
el tercer elemento de la lista ahora lo
tenemos bien entonces ya fui capaz de
capturar todo vale Y ahora esto aquí
decíamos imprime que la ejecución ha
finalizado Esto me va a servir para
explicaros alguna cosilla más que esto
en realidad no lo tienen todos los
lenguajes habitualmente los lenguajes lo
que sí que van a tener es esto el lugar
donde se inspecciona el código y la
captura de errores del sistema generales
personalizados Esto va a tener pero
python tiene dos cositas más que podemos
meter en el bloque de excepciones por un
lado es que nosotros le podemos indicar
en un blog código que se ejecute siempre
esto lo hacemos con la instrucción
Finally Y fíjate me voy a llevar esto
del programa finaliza sin detenerse al
final esto lo que va a hacer es que pase
lo que pase Durante este manejo de
excepciones incluso que se ejecute el
try que el process params como está
pasando ahora que se vaya e intente
manejar un error lo que va a hacer Sí o
sí al final es irse al Finally veis lo
que que pone aquí el programa finaliza
sin detenerse ya no solo nos ejecutaba
antes la línea que teníamos fuera ahora
si queremos hacer algo siempre imagínate
vamos a presuponer que en el Finally
informamos siempre a servidor y si se ha
provocado un error o no O que enviamos
al error el servidor o que limpiamos los
datos de un formulario imagínate falle o
no falle bueno eh pensar un código que
tengamos que ejecutar siempre se
produzca un error o no se produzca Pues
para eso es para lo que tenemos el
Finally pero aparte aún tenemos otra
instrucción esto no dejan de ser como
una especie de ifs verdad pues tenemos
incluso la instrucción els dentro del
bloque TR Step y esto Qué representa
Pues el els Qué es el els es que no se
ha cumplido ninguna de estas opciones
que este els es como el els de un If
Cuándo se ejecuta el If bueno pensar que
esto es como una especie de If y el If
no se ha producido el Index error no se
ha producido el cer division error no se
ha producido el str type error no se ha
producido el exception no entonces ahí
es cuando se ejecuta el print
básicamente para que lo entendáis el
print se ejecuta cuando no se han
producido errores voy a poner aquí no se
ha producido ningún error así de fácil
ahora vamos a lanzar nuestro programa en
nuestro programa sí que se ha producido
un error lo veis aquí el tercer elemento
no puede ser una cadena de texto y nos
dice el programa finaliza Aquí lo tenéis
nos controla el str type error y después
se va al Finally pero ahora voy a poner
todo bien en mi programa teóricamente si
yo pongo esto 1 2 3 4 no se va a
producir ningún error porque no es
Ninguno de los errores que tenemos
controlados esto se tiene que acabar
ejecutando bien Así que vengo por aquí
lanzo mi programa y vemos lo que imprime
aparte de los resultados de tratar esos
datos nos imprime no se ha producido
ningún error Dónde está eso en el els
claro no se ha producido ninguno de
estos errores controlados Así que
imprime el els y el Finally que siempre
lo va a hacer así que el els sí que es
opcional que se acabe imprimiendo no
igual que los errores okay Y con esto yo
creo que ya tenemos el manejo completo
de errores una explicación muy simple ya
veis que la explicación más simple Pues
será nada un segundo pero en esta un
poquito más compleja ya veis lanzar
errores del sistema crear errores
propios controlar errores genéricos y
aquí tenemos Cómo acabamos controlando
cada uno y como ejecutamos código
distinto y aparte cómo somos capaces de
controlar que no se haya producido un
error y también ejecutar un bloque de
código que siempre lo haga se produzco
un error o no Ya digo esto no existe en
todos los lenguajes de programación
manejo de errores creación de errores
propios sí bloes Finally habitualmente
pero igual lo que no tenéis Quizás lo
más raro es stels esto igual no lo
tenéis en todos los lenguajes de
[Música]
programación manejo de ficheros trabajar
con ficheros es algo s super habitual en
programación sobre todo cuando estamos
aprendiendo porque nos exige acabar
desarrollando una dinámica pues muy
habitual entre lenguajes de programación
pues lo típico poder crear un fichero
poder escribir un fichero poder leerlo
poder borrar arlo vale todo con el
sistema de archivos de nuestro propio
sistema operativo Vale qué tenía que
hacer el ejercicio vamos a ir primero a
la parte más simple desarrolla un
programa capaz de crear un archivo que
se llame como tu usuario de github y
tenga la extensión txt dice añá ese
archivo varias líneas el nombre tu edad
el lenguaje de programación favorito
tienes que imprimir Su contenido y
después borrarlo y vamos a ver cómo
somos capaces de resolver este ejercicio
desarrollo un programa capaz de crear un
archivo que se llame como tu usuario de
github y tenga la extensión t XT vale
aquí cada persona dependiendo de
lenguaje de programación que haya
elegido tendría que buscar Cómo poder
acabar trabajando con ficheros Okay yo
lo voy a explicar con python pero ya os
digo que la dinámica suele ser muy
parecida en cualquier lenguaje de
programación si veis los ejemplos en los
otros lenguajes de programación acabaré
entendiendo fácilmente que esa dinámica
esa lógica es muy parecida vale porque
va a haber operaciones del sistema
capaces de ayudarnos a crear ficheros y
a manejarlos en python lo que tenemos
que hacer es importar os operative
System básicamente un módulo que es
capaz de darnos operaciones que nos
permiten interactuar con el sistema
operativo Okay entonces para eso
nosotros lo que podemos hacer por
ejemplo es llamar una operación que se
llama Open Y en este Open Nosotros le
podríamos pasar el nombre del fichero
cómo queremos llamarla a nuestro fichero
decíamos nuestro nombre de usuario como
lo voy a tener que utilizar en varios
sitios me voy a crear por aquí una
variable que le voy a llamar filen y
nuestro fichero dijimos que se iba a
llamar mouredev txt entonces sin más yo
lo que voy a hacer es es lo que quiero
abrir filename vale Y aquí por ejemplo
en python aparte de decirle el fichero
que queremos abrir le tenemos que decir
en qué modo lo queremos abrir y aquí le
podríamos indicar mira como Quiero abrir
mi fichero es con w con write Con
permiso de escritura por qué porque voy
querer escribir algo claro nosotros
ahora podríamos arrancar nuestro
programa y no sé si lo veis aquí abajo
pero veis que ya Solo lanzando esa línea
yo ya tengo un mour de.txt ya he sido
capaz de crear un fichero lo crea la
raíz del proyecto podríamos acabar
indicándole una ruta no os lo pedía Por
qué Porque como Os pido trabajar con el
fichero y después borrarlo pues no me
importaba donde metieras el fichero ni
al final la localización era un poco a
vuestra bola como yo os lo voy a pedir
borrar pues sin más vale Ya tengo creado
el fichero Ahora aquí lo que tendríamos
que hacer es vale Y si yo ya tengo el
fichero qué podríamos hacer lo podríamos
guardar podríamos acabar trabajando con
él bueno tenemos una forma de trabajar
con un fichero Pues de Pues de una
manera bastante segura que es trabajando
dentro de un contexto con él para eso yo
en python por ejemplo le puedo hacer
with open de esta forma le podría decir
mira lo vas a abrir y lo vas a asociar a
una variable que yo le voy a llamar file
sin más y ahora dentro del Wi como si
fuera una especie de operación nosotros
podríamos Acceder al fichero y
tendríamos ya un flujo de conexión con
nuestro fichero para hacer diferentes
operaciones y operaciones en modo right
en modo escritura okay Así que yo ahora
podría venir por aquí y decirle right
dentro del fichero tengo la operación de
escritura ya veis qué fácil es y qué es
lo que quiero escribir en mi fichero qué
me decía el ejercicio me decía añade
varias líneas en este fichero tu nombre
la edad y tu lenguaje de programación
favorito por probar algo entonces por
ejemplo mi nombre br mour Okay y si
quiero escribir otra línea vamos a
probar esto lo que podríamos pensar es
si accedo tres veces a él y ahora le
digo mi edad hablábamos aquí 36 mi
lenguaje de programación favorito Bueno
ya que estamos en python le voy a poner
python vamos a lanzar mi programa vamos
a ir a mured viste Oh qué hace python
por defecto esto cada lenguaje puede
tener algunas diferencias pero aquí cada
vez que yo llamo a Wi está concatenando
en el fichero al final no me está
haciendo saltos de línea con lo cual yo
tendría que pensar Uy pues quizás igual
le tengo que acabar concatenando a cada
llamada al fichero un barra n le podría
hacer para lanzar estos saltos de línea
Okay o sin más hago esto y le meto un
barra n y ya está al final un barra n es
un salto de línea sin más vale Así que
si ahora volvier a lanzar vamos a ir por
aquí volver lanzar mi programa vamos a
mouret XT lo estáis viendo aquí ya
aparece bien ojo ya tenemos algo hemos
sido capaces de crear un fichero llamado
mod.txt y ya le hemos metido los valores
nuestro nombre edad y lenguaje lo
siguiente que nos decía es vale una vez
tienes el fichero lo siguiente que
tienes que acabar haciendo va a ser
leerlo os decía aquí el ejercicio
imprime el contenido Okay cómo vamos a
imprimir el contenido aquí podríamos
pensar pues No lo sé si me voy al file
igual que tengo un wr tendré un Red A
ver vamos a lanzar mi programa ojo qué
pone aquí ya sabemos lo que son las
excepciones ya lo vimos en otra lección
nos dice ey unsupported operation no es
legible Nosotros hemos accedido al
fichero diciéndole que la operación que
queríamos lanzar era una operación de
escritura con lo cual hemos podido
escribir pero si yo me pongo a leer pues
quizás no puedo leer le podríamos meter
varios permisos pero vamos a ir
haciéndolo parte por parte porque yo
ahora podría intentar hacer exactamente
lo mismo y decirle ahora fichero en vez
de acceder a ti con permisos de
escritura después de ya haber escrito
quiero acceder con permisos de lectura
Cuáles serán los permisos de lectura rre
con lo cual si yo ahora vengo por aquí y
accedo al file y llamo a la operación de
lectura a ver qué pasa Ey ya no falla el
programa okay Y qué nos va a dar el re
este pues nos va a dar el contenido del
fichero con lo cual yo lo que intuyo si
le hago un print al contenido del
fichero qué tengo por aquí bry 36 y
python justo lo que había escrito
perfecto pues ya hemos sido capaces de
crear el fichero escribirlo y leerlo muy
bien y si lo quiero borrar que es lo
último que me pedía el ejercicio en su
parte más simple decía Borra el fichero
para asegurarnos de no tener problema no
hace falta ni incluso que mantengamos un
flujo python es bastante inteligente en
este aspecto y nosotros podemos Acceder
al fichero podemos empezar a manejarlo
porque me decís sin cerrarlo y tal
incluso no nos hace falta porque él se
va a encargar de lanzar otras
operaciones por el medio en el momento
que nosotros hacemos accesos por eso Si
yo ahora lo último que quisiera es
borrarlo me voy a remove Y qué tendré
que pasarle para borrarlo sin más el
nombre del fichero filename qué tiene
que pasar ahora cuál es el fichero de
momento no lo estamos borrando veis aquí
tenemos el fichero vale Okay nosotros ya
estamos trabajando en un contexto seguro
Por qué Porque pensar que en el momento
que nosotros estamos haciendo el Wi con
el open en realidad nosotros el acceso
al fichero lo tenemos solo en este scope
Okay no es como si nosotros hiciéramos
el open
guardármelo el proceso de acceso al
propio al propio fichero Okay en el
momento que nos salimos del vale ya
tenemos todo esto lo último que voy a
hacer ya es borrarlo si lo lanzo qué
aparece aquí veis que aparece tachado
por qué Porque como lo he acabado de
borrar ya no lo tenemos lo crea lo
sobreescribe esto también es muy
importante y tener en cuenta con Qué
lenguaje de programación estés
trabajando porque hay lenguajes de
programación que por defecto concatenan
pero yo aquí como estoy haciendo el open
y con el permiso de escritura en lo que
me va a hacer es machacar el contenido
cada vez que yo lanzo el programa por
eso no tenemos cada vez aunque yo aquí
no lo lo borrara cada vez que se Lance
esto lo que va a hacer es escribir desde
cero mi nombre edad y lenguaje de
programación no va a continuar donde
quedó anteriormente Okay Porque con Wi
siempre lo machaca y lo vuelve a crear
desde cero vale Y después lo elimina
recordaba que estaba por aquí abajo ya
no lo veis vale ya tenemos esto Esta era
como la parte más simple para que
vierais únicamente Cómo interactúa era
muy fácil esta parte era muy fácil Por
qué Porque lo verdaderamente si le
queremos Llamar complicado era la
segunda parte del ejercicio la parte que
solemos llamar extra aquí ya tenías que
ya entender un poquito más Cuál es el
flujo a la hora de interactuar con
ficheros la parte extra ya nos decía
montar Pues un programita algo más real
vamos a llamarle decía por aquí
desarrolle un programa de gestión de
ventas que almacene sus datos en un
archivo txt cada producto se guarda en
una línea de archivo de la siguiente
manera vale vemos que tenemos un
programa que va a pedir hacer bastantes
cosas esto ya lo hemos visto en alguna
clase vamos a empezar a pedirle
diferentes acciones al usuario final por
terminal por ejemplo para que vaya
interactuando por eso yo me voy a abenir
por aquí y voy a hacer un wth para que
este programa esté infinitamente
preguntándole cosas al usuario Hasta que
el usuario decida salir okay Y aquí
Nosotros le podríamos acabar indicando
pues qué es lo que queremos que haga el
usuario voy a hacer un montón de prints
porque le puedo comentar Pues si pulsa
el uno va a ser Añadir producto porque
esto es un control de gestión de
inventarios por ejemplo ya veis que nos
decía cada producto se guarda tenemos un
formato también debes poseer opciones a
la hora de calcular la venta total y Pro
producto Añadir modificar consultar no
sé qué Así que vamos a hacer programa
clásico por terminal donde yo le puedo
decir primero al usuario Ey qué es lo
que quieres hacer le voy a decir Añadir
con el uno Añadir producto con el dos
consultar producto con el tres
actualizar producto con el cuatro borrar
producto con el cinco calcular la venta
Total que nos decía que tenía que hacer
el ejercicio y con el seis calcular la
venta por producto y ya le podemos hacer
Si escribes El Siete pues Sales Aquí
podríamos hacer como nos diera la gana
poniendo una palabra eh seleccionando lo
del listado lo que nos diera la gana por
eso lo primero que voy a hacer option
Voy a recoger lo que va a seleccionar el
usuario porque le voy a decir aquí input
que seleccione una opción selecciona una
opción y aquí el usuario lo primero que
tendrá que hacer es pues escribir 1 2 3
4 5 6 o siete ya está sin más vale una
vez ya tenemos esto que podríamos hacer
aquí pues empezar a revisar Cuál es el
número que se ha seleccionado qué
significaría esto Pues si la opción que
han seleccionado es igual a uno pues voy
a tener que hacer una una lógica si es
la dos otra lógica la tres la cuatro la
5 la 6 la si lo que sea vale aquí que
podríamos hacerlo ya sabéis que
podríamos montar un switch lo que os dé
la gana nos da igual para este ejercicio
ya sabéis eh En este caso seguramente un
switch sea mucho más óptimo a la hora de
empezar a evaluar aquí depende un poco
de las estructuras que controlé de las
estructuras de fluj de control de flujo
que tenga vuestro lenguaje Okay el
switch en realidad solo se queda con una
opción válida de las que está revisando
Okay y habitualmente se utiliza cuando
lo que estamos inspeccionando es siempre
la misma variable que toma diferentes
valores vale por si no tenéis switch en
vuestro lenguaje qué tendríais que hacer
un If y un elsif básicamente con todas
las opciones ya digo que aunque sea más
óptimo el switch en caso de que exista
sin más os voy a poner aquí un pas para
ir ejecutando todas lo que tendréis que
hacer es inspeccionando cada uno de los
valores que puede tomar por aquí nuestro
programa en tal caso sería el dos el
tres el cu el cco El Seis lo veis
entonces bueno tendríamos que revisar
todos estos hasta Cuál pues tendríamos
que revisar exactamente hasta el siete
que son todos los que tenemos y en el
caso de que no seleccione ninguno de
estos se nos iría por el els y en el
caso de que se nos vaya por el els Pues
básicamente tendríamos que volver a
preguntar tendríamos que decir algo así
como eh selecciono una opción correcta
una de las opciones disponibles Okay
podríamos poner esta Bueno ya está Y
ahora qué vamos a hacer Pues venga vamos
a empezar a implementar cada una de las
opciones en este caso vamos a empezar
por la más fácil salir si nos selecciona
El Siete rompemos el flujo decimos break
se acabó Ya tenemos la opción de salir
qué podríamos poner al usuario podríamos
decirle Pues no sé saliendo del programa
o algo así en realidad qué tenemos que
hacer la opción salir Borra el txt esto
ya lo teníamos por aquí si yo vengo aquí
le voy a llamar Exactamente igual que
aunque lo veáis aquí digo archivo.txt no
sé qué le voy a llamar también mouredev
txt así utilizo ya el nombre del fichero
qué tendría que hacer en el momento que
quiero salir del programa lo elimino Ya
está ya tenemos el eliminar de nuestro
programa fantástico esto era lo fácil
vamos a ir haciendo una por una las
opciones si tenemos la opción uno lo que
nos decía nuestro ejercicio es que
tenemos que guardar dar el producto es
decir cada producto se guarda en una
línea del archivo de la siguiente manera
nombre producto cantidad precio Okay
pues qué Tendremos que hacer tendremos
primero que recoger los datos del
producto para ello Yo podría venir por
aquí datos del producto por un lado el
name el nombre del producto por otro
podría poner aquí e nombre qué
tendríamos que meter pues la cantidad
cantidad y el precio aquí le podríamos
poner quantity por ponerlo en inglés No
Y price cantidad y precio vale ya
tenemos los datos que se nos piden ahora
qué Tendremos que hacer Tendremos que
escribir estos datos cómo lo escribíamos
Ya teníamos algo parecido aquí que me
puedo venir por aquí y copiar este flujo
vengo por aquí abrimos el fichero y me
decía e la manera que tú tienes de
guardarlo es como te dice aquí nombre de
producto coma cantidad vendida coma
precio y vamos a meter justo los datos
que nos han introducido el usuario aquí
lo de siempre no voy a controlar que el
precio sea un número válido noy voy a
controlar que la cantidad sea una
cantidad Pues no lo sé entera Lo que sea
simplemente me voy a fiar de lo que mete
el usuario Por qué Porque si no nos
vamos a empezar a poner a controlar un
montón de casos límite que no tienen
nada que ver con lo que queremos
aprender en este ejercicio en vuestra
corrección lo queréis hacer genial es
decir aún mejor pero bueno aquí entender
el porqué de esta explicación metemos
nombre la cantidad y el precio ya está y
al final le hago un salto de línea para
que si después tengo que escribir otro
producto que me lo haga en una nueva
línea okay Así que más o menos ya
tendría esto esto podríamos pensar que e
estaba bien así queréis que probemos
nuestro ejercicio vamos a hacer primero
la opción de ya que no tenemos vamos a
hacer una opción de mostrar todos los
productos Okay me voy a venir aquí y me
voy a hacer una opción por ejemplo cinco
voy a cambiar los valores 6 7 y 8 vale
la opción de borrar va a ser el ocho
porque voy a meter uno más y no s es más
simple siete y ocho porque para que lo
veamos Nosotros bien para poder hacerlo
desde terminal por ejemplo le voy a
montar la opción 1 2 3 4 5 que sea
mostrar productos yo digo esto queda un
poco a como vosotros queráis ir montando
las cosas Pero aún así Creo que está
bien que podamos ir viéndolos aunque el
ejercicio creo que no lo pedía como tal
vale permitía Añadir consultar
actualizar eliminar productos y salir yo
os voy a poner una opción de mostrar
todos porque es tan fácil como esto que
hicimos aquí y así en la opción de
mostrar productos que es la cinco Así ya
podemos ir viendo por terminal Qué es lo
que tiene nuestro programa de gestión de
inventario vale voy a arrancarlo mirar
ya lo que me dice Añadir producto
consultar producto voy a seleccionar la
opción ocho a ver si me sale dice Hala
qué ha pasado aquí esto podría ser un
problema vemos por aquí ostras estoy
intentando salir y borrar un fichero que
no existe aquí habría muchas formas de
hacerlo tendríamos la posibilidad de
comprobar si el fichero existe por
ejemplo podríamos hacerlo así Qué podría
ser lo mejor qué podría ser lo mejor a
veces lo que suele hacer en estos
programas veis aquí donde empieza el
programa podríamos acabar intentando
inicializar el fichero porque yo que
siempree voy a trabajar con un fichero
puede decir no sé quizás existe alguien
puede pensar o ese punto y podríamos
decir ostras y tengo alguna operación
para poder revisar si existe lo
podríamos hacer por supuesto Qué pasa
que yo lo que creo es que es muy posible
es muy posible que yo ahora mismo tengo
un fichero con el que no sé si voy a
acabar interactuando más adelante Lo más
seguro es que sí con lo cual yo podría
venir por aquí y vamos a probar esto yo
ahora vengo por aquí y voy a crearme ya
el fichero antes de empezar en el
programa a ver ahora qué pasaría vemos
Que de momento no estaba creado vuelvo a
lanzar mi programa ahora vemos esto el
fichero ya está por aquí ahora voy a
venir por aquí y voy a acabar haciendo
lo siguiente voy a pulsar el ocho para
salir Ey lo ha borrado vale
personalmente es muy posible que esta
opción funcione mejor que el comprobar
en cada caso si existe vamos a ver qué
problemas nos podría acabar dando esto
ya digo dependiendo del lenguaje igual
tenemos que utilizar una opción o otra
de momento vamos a ver si con esto lo
solucionamos voy a volver a arrancar mi
programa voy ahora a seleccionar la
opción uno que es la de Añadir yo nombre
y voy a poner manzana cantidad cinco
precio 2 manzana las Manzanas más caras
del mundo vale Ya está vamos a irnos
ahora a la opción de mostrar productos
digo Uy he ido aquí a la opción de
mostrar productos Y qué ha salido
manzana 52 ojo eh nuestro programa
parece que funciona ahora voy a venir
por aquí y le voy a decir que quiero
Añadir otro producto huevo por ejemplo y
en este caso Tengo 10 y el precio es uno
ahora los voy a listar otra vez con el
cinco qué ha pasado ahora al listar ya
no están las Manzanas y nos vamos al
fichero y ya no están las Manzanas Por
qué tenemos esto fíjate qué le pasaba a
esta opción esta opción de escritura lo
que acabamos consiguiendo con él es que
sí sí escribes en el fichero Durante
este contexto pero lo que pasa es que
esta W lo que nos está haciendo es
escribiendo borrando inicializando
necesitamos una opción que nos permita
escribir en el fichero pero añadiéndole
datos a lo que ya tenemos para ello esto
era así una pequeña la trampa que tenéis
que acabar viendo tenéis que acabar
encontrando con ella que igual empezaba
a machacar el fichero nosotros tenemos
una opción que es la a para app para
seguir añadiendo ahora vamos a probar a
ver qué pasaría en este caso arranco mi
programa vengo por aquí y le digo quiero
Añadir uno manzana 5 do ahora voy a
Añadir otro opción uno huevo 10 1 listo
todos a ver qué tenemos por aquí ya
tenemos manzana y ya tenemos huevo nos
vamos al fichero tenemos manzana tenemos
huevo Okay lo veis vamos a lo siguiente
voy a matar el programa sin borrarlo
para que veáis que claro como no he
salido de manera legal digamos Aquí está
el fichero Sigue estando no me lo he
cargado Por qué Porque quiero hacer una
prueba voy volver a arrancar mi programa
voy venir por aquí Hala otra vez la
hemos liado con lo cual vamos a venir
por aquí y ahora le voy a decir también
que quiero abrir el fichero en modo
appen a ver qué pasaría en este caso voy
matar el programa voy a borrar el
fichero voy a arrancar el programa El
fichero se crea correctamente voy a
Añadir manzana 5 a dos y voy a matar el
fichero Hala vale de momento Sigue
estando por aquí voy a arrancarlo qué
está pasando aquí nos lo estamos
cargando todo el rato os fijáis Aunque
yo tenga este modo appen por aquí
estamos teniendo un pequeño problema que
estamos intentando Acceder al fichero
accedemos al fichero qué hacemos qué
hacemos vamos a verlo del ejercicio de
arriba para que entendáis rápidamente lo
que está pasando Lo voy a comentar
porque igual nos hemos visto aquí espera
el fichero el nombre del fichero no o si
nos hemos visto Aquí medio engañados no
voy a venir por aquí lo voy a lanzar
ahora otra vez tenemos nuestro fichero
quiero Añadir uno manzana 5 2 mato el
programa tenemos manzana tenemos manzana
Okay entonces voy a venir por aquí voy
volver a arrancar mi programa qué pasaba
pensar todo lo que estábamos ejecutando
antes cómo nos lo estábamos cargando
porque en realidad Aquí sí que le
estábamos haciendo el W y estábamos
borrando el fichero realidad ya lo
borrás lo mejor en este caso pues sin
más yo me voy a venir por aquí y le voy
a dar otro nombre al fichero Y en vez de
llamarle mouredev XT le voy a llamar
pues mouredev shop. txt para intentar
asegurarme de que yo aunque me cargue
este fichero Ahora cuando lo arranque
muy bien Yo me puedo acabar cargando
esta parte fijaos okay mev ya no está y
el que queda es m dep Shop vamos a ver
ahora incluso con el código que teníamos
antes y vengo por aquí selecciono la uno
zana 5 do y ahora le digo que voy a
matar el programa m dep Shop Sigue
estando por aquí si ahora arranco de
nuevo el programa y me voy a mouredev
Shop Yo sigo teniendo manzana aunque
mouredev no lo tenga y si yo ahora
viniera aquí y seleccionara la opción de
Añadir uno más y pongo huevo 10 a un
dónde lo ha metido Ok a continuación ha
sido capaz de hacer el appen Así que muy
importante tener en cuenta Cuáles son
los modos primero que ties que utilizar
y Cómo estáis trabajando con el fichero
para ver si de verdad estáis
interactuando con el fichero que es o
estáis interactuando con otro vale me he
detenido mucho en esto porque quería
explicar bien esta parte porque es la
rara un poco de que Ey estábamos
perdiendo el fichero que estábamos
haciendo si yo ahora me viniera por aquí
y ya selecciono la opción ocho ya veis
ya ha desaparecido ya aparece tachado m
dep Shop el programa ya está funcionando
correctamente vale vamos ahora a la
opción dos la opción dos era consultar
producto Qué quiere decir que nosotros
tenemos que acabar pidiéndole el nombre
del producto que queremos consultar así
que sin más voy a venir por aquí y me
voy a quedar con el nombre que Quiero
consultar qué tendríamos que hacer ahora
ya tenemos este producto pero y ahora
Cómo sabemos dónde está ese producto en
cada uno de ellos pues lo primero vamos
a abrir nuestro fichero en modo lectura
yo ya tengo el nombre que Quiero
consultar lo voy a abrir en modo lectura
tengo mi fichero Y ahora qué tendríamos
que hacer Vamos a ver qué cosas tiene el
fichero file Ah mira me dice aquí Red
Line claro me le como una línea esto
podría estar bien no sé podríamos decir
por aquí voy a intentar leer las líneas
voy al fichero y voy a venir red Lines
Ah Lines es un array con lo cual yo
podría venir por aquí y empezar a leer
todas las filas en realidad Así que
vengo por aquí me pongo a leer las filas
filas y las voy a iterar por ejemplo for
Line inlines vamos a leerlas tengo todas
estas líneas lo que tendremos que acabar
comprobando aquí es Okay yo ya tengo
todas las líneas voy a ir línea tras
línea tendré que empezar a revisar si en
cada una de las líneas por ejemplo está
el nombre que yo le he metido Cómo
tendríamos que hacerlo claro lo
podríamos Buscar en toda la línea pero
si yo lo que quiero buscar el nombre a
esta línea le podría hacer un split
siguiendo qué qué tendría que hacer ese
split el Split que es la subdivisión Yo
podría hacerle un split por comas claro
Yo vengo por aquí le digo Mira Hazme un
split por comas Cómo por comas por coma
y espacio recordar que es como lo
estamos metiendo coma y espacio coma y
espacio y al hacer el Split por comas me
voy a quedar con el primer elemento el
elemento cero Entonces si el primer
elemento del producto es igual al nombre
que yo estoy buscando name entonces aquí
es donde hago el print de la línea
completa okay Y una vez tenemos esto
podría hacer un break y seguiría vamos a
ver qué pasa vamos a probar Ahora aquí
esta opción voy a cargarme es decir voy
a comentar el borrar para que podamos
hacer cositas y no estar borrando el
fichero para así yo tener que estar
metiendo nuevos productos cada vez y
podamos ir un poquito más rápido vale
voy arrancar Voy a Añadir un producto eh
manzana lo teníamos antes cinco manzanas
a $ voy a Añadir otro producto que es
huevo 10 huevos a uno Ahora me voy a ir
a la opción de eh mostrar productos que
era la 5co a ver qué pasa mostrar
productos aquí tenemos los dos me voy a
ir ahora a la opción de consultar
producto y me dice nombre y voy a poner
huevo veis huevo 10 1 Aquí está me lo he
encontrado Y si yo ahora me pusiera aquí
a buscar manzana por aquí manzana 52 si
yo me pusiera a consultar pera pues la
pera vemos he puesto pera y no me ha
encontrado nada Qué podríamos acabar
haciendo podríamos acabar revisando si
no me encontró ninguno acabar poniéndolo
nos da igual ya digo que eso ya sería
más tema de lógica aplicada a los datos
que estamos intentando consultar del
ejercicio más que el trabajar con el
fichero es que es lo que me importa ya
digo si lo hiciéramos bien podríamos eh
acabar aquí controlando si lo hemos
encontrado o no vale vamos a la opción
tres la opción tres lo que nos decía es
que tenemos que actualizar productos qué
podríamos hacer primero preguntar claro
Cuál es lo que queremos actualizar el
nombre la cantidad y el precio ya que lo
queremos actualizar una vez ya tenemos
todo esto podría podamos hacer algo
parecido aquí claro qué haríamos Buscar
en el fichero la línea esta tendríamos
que acabar dando con ellas perfecto Pues
casi podría acabar replicando esta parte
vengo por aquí vengo por aquí abro el
fichero y lo que tendría que acabar
buscando es vale Y cuál es la línea que
coincide con el nombre que yo quiero
actualizar en el momento que yo ya tengo
la línea Qué acabaría haciendo igual No
es tan fácil esto claro yo ahora vengo
por aquí y digo si ya existe el nombre
Qué acabaríamos haciendo si si ya existe
el nombre en realidad yo lo que podría
hacer es lo borramos no lo borramos lo
metemos de cero vamos a pensar lo
siguiente lo primero que voy a hacer es
intentar actualizarlo lo podría
actualizar podría ir a un fichero Buscar
la línea porque igual no es tan fácil
esa parte vale vamos a ver vengo por
aquí tengo el fichero dónde lo tengo
file Aquí está el file en el fichero qué
me dice en realidad aquí veo right Close
sick y poco más No claro cómo lo hacemos
cómo lo hacemos en realidad vamos a
hacer lo siguiente si yo encuentro el
nombre lo que voy a hacer es guardarlo
Cómo hacíamos el guardado me voy a
copiar esta línea porque ya era muy
parecida yo tengo el nombre la cantidad
el precio y aquí podéis decir Jer brce
pero es que así lo que vas a hacer es
escribir una nueva línea duplicada os lo
voy a explicar de la manera más más
simple trabajando una manera muy pura
con ficheros hay maneras más
inteligentes de hacerlo y mucho más
óptimas pero como ya digo esto se un
poco a lo que lo quiero mir es a que
intentemos pensar la lógica
independientemente del lenguaje de
programación qué haríamos qué haríamos
Pues yo estoy recorriendo todo el
fichero lo voy a recorrer completamente
pensar en esta lógica si existe meto mis
nuevos datos Y si no existe lo que hago
es sin más venir por aquí y escribir la
línea otra vez right de qué de la línea
Line y ahora Vais a pensar aquí bry la
vas a acabar liando claro la vas a
acabar liando porque tú Primero aquí no
puedes escribir aquí no puedes escribir
porque tienes el Red con lo cual le
podrías meter el append y lo agregarías
al final pero no nos vale agregarlo al
final yo lo que quiero es escribirlo
pero claro Cómo haces para escribirlo
porque necesitas primero acabar leyendo
cada una de las filas este redlines que
teníamos por aquí el fichero cada una de
sus filas y así yo ya puedo comprobar en
cada una de las filas pero claro si le
he hecho Wi lo he borrado qué ha pasado
ahora me lo he cargado todo qué
podríamos acabar haciendo con esto
podría intentar abrir el fichero antes
en modo lectura vengo por aquí crear una
variable que se llame Lines leer aquí
las líneas y acceder a las líneas que yo
he almacenado antes de borrar así me voy
a cargar el fichero voy a tener las
líneas aquí y si ya existe le meto la
actualización y si no existe lo escribo
tal cual está Vale Esta es la manera
como más más más más purista porque
depende mucho de las capacidades que
tenga el lenguaje y de los métodos que
estemos utilizando vale pero pensar la
lógica me quedo con lo que ya tiene el
fichero antes lo borro y si hay
actualización lo actualizo y si no le
meto el dato que ya tenía así soy capaz
de cambiar Vais a ver cómo lo voy a
hacer vamos a detener nuestro programa
vamos a ver lo que teníamos aquí manzana
y huevo voy a arrancar nuestro programa
voy a venir por aquí y le voy a Añadir
otro más pera le voy a Añadir 15 peras a
1.5 por ejemplo a ver Cómo va nuestro
fichero aquí lo tenemos perfecto me voy
a ir a la opción ahora de actualizar
producto y me dice Cuál es el nombre del
producto que quieres actualizar Por
ejemplo yo le voy a decir que Quiero
actualizar el huevo así que le voy a
poner huevo y me va a decir la cantidad
no quiero que tenga 10 le voy a poner 20
y el precio Imagínate que el precio se
ha mantenido es uno Okay fijaos lo que
va a pasar ahora hago esto y se ha
lanzado el proceso vamos al fichero
magia el huevo está actualizado Qué ha
hecho lo que ha hecho nuestro fichero es
lo siguiente primero ha leído todo el
contenido lo veis aquí ha leído todo lo
que ya tenía y lo he guardado en una
variable en Lines Entonces yo en Lines
Lo que ya tenía era un array con manzana
52 huevo 21 pera 15 1.5 siguiente que
lanzo lo que lanzo es escritura qué
hacía el escritura borraba el fichero
recordarlo claro Quiero borrar el
contenido del fichero porque yo ahora lo
que voy a hacer es revisar línea por
línea y es vale manzana La manzana es el
no nombre que yo quiero actualizar que
lo guardamos por aquí no pues lo meto en
la primera línea del fichero huevo es lo
que yo quiero actualizar Sí entonces en
vez de meter tal cual la línea meto la
línea con los datos actualizados Y
entonces ya entra en este caso el huevo
con 20 de cantidad pera es lo que quiero
actualizar No pues déjalo exactamente
como lo tenías antes este es como un
proceso muy manual muy poco eficiente
pero el más puro a nivel de lógica vale
seguimos qué más cosas teníamos que
hacer opción cuatro en la opción cuatro
teníamos que borrar el producto ostras
más de lo mismo opción borrar qué tendré
que hacer ahora en este caso pues es
bastante fácil casi la lógica que
tenemos que hacer es exactamente la
misma yo le voy preguntar por el nombre
del producto que Quiero borrar me voy a
guardar otra vez todas las líneas y lo
tenéis y después vuelvo a lanzar el
fichero pero en este caso también otra
vez en modo escritura y qué tengo que
hacer Voy ir leyendo línea por línea y
voy a ir escribiendo línea por línea
While write en el caso en el que no
coincida con el nombre porque eso va a
significar que si no coincide con el
nombre es que yo aú lo quiero mantener
en cambio Si coincide con el nombre es
el que yo quiero acabar borrando
entonces hago la misma jugada pero en
este caso solo me quedo con los nombres
que no son iguales al que yo he escrito
que es el que he querido borrar vale
siguiente ya veis que una vez lo
entendemos la lógica es bastante simple
lo siguiente que veíamos aquí mostrar
productos ya lo teníamos calcular venta
total para calcular la venta total yo
voy tener que almacenar en algún sitio
Justo eso que yo quiero acabar pintando
con el usuario lo que yo podría llamarle
pues le llamo Total que tiene valor cero
inicialmente qué tendríamos que hacer en
este caso leerlo Bueno ya hemos visto
Cómo leer tengo que recorrer todos los
ficheros me pongo a leer por aquí el
fichero Y qué tendríamos que hacerle a
estros ficheros vamos a recorrer línea
por línea esto ya lo hemos visto también
antes dónde tengo aquí venga revisión de
línea por línea y en en cada una de
estas líneas con qué me tendré que ir
quedando en este caso Me tendré que ir
quedando con la cantidad y con el precio
porque tendré que ir multiplicando el
precio de cada producto por la cantidad
de productos que hay en este stock decir
Me tengo que ir quedando con esta
cantidad quantity Dónde está quantity y
price claro cómo accedo a la cantidad
Cómo accedo al precio vamos a ver cómo
accedí al nombre así Line split
components aquí lo teníamos si me voy al
componente número uno va a ser la
cantidad si me voy al componente número
dos va a ser el precio el precio que
entendemos que es pues seguramente va a
ser un Flow es decir puede ser eh
decimal aquí lo que querramos controlar
la cantidad va a ser entera porque a mí
me da la gana no tiene sentido que sea
entera y cómo será el total pues el
total será el acumulado de la cantidad
por el precio matemática pura y dura una
vez ya tenemos todo esto y acaba este
proceso Yo vendré por aquí y haré un
print y voy a poner que era Eh bueno sin
más lo vamos a poner a continuación voy
a imprimir el total con esto ya
podríamos más o menos hacerlo y aquí
perdón el components no accedo al cero
es decir el componentes lo que quiero
acabar generando es el array de
componentes ya tenemos esto con el siete
en cambio lo que nos decía es que
teníamos que calcularlo pero para el
producto en sí esto es muy parecido en
realidad sería casi lo mismo pero
viniendo Yo por aquí y pidiéndole
primero al usuario el nombre del
producto que yo quiero calcular ía por
aquí le pediría el name en el momento
que yo ya tengo el name empezamos a
revisar aquí todas empezamos a tener Por
aquí todos los componentes y qué debería
hacer yo en este caso sí que tendría que
acceder a los components al cero y si es
igual al nombre que yo quiero calcular
name aquí es cuando haría la operación
de cálculo de cantidad del precio y del
total Okay Así de fácil y una vez hecho
esto pues lo que veíamos antes que
también yo me podría venir por aquí y
decirle venga haz un break y deja de
ejecutar esto porque ya lo has
encontrado Okay vamos a ver ahora un
poco si somos capaces ya con los datos
que tenemos aquí de calcular algo voy a
matar el programa voy a lanzarlo y voy a
decirle que quiero en este caso primero
calcular la venta total selecciono la
opción seis y a ver qué nos pone 52,5
Okay Qué es 52,5 fijaos eh Por aquí
teníamos las 20 unidades estos 20 estos
10 de momento tenemos 30 aquí lo tenemos
el 52,5 vale es decir es la suma Al fin
y al cabo de todos qu queremos de uno en
concreto y Imagínate que ahora lo que
quiero es de la pera pues quiero
calcular por producto siete y le digo
pera y con la pera me pone 22,5 Okay qué
nos falta también por comprobar el
borrar producto voy a decir ahora que
queremos Borrar producto en este caso
borrar producto opción y voy a decir que
Quiero borrar el producto manzana
manzana lo veis borrada la manzana
borrada de manera un poco tricky porque
ya sabéis que borramos el fichero nos
quedamos con lo que tenía antes y
escribimos todo menos lo que hemos dicho
que teníamos que borrar voy a volver
descomentar esta línea para que borre el
fichero en el momento que nosotros
salimos pero ya lo veis este proceso se
puede optimizar infinito es como una
manera muy pura de hacerlo Después según
el lenguaje va a haber un montón de
opciones para poder acceder a él y hacer
este tipo de cosas que yo estoy haciendo
a mano de manera mucho más fácil
podríamos reutilizar un montón de código
hemos repetido código a montones os lo
dejo todo repetido para que entendáis
perfectamente la lógica que hacemos
enada caso Pero esto se podría hacer en
muchísimo menos código pero no es el
[Música]
caso reto 12 Jason y xml primero vamos a
pararnos en explicar Qué es un Jason y
un xml básicamente es un formato de
fichero un formato de fichero igual que
seguramente conocéis un fichero txt que
es de texto plano Pues un Jason es un
formato que acaba en js y un xml es un
fichero que finaliza en punto xml son en
cierto modo ficheros que nos sirven para
estructurar datos Okay no nos quedemos
tanto con hablar 100% de la
especificación de lo que es un J un xml
básicamente quedaros con que son
ficheros de Guardado de datos
comunicación de datos configuración vale
Y que tienen una estructura muy concreta
y son dos ficheros que la primera parte
del ejercicio sobre todo trataba de que
buscares información sobre ellos aún no
vamos a ver 100% en dónde lo solemos
utilizar pero sí que está bien que
entendamos Que son dos tipos de ficheros
que utilizamos muchísimo en programación
básicamente porque los utilizamos hasta
para configurar nuestras aplicaciones
hasta para comunicarnos cliente con
servidor etcétera el ejercicio decía lo
siguiente desarrolla un programa capaz
de crear un archivo xml y Jason Que
guarde los siguientes datos haciendo uso
de la sintaxis correcta en cada caso
tenemos diferentes datos nombre edad
fecha de nacimiento listado lo primero
que voy a hacer es que yo tengo unos
datos y voy a intentar modelar estos
datos aún sin guardarlos si hicisteis el
ejercicio anterior ya hablábamos de
manejo de ficheros de escritura de
modificación de lectura de ficheros aquí
es como una evolución del ejercicio de
la semana pasada entonces lo que voy a
intentar hacer es bueno Cuáles son los
datos que yo tengo que guardar decía el
nombre la edad la fecha de nacimiento el
listado de lenguajes de programación
pues sin más yo voy a ir creando
variables mi nombre bry moure de momento
aún no sabemos nada de lo que nos pide
la edad age en mi caso 36 años e la
fecha de nacimiento por ejemplo 29 de
abril de
1987 lenguajes de programación
programming languages y lista de
lenguajes de programación por ejemplo
python coding y s vale ya tenemos
variables qué podríamos hacer ahora con
esto podríamos empezar a pensar qué es
lo necesario para empezar a escribir
este tipo de ficheros ya tenemos todo
esto Ahora lo siguiente que nos decía el
ejercicio era desarrolla un programa
capaz de crear un archivo xml y Jason
Que guarde los siguientes datos okay Así
que aquí teníamos que empezar a buscar
Cómo podría ser yo capaz de empezar a
estructurar estos datos aquí os lo
dejaba un poquito a lo tramp sabéis que
yo algunas veces os pongo sin utilizar
librerías del lenguaje o utilizando
librerías de lenguaje aquí no os puse
nada por qué porque de verdad quería que
os buscase un poquito la vida a ver qué
erais capaces de llegar a deducir okay
Porque Habrá gente que lo haya hecho a
mano Es decir 100% a mano de verdad
quería que os pelear con eso porque
igual hay alguien que lo quiere montar a
mano y Alguien que ha decidido Buscar
pues alguna utilidad de lenguaje que nos
ayude Okay entonces lo que yo suelo
hacer es que si no específico que no se
utilice en librerías es que en cierto
modo podéis hacerlo yo en este caso no
puse nada así que se trataba un poco de
que los buscaréis Por qué bueno porque
si lo queréis hacer a mano os iba a
ayudar a entender muy bien Cuál era la
estructura pero la realidad es que con
este tipo de ficheros en el 99% de los
casos lo que vamos a hacer es trabajar
con ellos a través de librerías Por qué
Porque nos van a ayudar a trabajar con
ellos de una manera más eficiente y más
segura Okay Entonces ahora aquí depende
un poco del lenguaje en el que estéis
pero por ejemplo si yo quisiera trabajar
con xml en python por ejemplo hay una
librería dentro del propio lenguaje que
se llama xml Okay en concreto xml y3
Okay en concreto xml y3 Element 3 Este
es un módulo que nos permite manipular
xml de una manera un poquito más fácil
quien lo haya hecho sin librerías
fantástico Por qué Porque así os
peleaste exactamente con Estos tipos de
ficheros Y eso es lo importante Pero
bueno vamos a intentar resolverlo de la
manera en la que yo lo haría si de
verdad tuviera que escribir estos datos
en un xml okay Así que ya que tengo todo
esto voy a decir que bueno Esto le voy a
meter un alias le voy a decir que es xml
okay Y aquí podríamos empezar a escribir
los datos vale vamos a empezar con la
parte del xml ya que yo tengo estos
datos Cómo tendríamos que hacer para
guardar el xml Mira me voy a crear una
función Def save xml una función para
tenerlo un poquito estructurado y qué
tendríamos que hacer ahora aquí Buscar
cómo escribir el xml lo primero que
tenemos que tener en un xml es un nodo
raíz el xml al final lo que tiene son
tags que tienen que ir abriendose y
cerrando para ar cada uno de los
elementos que guardamos con lo cual yo
lo que tengo que hacer es primero tener
el elemento raíz con esta librería yo ya
tengo la posibilidad de escribir un
elemento y de darle un nombre al
elemento qué podría hacer yo bueno ya
que esto es un programador una persona
no sé le podría llamar programmer por
ejemplo pero lo que voy a hacer es le
voy a llamar Data sin más y esto para mí
va a ser el Root Por qué Porque pensar
que un xml tiene que ir anidando los
datos Y esto es algo que teníais que
haber visto en el momento que
empezasteis a trabajar con este
ejercicio y una vez tenemos los datos en
este Root ya tengo mi elemento principal
ya podría ir añadiéndole cada uno de los
datos Cómo creando subelementos creando
hijos de ru Child vale Cómo creo un hijo
pues con esta librería Yo podría crear
un subelement pero un subelement en base
a qué a Root al elemento principal Y qué
le tendría que decir pues también darle
un nombre al subelement claro Imagínate
que yo lo que quiero hacer es guardar un
elemento hijo por ejemplo que sea para
el nombre pues le tendría que decir el
subelement asociado al nombre pues va a
ser este okay Y así lo podría hacer y
una vez ya tengo este hijo en este hijo
le podría decir Y ahora cuál es el texto
pues el texto sería mi nombre bry moure
Okay Y eso lo podría ir haciendo con
cada uno de los elementos Qué pasa que
de esta manera sería bastante manual
Tendría que ir creando uno por uno por
qué no intento crear por ejemplo una
estructura que guarde todos estos
elementos así podemos ir un poquito más
rápido Okay me voy a crear un
diccionario y le voy a llamar Data y en
realidad en este diccionario voy a meter
mis elementos Pero bueno los voy a
guardar dependiendo del lenguaje que
utilicéis pues como lo tengáis que hacer
en este caso en python ya sabéis clave
valor vale Cuáles son las claves lo que
vemos por aquí voy a hacer que las
claves sea el nombre que yo les di a las
variables y el valor pues sin más lo que
ya teníamos porque así las claves ya me
pueden actuar de nombre de los propios
nodos y aquí estamos es decir ya tengo
mi dicionario qué podría hacer ahora Jer
Pues algo tan fácil como venga ahora que
ya lo tienes un diccionario podría
recorrerlo yo podría venir aquí for key
y for value in Data así ya tendría todos
los elementos Data items Así me pongo a
recorrer todos los elementos y ya sería
capaz de ir creando hijos y qué tendría
que ponerle de clave la clave de mi
dicción y de valor el valor de mi
villonario y ya sería capaz de crear el
xml por lo menos a nivel de estructura
de una forma bastante automática Okay
Vale cuando ya tenemos todos los
elementos en el Root qué tenemos que
acabar creando un xml lo que es ese
árbol de jerarquía es decir algo que
llamamos tri y cómo lo creamos Pues con
esta librería igual que hay un Element y
un subelement tenemos algo que es el
Element el árbol y qué entraría en este
árbol en realidad C rot el elemento
principal ya está y una vez ya tenemos
esto qué podría hacer pues este Tri digo
que lo quiero escribir y Con qué nombre
por ejemplo mour d. xml dándole ya la
extensión que hiciera falta Okay Vale
vamos a ver qué resulta Cuando ejecuto
esto voy a venir por aquí y voy a llamar
a mi función save xml y de hecho aquí
xml file le voy a dar este nombre Aquí
vamos a ejecutar esto a ver qué pasa
lanzo esto dice Uy parece que hay aquí
algún problema no lo sé claro se ha
escrito ojo fíjate Parece que ha
empezado a escribir algo Data name qué
ha pasado parece que tenemos algún dato
que nos empieza a dar problemas porque
dice hay un error en la serialización o
no sé qué Y nos dice ey no puedo
serializar el valor 36 por qué porque en
realidad yo estoy escribiendo un fichero
de texto aunque tenga un formato xml yo
tendría que asegurarme que este valor
siempre sea una cadena de texto Así que
ahora voy a venir por aquí y le voy a
decir conviértelo siempre en este vamos
a volverlo a lanzar qué tengo por aquí
ojo ya tenemos algo no está mal no tiene
pinta de un xml el nodo padre que era
Data y cada uno de los nodos hijos nodo
name nodo age nodo Birthday y nodo
programming languages está bien casi
Esto no es testo plano es decir yo aquí
lo que he guardado es como un listado
pero cada elemento en realidad tiene que
ser un nuevo nodo qué tendríamos que
hacer que en el momento que existe un
nodo que lo que tiene dentro son varios
elementos deberíamos crear otro hijo
otro hijo para cada uno de los lenguajes
de programación en este caso qué
podríamos hacer podríamos intentar
revisar si el valor que tengo aquí es
simplemente como Tenemos aquí un dato
único o tenemos varios qué podría hacer
pues sin más voy a hacer una
comprobación s el valor No si en
realidad nosotros tenemos una instancia
Sí qué es lo que tenemos que comprobar
si tiene tiene instancia el valor los
datos no Y si es una instancia de qué
esto Qué tipo de dato es es una lista
por ejemplo en python podemos
comprobarlo así decir si el valor es una
instancia de lista haz algo si no haz
otra cosa si no ya lo tenemos en
realidad era si no era una lista
Escríbelo y ya está no nos importa qué
tendríamos que hacer en este caso pues
en este caso tendríamos que guardar los
diferentes datos Cómo sabemos Cuáles son
esos diferentes datos los diferentes
datos el listado Es value okay vamos a
recorrerlo por item in value el value es
el listado qué tendría que hacer yo
ahora pues tendría que guardar cada uno
de los elementos ostras claro cada uno
de los elementos en dónde ya no
directamente en Child sino que debería
crear otro subelement ahora cuál sería
el padre el rot no sería Child Y qué
tendría dentro pues ya que tenemos un
listado le puedo llamar a cada uno de
los elementos em esto lo podríamos
guardar como un subelemento podríamos
perfectamente o simplemente ya que estoy
creando el subelemento podría acceder a
su propiedad text y meterle el ítem
vamos a ejecutarlo ahora de nuevo y
vamos a ver lo que tenemos ahora veis
que ya tiene mucho mejor pinta ahora en
el momento que detectó que programming
languages era un listado ya lo que hizo
fue crear un elemento hijo por cada uno
de los elementos del listado y la ha
llamado ítem por supuesto claro Hay un
em python un item cing un item Swift yo
le he puesto ese nombre le podríamos
haber llamado Language a cada uno pero
ya que es un listado lo he intentado
dejar como algo genérico porque nosotros
no sabemos si ahora le metiera un
listado que no es de lenguajes también
lo iba a hacer bien entonces de momento
lo que hemos hecho es crear una función
que sea capaz de guardar Por lo menos
datos que tengan hasta un nivel hasta
ahora ya tenemos nuestro xml por aquí y
nos decía también que debíamos leerlo
que debíamos acceder a él esto nos lo
decía el ejercicio si vamos al ejercicio
decía métele todo muestra el contenido
de los archivos claro Así que una vez lo
guardamos vamos a leerlo Okay cómo lo
leemos esto ya es bastante fácil sobre
todo Si hicisteis el ejercicio anterior
vale ya tenemos guardado el xml ya lo
veis por aquí tenemos un xml perfecto
Pues ahora lo que voy a hacer es
intentar leer el xml cómo lo puedo hacer
esto ya lo vimos muy parecido en el
ejercicio anterior Simplemente si yo
quiero abrir un fichero with open el
nombre de fichero Cuál era el nombre de
fichero xml file y le voy a llamar as
xml Data Y cómo puedo mostrar los datos
en concreto de este xml pues sería tan
fácil le voy a hacer un print de los
datos Y ya está no vengo por aquí
xml Data okay Y una vez tenemos este
fichero yo lo que le puedo hacer es
venga lelo vamos a lanzar qué vemos por
aquí Data name age Birthday programming
básicamente Ya estoy imprimiendo por
terminal justo el ejercicio lo que
teníamos por aquí lo veis sin ningún
problema ya hemos sido capaces de
escribir el xml y de leerlo y ya lo lo
último que nos decía el ejercicio era
bórralo Okay cómo lo borramos por
ejemplo en python me voy a importar el
sistema operativo este módulo llamado
sistema operativo Por qué Porque si
accedo a os puedo acceder a una
operación que sea capaz de eliminarlo
simplemente llamo a remove y le paso la
ruta del fichero en este caso está la
raíz xml file yo ahora lo lanzo esto lo
va a imprimir y lo va a acabar borrando
Okay ya está listo la primera parte del
ejercicio qué nos decía el ejercicio que
hagamos Exactamente lo mismo pero
también con un Jason okay Así que vamos
a anotar por aquí que yo ahora quiero
hacer lo mismo pero con un Jason cómo
podremos trabajar con un Jason Pues
también con una librería en este caso
aún más simple import Jason ya tenemos
por aquí el Jason Y ahora qué tendría
que hacer para escribir el Jason el
Jason en realidad sí que es bastante
fácil es bastante fácil trabajar con él
porque lo único que tenemos que hacer
primero es crear el fichero Así que voy
a venir por aquí voy a crear primero un
nombre del fichero Jason file Jason file
y se va a llamar mouredev Jason vale
vamos a abrirlo como si fuéramos a crear
un fichero en blanco with open Jason
file Y si queríamos darle la posibilidad
de escribir abrirlo y escribirlo porque
aquí solo estamos abriendo para leerlo
con lo cual sin ningún problema pero si
queremos escribirlo Dentro de este
contexto Nosotros le tenemos que decir
venga Dale permisos de right esto lo
vimos en el ejercicio anterior una vez
ya tenemos el fichero creado si
simplemente le damos un nombre vale Y
qué tenemos aquí en este Jason Data pues
la posibilidad de poder escribirlo vamos
a utilizar la librería Jason Y aquí
tiene una operación muy Guay que se
llama dump que es la posibilidad de
nosotros pasarle un objeto y que él ya
lo escriba en formato Jason tenemos ese
objeto Sí el Data Y dónde lo queremos
guardar en realidad lo queremos guardar
en este Jason Data al que habíamos
accedido aquí vale vamos a lanzar
nuestro programa vemos un fichero
mouredev J Y qué tenemos aquí así de
fácil ha sido capaz de El diccionario
que nosotros le pasamos guardarlo
directamente en formato json ya se ha
apañado él okay esto es mucho más rápido
es decir Jason en cierto modo ha sido
una evolución de xml para los
programadores porque es muchísimo más
fácil manejar un Jason que un xml es
muchísimo más rápido es muchísimo menos
verboso Okay entonces una vez ya lo
tenemos por aquí qué podríamos hacer lo
siguiente bueno simplemente acceder a él
recordar que también nos decía he y esto
lo tienes que imprimir por consola Cómo
podríamos imprimirlo por consola aquí ya
lo habíamos visto que podríamos Acceder
al fichero veis por aquí Incluso si lo
queremos dejar bonito le podríamos
acabar diciendo Mira esto con permisos
únicamente de lectura vale una vez voy a
comentar la eliminación porque ahora voy
a Acceder al file con lectura vamos a
tener el dacta y vamos a leerlo vamos a
arrancar nuestro programa y aquí lo veis
primero se imprimido el xml y a
continuación se ha imprimido el Jason ya
está así de fácil si quisiéramos
borrarlo de momento lo voy a dejar
comentado para que veamos que somos
capaces de hacer las cosas Pero bueno
sería solo pasar el fichero y esto ya lo
borraría vale Esto es lo único que
teníais que hacer en la primera parte
sobre todo familiarizar con lo que sería
este tipo de estructura ahora vamos a ir
un poquito a la parte avanzada decía
utilizando la lógica de creación de los
archivos anteriores creo un programa
capaz de leer y transformar en una misma
clase custom de tu lenguaje los datos
almacenados en el xml y en el json Wow
claro Nosotros hemos tenido la
posibilidad de guardarlos pero lo
habitual no es tanto hacer esto sino la
operación contraria Tú ya tienes creados
Los ficheros Tú ya tienes podemos
dejarlo aquí con todo no que esto los
creaba los leía y los borraba Pero si yo
ahora quiero igual que tenemos este save
xml me voy a crear otra operación que
sea aquí save Jason para para acceder
rápidamente como lo escribíamos así sin
más y ahora puedo llamar a save Jason
save Jason Okay muy bien ya tenemos la
posibilidad de crearlo y borrarlo lo
siguiente que nos decía es utilizando la
lógica de creación utilizando la lógica
de creación Cuál es la lógica de
creación save xml save Jason o si
quisiéramos create xml por si queréis
que se entiende mejor create Jason vale
utilizando esta lógica de create Jason
por un lado create xml aquí aunque los
hayamos borrado hace un rato me los voy
volver a crear Vale ahora lo que
teníamos que hacer era lo contrario es
Sí tú ya sabes leerlos pero no se trata
solo de leerlos decía utilizando la
lógica de creación de los archivos
anteriores crea un programa capaz de
leer y transformar en una misma clase
custom de tu lenguaje los datos
almacenados ostras en una clase en un
tipo de estructura que ya hemos visto
vale de momento voy a crear una clase
aunque no tenga ni idea de Cómo
transformar los datos xml y Jason en una
clase si Quiero crear una clase Pues
bueno Class de momento me voy a ir
creando una clase la clase sin más le
voy a llamar Data porque es lo que yo
estaba guardando Y qué tendremos pues
Tendremos una serie de datos Qué tipo de
datos me voy a definir un init Por qué
Porque si yo quiero guardar datos en una
clase Necesito un inicializador esto
sabéis que depende un poco del lenguaje
pero básicamente es crear una clase con
una serie de parámetros Y qué parámetros
le vamos a pasar aquí el name el age el
Birthday y los lenguajes de programación
una vez ya tenemos Esto me los voy
guardando self igual a name igual que
tengo esto lo puedo hacer con todos los
datos esto es la creación de una clase
que ya hemos visto en otra lección de la
ruta de estudio sin más yo así sería
capaz de crear Pues en este caso una
estructura una clase que me guarde los
datos Y ya está Pero dónde está lo
difícil de todo esto lo difícil de todo
esto es que ahora necesitaríamos la
capacidad de hacerlo al inversa que
aunque yo tenga esta clase cómo soy
capaz de leer los datos una vez he
creado un fichero xml y Jason y de
transformarlos aquí vamos a ver cómo
podríamos hacerlo al revés ya tengo esto
vamos a ir a la parte de lectura Cuál
era la parte de lectura por ejemplo del
xml aquí teníamos el xml vamos a irnos a
leerlo otra vez Pero ahora no solo Vamos
a imprimir ahora vamos a intentar crear
una clase Data con estos datos será
difícil no será difícil Pues no lo sé
vamos a ver cómo podríamos hacer
teníamos los datos los lo primero es
intentar montarlo a revés con la
librería xml nosotros tenemos una
operación que se llama from stram cuando
nosotros leemos el fichero qué imprimí
antes una cadena de texto un churro con
el texto yo ya tengo una operación en la
que le paso el texto que es el xml Data
aquí y ya voy ser capaz de empezar a ir
generando cada uno de los datos de mi
xml okay Y qué tendré con esto en
concreto en concreto en realidad lo que
tendré aquí es el Root vale bueno no
está mal y una vez ya tengo esto qué
deberíamos ir haciendo recuperando cada
uno de los datos claro tengo el rot Qué
es el Root como tal dice el Root es un
Element Y qué vemos que tiene aquí Bueno
la posibilidad de añadirle de limpiarlo
de extenderlo de encontrar ojo y si yo
ahora aquí me pongo a buscar a cada uno
de los elementos que yo necesito para
crear mi clase en concreto Yo podría
ponerme a buscar cada uno de estos datos
Cuáles son estos datos yo puedo hacer un
find de qué del name cómo lo habíamos
guardado teníamos aquí name age Birthday
programming languages Okay pues si yo
busco el nombre es posible que yo lo que
acabe recuperando aquí es mi nombre y en
dónde lo tengo en el texto del nombre
con lo cual si yo ahora me quedo con
este valor esto en realidad es el name
vamos a irnos a los simples tengo el
name qué más me pasaría me pasaría
Exactamente lo mismo con el H y con el
Birthday eran textos sin más Qué era lo
raro lo raro en realidad era los
programing languages si yo ahora me voy
aquí y Busco programing languages lo que
yo voy a tener dentro del xml es otra
estructura con más elementos qué hacemos
pues bueno no sería tan difícil lo que
pasaría es que en el momento que yo
estoy intentando acceder a esto en
realidad s va a tener un listado de
elementos sería tan fácil como que yo
ahora una vez ya tengo esto Qué sería si
yo tengo un listado de elementos en
realidad esto es lo mismo que hacer for
item in aquí en este listado lo veis y
ahora aquí Podría empezar a acceder a
cada uno de los ítems no es tan
complicado verdad y ahora aquí Tendría
que ir guardando cada uno de los
elementos cada uno de los elementos Cómo
Pues en realidad yo podría crearme un
listado de programming languages vacío y
en este programming languages podría ir
añadiéndole los diferentes elementos
cómo son estos elementos Pues yo vendría
por aquí le haría un append y en it
tengo un elemento si accedo a su texto
voy a tener cada uno de los elementos Ya
está ya tengo todos estos ya puedo crear
mi clase en realidad ya podría crear mi
clase yo ahora podría venir por aquí y
decir Data Class le puedo acabar
llamando porque vamos a crear Ya esta
clase creo mi clase Data Y qué me pide
el nombre ya lo tengo name y el age lo
tengo también Y qué más el Birthday lo
tengo también y programming languages
los tengo también Aquí ya está he sido
capaz a hora de ir hacia atrás buscando
cada uno de los elementos que tengo y
una vez Ya los tengo todos Pues los
acabo metiendo por aquí vale o puedo
llamarle Data from xml para después ver
lo distinto okay Bueno qué pasaría ahora
si yo accedo aquí y le hago un PR Data
lo lanzamos qué me dice aquí dice Uy
claro parece que hay un error qué ha
pasado xml Data Qué es este xml Data
dónde nos está dando el problema nos
dice from stram este xml Data puede que
esté pasando algo por qué por qué
estamos teniendo aquí un problema Yo
podría imaginar que en principio esto
Debería ser suficiente verdad yo estoy
como leyendo el fichero ya tengo los
datos Está bien qué nos falta aquí
nosotros en el momento que tenemos el
fichero cómo lo leemos falta el Red
nosotros así solo teníamos la referencia
al fichero pero no teníamos los datos
del fichero veis que ahora Aquí está
fichero por aquí lo empieza leer y
teóricamente tenemos esto Data object
algo es algo Si queremos ver todos los
datos que tenemos Tenemos aquí podría
pasarlo a un dicionario le podría decir
muéstralo en formato dicionario la clase
o mira Class xml Class le voy a llamar y
le voy a decir imprímelo en formato
diccionario tengo exactamente lo mismo
que tenía en el fichero aquí lo veis he
sido capaz de realizar una
transformación a la inversa queremos
hacer esto mismo pero ahora con el Jason
pues más de lo mismo voy a venir por
aquí en este caso lo que voy a abrir es
el Jason file y voy a tener Jason Data
como decía antes trabajar con un fichero
Jason es muchísimo más fácil Cómo
creemos que tenemos que hacer para leer
el diccionario y todo eso Pues sería tan
fácil fijaos lo que voy a hacer me voy a
crear la clase directamente Jason Class
me voy a crear la clase y voy a empezar
a acceder a cada uno de los elementos a
cada uno de los elementos qué teníamos
aquí name H Birthday y programing
languages vale Cómo accedo a los
elementos del Jason lo primero que
necesito es acceder a su Data recordáis
algo así como cuando estaba creando Pues
esta raíz voy a venir por aquí y cuál es
la Data en realidad es el
jasona Red Aquí tengo los datos Y una
vez ya tengo los datos este red qué va a
hacer va a ser capaz de crear un
diccionario con lo cual en realidad es
un js dict un diccionario si yo ahora
accedo a cada uno de los valores del
diccionario por su nombre el nombre el
age el Birthday y los lenguajes de
programación tan fácil como que casi me
salto todo esto y accedo directamente a
ellos para transformarlo en esta clase
aquí ya no tengo los problemas del
listado es capaz de entenderse
perfectamente porque lo que tenemos
siempre en los Jason es una estructura
que dentro puede tener otra estructura
listados es más de lo mismo vale una vez
ya tengo esto lo imprimimos a ver si nos
lo ha creado bien Vamos a imprimir Jason
cl. dict si queréis para que nos lo deje
bonito lo ponemos así lo lanzamos y me
dice Uy el diccionario que no me
encuentras name Por qué Qué problema
tenemos ahora me dice que no soy capaz
de encontrar name dentro del diccionario
A ver vamos al Jason no tengo un name sí
que tengo un name Qué pasa aquí dice
Stream indicat must be in tagers not str
qué será esto qué transformación estamos
haciendo aquí Qué estamos intentando
Buscar Y qué está dando qué está
fallando Cómo empezaríamos a revisar si
estos datos están bien o no lo están
Bueno vamos a ver por ejemplo si este
diccionario está bien me voy a ir al
Jason Dick vale diccionario perfecto
name age Birthday programming languages
perfecto pues vamos a ver ahora qué es
lo siguiente que tendríamos que hacer
aquí ver si podemos Acceder al nombre al
diccionario al Birthday esto lo lanzamos
qué lo vemos error Dick name parece que
aunque nosotros tengamos este
diccionario por aquí no le gusta Por qué
Porque este Jason Data aunque no esté
pintando un diccionario bien en realidad
no lo está entendiendo tenemos un
dicionario igual esto que tienes tú por
aquí no es un diccionario vamos a
revisarlo type y a ver si esto es un
diccionario o no nos dice Class Stream
ojo Qué problema estamos teniendo aquí
en realidad tenemos un problema bastante
grave que es que nosotros nos hemos
puesto a leer un fichero pero que en
realidad este fichero es una cadena de
texto aquí hay que hacer un pequeño
extra que es que nosotros con este red a
la inversa no nos llega tendríamos que
irnos a la clase Jason y aquí llamar aow
y con este load si nosotros ya le
pasamos el fichero a ver ahora qué tiene
aquí ojo ya es un diccionario ya no es
una cadena de texto con lo cual nosotros
ahora nos podemos venir por aquí y al ya
tener un diccionario en vez de una
cadena de texto ya nos hace toda la
transformación aquí la veis bueno
peculiaridades que tiene cada uno de
estos qué más nos pedía el ejercicio
decía capaz de leer y transformar en una
clase y después ya pues borrar Los
ficheros sin ningún problema una vez ya
lo tenemos vamos a hacerle el remove de
cada un voy a venir por aquí y voy a
venir por aquí xml file Y esto es lo
mismo que también le voy a dejar puesto
por aquí vale teníamos el remove y el
remove lo lanzamos lo revisamos y aquí
vemos las impresiones de cómo era por un
lado el xml aquí arriba y de cómo
tenemos los print de la primera lectura
del Jason del diccionario por este lado
que es una clase y exactamente otro
igual hemos visto que estas dos últimas
líneas es la transformación del xml y
del Jason a una clase veis que tenemos
lo mismo lo veis aquí Exactamente igual
Okay solo que hemos visto esta pequeña
diferencia en el momento que nosotros
estamos buscando esta parte le estamos
haciendo la transformación siempre a una
cadena de texto porque es la manera que
nosotros tenemos a la hora de leerlo que
queremos que los dos sea Exactamente
igual podríamos hacerle una
transformación siempre a un Stream para
asegurarnos yo podría leer el Birthday
que es lo que yo sé que es raro y le
digo Mira Aunque sé que lo guardaste
como un integer en este este caso te
quiero guardar igual te intento
transformar entonces intentamos hacerle
hago este Jason cuando lo leo podría
acabar transformándolo un Stream esto ya
un poquito como vosotros queráis en mi
caso ya que estamos en python y nos da
igual los tipos de datos porque
precisamente son dinámicos voy dejar que
los transforme según venga voy a volver
a hacer el ejercicio para que veáis lo
que guardamos veis que en este caso lo
guardábamos como un entero en cambio en
el xml lo guardamos siempre como texto
por eso hay esa pequeñita diferencia
pero que en nuestro caso pues no nos
molesta hemos sido capaces de
transformar tanto el xml como el Jason
en una misma clase que hemos creado por
aquí y así yo creo que ya tenemos todo
lo que nos pedía el ejercicio y así
llegamos al final de esta primera parte
del curso de lógica de programación
desde cero Recuerda que la web de la
ruta de estudio puedes seguir
consultando los nuevos ejercicios y que
Tú mismo puedes aportar tus correcciones
Únete al discord y a la actividad en
directo y sígueme en redes sociales Si
no quieres perderte el contenido que
creo de forma diaria Espero que este
curso te haya resultado útil y que poco
a poco te ayude a programar de manera
más lógica Muchísimas gracias por tu
tiempo nos vemos en un nuevo tutorial
hasta luego
[Música]
[Música]
More transcripts
Explore other videos transcribed with YouTLDR.

004_ شروط الوضوء وفرائضه وسننه _دورة شرح ( كتاب الفقه الميسر) _ م علاء حامد
Alaa Hamed - علاء حامد · Arabic

BANDUNG BONDOWOSO KETHOPRAK TEMANGGUNGAN
Kethoprak Temanggungan · English

MENYUSURI KAMPUNG DI JAKARTA YANG TIDURNYA SHIFT-SHIFTAN DENGAN RUMAH 2X3 METER | #VERSPEKTIF
Volix Media · English

كيف تكون مفاوض جيد مع من حولك ؟ من كتاب Never split the differences
M2M · English

Apple Lost the AI Race
Marques Brownlee · English

Drewermann: Immanuel Kant - Verstand und Vernunft. 10. Wintervorlesung 24/25 Philosophie & Religion
Drewermann Kanal · German

Kants Philosophie - Was ist der Verstand?
Die Stimme der Vernunft · English

CONVERSATORIO VIRTUAL: “SISMOS 2026: LECCIONES Y FUTURO AMBIENTAL”
Postgrado UNET · Spanish

We WON the AT&T Annihilator Cup + $1100 Knife
TheBurntPeanut · English

Lara Trump REVEALS Her Fitness Routine & Diet Rules | The Riley Gaines Show
Riley Gaines · English

Our Land is the Sea (Full Film)
UH Mānoa Center for Southeast Asian Studies · Indonesian

Teks Argumentasi | Bahasa Indonesia SMA
kejarcita · English
Get the TLDR of any YouTube video
Transcribe, summarize, and repurpose videos in 125+ languages — free, no signup required.