Full Transcript

·YouTLDR

Curso COMPLETO de LÓGICA DE PROGRAMACIÓN Desde Cero

7:29:52SpanishTranscribed Jul 25, 2026
0:00

seguro que alguna vez has escuchado esta

0:01

expresión a programar se aprende

0:03

programando la realidad es que no puedes

0:05

aprender a programar si no practicas Y

0:07

eso es justo lo que vamos a hacer en

0:08

este curso desde cero de lógica de

0:10

programación vamos a seguir una ruta de

0:12

estudio con el lenguaje de programación

0:14

que tú elijas durante más de 7 horas y

0:16

13 ejercicios y donde tú también podrás

0:18

participar de manera activa enviando tus

0:20

correcciones Así que comenzamos a

0:22

[Música]

0:24

picar Bienvenidos a mour dep by brce

0:27

moure tutoriales de programación y rollo

0:30

de software Mi nombre es bryce moure Soy

0:33

ingeniero de software desde hace más de

0:35

14 años cuando comenzamos a aprender un

0:37

lenguaje de programación solemos cometer

0:39

el error de dedicarnos a visualizar

0:40

únicamente tutoriales durante horas algo

0:43

que puede resultar agradable ya que cada

0:44

vez se nos van presentando más conceptos

0:46

pero una vez finalizamos los tutoriales

0:48

es muy habitual sentirse con la

0:50

sensación de que nosotros mismos no

0:51

seríamos capaces de idear un algoritmo

0:53

una lógica que resuelva un problema y

0:55

que haga uso del lenguaje de

0:56

programación que durante tantas horas

0:58

hemos visto sus tutoriales o leído la

1:00

teoría esto como he dicho al principio

1:02

es principalmente por un motivo falta de

1:04

práctica pero de una poca práctica No de

1:07

muchísimas horas de práctica muchas más

1:09

de la que le hemos dedicado a estudiar

1:11

la teoría esa es la realidad y por eso

1:13

con este curso quiero ayudarte a

1:15

conseguirlo la lógica de programación es

1:17

el proceso de aplicar una secuencia

1:18

estructurada y coherente de pasos para

1:20

resolver problemas específicos mediante

1:22

un lenguaje este curso forma parte de

1:24

una actividad de nuestra comunidad

1:25

llamada retos de programación cada

1:27

semana y Durante los últimos do años

1:30

propuesto y resuelto ejercicios para

1:31

mejorar en programación y aprender a

1:33

utilizar un lenguaje tienes todo en

1:35

retos de programation comom desde más de

1:38

100 ejercicios A diferentes proyectos

1:40

para tu portafolio y donde podrás

1:42

encontrar la última iniciativa llamada

1:44

roadmap o ruta de estudio en la que

1:46

vamos a centrar este curso con esta ruta

1:48

de estudio vas a aprender desde cero el

1:50

lenguaje de programación que tú elijas

1:52

como el que tú elijas exactamente ya que

1:55

este curso no se centra tanto en que yo

1:57

explique un lenguaje concreto sino

1:59

Cuáles son los conceptos y fundamentos

2:01

comunes entre la gran mayoría de

2:02

lenguajes porque Sí Prácticamente todos

2:05

son iguales a nivel fundamental

2:06

únicamente cambia su sintaxis Así que

2:09

cómo funciona este curso en cada clase

2:11

te voy a explicar un concepto teórico de

2:13

los lenguajes de programación esta

2:15

teoría la vamos a llevar a la práctica

2:17

resolviendo diferentes ejercicios

2:19

lógicos la manera real de conseguir que

2:21

esta teoría se transforme en una pieza

2:23

de un puzzle que poco a poco vamos a

2:24

combinar con otras y así aprender a

2:26

resolver ejercicios más complejos todas

2:28

estas lecciones las encontr harás en

2:30

retos de programación comom barrad map y

2:33

en cada lección tendrás los siguientes

2:35

recursos un enunciado para presentar que

2:37

se va a estudiar y qué ejercicio

2:39

Tendremos que resolver para aplicar la

2:41

teoría aquí te recomendaría que primero

2:43

leas cada ejercicio e intentes buscar

2:45

algo de información por tu cuenta ya que

2:47

esa es una de las habilidades que

2:48

tenemos que desarrollar como

2:49

programadores y que va a ayudarte a

2:51

marcar la diferencia en la primera clase

2:53

incluso vamos a hablar de Cómo encontrar

2:55

esos recursos para que aprendas el

2:56

lenguaje que tú quieras aparte del

2:58

ejercicio cada lección tendrá asociada

3:00

una corrección de código propuesta por

3:02

mí intentando que esa solución no sea

3:04

demasiado simple ni demasiado compleja

3:06

para que la pueda entender todo el mundo

3:08

una solución que yo elaboro y explico

3:10

Durante este curso y que en la web

3:11

también tendrás por separado el enlace

3:13

tanto del código como del vídeo pero

3:15

cómo dices que este es un curso para

3:17

aprender cualquier lenguaje si tú estás

3:19

usando python para resolver el ejercicio

3:21

como he dicho este no es un curso de

3:23

python es un curso de lógica y todos los

3:25

lenguajes poseen los mismos fundamentos

3:27

yo he necesitado elegir un lenguaje para

3:29

poder ejecutar el código Pero lo

3:31

importante es que también vas a tener tu

3:33

disposición las correcciones de las

3:34

lecciones en el resto de lenguajes en la

3:37

web en cada uno de los ejercicios

3:38

tendrás esta opción comunidad accediendo

3:40

así a las correcciones en todo el resto

3:43

de lenguajes todas ellas aportadas por

3:45

la comunidad Mira todas las opciones que

3:47

tenemos en este ejercicio y créeme

3:49

cuando te digo que lo importante no es

3:50

el lenguaje sino nuestra capacidad de

3:52

entender los fundamentos y aplicar

3:54

soluciones Así que déjame en comentarios

3:56

con Qué lenguaje vas a realizar el curso

3:58

si en la web de roadmap seleccion as ver

4:00

el ranking podrás descubrir que no te

4:01

miento aquí se visualiza un listado de

4:03

todos los lenguajes que ya está

4:05

utilizando la comunidad para resolver

4:07

los ejercicios su porcentaje de uso e

4:09

incluso el listado de usuarios teniendo

4:11

en cuenta sus aportaciones estos datos

4:13

se actualizan una vez al día y tú puedes

4:15

ser una de las personas Que aparezca las

4:17

primeras posiciones de ranking en la web

4:19

se explica cómo puedes aportar tus

4:20

propias correcciones para que se

4:22

incorporen al proyecto de código abierto

4:24

visita la sección de preguntas

4:25

frecuentes Y recuerda que todo el código

4:27

está disponible en el repositorio de

4:29

gith llamado roadmap retos programación

4:31

aquí es donde encontrarás todos los

4:33

ejercicios resueltos en los diferentes

4:35

lenguajes y donde también podrás

4:36

consultar las instrucciones para

4:38

participar con tus correcciones dedícale

4:40

unos minutos a leer toda esta

4:42

información ya que es muy importante

4:43

para realizar de forma correcta el curso

4:45

también pedirte un único favor que es si

4:47

quieres apoyar esta iniciativa hagas

4:50

estar en el repositorio simplemente es

4:52

un clic y ayudas a valorar este recurso

4:54

aportando tus correcciones también

4:55

ayudarás a que este recurso cada vez sea

4:57

más valioso en cada una de las lecciones

4:59

es decirte que también podrás encontrar

5:01

su nivel de dificultad y una sección

5:03

extra con otro reto un poco más complejo

5:05

para que puedas seguir practicando lo

5:07

aprendido y que sinceramente te

5:08

recomiendo que siempre intentes hacer ya

5:10

antes de empezar recordarte que esta es

5:12

una actividad que realizamos de manera

5:14

semanal desde Twitch y en directo este

5:16

curso tiene 13 lecciones pero en la web

5:18

puedes consultar los nuevos ejercicios

5:20

La idea es crear cursos agrupando

5:22

bloques de lecciones ya finalizadas lo

5:24

que quiere decir que a futuro tendrás

5:26

una segunda Tercera y hasta cuarta parte

5:28

de este curso a que avancemos Pero como

5:30

te digo puedes seguirlo semana a semana

5:32

desde la web y las emisiones en directo

5:34

por último invitarte a unirte al

5:36

servidor de discord de nuestra comunidad

5:38

donde podrás reunirte con más de 70.000

5:40

personas que están aprendiendo un lugar

5:42

para compartir preguntar y ayudarnos

5:44

también podrás consultar en la sección

5:46

de eventos cuando realizo las

5:47

transmisiones en directo entre ellas la

5:49

actividad de la ruta de estudio de

5:51

programación en la que se basa este

5:53

curso y ahora sí bienvenido y Bienvenida

5:55

al curso de lógica de programación desde

5:57

cero

6:00

[Música]

6:03

si os vais a la web y ya pincháis en

6:05

github o os vais al primer reto de

6:07

programación que vamos programar hoy y

6:08

le dais al botón de ejercicio os va a

6:10

llevar al github aquí es donde va a

6:13

estar el ejercicio todas

6:15

eh No sé todas las reglas que yo os

6:18

quiera poner van a estar aquí escritas

6:19

os dije que había un tutorial de cómo

6:21

participar mirar instrucciones

6:24

aclaraciones guía rápida Vale hasta cómo

6:26

trabajar con giop está todo está

6:29

absolutamente todo aquí aquí veis por

6:31

ejemplo el reto de programación primer

6:33

reto aquí estará mi código el vídeo las

6:36

soluciones de la comunidad todo si

6:39

utilizáis os prometo 10 minutos de

6:41

vuestro tiempo en leer web y repositorio

6:43

o incluso los repositorios del año

6:45

pasado Pero bueno vamos a quedarnos un

6:47

poco con lo que empieza hoy eh Aunque

6:49

todo lo del año pasado también está

6:51

explicado y también sigue más o menos el

6:53

mismo formato Okay Eh os acabaré

6:55

enterando perfectamente si no también

6:57

discord y si no me preguntáis a mí o le

6:59

preguntáis a la comunidad o lo que sea

7:00

vale al principio em habrá que

7:03

esforzarse un poquito más entender que

7:05

Oye va a estar empezando si nunca habéis

7:07

participado en los retos Pues igual os

7:08

cuesta un poco más por cómo interactuar

7:10

con git o con github o con la dinámica o

7:13

que enviáis el ejercicio igual hay que

7:14

modificar algo porque se ha hecho mal

7:17

Bueno cualquier cosa Vale también os

7:19

digo que por favor H tengáis muy en

7:23

cuenta muy en cuenta todo lo que pone en

7:26

la web todo lo que pone aquí en el

7:28

repositorio por qué porque incluso

7:30

cuando Vais a enviar vuestra corrección

7:32

hay una plantilla hay una plantilla que

7:35

os va a saltar Esta es la plantilla que

7:36

no hace falta eh incluso ni leerla Pero

7:39

bueno pide cosas muy fáciles os dice Oye

7:41

asegúrate de que el título de p request

7:43

con el que estás enviando tu corrección

7:45

pues tiene este formato que el nombre

7:47

del fichero es el nombre de tu usuario

7:49

de github eh aquí veis 19 purri sin

7:52

atender es posible que de estas 19 15

7:55

Sea gente que no ha puesto bien eh su

7:57

nombre de usuario y con lo cual no se

8:00

puede aceptar esa p request no se puede

8:02

aceptar ese código porque si no podría

8:05

entrar en conflicto con otra persona que

8:07

quiere enviar el ejercicio y así también

8:09

queda registrado Cuál es exactamente las

8:12

correcciones que ha enviado cada usuario

8:14

vale mira la primera vez que participo

8:16

super Entiende todo vale así que de

8:18

verdad que si hay alguna equivocación No

8:20

pasa nada eh Jer está Roswell está

8:23

control también para ayudaros em desde

8:25

la parte de moderación estar revisando

8:27

todas las prs hacerles caso pero también

8:30

intentemos

8:31

em quitarles trabajo a toda la gente que

8:35

está ayudando gratis en la comunidad y

8:37

basta con leer esto en el momento que lo

8:41

enviéis bien ya una vez eh después ya no

8:45

Vais a tener que que revisar nada esto

8:47

prácticamente ya digo es leer las normas

8:49

una vez leer esta plantilla que os va a

8:51

saltar en el momento que queráis

8:53

lanzarla la p request y ya está No vais

8:56

a tener que hacer eh prácticamente nada

8:58

más eh se trata de que todo esté

9:00

atendido y que lo vayamos mejorando poco

9:02

a poco OK Así que por favor eso es lo

9:05

primero que tenéis que tener en cuenta

9:06

vale eh vamos a ello no será hora de

9:09

comenzar no así que qué es esto de

9:11

roadmap lo vuelvo a repetir ya sabes

9:14

algún lenguaje genial el roadmap te va a

9:16

servir no tienes ni idea de algún

9:17

lenguaje La idea es que con el Road map

9:20

aprendas

9:21

a por lo menos programar con algún

9:24

lenguaje que vayas aprendiendo los

9:25

fundamentos poco a poco porque como bien

9:27

Dice el roadmap Y si nos vamos aquí a la

9:29

web de roadmap veréis lo siguiente están

9:31

todos los retos a medida que se van ir

9:34

publicando uno cada semana pues aquí lo

9:37

veis va a aparecer con una dificultad

9:39

con la fecha en la que se publica con la

9:41

fecha que la que se corrige hoy es día 2

9:43

el reto aquí tenéis el texto el

9:46

ejercicio en Sí vale el horario el día

9:49

que se va a corregir en directo también

9:51

tenéis aquí para que podáis Crear un

9:53

recordatorio y os vengáis al directo si

9:55

podéis si no podéis bueno que sepáis

9:56

cuándo va a aparecer la corrección os lo

9:58

prometo y como va a ser un repaso tan

10:02

exhaustivo por e los lenguajes de

10:05

programación aunque ya sepáis programar

10:07

Estoy seguro que algo Vais a acabar

10:09

descubriendo nuevo en el lenguaje okay Y

10:12

por qué con cualquier lenguaje brce tú

10:13

tendrás que explicarlo en algún lenguaje

10:15

por supuesto e habitualmente yo lo que

10:18

voy a hacer es utilizar el lenguaje

10:19

python porque es uno de los que más

10:20

utilizo que también estamos haciendo

10:22

cursos aquí dentro de la comunidad vale

10:24

pero eh eso no es lo importante Qué es

10:27

lo importante de todo esto que la propia

10:29

comunidad está enviando correcciones En

10:32

todos los lenguajes si no me equivoco

10:36

hoy en día en solo una semana hemos

10:39

reunido 21 lenguajes de programación

10:42

cuando le eché yo un ojo vale Así que

10:44

bry tú lo haces con python y a mí no me

10:46

interesa python no te preocupes porque

10:49

gente de la comunidad va a estar

10:51

enviando correcciones En todos los

10:52

lenguajes Y si hay 20 lenguajes

10:55

distintos es muy posible que alguno de

10:58

los tuyos si estás partiendo desde cero

11:00

y no sabes ni por dónde empezar es muy

11:02

posible que entre esos 20 lenguajes o

11:05

más o bueno los que sea que envíe la

11:07

comunidad esté también eh el lenguaje

11:10

que tú quieres aprender vale Estos son

11:13

retos para aprender fundamentos de los

11:14

lenguajes los lenguajes hay cosas que

11:16

tienen en común todos vale Y eso es

11:19

justo lo que vamos a tratar habrá cosas

11:21

que igual hay pequeñas diferencias pero

11:24

digamos que el enunciado general de cada

11:26

uno de los retos del roadmap serán en

11:29

principio no sé propuestas que se pueden

11:31

resolver con cualquier lenguaje de

11:33

programación igual que hacíamos el año

11:34

pasado así que os servirá para revisar

11:37

la teoría os servirá para estudiar y os

11:40

servirá para hacer la parte de lógica

11:41

Aunque yo lo esté explicando en otro

11:43

lenguaje distinto Okay y después el

11:46

roadmap hay que llevarlo semana a semana

11:48

yo no puedo seguir el ritmo yo me voy a

11:49

incorporar más adelante porque no puedo

11:52

empezar no pasa absolutamente nada todos

11:54

los ejercicios se van a poder entregar

11:56

en el momento que os dé la gana se

11:58

seguirá revisando incorporando a repo

12:00

como ya Vais a tener mi explicación y

12:02

Vais a tener la ruta de estudio uno tras

12:04

otro que os queréis saltar alguno porque

12:06

igual pensáis que ya lo sabéis os lo

12:07

saltáis y empezáis por el que os de la

12:09

gana que queréis empezar la ruta de

12:10

estudio y que ya ha pasado un mes desde

12:12

el día de hoy que estamos empezando pues

12:14

no pasa tampoco absolutamente nada vais

12:16

poco a poco se trata de un curso que

12:17

puede ser en comunidad que sería la

12:20

manera ideal pero pero pero también por

12:23

otro lado en realidad lo podéis hacer

12:25

vosotros A vuestra a vuestro ritmo y ya

12:27

está al final no deja de ser un recurso

12:29

libre y gratuito vale sobre la

12:31

dificultad se trata de que los retos

12:33

como van a seguir una ruta de estudio

12:35

más o menos van a estar relacionados

12:37

entre ellos Okay pero la dificultad sí

12:41

que es cierto que puede ir variando aún

12:42

así aunque se siga la ruta de estudio

12:45

igual lo que voy haciendo los retos es

12:47

que igual hay una parte que es más fácil

12:49

y otra parte como para sacar nota Es

12:52

okay Te parece más simple la premisa

12:55

Pues venga Si quieres ponerte un poquito

12:58

más a prueba cu tienes eh Pues un

13:01

ejercicio un poquito más avanzado dentro

13:03

de la propia lección de la semana y os

13:05

voy a enseñar el ejemplo en el reto que

13:07

voy a publicar en el momento que corrija

13:09

este Okay es un poco la idea no no os

13:11

imaginéis que en el primer reto va a ser

13:13

un rollo hiper complicado para gente que

13:15

tenga muchísima experiencia pero bueno

13:17

se trata de que a medida que avancemos

13:19

por los fundamentos va a haber más

13:22

recursos para que podáis aprender Y así

13:25

también yo voy a poder justificar que

13:27

Okay no entiendes el reto 10 Échale un

13:31

ojo a los de atrás y vete poquito a poco

13:32

y ya verás como cuando llegues al 10 lo

13:34

vas a tener mejor y como tenemos los

13:36

grupos de estudio en el discord si no

13:37

sabéis lo que son los grupos de estudio

13:39

buscarlos dentro de discord también es

13:41

decir hay

13:42

e decenas de formas de aprender a

13:46

programar con los retos que tenemos en

13:47

la en la comunidad con la parte de

13:49

roadmap y con la parte de los retos de

13:51

programación no hay un plazo máximo la

13:53

dinámica es cada semana yo explico reto

13:56

publico nuevo cada lunes habitualmente

13:59

pero si os queréis ir a los anteriores

14:00

como va a estar el vídeo grabado comoo

14:02

va a estar el código publicado como van

14:04

a estar las soluciones de la comunidad

14:06

pues no no importará tanto vale Así que

14:09

eh otra cosa muy importante en la web os

14:12

va a llevar a cuándo son las

14:13

correcciones vale Ya os dije que un

14:15

sitio importante es el canal de Reto

14:17

semanal que es el que está relacionado

14:19

con los retos de programación Y si os

14:20

vais también aquí a eventos aquí

14:23

empezaré a ver cuáles son los directos

14:25

Cuáles son los eventos importantes que

14:26

celebramos en la comunidad Ya veis ahora

14:29

y en curso y 500 personas apuntadas Eso

14:31

es que 500 personas se han enterado de

14:33

este evento han decidido Crear un

14:35

recordatorio para cuandoo se nos vamos a

14:37

poner aquí a corregir el reto que era

14:39

ahora mismo pero si os fijáis el próximo

14:42

lunes 8 de enero a las 8 de la tarde 8

14:44

de la tarde hora España la la hora que

14:46

es ahora mismo aquí veis que ya está

14:47

creado un evento y que ya se han

14:49

apuntado personas pues bueno ya sabéis

14:51

qué día de la próxima semana vamos estar

14:53

aquí con el nuevo reto de programación

14:54

Okay así que de verdad la idea y ya

14:58

llevamos un tiempo Aunque empecemos con

15:00

los con el roadmap

15:02

Eh ya llevamos tiempo haciendo retos

15:06

aunque no sean exactamente iguales como

15:08

para que fuéramos teniendo en cuenta e

15:11

las los diferentes problemas o las

15:13

diferentes casuísticas de la comunidad

15:15

vale Y ya lo último sobre repositorio

15:17

qué os pediría Cuál es la manera de

15:19

apoyar Cuál es la manera de ayudar un

15:21

poquito a todo este trabajo todo es

15:22

gratuito aquí nadie te va a cobrar por

15:25

hacer esto ni mucho menos pero veis esto

15:29

Star veniros al repositorio de roadmap y

15:32

pinchar en el botón de Start que es una

15:34

manera de dar un like en el repositorio

15:36

para que más gente lo conozca para que

15:38

más gente sepa que aquí hay eh código

15:41

para aprender a programar un segundo es

15:43

no sé cuánto puedo llevar esto espera

15:45

uno no sé un segundo de vuestro tiempo y

15:49

y ayuda a que esta actividad pues se

15:51

siga haciendo todo lo que podáis eh

15:53

compartir abrar a la gente a vuestros

15:55

compañeros a más gente que esté

15:57

Aprendiendo la propia página de retos de

15:59

programación abajo de todo tiene un

16:01

compartir Eh bueno si podéis hacer que

16:04

este recurso llegue a más gente pues os

16:07

lo agradezco porque así eh significará

16:09

que por supuesto va a haber más gente

16:10

para aquí pero eso significará que yo

16:12

voy poder seguir creando contenido y que

16:14

podremos mejorar esta actividad quién

16:16

sabe en qué se acaba convirtiendo esto

16:18

empezamos este tercer año de directos y

16:21

cada año yo creo que hemos ido mejorando

16:23

cosas así que quién sabe en lo que puede

16:25

quedar este roadmap y se acaba

16:26

convirtiendo en un recurso para aprender

16:28

programación para muchísima gente Ojalá

16:31

ojalá lo consigamos Vale ahora sí venga

16:34

vamos al primer reto el primer reto era

16:36

un reto muy fácil para empezar a dar ahí

16:39

esos primeros pasos vale lo tenéis en

16:43

retos programación comom bar roadmap OK

16:46

Así que el primer reto reto cero se

16:49

llamaba sintaxis variables tipos de

16:51

datos y hor mundo Este era el reto para

16:54

que empezar a tomar alguna decisión

16:57

sobre vamos a empezar la ruta de estudio

16:59

Qué lenguaje de programación o por qué

17:00

lenguaje de programación quieres

17:03

comenzar vale Así que te decía preparado

17:05

para aprender a repasar el lenguaje de

17:06

programación que tú quieras repito y

17:09

Siento ser pesado Esto vale para

17:10

cualquier lenguaje de programación

17:12

Aunque a mí me veis haciéndolo con

17:13

python eh después nos iremos a las

17:16

correcciones de la comunidad y flipar

17:18

porque hay más de 200 correcciones que

17:20

ya ha enviado la comunidad en un montón

17:21

de lenguajes Vale dice Recuerda que

17:23

todas las instrucciones de participación

17:25

están en el repositorio leer la web y

17:26

leer repositorio lo primero ya has

17:28

elegido el lenguaje No todos son iguales

17:30

pero sus fundamentos suelen ser comunes

17:32

Este primer reto te servirá para

17:33

familiarizarte con la forma de

17:35

participar enviando tus propias

17:37

soluciones Okay es mi propia corrección

17:40

es mi manera de explicar la manera en la

17:42

que yo explico los retos o la manera en

17:43

la que yo elaboro el elaboro el código

17:45

no es ni el código más profesional del

17:48

mundo ni el código más cutre del mundo

17:50

me intento quedar a medias Por qué

17:52

Porque Habrá gente que esté viendo Este

17:55

vídeo y que diga br yo empiezo de Cero y

17:58

habrá gente que dirá Bray yo ya tengo

18:00

experiencia entonces me intento quedar

18:02

en una corrección que tanto la gente que

18:05

está empezando como la gente que lleva

18:07

más tiempo pues puede entender No suelo

18:08

hacer cosas muy propias del lenguaje o

18:11

cosas muy complejas de entender porque

18:13

creo que eso pediría perdería todo el

18:15

sentido si lo que estamos intentando

18:17

pues aprender o mejorar nuestra lógica

18:19

okay Así que eh Por favor ya digo Aquí

18:22

Este primer reto te va a servir para

18:24

familiarizarte con la forma de

18:25

participar enviando tus propias

18:27

soluciones si no habéis participado en

18:28

este primer reto por favor podéis seguir

18:30

participando Aunque hoy eh Ya me ponga a

18:32

corregirlo o lo explique o ya publique

18:34

el segundo reto Ahora aquí llegamos al

18:36

ejercicio Cuál es el ejercicio crea un

18:38

comentario en el código y coloca la URL

18:42

del sitio web oficial de lenguaje de

18:43

programación por qué Para así ya también

18:46

tengáis la referencia del lugar donde

18:48

Vais a aprender programación o donde

18:50

está la documentación de cada uno de los

18:51

lenguajes y os digo Aquí representa la

18:52

síntesis de los comentarios crea

18:54

variables y constantes si se soportan

18:56

crea variables representando todos los

18:57

tipos de datos e imprime por terminar el

19:00

texto Hola y el lenguaje que hayas

19:02

elegido y te digo Aquí al final fácil No

19:04

te preocupes Recuerda que esta es una

19:05

rota de estudio y debemos empezar por el

19:06

principio okay Así que porfa que nadie

19:10

diga bu esto ya lo sé calma las cosas

19:12

las tenemos que hacer poquito a poco y

19:14

ya veréis como en el siguiente reto que

19:15

voy a publicar pues ya va a haber una

19:18

parte muy básica pero ya va a haber una

19:20

parte para bueno intentar hacer un

19:22

poquito más si pinchara aquí en

19:24

ejercicio esto s iba a llevar a gih vale

19:26

en giob está el ejercicio y aquí ya

19:29

podéis ver lo siguiente ya os lo voy a

19:31

enseñar haciendo un poco de spoiler aquí

19:33

tenéis las correcciones que ya ha

19:34

enviado la comunidad fijaos bash csharp

19:37

c+ Plus c cobol Dart Go haskel Java

19:40

javascript coling Lua ocam Pascal php

19:43

prolog python Ruby rust lecheo cuas

19:47

Swift y types la comunidad ha enviado

19:50

correcciones En todos estos lenguajes

19:52

que falta algún lenguaje que sea que tú

19:53

quieras aprender Envía tu corrección así

19:56

on tendremos muchísimas más cosas vale

19:59

así tendremos muchísimas más cosas así

20:01

que por favor en comunidad todo esto es

20:04

mucho más fácil todo esto es muchísimo

20:07

fácil que decir bry me importa nada que

20:10

tú lo expliques en python a mí Yo lo que

20:13

quiero aprender es go pues me voy a la

20:14

carpeta de Go y dices Diego Kevin Miguel

20:17

y deera han enviado correcciones de Reto

20:20

en Go Así que vale con mi explicación

20:24

más comparando también con lo que han

20:25

hecho otros miembros de la comunidad que

20:28

ejercicio no tiene por qu ser exacta

20:30

exacta Exactamente lo mismo que yo lo

20:32

corrija de una forma no quiere decir que

20:34

tengan que ser copy pastes todos los

20:35

ejercicios cada persona lo va a entender

20:37

de una manera lo va a abordar de una

20:38

manera distinta Eso es lo importante que

20:40

tú te pelees contra el código porque si

20:41

no no se aprende a programar ya sabes

20:43

que se aprende programando vale pero

20:45

junto con la parte explicación quizás

20:48

más teórica que me vas a escuchar a mí

20:50

más ejemplos en el código o en el

20:52

lenguaje que tú quieres aprender pues

20:54

aún mejor vale Así que os queda por aquí

20:57

eh todo vale teniendo esto nos vamos a

21:01

resolver reto programación lo tengo por

21:03

aquí el enunciado vamos a ir leyéndolo

21:06

poquito a poco y vamos a ir eh

21:08

explicando un poco todo vale Así que yo

21:11

lo voy a corregir en python como os he

21:13

dicho qué tenéis que hacer os venís a la

21:16

carpeta del lenguaje si no existe la

21:17

carpeta del lenguaje la creáis vale Si

21:20

no leer las reglas para saber cómo

21:22

tenéis que participar crear el fichero

21:24

etcétera Pero básicamente es en una

21:26

carpeta dentro del directorio donde está

21:28

el reto de programación en el que

21:30

queréis participar dentro de la carpeta

21:31

del lenguaje escrito en minúsculas

21:33

tenéis que crear un fichero con el

21:35

nombre de vuestro usuario en github

21:37

revisar por favor Cuál es el nombre de

21:39

vuestro usuario en github Vale entonces

21:41

el mío es mouredev la extensión es Spy

21:43

porque va a ser python el ejercicio y

21:46

ahora teniendo esto voy a empezar a

21:49

hacer un poco toda la corrección del

21:51

ejercicio lo tenemos aquí abierto vamos

21:53

a ir hablando vamos a ir viendo eh qué

21:55

es lo que nos pedía el ejercicio el

21:57

ejercicio nos decía lo siguiente decía

21:59

crea un comentario en el código y coloca

22:00

la URL del sitio web oficial del

22:02

lenguaje de programación que ha

22:03

seleccionado vale Y cuál es la web

22:05

oficial de python que yo he elegido pues

22:07

me voy a venir a Google y voy a poner

22:08

python yo que sé vale veo python España

22:12

porque hay el propio dominio dentro de

22:14

España Pero bueno eh en realidad la

22:17

propia web oficial Aunque entremos

22:18

dentro del dominio de España en realidad

22:20

la web oficial general para todo el

22:22

mundo es python.org aquí es donde está

22:25

la documentación Cómo instalarlo bla bla

22:26

bla eh absolutamente todo lo del

22:28

lenguaje lo Vais a encontrar aquí y

22:31

eh elijáis el lenguaje que elijáis va a

22:34

tener su web oficial con sus recursos

22:37

con su documentación y y con su forma de

22:40

acabar obteniendo una respuesta a lo que

22:43

yo os estoy pidiendo los ejercicios de

22:45

rad map vale Así que vengo por aquí y lo

22:48

primero que pedía el ejercicio era que

22:49

era un comentario Vale pues lo primero

22:51

que teníamos que estudiar aunque esto os

22:53

suene como muy básico es y Cómo creo un

22:56

comentario en python Qué es un

22:57

comentario a la gente que tendrá que

22:59

empezar por aquí Bueno un comentario es

23:01

un código que no se ejecuta es un

23:02

comentario porque yo puedo escribir lo

23:05

que yo quiera pero no es código

23:07

programado como tal no es código que va

23:08

a acabar desencadenando una ejecución

23:10

concreta vale nos sirve para en cierto

23:13

modo pues intentar aclararnos cosas a

23:15

nosotros mismos a nuestros compañeros o

23:17

a nuestro yo de futuro vale no quiere

23:19

decir que habitualmente se tenga que

23:22

comentar mucho pero sí cuando es

23:24

necesario sobre todo cuando estamos

23:25

empezando Así que no tengáis miedo lo

23:27

vuelvo a repetir cuando estáis empezando

23:29

a dejar comentarios por encima de lo que

23:31

se cree que suele ser lo habitual así

23:34

que me voy a poner me voy a venir por

23:36

aquí y escribir un comentario Vale y en

23:38

ese comentario decía que pusieras la URL

23:41

de la web Vale y la URL de la web

23:44

oficial de python es

23:47

python.org Okay pero lo siguiente que

23:50

nos decía era indica las diferentes

23:52

formas que tienes de escribir un

23:54

comentario en el lenguaje que hayas

23:55

seleccionado Pues mira ya lo hemos visto

23:57

esto es un comentario eh en una línea en

23:59

python Pues bueno con una almohadilla en

24:02

otros lenguajes pues suele ser con dos

24:04

barras inclinadas o como sea vale Y

24:07

también nos dice que si existe en tu

24:09

lenguaje crear comentarios en varias

24:12

líneas Pues que indiques Cómo es en

24:14

python el formato para escribir

24:15

comentarios en varias líneas es con tres

24:18

dobles comillas al abrir y al cerrar y

24:21

todo lo que yo escriba aquí en el medio

24:23

por ejemplo esto también es un comentar

24:29

en varias líneas Vale entonces ya tengo

24:32

un comentario en varias líneas si yo

24:33

ejecutara este código esto simplemente

24:36

serían anotaciones mías no podría hacer

24:39

fallar el programa ni desencadenar nada

24:42

vale Y en python encima aún son más

24:45

especialitas y otros lenguajes también

24:47

soportan esto que lo que son las cadenas

24:50

de texto se suelen utilizar estas

24:52

comillas dobles pero en algunos

24:53

lenguajes también se soporta o en

24:55

algunos lenguajes incluso solo se

24:57

soporta lo que son las comillas simples

25:00

Así que si yo ahora meto tres comillas

25:02

simples para abrir y tres para cerrar y

25:04

meto este texto aquí esto en realidad

25:07

también es otra forma de escribir

25:10

comentarios en python Así que tenéis que

25:12

buscar el equivalente en el lenguaje de

25:14

programación que estéis utilizando Okay

25:16

esto es bueno muy básico muy simple pero

25:20

que al fin y al cabo Si queremos empezar

25:22

por el principio de todo esto nos hace

25:24

falta Vale qué más cosas eh se nos ped

25:28

el ejercicio vamos por aquí decía

25:30

em Crea una variable y una constante si

25:34

el lenguaje lo soporta Vale pues voy a

25:37

crear una variable Cómo se crea una

25:39

variable en python pues simplemente

25:40

darle un nombre no hace falta Ninguna

25:42

palabra reservada que algunos lenguajes

25:44

este la palabra bar o parecido Pues no

25:47

yo quiero crear una variable pues le

25:48

llamo my variable en python Y esto es

25:51

algo que también habría que explorar

25:52

cuando estáis empezando cualquier

25:54

lenguaje que hayáis seleccionado es como

25:55

es la sintaxis Cómo escribo yo hago sí

25:58

my variable con la primera en mayúscula

26:02

o todas o separo por gu bajo pues esto

26:05

es algo que también tiis que descubrir

26:06

Cuál es la sintaxis por defecto Cuáles

26:09

son las diferentes convenciones que

26:10

tiene vuestro lenguaje de programación

26:12

para en este caso nombrar variables en

26:14

python es lo que se llama el snake Case

26:17

snake de de de de serpiente vale que por

26:21

cada nueva palabra hay un guion bajo y

26:23

todo escribe en minúsculas y lo

26:25

siguiente que ties que hacer para darle

26:26

eh el valor una variable ya es colocar

26:29

algo a continuación del Igual yo voy a

26:31

crear una variable de tipo cadena de

26:33

texto entre dos comillas dobles ya que

26:37

hemos visto que bueno se puede escribir

26:38

texto así vale Y yo digo que esto es mi

26:41

variable Okay Vale entonces esto es una

26:43

variable Qué es una variable en

26:44

cualquier lenguaje de programación Pues

26:46

un dato que pueda acabar mutando Yo

26:48

podría cambiar aquí y venir my variable

26:50

y decir nuevo valor de mi variable la

26:54

variable originalmente tenía un valor

26:55

queda una cadena de texto que decía mi

26:57

variable pero he acabado cambiando por

27:00

otra cadena de texto a medida que se va

27:02

ejecutando línea a línea vale decía

27:05

también el ejercicio que creéis una

27:06

variable pero que también crearé una

27:08

constante Uf qué es esto una constante

27:10

Pues bueno como una variable pero no

27:12

varía por eso se llama constante vale

27:16

python tiene constantes Pues en realidad

27:18

no tiene constantes decir si y esto que

27:22

aplique a todos los retos de

27:24

programación que voy a publicar durante

27:26

el año en este radm si no lo tiene

27:29

vuestro lenguaje Pues no hay nada que

27:31

hacer es decir se trata un poco de que

27:33

también conozcáis Qué cosas existen a

27:37

nivel conceptual a nivel fundamental los

27:39

lenguajes Pero qué cosas en concreto

27:41

tiene vuestro lenguaje o no tiene o se

27:43

pueden hacer de más maneras igual hay

27:45

otros lenguajes en el que tú no puedes

27:47

escribir comentarios con esta comilla

27:48

simple Ok y en otros que sí y en otros

27:51

que lo puedes hacer Pues con otro

27:52

carácter yo que sé no entonces en python

27:55

no existen las constantes todos son

27:59

todos los datos que yo creo pueden

28:01

mutar Vale pues mala suerte Pues yo no

28:04

crearía constante pero sí que es cierto

28:07

que si nosotros queremos alguna forma de

28:09

representar una constante en python

28:11

Aunque pueda variar lo que se suele

28:13

hacer es por convención hacer esto si yo

28:17

ahora vengo por aquí hago my constant

28:19

voy crear una variable que se llame mi

28:21

constante constant si yo escribo el

28:24

nombre de una variable en mayúsculas yoo

28:28

presentando aunque esto pueda variar es

28:30

que por favor no me cambies el valor de

28:33

esta constante tengo por aquí y le voy a

28:35

llamar también mi constante va a ser un

28:37

texto Pero nos tenemos que dar cuenta

28:39

que esto es una convención vale esto es

28:41

por convención yo ahora si viniera aquí

28:44

y llamara a my constant le podría dar el

28:47

valor que me diera a mí la gana que esto

28:50

va a compilar va a funcionar si yo

28:53

arrancara el ejercicio veis aquí dice Uy

28:57

qué pasa aquí dice Uy igual tienes aquí

29:00

un carácter que igual no te gusta que

29:02

estoy poniendo aquí vale nos dice revisa

29:05

a ver si me estás metiendo caracteres

29:07

que no vale Pero si yo ahora cierro y

29:09

vuelvo a arrancar vemos que no da error

29:11

entonces estaba fallando por el tipo de

29:12

carácter porque no lo acepta dentro de

29:15

su coding pero en realidad Cuando yo le

29:17

quité el carácter ese raro que era la

29:18

diéresis porque no permite las diéresis

29:20

como tal pues lo que hemos visto aquí o

29:22

no las permite así de buenas a primeras

29:24

hay maneras de escribirlas no vemos que

29:26

aunque yo diga que es una constante que

29:27

este mayúscula deja Modificar el valor

29:29

okay Así que es una constante de mentira

29:31

pero que sirve para que la gente que en

29:34

este caso sabe python en el momento que

29:36

ve esto dice Ah vale Esto me está

29:38

intentando representar que es una

29:39

constante Así que no tiene que cambiar

29:42

vale no tiene que cambiar vale más

29:44

cosillas que nos pedía por aquí ya

29:46

tenemos lo de las variables y las

29:48

constantes existían dice crea variables

29:50

representando todos los tipos de datos

29:52

primitivos del lenguaje cadenas de texto

29:54

enteros buanos los que sea también esto

29:57

era un poco una labor de de de de

30:00

trabajo por vuestra parte queréis

30:03

empezar en un lenguaje pero Cuáles son

30:05

los tipos de datos primitivos eh

30:07

programar no deja de ser Pues acabar

30:11

creando datos instrucciones piezas de un

30:15

puzzle y mezclándolo entre ello Qué pasa

30:18

que bueno todo se puede llegar a un

30:19

nivel que acabamos creando Pues el

30:21

software que nos de la gana pero

30:23

inicialmente todo va a partir de cosas

30:25

muy muy básicas eso os lo prometo todo

30:27

empieza por por lo que estáis viendo

30:29

aquí y el lenguaje de primeras ya tiene

30:32

lo que se llaman esos tipos de datos

30:33

fundamentales o

30:36

primitivos veis que yo sin hacer

30:38

prácticamente nada ya he podido escribir

30:41

una cadena de texto con lo cual ya

30:43

entiendo que la cadena de texto es un

30:47

tipo de dato primitivo cada lenguaje

30:50

tiene 3 cu 5 10 tipos de datos

30:53

primitivos dependiendo del lenguaje en

30:55

python en realidad existen cu tipos de

30:58

datos primitivos que realmente existen

31:00

en todos los lenguajes de programación

31:02

vale Así que vamos a ver cuáles son esos

31:05

tipos de datos primitivos el primer tipo

31:07

de dato primitivo es el que llamamos in

31:10

entero integer

31:11

eh un tipo de dato que nos sirve para

31:14

representar números enteros que son

31:16

números enteros pu los que no tienen

31:17

decimales vale Así que le voy a llamar

31:19

aquí a mi variable my int le podría

31:21

llamar ya sabéis como me de la gana y

31:23

cómo hago para asignarle a esta variable

31:26

llamada my int un número entero Cómo

31:28

hago para crear una variable de tipo

31:29

entero pues simplemente le meto un

31:31

número ya está como le he metido un

31:33

número y le he metido un número sin

31:34

comillas esto automáticamente pasa a ser

31:37

un número pasa a ser un int vale hay

31:41

algo que podríamos hacer para

31:43

representar todo esto que es e bueno os

31:46

lo hago al final vamos a ir viendo los

31:48

tipos de variables pero igual que

31:50

tenemos números enteros También tenemos

31:52

números decimales Cómo puedo representar

31:55

yo un número decimal Pues para eso

31:57

tenemos un tipo de dato que se llama

31:58

float no de coma flotante básicamente

32:00

float es como se llama en python Cómo

32:03

hago para asignarle un número decimal

32:05

pues escribo un número decimal 1,5 esto

32:08

ya significará que esta es una variable

32:10

que acepta pues números decimales Okay

32:13

qué tenemos más aquí tercer tipo de dato

32:16

primitivo he dicho que hay cuatro

32:17

tenemos los buanos vale Bull en realidad

32:22

Bull bullan vale eh un bullan es algo

32:25

que en realidad solo atiende a a lógica

32:27

boleana es decir algo que puede ser

32:29

verdadero o que puede ser falso y que la

32:31

gran mayoría de los lenguajes lo que

32:32

hacemos es esto poner true O my Bull

32:36

vengo aquí y Pongo false aquí le estoy

32:39

cambiando el valor a mi variable primero

32:41

he dicho que es verdadera después he

32:43

dicho que es falsa estos son los únicos

32:45

dos valores que puede tener una variable

32:47

de tipo bullan y ya por último Tenemos

32:50

aquí pues la que ya hemos visto al

32:52

principio mi cadena de texto No mi str

32:57

Pon aquí

32:58

lo que es un String vale String

33:01

simplemente pues yo que sé Eh mi cadena

33:04

de texto pero igual que puedo crear la

33:07

cadena de texto entre comill con estas

33:09

comillas dobles si yo pongo my other

33:12

stram otra variable digo mi otra cadena

33:17

de texto y cómo la podré representar

33:19

Pues con comilla simple ya veis que si

33:21

pongo comilla doble al principio y

33:22

simple al final no vale son o las dos

33:24

simples o las dos dobles con esto ya

33:27

tengo todos los tipos de datos

33:30

primitivos primitivos que tiene el

33:32

lenguaje según el lenguaje que hayáis

33:33

elegido lo repito Habrá más o menos

33:37

tipos de datos primitivos vale Y ya lo

33:39

último que nos pedía el ejercicio nos

33:41

decía imprime por terminar el texto Hola

33:43

y el nombre del lenguaje vale tendríais

33:46

que haber buscado Cómo podéis imprimir

33:49

texto por consola en python es tan fácil

33:51

como escribir print y entre comillas lo

33:53

que le queremos pasar qué le quiero

33:55

pasar Pues esta cadena de texto no es un

33:58

Stream lo que tengo que acabar pasándolo

34:00

entonces Bueno digo Hola Y en mi caso el

34:03

lenguaje de programación es python pero

34:06

pensar en alguien que nunca haya

34:08

programado esto le vale para ver el

34:10

lenguaje y decir Ey he programado algo

34:12

si yo ahora ejecuto esto vemos por aquí

34:15

por consola Hola python Ey un hola mundo

34:18

una buena ejecución por aquí y lo que os

34:20

Decía si queréis comprobar los tipos de

34:21

datos esto ya va un poquito Aparte

34:23

también tenemos en cada uno de los

34:25

lenguajes Este es un pequeño extra

34:26

tenemos la manera de obtener Cuál es el

34:29

tipo de dato que estamos representando

34:30

sobre todo el lenguajes que son

34:33

débilmente tipados como es en este caso

34:35

python python Aunque yo le esté dando

34:37

aquí un número después si quisiera

34:39

asignarle un valor entero o decimal O

34:41

bullan podría cambiarlo en tiempo de

34:43

ejecución y no daría un error no pasaría

34:45

nada pero vamos a ver inicialmente cuál

34:48

es el tipo de dato de cada uno de ellos

34:49

voy a poner un print y voy a llamar a

34:51

una función del sistema que no tenéis ni

34:53

que saber lo que es una función del

34:55

sistema pero le voy a ir pasando

34:58

cada una de las variables que tengo por

35:00

aquí vamos a hacer aquí un print de los

35:03

cuatro tipos de datos de My in my Bull y

35:06

mystream y vamos a lanzar nuestro

35:07

programa y vamos a ver lo que pasa o lo

35:09

que pinta vemos int float Bull Y str

35:13

aquí están los cuatro tipos de datos si

35:16

nosotros especificar el tipo de dato que

35:18

queremos crear aún así podríamos indicá

35:21

selo de una forma más implícita yo le

35:22

podría decir con dos puntos decir mira

35:24

esto es un int Pero bueno aún así podría

35:26

cambiar el tipo de datos simplemente es

35:28

un poco para dar información igual que

35:30

my constant yo la ponía en mayúsculas

35:32

para indicar que era una constante

35:34

Aunque podía variar vale y le hago entre

35:36

dos puntos y le meto el tipo de dato int

35:39

float eh Bull String str en realidad

35:42

serviría para indicar a resto de

35:45

personas o a mi yo futuro Oye que yo he

35:47

creado esta variable y yo lo que quiero

35:49

meter aquí son enteros no me hagas el

35:50

lío y no me vengas ahora aquí my int y

35:53

me digas eh mi entero o me digas cuatro

35:57

y no no no este cuatro ahora ya será una

36:01

cadena de texto porque va entre comillas

36:03

ya no será un número así que no me la

36:04

líes que te he dicho que era un entero

36:06

Okay entonces Esto inicialmente es lo

36:09

que teníais que haber hecho en el primer

36:11

ejercicio queríais hacer más habéis

36:13

visto más casuística lo habéis resuelto

36:16

de otra manera no pasa absolutamente

36:19

nada porque Incluso si yo ahora me voy

36:21

aquí a las correcciones de la comunidad

36:23

vamos a irnos a alguien de javascript

36:26

por ejemplo aquí a ver vale pues vemos

36:28

Berto Cómo ha creado variables Cómo ha

36:30

creado constantes os fijáis cómo le mete

36:33

tipos de datos Big int décimal entero

36:36

veis no son Exactamente lo mismo pero

36:38

entendéis que esto está representando un

36:41

número entero esto un número decimal

36:43

aquí un número eh mucho más grande vale

36:46

vemos un bullan vemos que hay algo

36:48

parecido vale Vámonos a otro lenguaje de

36:51

programación que a Swift nos vamos venga

36:55

vengo por aquí aquí lo veis ya es un

36:57

lenguaje tipado ya está indicando que

36:59

esto es un Stream que esto es un bullean

37:00

un in float veis es otro lenguaje

37:03

Vámonos a ras que ras seguramente es muy

37:05

diferente Ah mira led para crear

37:07

variables lo que sea le estamos dando

37:09

los tipos de datos tienen otro nombre

37:11

pero está representando números enteros

37:12

cadenas de texto buanos etcétera Así que

37:15

la dinámica Esta es la que vamos a

37:17

intentar cumplir vale todos sabemos

37:20

Vámonos a cobble Por qué Claro cobble

37:23

claro cobble creado hace 500 años eh se

37:27

seguro que es muy diferente Pues si es

37:30

diferente Pero mira una variable que

37:33

hemos creado por aquí y aquí hemos

37:34

definido una constante y aquí hemos

37:36

definido un número un entero un float un

37:42

float negativo una cadena lo veis

37:46

entonces Oye es una locura cobble Eh sí

37:50

pero Fijate display qué será display un

37:53

print Hola cobol loco Sí pero a que

37:57

realidad está pasando por los mismos

37:59

pasos que pasamos nosotros Mira

38:01

comentarios aquí tenemos los comentarios

38:03

No veis no es tan complicado lo dicho

38:05

que al fin y al cabo tenéis eh recursos

38:08

para todos porque solo con verme a mí o

38:10

solo con ver las soluciones y hacer así

38:12

no os va a valer de mucho Lo importante

38:15

es pelearse y que vale estás diciendo

38:18

que es muy fácil y yo no di pasado ni de

38:20

la primera línea no pasa nada eso eh te

38:22

ha pasado a ti y me ha pasado a mí y ya

38:25

está pero por eso tienes que pasar si no

38:27

no hay manera vale dicho esto Cuál será

38:31

la siguiente dinámica ahora que hemos

38:33

explicado este reto de programación Pues

38:36

cómo continúa esta dinámica la dinámica

38:39

por lo que va a continuar ahora que

38:40

hemos visto pues alguna corrección de la

38:42

comunidad y explicado Pues todos los

38:45

pasos que tenemos que seguir la dinámica

38:48

Es que yo voy a publicar un nuevo reto

38:51

de programación Okay vamos a publicar un

38:53

nuevo reto que ya será el siguiente

38:56

asociado a roadmap Este era el reto o el

38:59

ejercicio eh 00 pues vamos a pasar al

39:03

ejercicio

39:05

[Música]

39:10

01 crea ejemplos utilizando todos los

39:12

tipos de operadores de tu lenguaje aquí

39:15

ya entraba algo muy concreto que es vale

39:17

Qué lenguaje habéis elegido el que sea

39:19

pues os toca revisar Cuáles son todos

39:22

los operadores y aquí seguro que más de

39:24

uno ha descubierto un nuevo operador

39:26

porque es probable que los más

39:28

habituales o los que utilizamos más a

39:30

menudo que estamos más acostumbrados a

39:31

ver pues que sí los tenemos vale más que

39:34

aprendidos pero en el momento que nos

39:36

ponemos a indagar un poquito decimos Uy

39:38

Y este operador existía en mi lenguaje

39:40

Pues bueno vamos a hacer un repaso por

39:43

diferentes operadores en este caso yo

39:45

voy a hacer el repaso por operadores de

39:47

python pero que ya veréis como la

39:50

mayoría son comunes aún así ya veremos

39:53

qué ha hecho la comunidad en otros

39:54

lenguajes también así que voy a venirme

39:56

por aquí me voy a crear aquí un

39:58

comentario y voy a poner operadores

40:00

venga vale Y aquí vamos a empezar a

40:02

hacer un repaso por los diferentes

40:03

operadores porque hay 300,000 operadores

40:06

vamos a empezar por los que seguramente

40:08

más gente conoce que son los operadores

40:10

aritméticos no os decía que de cada uno

40:14

de los ejemplos que utilizáis porque

40:15

ponía crea ejemplos para poner en

40:17

práctica los operadores por ejemplo el

40:19

operador de suma el más bueno no me

40:21

digas que está el más no Hazme un

40:22

ejemplo súmame dos números no y enséñame

40:25

cómo funciona Vale pues había que hacer

40:26

ejercicios e imprimirlos cada uno y

40:28

Bueno siempre en cuenta un poco qué

40:30

tiene vuestro lenguaje vale Así que me

40:32

voy a ir haciendo prints de los

40:34

diferentes operadores aritméticos que

40:36

tiene por ejemplo el operador de suma y

40:38

voy a empezar a hacer ejemplos para que

40:40

veamos los más normales bueno los más

40:42

simples o los aritméticos sobre todo que

40:44

en mayor o menor medida todo el mundo

40:46

conoce pues no tiene mucha dificultad

40:48

Así que simplemente voy a ir creando

40:50

ejemplos para ir repasando todos los que

40:52

existen vale por ejemplo voy a hacer 10

40:54

+ 3 el operador aritmético de suma es el

40:56

símbolo más aquí lo que estáis viendo

40:58

con la f esta y entre las llaves Es que

41:01

voy a interpolar valores Esta es una

41:03

manera de imprimir una cadena de texto

41:05

en la que yo voy a colocar código

41:06

entonces Cómo podemos utilizar el

41:09

operador aritmético de suma pues

41:10

simplemente utilizando el símbolo más

41:12

por eso yo voy a poner suma 10 + 3 = y

41:15

aquí sí que voy a utilizar código esto

41:16

es una cadena de texto si yo ahora me

41:18

pongo a imprimir esto veis suma 10 + 3 =

41:20

13 porque esto es texto como tal esto no

41:22

lo está operando simplemente es texto

41:24

pero aquí esto que estoy interpolando el

41:26

10 + 3 entre eh llaves en python sí que

41:31

estoy utilizando Pues bueno el lenguaje

41:32

de programación para realizar la

41:34

operación Vale qué más Qué más cosas

41:36

podemos tener por aquí Esto es algo más

41:38

avanzado bueno la interpolación como

41:40

queráis Imagínate que lo queríamos hacer

41:42

más fácil o lo que fuera siempre

41:44

podríamos poner 10 + 3 y después Aquí

41:46

imagínate un más y ponerle la otra

41:49

cadena de texto o imprimirlo en dos

41:51

líneas o guardar en una variable

41:53

imagínate zoom y que yo viniera aquí y

41:55

la suma hiciera eh 10 + 3 y que esta

41:58

suma pues fuera lo que muestro en otro

42:00

print hago así entonces Bueno aquí un

42:02

poco pues simplemente avanza así un

42:04

pelín pero como vosotros más o menos

42:07

pensaris que se puede imprimir ya digo

42:09

Este es un concepto el de interpolación

42:11

en cadenas de texto que existe muchos

42:13

lenguajes de programación para poder

42:15

dentro de una cadena de texto utilizar

42:17

también código programado en cada

42:19

lenguaje hay una sintaxis distinta en

42:21

python en concreto es esto metiendo la F

42:24

y entre las llaves metiendo el código al

42:26

que nosotros queremos hacer referencia y

42:28

creo que como vamos a escribir tantos

42:30

operadores creo que así nos queda

42:32

bastante fácil para que no nos queden

42:34

muchísimas líneas Bueno vamos ir

42:35

haciendo el repaso tampoco vamos a echar

42:37

muchísimo tiempo sobre todo los más

42:38

fáciles una resta el operador aritmético

42:41

menos vale qué más una multiplicación

42:44

pues la multiplicación la hacemos con el

42:46

operador asterisco Aquí está Y qué más

42:48

Tendremos una división Vale pues la

42:50

división con esta barra inclinada Vale

42:52

ahora aquí puede aparecer alguno Que

42:53

igual no suena tanto por ejemplo el

42:55

módulo el módulo es el resto de la

42:57

división es lo que nos queda después de

42:59

dividir vale por ejemplo vamos a

43:01

pararnos aquí módulo si nosotros fijaos

43:04

para que nos vayamos aquí al módulo

43:06

módulo se hace con el símbolo del

43:08

porcentaje módulo de 10 3 1 por qué

43:10

Porque la división entera sería 103 a 3

43:14

o

43:14

3,3333 no pero en cambio después de la

43:17

división entera que sería 9 3 sí que nos

43:20

daría 3 10 3 nos sobra uno el resto Pues

43:23

el módulo Calcula ese resto vale veáis

43:25

que también tenemos operaciones para

43:27

poder Hallar el módulo otra operación

43:29

que puede que igual no la conociera

43:30

tenemos operaciones exponenciales

43:32

también en la gran mayoría de los

43:33

lenguajes exponente por ejemplo por

43:35

ejemplo en python cómo hacemos el

43:37

exponente Pues con dos símbolos de

43:38

multiplicar Okay Vale por eso aquí veis

43:40

pues 10 a la TR Pues nos da un 1000 por

43:42

aquí vale Y ya el último operador

43:45

aritmético así habitual es la división

43:47

entera Pues justo la inversa ahí al al

43:49

módulo que teníamos antes la división

43:51

entera es en vez de con dos símbolos de

43:53

multiplicar como el exponente con dos

43:54

símbolos de dividir por aquí claro

43:56

fijaos lo que nos sale por aquí en el a

43:58

si nosotros dividimos 10 3 nos da tres

44:00

periodo eh 3 con3 periodo Pero en cambio

44:03

la división entera es que el resultado

44:05

nos tiene que dar un número entero

44:06

redondeado vale 10 3 división entera 3

44:09

ya evita la parte decimal os fijéis como

44:11

hay pues muchos operadores Ya solo

44:13

dentro de los aritméticos es posible que

44:15

igual no conocieras todos pero tenemos

44:17

montonazo de operadores vamos a seguir

44:19

con más operadores operadores de

44:20

comparación por ejemplo est nos sirven

44:22

para comparar pues valores valores de

44:24

variables creo que la igual la la manera

44:27

más fácil de explicarlos es con números

44:31

vale pero pensar que en muchos casos

44:34

algunos operadores los aritméticos

44:36

suelen estar asociados a números pero

44:37

por ejemplo el operador más también se

44:40

utiliza bastante en cadenas de texto

44:41

pero los operadores de comparación

44:43

Aunque lo podemos utilizar mucho con

44:44

números También lo podríamos utilizar

44:46

con variables Solo que yo lo voy a

44:47

explicar con números porque Bueno

44:49

estamos empezando la ruta de estudio

44:51

tampoco me quiero pasar de complejidad

44:53

pero entender que a veces estos

44:55

operadores No únicamente eh se tienen

44:57

que usar con lo que yo los voy a

44:59

explicar sino que estos operadores

45:01

combinados Pues con los diferentes

45:02

elementos del lenguaje pueden acabar de

45:05

bueno dar muchas más cosas así que vamos

45:07

a verlos de comparación cosas que nos

45:09

servirían para comparar Pues el más

45:12

utilizado de todos el operador de

45:14

comparación de igualdad vale Qué es el

45:16

el operador de igualdad pues por ejemplo

45:18

igual a igualdad bueno no igualdad voy a

45:21

poner aquí Imagínate que quiero comparar

45:23

si 10 es igual a TR Pues yo pondría dos

45:26

veces símbolo igual la igualdad

45:27

habitualmente es con dos símbolos igual

45:29

así que yo puedo decir mira 10 es ig a 3

45:32

aquí puedo decir 10 = 3 es y le hacemos

45:35

Aquí también la interpolación y ahora

45:37

Aquí sí que metemos código 10 = 3 Bueno

45:39

si yo ejecuto esto lo que veremos es

45:41

igualdad 10 = 3 es false vale los

45:43

operadores de igualdad nos van a dar

45:45

como resultado si es verdadero o falso

45:47

qué significaría esto claro los números

45:49

es como muy fácil de ver pero con los

45:51

operadores de igualdad también podemos

45:53

comparar valores de variables valores de

45:55

cadenas de texto claro podríamos

45:57

utilizar para varias cosas aún así ya

45:59

digo lo voy a poner con números pero

46:00

tenerlo en cuenta que lo podéis utilizar

46:01

con más cosas vale vamos por aquí vamos

46:03

a ver más operadores de comparación

46:05

igual que tenemos el de igualdad tenemos

46:07

el de desigualdad vale Cómo es el de

46:09

desigualdad en python por ejemplo es con

46:11

el símbolo de admiración y el igual 10

46:13

es distinto de tres ahora si ejecutamos

46:16

esto sí que nos daría 10 distinto de

46:18

tres es true efectivamente 10 es

46:20

distinto de tres vale vamos a más vamos

46:22

a seguir tirando aquí por ejemplo mayor

46:24

que 10 Mayor que 3 es que bueno en este

46:28

caso pues sería verdadero igual que el

46:30

mayor que también tenemos el menor que

46:32

con el símbolo menor igual que tenemos

46:35

el mayor y el menor que tenemos el mayor

46:38

o igual que y el menor o igual que mayor

46:41

o igual que menor o igual que y sería

46:44

con el mayor y el igual pues tal cual

46:46

suena y el menor y el igual y aquí más

46:48

de lo mismo aquí podríamos cambiar el

46:49

valor y decir e 10 es mayor o igual que

46:53

10 y aquí podría decir es menor o igual

46:57

que tres este lo puedo dejar así para

46:59

que el primero por ejemplo pues nos dé

47:01

un true ya que es 10 Es mayor que 10 no

47:03

pero es igual mayor o igual con lo cual

47:05

nos vale perfectamente Entonces todos

47:07

estos son los operadores de comparación

47:09

que habitualmente pues suele tener un

47:11

lenguaje línea 19 está mal esperar mayor

47:14

o igual que mayor o igual que 10 ahí

47:17

estamos gracias Qué más operadores

47:19

tenemos por aquí operadores lógicos

47:21

también comunes a la gran mayoría de

47:24

lenguajes de de programación esto sí que

47:27

la gran mayoría Pues nos suelen sonar

47:30

vale seguro que os suena el operador and

47:32

que en algunos lenguajes escribe and en

47:34

otros lenguajes se escribe Pues con dos

47:36

ampersan vale Cómo o qué acaba para qué

47:40

acaba valiendo el and bueno el and lo

47:42

que intenta es que dos condiciones pues

47:45

sean iguales Okay pues vamos a ver esto

47:46

un and imagínate 10 + 3 es ig a 13 and m

47:54

5 - 1 es ig a 4 qué nos acabará dando

47:58

esto venga Lo Interpol y metemos

48:00

exactamente este código por aquí vale es

48:03

y le voy a meter el código vale 10 + 3 =

48:06

13 and 5 - 1 = 4 esto significa 10 + 3 =

48:10

13 y 5 - 1 es = 4 10 + 3 = 13 verdadero

48:16

y 5 - 1 = 4 también verdadero verdadero

48:19

y verdadero es verdadero con lo cual el

48:21

and está cumpliendo pues las dos

48:23

operaciones que tenemos por aquí por eso

48:25

este and es true okay Bueno totalmente

48:28

cierto por supuesto se han cumplido

48:30

ambas condiciones a la derecha y a la

48:31

izquierda de este operador lógico Pero

48:33

en cambio tenemos un operador lógico que

48:36

es el or o a veces también representado

48:38

en algunos lenguajes de programación con

48:40

este pip no Y si yo ahora cambiara esto

48:42

y pusiera or aquí or nos va a volver a

48:46

decir que es true Pero por qué vale

48:48

porque el or lo único que pide es que

48:50

sea verdadera por lo menos una de las

48:52

condiciones ahora vamos a hacer que esto

48:54

es mentira por ejemplo voy a hacer 10 +

48:56

3 voy a poner 14 Pero en cambio Si Yo

48:58

corro el programa me va a seguir

49:00

diciendo que este or es true Por qué

49:02

Porque 10 + 3 no es 14 pero 5 - 1 sí que

49:06

es 4 entonces como se cumple una de las

49:08

condiciones de esta operación lógica es

49:10

verdadera vale así funciona el operador

49:12

o al final lo tenemos que leer uno u

49:14

otro si uno u otro es verdadero es

49:17

verdadero en cambio para que este an sea

49:19

verdadero tiene que ser tien que ser

49:21

verdadero ambos tiene que ser verdadero

49:23

este tiene que ser verdadero este por

49:25

aquí y cuál es el tercero operador

49:27

lógico que solemos tener la gran mayoría

49:29

de lenguajes de programación Pues el not

49:31

o representar muchos lenguajes de

49:32

programación con el símbolo de

49:33

admiración voy a hacer otra porque creo

49:35

que así lo vamos a ver bien aquí no

49:37

tenemos que andar combinando nada vale

49:39

voy a poner por ejemplo 10 + 3 = 14 y yo

49:42

ahora vengo por aquí y digo 10 + 3 es =

49:45

14 esto al ejecutarlo me daría false

49:48

porque 10 + 3 no es igual a 14 Pero en

49:51

cambio Si yo negara esto y pusiera not o

49:54

le pusiera el not aquí delante qué

49:55

significaría que sería verdadero en caso

49:58

de que esto no se cumpliera okay Así que

50:01

vengo por aquí y ahora al correrlo ahora

50:03

ya me da true veis ya pasado a ser

50:05

verdadero perfectamente vale más

50:07

operadores hay bastantes no y al final

50:09

parece que solo usamos dos o tres

50:11

operadores de asignación qué es esto de

50:13

los operadores de asignación Pues bueno

50:15

son operadores que en realidad estamos

50:17

utilizando en conjunto pues por ejemplo

50:19

con el valor de las variables voy a

50:20

venir por aquí y me voy a crear una

50:22

variable que le voy a llamar my number

50:23

por ejemplo y a my number le voy a dar

50:25

el valor 11 me he creado una variable

50:27

venga y la voy a imprimir print pues my

50:30

number aquí ya estoy haciendo una

50:31

asignación Aquí tengo el operador de

50:33

asignación el igual sirve para asignar

50:35

el valor 11 a la variable que se llama

50:37

en este caso my number esto ya es una

50:39

asignación Pero qué más operadores por

50:41

ejemplo tengo yo por ejemplo tengo el

50:43

más igual Imagínate que hago my number +

50:45

= 1 Qué significa este operador más

50:48

igual esto es suma y asignación dejadme

50:51

que que imprima muchas veces aquí el

50:52

valor de My number que así voy metiendo

50:55

los diferentes operadores de asignación

50:57

Qué hace esto pues le suma uno al valor

50:59

que ya tiene my number veis que aquí no

51:01

aparece el 11 en ningún momento o que no

51:02

aparece my number sumándole uno que no

51:04

estoy haciendo igual my number + 1 que

51:07

esto podría valer aquí estaría

51:09

utilizando este operador aritmético pero

51:11

no hay operador de asignación que ya me

51:13

permite directamente sumarle uno uno o

51:16

lo que me dé la gana o cinco fíjate

51:18

imprimo Esto me da 16 Por qué Porque al

51:20

valor que tiene my number le he sumado

51:21

cinco vale Pero igual que tenemos la

51:23

suma y la asignación vamos a ver qué más

51:25

cosas tenemos Pues por supuesto vamos a

51:27

combinar estos operadores aritméticos

51:29

que vimos antes si ponemos - = 1 es

51:32

resta y asignación qué más podemos

51:34

utilizar si podemos utilizar la suma y

51:36

la resta seguramente podremos utilizar

51:38

la multiplicación multiplicación y

51:39

asignación más si podemos utilizar la

51:41

multiplicación y asignación podremos

51:43

utilizar la división y la asignación y

51:45

así no tenemos que andar repitiendo

51:47

código vale Y esto ya nos va a dar pues

51:49

una pista ya voy a poner aquí unos

51:51

cuantos más qué más operadores teníamos

51:53

aritméticos pues teníamos el de módulo

51:55

módulo y asign vale aquí lo que

51:57

podríamos hacer es acabar metiendo las

51:59

voy a poner por ejemplo en el de

52:00

multiplicación que ya sea por dos y la

52:02

división Pues que sea entre dos lo

52:04

podemos ir variando no pasa nada y aquí

52:06

podría calcular el módulo de dos porque

52:08

el de uno pues al final nos da el mismo

52:09

Vale qué más cosas recordáis que

52:11

teníamos el exponente pues tenemos aquí

52:13

exponente y asignación Y por supuesto

52:16

También tenemos división entera y

52:18

asignación con las dos barras es decir

52:20

podemos combinar estos operadores

52:22

aritméticos que vimos antes con las

52:24

operadores de asignación Así que vengo

52:26

por aquí ahora lanzo esto y podemos más

52:28

o menos echarle un ojo a ver si esto se

52:30

corresponde vamos a repasarlo tenemos 11

52:32

11 + 1 12 12 - 1 11 que vemos por aquí

52:36

11 * 2 y asignado 22 aquí lo vemos vale

52:40

en cambio Si después lo dividimos entre

52:42

dos ya nos da otra vez 11 y después que

52:45

ya nos ponemos a hallar el módulo de dos

52:47

pues claro ya al final ya solo Tenemos

52:49

uno el exponente de uno es uno la

52:51

división entera de uno es uno fijáis

52:53

entonces Bueno aquí lo tenemos como con

52:55

los diferentes operadores y cómo los

52:56

Vamos combinando pues ya llevamos unos

52:58

cuantos operadores por aquí venga hemos

53:00

acabado ni mucho menos ni mucho menos

53:02

venga seguimos operadores de identidad

53:06

qué es esto los operadores de de

53:08

identidad los operadores de identidad

53:10

podemos pensar bueno identidad Qué es la

53:11

identidad nos sirven para comparar

53:13

valores pero valores de qué tipo No

53:15

Bueno en realidad los operadores de

53:16

identidad nos sirven para comparar el

53:19

valor no de la variable sino el valor de

53:22

la posición de memoria y os lo voy a

53:25

explicar muy rápido vale voy voy aquí

53:26

por ejemplo a crear una nueva variable

53:28

my New number Vale y a my New number le

53:31

voy a dar el valor 1.0 por qué porque le

53:34

estoy dando exactamente el valor que va

53:36

a tomar my number y ahora voy a hacer

53:38

aquí un print con un operador de

53:40

identidad también interpolando y voy a

53:41

hacer aquí my number is que es el

53:44

operador de identidad my New number y

53:46

vamos a ver si esto es igual my number

53:49

is my New number es y Aquí vamos a

53:52

interpolar esto a ver qué nos dice pyth

53:54

dice my number is my new New number es

53:57

false cómo es false Es imposible my New

54:00

number Vale 1.0 y my number en la última

54:03

ejecución vale 1.0 Cómo es false cómo

54:06

que es false a ver espera voy a imprimir

54:08

aquí my New number A ver cuánto daba

54:10

aquí lo tenemos 1.0 1.0 Entonces cómo

54:13

nos da false porque como os decía los

54:15

operadores de identidad la identidad lo

54:17

que intentan comparar es el valor en

54:19

memoria es decir tienen sí son dos

54:21

números que tienen el mismo valor pero

54:23

my New number ocupa una dirección de

54:25

memoria my number ocupa otra dirección

54:27

de memoria con lo cual no es el mismo

54:29

Pero en cambio Ahora imagínate que yo a

54:31

my New number le doy el valor de My

54:33

number ahora tenemos una variable que es

54:35

my number que tiene una posición de

54:36

memoria y my New number que ahora tiene

54:38

la misma posición de memoria que my

54:40

number lo lanzo y ahora ya nos dice aquí

54:42

my New number es true lo veis Aquí es

54:44

donde está el operador de identidad como

54:46

tal y igual que tenemos un operador de

54:48

igualdad con el is tenemos un operador

54:51

de desigualdad pero en identidad que es

54:53

is not si yo pusiera ahora not ahora

54:57

vemos por aquí es false porque ahora sí

54:59

que no lo es entonces aquí operador de

55:01

identidad bueno bastante fácil bastante

55:03

rápido pero que alguna vez nos puede

55:05

hacer falta para comparar si de verdad

55:07

dos objetos son iguales vale Y ya digo

55:10

que estoy haciendo todos los ejemplos

55:11

con números porque es una forma fácil de

55:13

verlo pero no os quedéis con que estos

55:15

operadores de identidad o cualquier tipo

55:17

de operador únicamente apliquen a

55:19

números porque es muy habitual que

55:20

apliquen a cadenas de texto que apliquen

55:22

a objetos conceptos que ya veremos más

55:23

adelante seguimos venga vamos por aquí

55:26

operadores hay bastantes no operadores

55:29

de pertenencia operadores de pertenencia

55:31

también muy fácil un operador de

55:33

pertenencia al final lo que nos ayuda es

55:36

si algo pertenece a algo así de fácil

55:39

cómo lo vamos a entender muy fácil sobre

55:41

todo cuando trabajamos con conjuntos con

55:44

estructuras se utilizan mucho pero como

55:45

aún no hemos visto ese tipo de conceptos

55:48

vamos a verlo de una manera muchísimo

55:49

más fácil voy a venirme por aquí voy a

55:51

hacer un print e Imagínate que yo quiero

55:54

comprobar que la letra a está en la

55:56

palabra brce imagínate o que la letra u

55:59

está en la palabra moure Vale entonces

56:02

voy a venir por aquí u os Lo pongo aquí

56:04

la letra u está en moure y vamos a

56:06

comprobar esto vengo por aquí y vamos a

56:08

hacer u in moure y el in este va a

56:12

comprobar que si esta letra o lo que sea

56:14

está dentro del texto dejarme que Lance

56:16

esto lo veis u in mour igual a true ojo

56:19

eh estos operadores de pertenencia no

56:22

existen en todos los lenguajes estos ya

56:24

ya empiezan a ser un poquito más raros o

56:25

a veces no son tan directos pero la gran

56:28

mayoría sí que existen digo para

56:29

comprobar que algo existe en otro

56:31

conjunto es muy muy rápido y por

56:33

supuesto igual que tenemos esta

56:35

pertenencia podemos comprobar que no

56:38

pertenece por ejemplo la B voy a decirle

56:40

not in moree o mouredev por eso ahora

56:43

vemos B not in mouredev y ahora sí que

56:45

nos dice true Okay Vale entonces bueno

56:47

operadores de pertenencia Buscar de que

56:50

más forma formas los podéis aplicar pero

56:53

a mí personalmente me gustan mucho y son

56:55

muy muy útiles y ahora vamos con los

56:57

operadores que existen en todos los

56:59

lenguajes y que seguramente menos

57:02

utilizan y en muchos casos que igual a

57:04

lo largo de tu vida solo los utilizas un

57:06

par de veces y la gran mayoría cuando

57:08

estás estudiando operadores de bit por

57:10

supuesto nosotros en los lenguajes

57:12

tenemos operadores para trabajar con

57:14

bits se usan para realizar operaciones a

57:17

nivel de bit sobre números enteros okay

57:19

Así que vamos a ver operadores de bits y

57:22

aquí ahora eh voy a aprovechar esta

57:25

clase esta le para casi explicaros

57:28

operaciones con bits que bueno son

57:29

bastante simples pero que así también

57:31

vais ver cómo aparecen otro tipo de

57:33

operadores vale vamos por aquí y voy a

57:35

crear unas variables vale voy a crear

57:37

una variable igual que teníamos antes

57:39

pues yo que sé una variable que valga 10

57:42

y otra variable B que valga 3 y antes de

57:45

nada vamos a pensar Cuál es el valor en

57:48

bits de 10 y de TR Bueno ya sabéis que

57:51

el cero se representa por cer0 el 1 por

57:53

un después sería el cómo sería dos vamos

57:57

y empezamos a avanzar los bits hasta que

57:59

acabamos dando ya sabéis 0 1 Después qué

58:02

tendría que ser pues le metemos cero a

58:03

la izquierda 10 vale después le metemos

58:05

el 11 no sabéis vamos a avanzar formando

58:08

números Únicamente con ceros y con unos

58:10

vale Así que el tres aquí lo tenemos el

58:12

tres por supuesto a ver esa lo hago con

58:14

dos bits 00 01 vale cómo sería el dos

58:17

cómo hacemos el dos Necesito que me

58:20

contéis en binario por lo menos hasta

58:22

tres Vale pues bueno sería 10 y el tres

58:25

sería 11 vale Así que en binario el 3 es

58:28

11 y el 10 en binario pues es 10 10 no O

58:31

lo que podría ser lo mismo 001 o si

58:33

queréis que los dejemos iguales vale por

58:35

los operadores con bits nos sirven para

58:37

trabajar con números enteros yo puedo

58:39

poner el 10 y el TR aunque no sean

58:40

binarios pero los operadores con bits

58:42

van a transformar estos números a bits a

58:45

ceros y unos y van a trabajar con ellos

58:47

vale Así que vamos a ver los diferentes

58:49

operadores con operaciones con bits

58:51

vamos a empezar aquí con la primera la

58:52

primera operación con bits es la

58:54

operación and las operaciones con bits

58:56

que sería por ejemplo and de 10 se

58:58

utiliza el ampersan para la operación

59:00

and y bueno los dos operadores que

59:02

tenemos por aquí pues cómo sería un and

59:05

bit bit de estos dos vamos a ver por

59:07

aquí vamos a ver el resultado que nos da

59:09

y os voy a explicar el Por qué Cómo está

59:12

operando este and básicamente Así que 10

59:14

and 3 Imagínate que yo lanzo esto y nos

59:17

da 10 ampers and 3 igual a 2 y aquí es

59:21

donde podemos decir eh vale Okay HM no

59:24

entiendo básicamente nada bueno pues el

59:26

operador como funciones que va a ir

59:28

comparando bit a bit Y si ambos bits son

59:30

uno el bit resultante pues es uno de lo

59:33

contrario es cero vamos a hacerlo a mano

59:35

no quiero ponerme Aquí muy loco

59:37

explicando cómo son las operaciones con

59:38

bits porque no creo que esto sea de esta

59:40

clase pero sí para que os hagáis un

59:42

poquito una idea vale el operador and lo

59:44

vuelvo a decir si empieza a comparar bit

59:47

a bit cada uno el bit C con el bit el

59:49

bit1 con el bit 1 el bit 2 con el bit 2

59:51

vale por posiciones y lo que decía es

59:53

que si los dos bits son uno el bit

59:55

resultante es uno no así que vamos a ver

59:57

el resultado aquí y os voy a poner que

59:59

nos daría 1 y o es uno no pues entonces

1:00:02

nos da c0 un y un es 1o pues nos da uno

1:00:05

0 y 0 es uno pues nos da o 0 y 1 es un

1:00:09

Pues nos da c vale Qué número es el 0 0

1:00:12

1 0 Pues básicamente es el dos qué nos

1:00:14

ha dado aquí como resultado dos ya está

1:00:16

y él se ha encargado de transformar a

1:00:19

binario y de operar vale Así que igual

1:00:21

que tendríamos este operador and

1:00:23

tendríamos el operador or tendríamos el

1:00:26

operador voy a venir por aquí or

1:00:27

tendríamos el operador xor y cada uno

1:00:31

Pues un poco siguiendo su su teoría Cómo

1:00:34

es el or con el Pipe Cómo eh es el xor

1:00:38

por ejemplo pues con el circunflejo Qué

1:00:40

hace cada uno en cada caso esperar

1:00:42

porque por lo menos os cuento Aquí muy

1:00:44

rápido Qué hace cada uno en cada caso

1:00:46

vale el or lo que hace también es

1:00:48

comparar bit a bit por son operadores

1:00:50

para bits vale pero en este caso el

1:00:52

operador compara cada bit Y si al menos

1:00:55

uno de los dos bits es uno el resultado

1:00:58

es uno lo hacemos aquí si al menos uno

1:01:00

es uno vamos a empezar desde el

1:01:01

principio uno y C uno es uno vale 1 y 1

1:01:04

es 1 0 y 0 es 0 Y aquí y nos da 10 11

1:01:08

vamos a ver el resultado aquí lo tenemos

1:01:10

11 el resultado 10 1 1 es el valor es el

1:01:14

valor binario asociado al número 11

1:01:16

fijaos es fácil porque el 10 era 10 10

1:01:19

Pues el 10 11 es el 11 y en cambio xor

1:01:21

lo que hacemos Es que el operador va a

1:01:23

comparar cada bit Y si los bits son son

1:01:26

diferentes el resultado es uno en cambio

1:01:28

si son iguales es cer0 vamos por aquí

1:01:30

son diferentes uno y cero es diferente

1:01:33

Vale pues entonces uno uno y uno es

1:01:35

igual pues entonces es 0 0 y o son

1:01:38

iguales pues entonces es c0 uno y o son

1:01:41

distintos con lo cual es uno por eso nos

1:01:44

da el nu 10 0 1 es el nu y el 10 10 era

1:01:47

el 10 entonces aquí operaciones bita

1:01:49

bita hay más operadores binarios o

1:01:51

operadores bit bit vamos por aquí voy a

1:01:53

pillar más y os voy a enseñar muy rápido

1:01:55

porque porque bueno no me quiero parar

1:01:56

mucho tenemos el operador not el

1:01:58

operador not lo que hace es intercambiar

1:02:02

el valor bit bit de cualquiera de los

1:02:04

elementos Imagínate que yo ahora el Note

1:02:07

lo hacemos con la virgulilla fijaos aquí

1:02:09

lo tenemos y ahora le voy a lanzar el

1:02:11

Note sobre el 10 y vamos a ver el

1:02:12

resultado Mira veis 10 y me da -11 por

1:02:15

qué Por qué vemos un -11 vale porque en

1:02:18

realidad lo que está haciendo es

1:02:19

invirtiendo el resultado bit bit sobre

1:02:22

esa representación del 10 entendéis esta

1:02:24

parte vale en realidad ese ese

1:02:26

complemento va negando bit a bit

1:02:28

invierte Al fin y al cabo los bits de es

1:02:30

operando más cosas vale desplazamientos

1:02:33

vamos al desplazamiento vamos a hacer

1:02:34

desplazamientos Ya solo nos queda

1:02:36

desplazamiento a la derecha y

1:02:38

desplazamiento a la izquierda y vamos a

1:02:40

ver muy rápido que esto desplazamiento

1:02:42

Porque también yo creo que también nos

1:02:43

enteramos bastante bien desplazamiento

1:02:45

desplazamiento a la derecha vale el

1:02:47

desplazamiento a la derecha lo hacemos

1:02:49

pues utilizando el mayor que dos veces

1:02:52

Imagínate que yo ahora hago aquí 10

1:02:54

desplazamiento a la derecha Dos dos y

1:02:56

vamos a ver cuál sería el resultado

1:02:58

vamos a ponerlo por aquí con código y

1:02:59

vamos a ver lo que pone aquí

1:03:00

desplazamiento a la derecha nos dice dos

1:03:03

vale Cuál era la representación del 10

1:03:05

la representación del 10 era esto que

1:03:06

veíamos aquí 10 10 Ahora imagínate que

1:03:09

empezamos a desplazar sus bits todos a

1:03:11

la derecha Pues claro este uno Este

1:03:14

pasaría a ser un cero y esto pasaría a

1:03:16

estar aquí y esto pasaría a estar aquí

1:03:17

eso sería desplazamiento hacia la

1:03:19

derecha un bit pero hemos dicho dos bits

1:03:22

Entonces esto pasa a ser un cero

1:03:23

cubrimos desde la izquierda con ceros

1:03:25

desde la derecha con cero según hacia

1:03:27

donde nos desplacemos esto pasaría a ser

1:03:29

un cer0 y el uno que teníamos antes en

1:03:31

esta posición pasa aquí Qué es 00 1 0

1:03:34

bueno 10 es el valor binario que le

1:03:38

asociamos al número dos por eso nos da

1:03:40

dos okay Por eso acabamos teniendo este

1:03:42

resultado que veíamos por aquí vale

1:03:43

igual que tenemos el desplazamiento a la

1:03:44

derecha tenemos a la izquierda que lo

1:03:46

hacemos así qué nos daría Pues mira

1:03:48

desplazamiento vemos lo que nos da 40

1:03:51

eso qué significaría si tenemos 10 10

1:03:53

qué es lo que teníamos inicialmente 10

1:03:55

10 vale si desplazamos dos vitas hacia

1:03:58

la izquierda quiere decir que cubrimos

1:04:00

con estos dos ceros entonces 1 0 1 0

1:04:04

esto básicamente es 40 en binario Y

1:04:07

estos Ahora sí Estos son todos los

1:04:09

operadores básicamente que tenemos en

1:04:12

python según el lenguaje que hayáis

1:04:14

elegido quién sabe si más o si menos por

1:04:17

eso se trata de que al final Aquí hay

1:04:19

una teoría Aquí hay una clase en la que

1:04:21

tenemos que empezar a revisar en cada

1:04:23

uno de nuestros lenguajes Cuáles son los

1:04:25

operadores sí que es cierto que aún así

1:04:27

Hay alguno más que puedo meter pero

1:04:30

prefiero quedarme con operadores que

1:04:32

suelen ser más comunes en todos los

1:04:34

lenguajes ahora si empezamos a comparar

1:04:36

diferentes lenguajes hay alguno más del

1:04:39

que podría hablar por aquí en python Y

1:04:42

por supuesto en otros lenguajes que

1:04:43

hayáis elegido Pues también va a

1:04:46

aparecer otros Así que fijaos Hacia

1:04:47

dónde lo podríamos llevar pero creo que

1:04:49

sirve más que de sobra para ejemplificar

1:04:52

por lo menos los operadores que tenemos

1:04:54

comunes en gran parte de los lenguajes

1:04:56

como son operadores aritméticos de

1:04:57

comparación lógicos de asignación de

1:05:00

identidad y estos que tenemos aquí por

1:05:02

último de pertenencia y vitavit más

1:05:04

cosas que nos pedía El ejercicio es

1:05:05

bastante fácil pero ya veis que lleva

1:05:07

algo de tiempo dice utilizando las

1:05:08

operaciones con operadores que tú

1:05:10

quieras cree ejemplos que representen

1:05:12

todos los tipos de estructuras de

1:05:14

control Hala Ahora nos tenemos que poner

1:05:16

aquí a hablar de estructuras de control

1:05:18

Pues bueno a ver qué tenemos de

1:05:19

estructuras de control Aquí también

1:05:20

dependerá un poco del lenguaje yo me voy

1:05:22

a quedar con lo más clásico vale que

1:05:24

tenemos en los lenguajes que esto

1:05:26

también forma parte de los fundamentos

1:05:27

Pues bueno qué estructuras de control

1:05:29

podríamos tener pues las primeras Son

1:05:32

estructuras de control condicionales y

1:05:34

esto lo Vais a entender rapidísimo

1:05:36

porque igual Nunca habéis pensado Cuál

1:05:38

es el nombre de una estructura de

1:05:40

control condicional la estructura de

1:05:41

control Al fin y al cabo nos sirve para

1:05:42

que nosotros le indiquemos a nuestro

1:05:44

código Cómo tomar diferentes caminos

1:05:46

pues Qué es la estructura de control por

1:05:48

antonomasia en cualquier lenguaje de

1:05:50

programación Pues el If el Sí si algo se

1:05:52

cumple haz algo si no se cumple Pues haz

1:05:54

otra cosa voy a crear por ejemp por

1:05:55

ejemplo aquí Pues un String no my String

1:05:57

una variable que se llama my String se

1:05:59

va a llamar mouredev esta cadena de

1:06:01

texto y le voy a poner si my String es

1:06:03

igual ahora ya vemos e ya estamos

1:06:05

utilizando aquí un operador ya estamos

1:06:06

comparando si my String es md Pues aquí

1:06:09

voy a hacer algo con mi código voy a

1:06:11

lanzar un print por terminal que diga my

1:06:14

String es m y si no se cumpliera cómo

1:06:17

funcionan estas estructuras de control

1:06:19

condicional Pues igual que tenemos el If

1:06:20

el si tenemos el Else que es que se va a

1:06:23

desencadenar una instrucción en caso de

1:06:25

que esta condición no se cumple esta

1:06:27

condición o como la querramos complicar

1:06:29

esta condición sería venir por aquí

1:06:31

poner pues my String que es lo que

1:06:32

estamos revisando alguna forma no es

1:06:34

mouredev si yo ahora corriera este

1:06:36

código veis que lo que imprimimos es

1:06:37

mystream es mouredev Pero si yo ahora

1:06:39

pusiera mouredev con muchas vves vemos

1:06:41

que lo que imprime es my String no es m

1:06:43

de porque lo que tiene es muchas subes

1:06:45

pero también le podemos indicar que haga

1:06:46

comprobaciones intermedias vale que muy

1:06:48

bien Igual no se cumple este If Pero

1:06:50

igual hay otra comprobación o

1:06:52

comprobaciones por el medio que podemos

1:06:53

hacer eso es lo que llamamos un el sif

1:06:56

podría comprobar no Bueno pues igual no

1:06:58

es murd pero a mí me interesa hacer algo

1:06:59

con mi código en caso de que sea bry sea

1:07:02

mi nombre entonces Aquí voy a poner un

1:07:04

print que sea my String my String es bry

1:07:07

Vale entonces ahora nos dice que es md

1:07:09

Pero si yo ahora le cambio aquí el texto

1:07:11

y lo cambio a bry me dice my stram es

1:07:13

brise no ha entrado por este If ya que

1:07:15

no se ha cumplido esta condición pero sí

1:07:17

que se ha cumplido esta condición aquí

1:07:18

solo se va a ejecutar una de ellas la

1:07:20

que se cumpla o que myin sea igual a m o

1:07:22

que myin sea igual a brce o que no sea

1:07:24

ni mev no es mdev ni price aquí tenemos

1:07:28

la estructura de control condicional

1:07:30

pero igual que las tenemos condicionales

1:07:31

también las tenemos iterativas

1:07:33

iterativas habitualmente solemos tener

1:07:35

dos la primera suele ser el for para

1:07:37

crear bucles Bueno un for muy simple un

1:07:40

for que es una estructura iterativa nos

1:07:42

vale para recorrer estructuras que

1:07:43

tienen más de un elemento o para

1:07:45

ejecutar una acción varias veces

1:07:47

Imagínate que yo lo que quiero hacer es

1:07:49

imprimir los números del C al 10 pues en

1:07:55

python esto ya iremos viendo pues

1:07:57

sintaxis no yo tengo algo que se Rango Y

1:07:59

si yo pongo Rango de 11 y aquí lo que

1:08:01

hago es lanzar un print de I esto para

1:08:03

qué me servirá para por pantalla mostrar

1:08:06

los números del 1 al 10 aquí lo veis

1:08:08

Rango significa una estructura que va

1:08:11

meter todos los números desde el cero

1:08:12

hasta el número que yo le indique aquí

1:08:14

sin tener en cuenta ese número claro he

1:08:15

puesto 11 con lo cual el último número

1:08:17

será el 10 no tiene en cuenta el último

1:08:19

y el for lo que hace es venga voy a

1:08:21

ejecutar esto que tengo dentro del

1:08:24

propio bucle tantas veces como elementos

1:08:26

existan en este Rango en este Rango hay

1:08:29

el elemento c el un el 2 el TR el cuat

1:08:31

hasta el 10 por eso se ha lanzado el

1:08:32

print en concreto 11 veces no desde el

1:08:35

cer0 hasta el 10 okay igual que tenemos

1:08:37

el bule for también sol ahora según el

1:08:39

lenguaje hay otros que son for each o

1:08:42

igual en estructuras condicionales habrá

1:08:44

otra gente que diga Ey que también

1:08:46

tenemos el Case bueno en python hay algo

1:08:48

parecido pero ya digo me suelo quedar

1:08:50

con lo más común Lo más habitual hay du

1:08:53

wils por ejemplo en otros lenguajes

1:08:55

bueno vamos a quedarnos con los más

1:08:56

simples for donde yo lo que tengo es

1:08:58

bueno una estructura que voy a acabar

1:09:00

recorriendo y el While que lo que yo

1:09:02

intento plantearla aquí es una condición

1:09:04

para que el bucle se ejecute mientras

1:09:06

Esa condición sea verdadera imaginemos

1:09:08

que ahora yo creo por aquí una variable

1:09:10

y un índice que vale cer0 Y yo ahora le

1:09:12

digo Mira mientras el valor de I sea

1:09:16

menor o igual que 10

1:09:21

ejecútalo esto el valor de I siempre va

1:09:24

a ser cero entonces va a imprimir sos si

1:09:26

yo lo lanzo veis esto hasta que prenda

1:09:28

fuego mi ordenador va a estar

1:09:29

imprimiendo cero porque es el valor que

1:09:31

tiene y entonces este bucle es lo que

1:09:32

llamamos un bucle infinito okay Pero en

1:09:35

cambio Si yo Después de ejecutar esto le

1:09:37

hago I y le hago esta asignación más = 1

1:09:40

qué pasaría que cada vez que se ejecuta

1:09:41

el bucle se le suma uno al valor

1:09:43

entonces fíjate cer0 pasa a valer uno

1:09:46

después pasa a valer dos pasa a valer

1:09:48

tres pasa a valer cuatro Entonces ahora

1:09:50

yo lanzo esta ejecución y vemos que con

1:09:52

el for imprime de 0 a 10 y con el While

1:09:54

también imprimir de 0 a 10 porque en el

1:09:57

momento que no se cumpla esta condición

1:09:59

del While se sale del bucle y se acabó

1:10:01

Ya está Vale bastante fácil Estos son

1:10:03

las estructuras de control iterativas

1:10:06

más habituales que solemos tener pero

1:10:09

sabíais que existen estructuras de

1:10:12

control para manejo de excepciones y que

1:10:14

también se llaman estructuras de control

1:10:16

vamos a provocar una excepción en

1:10:19

nuestro código por ejemplo voy a

1:10:20

imprimir 10 entre C no Qué pasa aquí

1:10:23

Hala una visión entre cero esto no

1:10:25

no se puede el mundo se acaba si tú

1:10:26

divides algo entre cero por supuesto

1:10:28

Imagínate que tú tienes un programa que

1:10:30

están utilizando millones de usuarios y

1:10:31

Tú metes todo en este código pues le

1:10:33

explotaría el programa a la gente le

1:10:34

daría un no lo podría seguir

1:10:35

utilizando y tu jefe te acabaría

1:10:37

despidiendo vale por no manejar

1:10:38

excepciones Bueno pues lo que solemos

1:10:41

tener también es un control de flujo

1:10:43

pero en este caso no basado en estas

1:10:45

condiciones bas operaciones estructuras

1:10:48

sino basado en problemas que pueda tener

1:10:50

nuestro código eso es lo que soléis

1:10:52

conocer muchas veces en la gran mayoría

1:10:53

de lenguajes como TR no como yo le puedo

1:10:56

decir Mira vamos a intentar ejecutar

1:10:58

este código pero en caso de que falle

1:11:01

por favor programa no te rompas intenta

1:11:03

recuperarte de tu error controlamos el

1:11:05

error puede que el programa no acabe

1:11:07

haciendo todo lo que yo quería porque se

1:11:09

nos ha ido la olla pero que el programa

1:11:10

no rompa que no pase esto que el

1:11:12

programa no se detenga que siga

1:11:13

ejecutando bueno el Catch en python es

1:11:17

except vale entonces yo le podría poner

1:11:19

TR except y aquí podría ponerle Se ha

1:11:21

producido un error entonces si yo ahora

1:11:22

ejecuto Esto me dice mi programa se ha

1:11:25

producido un error pero mi programa no

1:11:26

ha petado te fijas por lo menos si esto

1:11:28

ha petado se ha ido a esta línea lo ha

1:11:30

intentado manejar y el programa ha

1:11:32

continuado feliz vale Y aparte tenemos

1:11:34

una última instrucción que nosotros le

1:11:36

podemos también poner que es el Finally

1:11:38

que esto es esta es una instrucción que

1:11:40

se va a ejecutar siempre que finalice el

1:11:42

manejo de error se produzca error o no

1:11:43

se produzca y voy a poner aquí ha

1:11:45

finalizado el manejo de excepciones

1:11:47

entonces vemos que ahora por consola se

1:11:48

nos va imprimir Se ha producido un error

1:11:50

y ha finalizado el manejo de excepciones

1:11:52

print 10 entre C ha petado se ha ido a

1:11:54

qu hace cuando Peta y al acabar el

1:11:56

manejo del error ha ido por el Finally

1:11:58

porque lo va a ejecutar siempre ahora

1:12:00

voy a poner 10 / 1 10 / 1 no va a petar

1:12:02

vemos que ha imprimido aquí 10 no ha

1:12:04

petado no ha mostrado Se ha producido un

1:12:06

error porque no se ha producido entonces

1:12:07

lo que ha hecho es el print se ha

1:12:09

ejecutado correctamente y se ha ido al

1:12:10

Finally directamente ha finalizado el

1:12:12

manejo de excepciones vale Y este Ahora

1:12:14

sí Este es el último el último el último

1:12:17

elemento que tenemos habitualmente para

1:12:19

controlar estructuras de control aparte

1:12:21

de las condicionales y las iterativas

1:12:23

fijaos ejercicio simple pero 96 líneas

1:12:26

llevamos de código para hacer un repaso

1:12:28

solo de ese control y esos operadores

1:12:31

que tenemos en la gran mayoría de

1:12:32

lenguajes según el lenguaje que hayáis

1:12:34

seleccionado acabaría viendo que existen

1:12:37

Pues más o menos controles vale os decía

1:12:40

que estos ejercicios de lo que se trata

1:12:42

es ya no solo de hacer la parte del

1:12:45

ejercicio sino si ya tenéis

1:12:46

conocimientos pues os iré poniendo pues

1:12:48

unas partes con una dificultad un

1:12:50

poquito extra para que así vosotros

1:12:52

también podáis hacer algo más a medida

1:12:54

que vais aprendiendo o si ya teníais

1:12:56

este conocimiento Pues que ya

1:12:58

directamente hagáis el extra para que a

1:13:00

todo el mundo no Se le haga tan simple

1:13:01

aún así cualquier persona con un poquito

1:13:03

de experiencia este este extra es muy

1:13:05

facilito Pero bueno así poco a poco pues

1:13:07

vamos creando el recurso vamos por aquí

1:13:08

dificultad extra a ver qué contaba decía

1:13:11

creo un programa que imprima por consola

1:13:13

todos los números comprendidos entre el

1:13:15

10 y el 55 incluidos Vale pues voy a

1:13:17

venir por aquí y voy a hacer una otra

1:13:20

sección con el extra y vamos a ver lo

1:13:22

que nos iba pidiendo creo un programa

1:13:24

que imprima por consola todos los

1:13:25

números comprendidos entre 10 55 vale Yo

1:13:27

sé que esto es un for voy a poner aquí

1:13:28

number in y va a ser un Rango Pero cómo

1:13:31

va a ser el rango si yo quiero hacer que

1:13:33

sea entre el 10 y el 55 Pues será Rango

1:13:37

entre el 10 que lo tengo en cuenta y el

1:13:39

56 vale esto ya era un ejercicio como

1:13:41

para aplicar lo que hemos visto a lo

1:13:43

largo de la lección dice vale incluidos

1:13:45

Así que yo con esto ya podría hacer aquí

1:13:47

un print de cada número number Y si yo

1:13:49

lanzara esto vemos que va a imprimir

1:13:51

desde el cero ta ta ta hasta el 55 vale

1:13:53

Ya soy capaz de esto pero me dice ey

1:13:55

pero todos los números comprendidos

1:13:57

entre 10 55 incluidos pero que sean

1:14:00

pares Uf tengo que comprobar que sean

1:14:02

solo los pares Mira es muy fácil puedo

1:14:04

hacer un If porque quiero controlar el

1:14:06

flujo y cómo compruebo si los números

1:14:07

son pares yo por una definición

1:14:09

matemática sé que un número es par si al

1:14:12

Hallar el módulo de dos de ese número el

1:14:15

resultado es cero decir que esa división

1:14:16

entera el resto me da cer0 Así que si yo

1:14:19

ahora hiciera esto sé que por aquí ya

1:14:21

Solo se van a imprimir los números entre

1:14:23

el 10 y el 55 que sean pares y aquí lo

1:14:25

veis 24 26 28 30 32 son los pares Pero

1:14:29

qué más decía y que no son ni el 16 Ah

1:14:32

bueno pero yo ahora esto ya lo sé ya le

1:14:34

puedo meter aquí una condición and que

1:14:36

el número sea distinto no del 16 le

1:14:39

puedo decir que sea distinto el 16

1:14:41

Entonces el número 16 que ahora se

1:14:43

imprimía como vuelvo a lanzar esto voy a

1:14:46

tener el número 14 y voy a saltar al 18

1:14:49

directamente ya no tiene en cuenta el 16

1:14:51

y qué más cosas decía y ni los múltiplos

1:14:53

de tres ala Y cómo son los múltiplos de

1:14:55

tres Pues también es Otra condición más

1:14:57

an y Cómo sé si un número es múltiplo de

1:14:59

tres pues muy parecido también con el

1:15:01

módulo si el módulo de tres es distinto

1:15:04

de cero de cero veré que se está

1:15:06

cumpliendo lo que tenemos aquí que

1:15:07

tampoco es múltiplo de tres si es

1:15:09

distinto de cero no es múltiplo de tres

1:15:10

y ahora se acaba imprimiendo todo esto

1:15:12

que vemos por aquí que vemos Que bueno

1:15:13

en gran medida pues no cambia mucho era

1:15:15

un ejercicio s simple pero que nos valía

1:15:17

para ir razonando y poniendo en práctica

1:15:19

cosas que hemos visto antes

1:15:24

[Música]

1:15:26

el ejercicio os proponía esto crea

1:15:28

ejemplos de funciones básicas que

1:15:30

representen las diferentes posibilidades

1:15:31

del lenguaje sin parámetros ni retorno

1:15:33

con uno varios parámetros con retorno

1:15:35

bueno básicamente la idea era entender

1:15:38

entre muchas más cosas que os voy

1:15:39

pidiendo aquí paso a paso que es esto de

1:15:41

las funciones si nunca habéis tenido un

1:15:43

contacto con un lenguaje así que me voy

1:15:45

al apartado de funciones al proyecto me

1:15:48

voy a la carpeta de python y voy a crear

1:15:50

un ejercicio que se llame mouredev punp

1:15:54

mi nombre de G que es lo que tenéis que

1:15:55

hacer y la extensión pun p porque lo voy

1:15:58

a hacer en python Okay y vamos a ir poco

1:16:00

a poco pues resolviendo el ejercicio y

1:16:03

explicándolo lo tengo por aquí abierto

1:16:04

para tenerlo también a mano dice crea

1:16:06

ejemplos de funciones básicas que

1:16:07

representan las diferentes posibilidades

1:16:09

de un lenguaje Bueno yo creo que lo

1:16:11

primero que tenemos que explicar con

1:16:12

todo esto es que qué es esto de una

1:16:13

función no una función Al fin y al cabo

1:16:15

es un bloque de código y un bloque de

1:16:17

código que lo creamos en forma de

1:16:19

función para poder reutilizar una acción

1:16:22

específica eh nos van a proporcionar

1:16:23

pues una forma de organizar el código en

1:16:26

bloques lógicos para como he dicho

1:16:28

reutilizar el código e intentar que sea

1:16:32

más legible hacer que el código sea más

1:16:34

limpio que se cometan menos Bag que sea

1:16:37

más fácil de escalar de mantener

1:16:38

etcétera Así que esto es lo primero que

1:16:41

teníamos que entender Qué es una función

1:16:43

como tal y ahora vamos a ir

1:16:44

implementando por los diferentes bloques

1:16:45

de funciones aquí decía Pues bueno que

1:16:48

lo primero las funciones básicas no

1:16:50

vamos a intentar hablar de las

1:16:51

diferentes funciones básicas que existen

1:16:53

en la gran mayoría de lenguajes para

1:16:55

entender bien el concepto de funciones

1:16:57

Son son las que llamamos esas funciones

1:16:59

definidas por el usuario funciones

1:17:02

definidas por el usuario no no hablamos

1:17:04

de funciones ya creadas en el sistema

1:17:06

eso será otro apartado del ejercicio

1:17:07

pero vamos a centrarnos primero en las

1:17:09

funciones que crea el usuario como le dé

1:17:12

la gana Pues bueno hay diferentes

1:17:13

funciones vamos a hacer un repaso por

1:17:15

ellas y os voy contar pues De qué trata

1:17:16

cada una lo primero es lo que llamamos

1:17:18

las funciones simples una función eh

1:17:21

según el lenguaje pues tiene una

1:17:22

sintaxis concreta en mi caso en python

1:17:25

Cómo definimos una función con la

1:17:27

palabra reservada Def sin más y a

1:17:30

continuación le tenemos que dar un

1:17:31

nombre yo voy a hacer una función que

1:17:33

salude no que imprima por terminal eh

1:17:36

Hola python por ejemplo Así que le voy a

1:17:38

llamar grip en plan saludo sin más

1:17:40

nombre de la función dos puntos y qué es

1:17:42

lo que hace la función pues como he

1:17:44

dicho en este caso va a hacer

1:17:46

simplemente un print que sea pues Hola

1:17:49

python vale Esta es mi función Entonces

1:17:51

yo ahora aquí ya tengo ese bloque de

1:17:52

código reutilizable que hace una que

1:17:56

responde a una tarea concreta que tiene

1:17:58

una responsabilidad única en este caso

1:18:01

eh Pues saludar es una chorrada de

1:18:03

función pero no sirve para eh

1:18:05

ejemplificar Qué es una función Cómo

1:18:08

hago si quiero que ahora se ejecute este

1:18:09

código pues tengo que llamar a la

1:18:10

función sin más grid si yo ahora

1:18:12

ejecutara este código qué vemos por

1:18:14

terminal Hola python si yo ahora llamara

1:18:17

en dos sitios a la función grid qué

1:18:19

veríamos por terminal pues dos veces o

1:18:21

la python claro Imagínate que aquí

1:18:23

hubiese mucho código o una lógica muy

1:18:26

concreta tendría sentido estar

1:18:28

repitiendo copiando y pegando la lógica

1:18:30

a través de todo nuestro código No eso

1:18:32

es una locura a nivel de de buenas

1:18:34

prácticas pues por eso creamos funciones

1:18:36

funciones que tendrán una accesibilidad

1:18:38

concreta y cuando yo quiero hacer la

1:18:40

función por ejemplo que mi aplicación

1:18:42

tuviera que saludar en muchos sitios

1:18:44

tendría sentido que yo replicar todo

1:18:46

esto no Simplemente me quiero la función

1:18:48

que realiza mi lógica y cuando hace

1:18:49

falta saludar pues llamo a grit a saludo

1:18:52

y ya está igual que tenemos funciones

1:18:54

simples que realizan toda su lógica

1:18:56

dentro y nada más tenemos funciones con

1:18:58

retorno una función con retorno

1:19:00

significa que va a ejecutar una lógica y

1:19:03

va a acabar devolviendo algo le

1:19:05

podríamos decir pues mira una función

1:19:07

que se llame eh return grid Devuélveme

1:19:10

un saludo esta sería la función por

1:19:12

ejemplo aquí podríamos especificar Pues

1:19:13

que queremos devolver por ejemplo un

1:19:15

String una cadena de texto o lo que sea

1:19:17

en python como es un lenguaje de tipado

1:19:19

Dinámico aunque no pongamos que se

1:19:21

devuelve algo podríamos devolverlo y no

1:19:23

pasaría nada no entonces Yo podría venir

1:19:25

aquí y para devolver algo simplemente

1:19:27

haría un return Qué significa que ahora

1:19:29

yo tengo que retornar algo voy a

1:19:31

retornar una cadena de texto qué

1:19:33

significaría si yo ahora llamo a la

1:19:35

función return gd yo hago esto lo lanzo

1:19:37

y veo Hola python solo una vez esta no

1:19:40

esta llamada que teníamos aquí pero

1:19:41

ahora nos está imprimiendo este segundo

1:19:44

a la python Por qué Porque ahora tenemos

1:19:46

un return no tenemos un print que es lo

1:19:48

que lo imprime por terminal con lo cual

1:19:50

tendríamos que acabar capturando este

1:19:52

retorno lo que fuera pongo grid me lo

1:19:55

guardo en una variable porque llamamos a

1:19:57

return grid esto retorna una cadena de

1:19:59

texto que yo me voy a guardar en una

1:20:01

variable Y ahora yo podría venir por

1:20:03

aquí e imprimir el contenido de la

1:20:05

variable y ahora ya veis que ya hay dos

1:20:07

H la python porque ya tengo este valor

1:20:09

guardado en variable y metido aquí si

1:20:11

quisiéramos sin más yo podría imprimir

1:20:14

directamente return gd no me quiero

1:20:17

guardar el retorno en ninguna variable

1:20:19

simplemente lo quiero imprimir Pues mira

1:20:21

voy a imprimir el resultado de llamar a

1:20:23

la función return git sin más bueno ya

1:20:25

veis que es algo como muy muy simple Al

1:20:28

fin y al cabo qué más tipos de funciones

1:20:30

tenemos pues Vale tenemos funciones que

1:20:33

llamamos con argumentos no con un

1:20:35

argumento voy a venir por aquí función

1:20:36

con un argumento Qué significa esto que

1:20:39

nosotros le podemos pasar parámetros a

1:20:41

la función de momento aquí la función la

1:20:44

lógica dependía únicamente de lo que

1:20:46

había en el bloque de código en este

1:20:47

caso retornar en este caso imprimir Pero

1:20:49

y si yo quiero pasarle algo a la función

1:20:52

para que opere con ese algo pues se lo

1:20:54

podrí podía pasar con parámetro creamos

1:20:56

una función que le voy a llamar pues por

1:20:57

ejemplo arg de argumento eh grid Un

1:21:00

saludo pues con un argumento y yo ahora

1:21:02

Aquí le voy a pasar el nombre que quiero

1:21:06

acabar utilizando para el saludo me

1:21:08

vengo por aquí podría hacer el mismo

1:21:11

saludo pero ahora ya tenemos una

1:21:12

variable una variable que yo le paso

1:21:14

como argumento Y ahora yo No querría que

1:21:16

fuera python digo no no Yo quiero que

1:21:18

utilices ahora el nombre que yo te pase

1:21:20

así que yo lo Interpol por aquí y

1:21:22

utilizo este valor name lo voy a

1:21:24

utilizar dentro del texto con lo cual si

1:21:27

yo ahora Quiero llamar a argd si

1:21:29

intentara ejecutar esto Esto me iba a

1:21:31

dar un no ves arrid e Oye se

1:21:33

requiere un argumento posicional que se

1:21:35

llama name no puedes llamar a esta

1:21:37

función porque ahora necesitas Sí o sí

1:21:39

pasarle un parámetro Pues yo ahora por

1:21:41

ejemplo pues quiero saludarme a mí mismo

1:21:43

y le paso el argumento bry y vemos que

1:21:45

lo que imprime es Hola bry tiene un

1:21:47

argumento esto Pues mira con un

1:21:48

argumento puedo poner con argumentos o

1:21:52

lo pongo aparte me voy a copiar este

1:21:54

código y voy a hacer aquí con argumentos

1:21:57

porque por supuesto le puedo pasar más

1:21:59

de un argumento más de un parámetro

1:22:01

ahora le voy a pasar por ejemplo el

1:22:03

saludo y el nombre grid y el name

1:22:07

Entonces ahora el Hola también está

1:22:09

parametrizado entonces si ahora yo

1:22:11

quiero llamar a arx le voy a llamar esta

1:22:13

función porque es varios argumentos y

1:22:15

ahora lo quiero llamar solo con el

1:22:16

nombre brce veis no no no necesitas

1:22:19

pasarle un parámetro que es grit y otro

1:22:21

parámetro que es name Imagínate que yo

1:22:23

quiero saludar en inglés y pongo High

1:22:26

brce le paso dos parámetros tiene dos

1:22:28

parámetros los tengo que separar por

1:22:29

comas Ahora cuando arranco esto vemos

1:22:31

High briis ya se ha cambiado este valor

1:22:34

pero imaginemos que queremos darle

1:22:37

valores por defecto a estos parámetros a

1:22:40

estos argumentos le podríamos dar

1:22:42

imagínate voy a hacer otro tipo de

1:22:44

función con un argumento predeterminado

1:22:47

voy a poner Imagínate que yo quiero

1:22:49

llamar le voy a llamar default argd de

1:22:51

momento tenemos lo mismo pero imagínate

1:22:53

que yo quiero dar la posibilidad de

1:22:55

llamar a mi función Uy qué mal puse Aquí

1:22:58

default rgd Imagínate que yo quiero

1:23:01

llamar a mi función sin pasarle nada

1:23:03

porque digo mira cuando tú quieras

1:23:05

pasarle un nombre como era el caso este

1:23:07

que yo le pasaba a bryce pásaselo pero

1:23:10

en caso de que no quieras pasar nada que

1:23:12

tenga un valor por defecto pues algunos

1:23:14

lenguajes de programación esto ya sabéis

1:23:16

esto es como todo No todos los lenguajes

1:23:18

de programación tienen los mismos tipos

1:23:20

de funciones pero sí que es cierto que a

1:23:22

nivel fundamental la gran mayoría van a

1:23:24

tener casi todas las que yo explique

1:23:26

igual puede aparecer otro lenguaje que

1:23:28

tiene más tipos de los que yo os voy a

1:23:29

contar ahora mismo en python pero que

1:23:31

funciones sin parámetros con parámetros

1:23:33

con retorno con más de un argumento con

1:23:35

valores por defecto esas van a existir

1:23:37

en todos los lenguajes de programación

1:23:38

Okay eso también hay que tenerlo muy muy

1:23:41

en cuenta vale digo que imaginemos que

1:23:43

le queremos dar un valor por defecto

1:23:45

entonces en python por ejemplo se le

1:23:47

puede decir mira cuando name no tenga

1:23:49

valor Dale por defecto el valor python

1:23:51

por eso yo ahora podría llamar a la

1:23:53

función Def F arc grid con o sin

1:23:56

parámetro veis la segunda llamada no

1:23:58

tengo parámetro Y qué me va a imprimir

1:23:59

Hola python porque si no le paso el

1:24:01

nombre le mete el valor por defecto que

1:24:04

tenemos pensar que ahora aquí en el

1:24:06

momento que empezamos a saber que hay

1:24:08

parámetros más de un parámetro valor con

1:24:10

defecto retorno sin retorno todo esto se

1:24:12

puede combinar Yo podría hacer por

1:24:14

supuesto una función con un parámetro

1:24:17

por defecto Y retornarlo en vez de hacer

1:24:19

el print por supuesto esto pensar que

1:24:21

ahora es cuestión de combinar los

1:24:24

diferentes tipos de funciones que

1:24:25

tenemos Vale qué más cosas podríamos

1:24:27

hacer aparte de con un argumento con

1:24:30

varios argumentos con argumentos por

1:24:32

defecto nosotros podríamos hacer que

1:24:33

también todo esto fuera posicional

1:24:35

Imagínate que yo ahora quiero pasarle

1:24:37

estos argumentos en sentido inverso

1:24:40

Quiero pasarle bry y Hi al revés veis lo

1:24:43

que me imprime bry High Uy qué

1:24:45

equivocación lo que yo puedo hacer en

1:24:47

muchos lenguajes es decirle no no no si

1:24:49

yo los paso en orden y sin indicarle con

1:24:52

cuál se corresponde va a seguir el ord

1:24:54

orden de entrada de parámetros de la

1:24:55

función Pero si yo se los Quisiera pasar

1:24:57

en otro orden veis que bry en realidad

1:24:59

es el nombre yo podría decirle Mira

1:25:00

bryce es el nombre y High es el grid

1:25:03

ahora veis que ya lo imprime ordenado

1:25:06

porque aunque yo no lo he pasado en

1:25:08

orden sí que le he indicado con cuál se

1:25:10

corresponde cada uno entonces aquí por

1:25:12

defecto lo Pilla a nivel de posición

1:25:14

siguiendo el orden Pero si yo quiero

1:25:16

variar la posición puedo hacerlo siempre

1:25:18

que indique Pues cuál es cada uno de los

1:25:20

parámetros más cosas que podemos hacer

1:25:22

por aquí venga tipos de funciones si

1:25:24

queréis podemos hacer con argumentos con

1:25:27

argumentos y retorno Imagínate que yo

1:25:30

ahora me quiero devolver todo con

1:25:31

argumentos y retorno return arx grid que

1:25:35

yo le quisiera llamar así Qué podría

1:25:36

hacer esta función con retorno bueno es

1:25:38

algo cutre lo que voy a hacer Pero

1:25:41

sinceramente podríamos sin más venir por

1:25:44

aquí y decir Oye retorno todo esto venga

1:25:47

una función a la que le podemos pasar

1:25:48

varios parámetros y que también puede

1:25:51

acabar realizando un retorno pues si yo

1:25:53

quisiera hacer un retorno Ya lo hemos

1:25:54

visto antes simplemente con hacer un

1:25:56

return lo tenemos aquí esto puede

1:25:58

parecer una tontería No yo me podría

1:26:00

venir por aquí a hacer un print return

1:26:02

return y podría imprimir simplemente el

1:26:05

resultado de llamar a esta función ahora

1:26:07

ya no lo imprime dentro simplemente

1:26:08

Retorno a la cadena de texto como

1:26:10

teníamos antes Uy Perdón no le he puesto

1:26:12

la interpolación la cadena de texto que

1:26:14

teníamos antes y ya está y nos dice H

1:26:16

brce ahora lo retorna bueno otro tipo de

1:26:18

función pero una función puede recibir

1:26:21

varios parámetros pero en realidad puede

1:26:24

retornar más de un valor vale en

1:26:27

realidad sí que puede podemos hacer una

1:26:29

función con retorno con torno de varios

1:26:33

valores lo que llamamos por ejemplo una

1:26:35

tupla de valores más de uno Pues venga

1:26:37

voy a crear una función que se llame

1:26:39

múltiple return imaginemos esto sin más

1:26:42

y cómo haría yo para retornar varios

1:26:43

valores bueno depende podríamos tener

1:26:46

estructuras pero aún no hemos visto que

1:26:47

son las estructuras para retornar varios

1:26:49

valores pero sin más aunque no tengamos

1:26:52

muy claro a qu es esto de las

1:26:53

estructuras yo por ejemplo en muchos

1:26:55

lenguajes tengo esos formatos para poder

1:26:57

devolver más cosas Imagínate que quiero

1:26:59

devolver pues todas las cadenas de texto

1:27:01

que yo pintaba en el saludo el Hola una

1:27:03

coma y el python no entonces de esta

1:27:06

forma yo ya estoy retornando dos valores

1:27:08

veis que tenemos una coma y que estamos

1:27:10

separando las cadenas de texto no estoy

1:27:11

retornando ya solo una cadena de texto

1:27:13

estoy retornando dos cadenas de texto y

1:27:15

cómo podría hacer para recuperar estas

1:27:17

cadenas de texto digamos que ahora

1:27:18

tendría que desacoplar estos valores si

1:27:20

yo ahora llamo a esta función por

1:27:22

supuesto yo esto lo podría imprimir pero

1:27:24

cuando yo lo imprimo mira lo que se nos

1:27:26

muestra Bueno en realidad aquí con

1:27:28

paréntesis separados por una coma en

1:27:30

realidad aquí lo que tenemos es una

1:27:32

estructura que ya veremos lo que es no

1:27:33

pero yo podría desacoplar estos valores

1:27:35

pues simplemente como sé que va a

1:27:37

retornar dos Pues voy a intentar crear

1:27:39

dos variables con este retorno una

1:27:41

variable para el saludo grid y otra

1:27:43

variable para el lenguaje que era python

1:27:45

o el name no que le llamamos antes vale

1:27:48

entonces fijaos separo por comas el

1:27:50

nombre de las variables llamo la función

1:27:51

y ahora imagínate que imprimo por un

1:27:54

lado el grid este saludo y que imprimo

1:27:56

por otro lado el name veremos que tengo

1:27:59

en uno el Hola Y en el otro el python ya

1:28:01

veis más de un retorno porque puede que

1:28:04

tengamos una casuística muy concreta en

1:28:06

que no llegue con que nuestra función

1:28:07

retorne una cosa sino que ya queremos

1:28:09

retornar las cosas separadas para

1:28:10

tratarlas de manera independiente Pues

1:28:12

por supuesto también se puede y algo

1:28:14

ahora voy pasar ya a un par de funciones

1:28:17

más como decía el ejercicio crea

1:28:19

ejemplos de funciones básicas funciones

1:28:22

básicas no me voy a ir a funciones por

1:28:23

si al Alguien ha pensado Oye podemos

1:28:25

crear funciones recursivas o funciones

1:28:28

lambda Yo creo que es es algo que ya se

1:28:29

puede ver más adelante pero no está

1:28:31

dentro de las funciones más simples que

1:28:33

podemos crear dentro de un lenguaje si

1:28:35

alguien ha creado ya lambdas ha creado

1:28:37

recursividad está perfecto ya sabéis que

1:28:39

cada uno puede interpretar el ejercicio

1:28:42

como le dé la gana pero yo creo que como

1:28:44

aún estamos en el tercer ejercicio pues

1:28:46

quedarnos con funciones más simples

1:28:48

después ya tendremos clases y ya

1:28:50

tendremos lecciones para pararnos en el

1:28:53

concepto de lambdas o en el concepto de

1:28:56

funciones recursivas okay Así que voy a

1:28:59

hablaros de un par de funciones que son

1:29:01

bastante especiales en python aunque

1:29:03

también esto existe en muchos otros

1:29:04

lenguajes por ejemplo con lo que

1:29:06

llamamos funciones con un número

1:29:08

variable de parámetros o de argumentos

1:29:11

como lo estamos llamando vale deos Pero

1:29:13

esto ya lo hemos visto br ya hemos visto

1:29:15

por ejemplo esta con dos argumentos ya

1:29:17

pero si vengo por aquí y hago variable

1:29:20

ar grid por ejemplo un saludo con

1:29:22

argumentos variables fijaos lo que voy a

1:29:24

hacer Aquí le voy a decir que esto

1:29:26

Recibe un nombre pero delante le voy a

1:29:28

pasar un asterisco esto lo que le está

1:29:31

indicando es que en realidad le podemos

1:29:33

pasar más de un nombre y cómo lo

1:29:36

pasaremos pues separado por comas

1:29:38

argumento separado por comas qué va a

1:29:40

hacer esto Claro si yo aquí tengo más de

1:29:43

un resultado esto ya lo veíamos en la

1:29:45

clase anterior cuando entraba la

1:29:46

importancia de los bucles cuando

1:29:48

queríamos recorrer por ejemplo un objeto

1:29:50

cuando queríamos iterar más de una vez

1:29:52

una variable Pues claro este name puede

1:29:54

llegar a guardar más de un resultado Así

1:29:56

que yo voy a tener aquí un for con el

1:29:58

nombre dentro de los nombres names le

1:30:01

voy a llamar este parámetro names Por

1:30:03

qué Porque le voy a hacer un print con

1:30:06

el saludo que teníamos antes pero que se

1:30:08

va a imprimir una vez por cada nombre

1:30:11

que nos entra aquí Así que voy a venir

1:30:13

por aquí me cargo el python y le meto

1:30:15

name qué significaría esto que si ahora

1:30:17

llamo a esta función con un número

1:30:19

variable de parámetros yo le podría

1:30:21

pasar pues python como hacíamos antes Y

1:30:24

si Yo corro el programa vemos Hola

1:30:25

python pero le voy a pasar más lenguajes

1:30:27

o más nombres va a ser python Va me va a

1:30:30

saludar a mí va a saludar a mouredev y

1:30:34

va a saludar a la comunidad Ahora yo

1:30:36

lanzo esto y veis Hola python hola bry

1:30:39

hola mouredev o la comunidad le he

1:30:41

pasado varios argumentos separados por

1:30:43

comas y aquí ya no estoy definiendo un

1:30:46

número finito de argumentos aquí le

1:30:48

puedo pasar todos los argumentos que yo

1:30:50

quiera lo veis entonces bueno en este

1:30:51

caso que quisiera pasarle pues más de un

1:30:54

nombre para que hiciera el print para

1:30:55

que hiciera el saludo con cada uno de

1:30:57

estos nombres o con lenguajes o con lo

1:30:59

que fuera y parecido al número variable

1:31:02

de argumentos tenemos con un número

1:31:04

variable de argumentos pero con palabra

1:31:07

clave ya veréis qué es esto Esto no es

1:31:09

tan habitual en todos los lenguajes esto

1:31:11

es ya un poquito más exclusivo de de

1:31:14

python Okay cómo definimos esto Pues

1:31:17

venga vamos a crear aquí otra vez esto

1:31:20

porque se nos va a parecer mucho pero

1:31:22

aquí va a tener otra peculiaridad que es

1:31:25

que aparte de tener un número infinito

1:31:27

de argumentos Nosotros le podemos

1:31:28

indicar una clave a cada argumento y

1:31:30

para eso lo haremos con dos asteriscos

1:31:32

dentro de names y esto significará que

1:31:35

cada argumento estará formado por una

1:31:37

clave y por un valor con lo cual ahora

1:31:39

este names que teníamos por aquí va a

1:31:41

tener un nombre pero va a tener por

1:31:43

ejemplo el nombre del parámetro que yo

1:31:44

le quiero pasar entonces ahora aquí

1:31:46

tendremos el param y el name es decir un

1:31:49

nombre que yo le voy poder indicar Qué

1:31:51

tipo de parámetro es así que lo voy a

1:31:53

imprimir también por aquí para Y cómo

1:31:54

llamaríamos ahora bueno primero vamos a

1:31:56

cambiar el nombre le vamos a llamar

1:31:58

variable qar grid porque va a tener una

1:32:01

clave y un valor y vamos a llamar a esta

1:32:03

nueva operación y vamos a pensar que le

1:32:05

queríamos pasar esto esto podría ser

1:32:07

parecido y yo podría correr el programa

1:32:09

pero dice Uy no no no no con esto no

1:32:11

llega en realidad tú me tienes que pasar

1:32:13

ahora todos estos valores pero le tienes

1:32:15

que dar una clave okay Así que vamos a

1:32:18

pensar que le meto diferentes datos I va

1:32:20

a ser el lenguaje que estoy utilizando

1:32:22

el nombre de la persona el alias en mi

1:32:24

caso mouredev y la edad 36 todo con

1:32:27

cadenas de texto si tenéis un lenguaje

1:32:29

Dinámico Pues yo le podría pasar esto

1:32:32

sin ser mezclando pues una cadena de

1:32:34

texto y con un entero pero aquí nos dice

1:32:36

que falta la clave cómo le indicamos la

1:32:38

clave pues directamente dándole el

1:32:40

nombre a la clave lenguaje y un igual y

1:32:42

esto podría ser mi nombre y esto podría

1:32:45

ser mi alias y esto podría ser mi edad h

1:32:49

y ahora si imprimo todo esto que uy aquí

1:32:52

no puse un igual Perdón puse un más la

1:32:54

llamada bonita aquí ya que tiene varios

1:32:56

parámetros para dejarlo bien formateado

1:32:57

si yo ahora llamo a esta función que

1:33:00

admite infinidad de parámetros pero con

1:33:03

clave Qué estamos haciendo en este caso

1:33:05

Bueno en realidad esto es exactamente

1:33:07

como os lo conté que en realidad

1:33:09

nosotros lo que le podemos dar es una

1:33:10

palabra clave es decir ya no solo

1:33:13

pasarle el listado de diferentes

1:33:15

parámetros dejarme que este 36 lo

1:33:17

devuelva aquí a un entero nosotros lo

1:33:19

que tenemos que hacer es le pasamos el

1:33:21

listado de parámetros y después dentro

1:33:23

con esta función que ya existe dentro

1:33:26

del lenguaje que es items acaba

1:33:28

descomponiendo cada uno de los elementos

1:33:30

que nosotros tenemos aquí en una clave y

1:33:32

en un valor nosotros volvemos a

1:33:34

descomponer y nos quedamos con dos

1:33:36

variables para asignarle Pues venga Lo

1:33:38

que tienes como clave en el nombre de

1:33:40

esta variable que yo yo le he llamado

1:33:43

aquí y en este nombre de el valor de la

1:33:46

de la clave Pues nos lo quedamos en

1:33:48

value y ahora aquí me pongo a imprimir

1:33:50

los dos os digo que esto es algo

1:33:51

Bastante específico de lengu el poder

1:33:54

pasar pues con este con esta pinta no lo

1:33:57

que haríamos en otros lenguajes igual ya

1:33:58

es pasar una estructura que es un

1:34:00

diccionario que si no sabéis lo que es

1:34:01

un diccionario no os preocupéis porque

1:34:03

precisamente de estructuras es de lo que

1:34:06

vamos a hablar en el siguiente reto de

1:34:08

roadmap Okay así que bueno creo que

1:34:10

estas a grandes rasgos son los

1:34:13

diferentes tipos de funciones que hay en

1:34:15

la gran mayoría de lenguajes sobre todo

1:34:17

las simples con retorno con un argumento

1:34:19

con más de un argumento con argumentos

1:34:21

predeterminados con argumentos y y

1:34:23

retorno Okay y después ya esta parte de

1:34:27

variable con argumentos y variable con

1:34:29

argumentos y palabras clave no es tan

1:34:30

habitual en todos los lenguajes el que

1:34:32

sí es este también varios retornos así

1:34:34

que estas son las diferentes los

1:34:36

diferentes tipos de funciones que

1:34:37

nosotros Tendremos que ver según la

1:34:38

lógica que queremos desarrollar Pues

1:34:40

bueno qué tipos de funciones acabamos

1:34:41

creando ya digo si alguien ha

1:34:43

implementado funciones que llamamos

1:34:44

lambda o funciones recursivas también

1:34:47

son funciones que puede crear el usuario

1:34:50

pero que ya siguen una lógica muy

1:34:51

concreta o una lógica de ejecución

1:34:53

también muy concreta Así que hablaremos

1:34:55

de ellas más adelante pero yo no las voy

1:34:57

a meter en esta parte de roadmap qué nos

1:34:59

decía más el ejercicio nos decía aquí

1:35:01

por otro lado comprueba si puedes crear

1:35:03

funciones dentro de funciones ostras

1:35:06

Pues venga vamos a crear aquí una

1:35:07

sección de funciones dentro de funciones

1:35:10

esto para ver si vuestro lenguaje lo

1:35:13

soporta porque también puede ser un

1:35:14

concepto a explorar por ejemplo voy a

1:35:16

crear por ejemplo aquí una función ahora

1:35:18

ya no va a ser una función de estas como

1:35:20

de saludo como estábamos haciendo antes

1:35:22

pero voy a poner ouder function voy a

1:35:25

poner una función la función externa

1:35:27

pero yo por ejemplo en python o en

1:35:29

algunos otros lenguajes Yo dentro de una

1:35:31

función puedo crear otra función Inner

1:35:33

function qué significaría que yo creo

1:35:35

una función dentro de una función que yo

1:35:37

ahora sin más en la Inner function

1:35:39

Imagínate que yo ahora hago un print Y

1:35:42

que ahora en este print sí que pues voy

1:35:44

a imprimir lo que sea el Hola python que

1:35:47

teníamos aquí vuelvo otra vez a copiarme

1:35:49

el Hola python Entonces yo ahora voy a

1:35:51

venir por aquí y voy a llamar a ou

1:35:54

function voy a poner función interna dos

1:35:57

puntos Hola python para que sepáis que

1:35:59

estamos imprimiendo esto veis lo último

1:36:01

que imprime hola 36h muy mal esto Bueno

1:36:04

le voy a quitar el Hola incluso aquí

1:36:06

para que veamos que estábamos

1:36:07

imprimiendo la clave y el valor el Hola

1:36:09

creo que sobraba en este print bueno

1:36:11

volvemos a esto veis que yo ahora llamo

1:36:13

a other function pero no Se imprime

1:36:16

función interna o la python Por qué

1:36:18

Porque en realidad dentro de esta

1:36:20

función tenemos otra función y esta

1:36:22

función que está dentro de la función

1:36:24

nunca se llama como nunca se llama yo

1:36:27

ahora lo que tendría que venir aquí es

1:36:28

Llamar a la función dentro de la función

1:36:31

Ahora yo llamaré a ouder function ouder

1:36:35

function va a llamar a Inner function

1:36:37

Inner function se va a ejecutar y

1:36:39

acabaré imprimiendo el función interna o

1:36:41

la python lo veis por aquí entonces Esto

1:36:43

es algo que tenéis que comprobar si

1:36:45

vuestro lenguaje o que tenéis que

1:36:47

comprobar si vuestro lenguaje lo soporta

1:36:49

por qué porque también es una forma de

1:36:50

dejar vuestro código limpio que vosotros

1:36:52

llaméis una función pero pero que esa

1:36:53

función imagínate quiera desencadenar

1:36:55

más cosas y que querrás dividir el

1:36:57

código de la función o lo que sea

1:36:59

incluso algunos lenguajes lo que

1:37:01

permiten es pues concatenando por puntos

1:37:03

empezar a llamar a funciones dentro de

1:37:05

funciones esto python en concreto no lo

1:37:08

soporta pero en algunos lenguajes lo

1:37:09

podéis hacer así que bueno quedaros si

1:37:11

de verdad esto tiene sentido qué más

1:37:12

cosas teníamos que hacer en el ejercicio

1:37:14

nos dice utiliza algún ejemplo de

1:37:16

funciones ya creadas en el lenguaje esto

1:37:18

son funciones como os decía por aquí

1:37:20

funciones definidas por el usuario pero

1:37:23

vamos vamos a crear una sección eh

1:37:25

funciones de lenguaje lo que se suele

1:37:27

Llamar las eh buildin functions No

1:37:30

funciones que ya están construidas

1:37:32

dentro del lenguaje Qué funciones hay

1:37:34

dentro de un lenguaje llevamos viendo

1:37:36

una ya muchas clases cada vez que

1:37:39

nosotros estamos haciendo print esto es

1:37:41

una función lo veis esto es el formato

1:37:43

de una función es una función que se

1:37:46

encarga de imprimir por terminal el

1:37:48

texto que nosotros le pasamos Entonces

1:37:49

en realidad nosotros ya llevamos viendo

1:37:51

una función propia del lenguaje

1:37:53

muchísimo tiempo por ejemplo tenemos una

1:37:55

función que es len una función que

1:37:57

nosotros le pasamos un texto por ejemplo

1:37:58

m de o lo que nosotros querramos y nos

1:38:02

dice ocho veis que es una función len es

1:38:04

una función que retorna un entero Qué

1:38:07

hace esta función en concreto Nosotros

1:38:09

le pasamos algo y cuenta si le pasamos

1:38:11

una cadena de texto pues nos va a acabar

1:38:14

contando Cuántas letras tiene esa cadena

1:38:15

de texto si nosotros le pasáramos un

1:38:17

conjunto de datos contaría el número de

1:38:19

esos datos vale más funciones que

1:38:22

nosotros podemos tener mira vamos a ir

1:38:24

haciendo print de resultados de

1:38:25

funciones hay otra función por ejemplo

1:38:27

el lenguaje que es type y le voy a

1:38:28

volver pasar mouredev pero qué va a

1:38:30

hacer type en concreto ahora imprime

1:38:32

Class str nos dice el tipo de esta

1:38:35

variable es una cadena de texto si yo le

1:38:38

si yo le pasara un número 36 y lo

1:38:41

lanzara me imprime int veis que nos está

1:38:44

dando el tipo de dato que nosotros le

1:38:47

estamos pasando a type Okay entonces

1:38:49

bueno igual que tenemos esto Existen un

1:38:51

montonazo qué os diría yo por favor por

1:38:53

repasar Cuáles son las funciones con las

1:38:57

que ya cuenta el lenguaje por supuesto

1:38:58

según el lenguaje pueden ser decenas y

1:39:01

cientos pero sí que es cierto que hay

1:39:03

algunas funciones que Pues igual nos

1:39:05

resultan un poquito más fácil yo que sé

1:39:07

hay funciones que veis que estoy yo aquí

1:39:09

poniendo apper y digo Uy esto parece que

1:39:12

no que no funciona en cambio Si yo vengo

1:39:15

aquí y veo apper Ah hay funciones que

1:39:18

nosotros también podemos utilizar

1:39:20

asociadas a los tipos de datos qué

1:39:22

significaría que yo ahora venga por aquí

1:39:24

y por ejemplo imprima mouredev pero

1:39:28

llame con un punto a apper como función

1:39:32

típica de las cadenas de texto pues que

1:39:34

lo que se va a imprimir es mouredev en

1:39:36

mayúscula esta función que ya existe

1:39:38

dentro del lenguaje en realidad lo que

1:39:39

está haciendo es utilizando el propio

1:39:42

texto que nosotros tenemos y lo está

1:39:45

modificando claro aquí ya son otro tipo

1:39:47

de funciones que ya están modificando el

1:39:49

propio dato si nosotros nos vamos a

1:39:50

apper apper no deja de ser una función

1:39:52

que nosotros ya tenemos dentro del tipo

1:39:54

de dato que es la cadena de texto por

1:39:56

eso vemos que igual funciona de una

1:39:57

manera diferente Pero bueno también

1:39:58

tenerlo en cuenta Así que per no deja de

1:40:00

ser una función Si nosotros leemos la

1:40:02

especificación veis Def apper pero lo

1:40:04

que dice que va a recibir es self self

1:40:06

es una palabra reservada en python que

1:40:08

hace referencia a la propia instancia la

1:40:10

que está ejecutando es decir si Def es

1:40:12

una función que está dentro de la cadena

1:40:14

de texto self significará que es la

1:40:16

propia cadena de texto entonces hace

1:40:18

referencia al propio contenido del texto

1:40:21

que en este caso es m entonces bueno

1:40:22

algunos unos tipos de funciones que ya

1:40:24

existen dentro del lenguaje en este caso

1:40:26

ya no solo dentro del lenguaje a nivel

1:40:28

general que podemos utilizar De

1:40:29

cualquier manera sino que esto es una

1:40:31

función que ya está asociada a el propio

1:40:33

tipo de dato que esto es algo que ya

1:40:35

veremos más adelante cuando veamos sobre

1:40:37

todo el concepto de clases Vale qué más

1:40:39

cosas se nos estaba pidiendo por aquí

1:40:41

dice bueno tienes que también poner a

1:40:43

prueba el concepto de local y de global

1:40:45

pues una cosita más que teníamos que ver

1:40:47

aquí pues bueno venga otro bloque otro

1:40:49

bloque que voy poner aquí que sea

1:40:51

variables local y globales y Qué es el

1:40:55

concepto de variable local y global Pues

1:40:57

aquí entra otra cosa que tenemos que

1:40:59

aprender en prácticamente todos los

1:41:00

lenguajes de programación que es el

1:41:02

concepto de ámbito lo que llamamos scope

1:41:05

vale es decir cuándo tenemos acceso a

1:41:08

según qué nuestro código claro voy a

1:41:10

crear una variable y le voy a llamar

1:41:12

global variable y por ejemplo le voy a

1:41:15

decir que tiene el valor python muy bien

1:41:17

entonces Imagínate que yo ahora vengo

1:41:18

por aquí y quiero imprimir la variable

1:41:20

por supuesto tengo acceso a la variable

1:41:22

la he definido aquí puedo acceder aquí

1:41:24

vale aquí tenemos se nos imprime python

1:41:26

pero ahora voy a crear una función por

1:41:27

ejemplo Def y le voy a poner Hello

1:41:29

python le voy a llamar a esta función y

1:41:31

esta función pues va a hacer la tontería

1:41:33

de antes no que va a tener un print y va

1:41:36

a acabar imprimiendo pues por ejemplo el

1:41:38

texto que dice Hello y voy a intentar

1:41:41

acceder a esta variable Pero dentro de

1:41:44

la función vengo por aquí y llamo a la

1:41:46

variable veis que puedo acceder Y si yo

1:41:48

ahora llamara a la función Hello python

1:41:50

a ver que imprime Hello python okay es

1:41:53

decir imprime el texto y el valor de la

1:41:56

variable pero fijaos esta variable está

1:41:58

fuera de la función Este es el concepto

1:42:00

de variable global es decir que su

1:42:03

ámbito es superior a lo que queremos

1:42:05

ejecutar todo lo que se encuentra fuera

1:42:08

de la propia función esto es como si

1:42:09

fuéramos anidando código a medida que

1:42:12

nosotros vamos realizando código Incluso

1:42:14

si estuviéramos Pues no lo sé creando un

1:42:16

If por ejemplo estamos anidando el

1:42:18

código y hay cosas que vamos poder

1:42:20

ejecutar dentro del If y otras a las que

1:42:22

vamos poder ejecutar fuera y otras que

1:42:23

vamos poder acceder dentro del If o en

1:42:25

este caso ya que estábamos con funciones

1:42:27

os pongo Este ejemplo pero ahora dentro

1:42:28

de esta función me voy a crear otra

1:42:30

variable y le voy a llamar local

1:42:33

variable le voy a llamar bar para que

1:42:34

sea un poquito más corto así lo tendemos

1:42:36

mejor y hago local bar y ahora el local

1:42:38

bar le voy a dar el valor Hola y ahora

1:42:40

yo dentro voy a sustituir este valor el

1:42:43

Hello que tenía aquí ahora lo voy a

1:42:45

sustituir por el valor de local bar bar

1:42:47

cuando yo imprimo esto vemos Hola python

1:42:49

decir puedo acceder a esta variable pero

1:42:51

igual que yo aquí imprimía esta variable

1:42:54

global ahora voy a intentar imprimir

1:42:56

local bar Qué pasará tenemos un Y

1:42:59

si yo ejecuto esto dice Uy local bar no

1:43:02

está definido Cómo que no está definido

1:43:03

si tengo aquí local bar igual a Hola

1:43:06

pero local bar como es una variable

1:43:08

local solo funciona dentro del ámbito de

1:43:11

la función ya que la he definido dentro

1:43:14

de la función por eso yo no puedo

1:43:16

acceder fuera aquí depende un poco del

1:43:18

lenguaje hay lenguajes que este concepto

1:43:20

varía incluso que existe el concepto de

1:43:23

de variable global y local pero que

1:43:24

tienen funcionamientos ligeramente

1:43:26

distintos entonces tenéis que entender

1:43:27

También muy bien Cuándo se puede acceder

1:43:30

a una variable global cuando se puede

1:43:31

acceder a una variable local es

1:43:33

recomendado no es recomendado depende

1:43:35

nosotros tenemos que entender cuando una

1:43:37

variable tiene sentido que sea global y

1:43:40

que nosotros podamos acceder desde

1:43:42

digamos subconjuntos de nuestro código a

1:43:44

cuándo tiene que ser local una buena

1:43:47

práctica siempre intentar restringir al

1:43:50

máximo el ámbito de todo vuestro có

1:43:53

se entiende esto por qué Porque igual

1:43:55

que nosotros podemos acceder a variables

1:43:57

podríamos cambiarle el valor Entonces

1:43:59

siempre en este caso qué tendríamos que

1:44:02

hacer Mira empiezo a picar Mi código y

1:44:04

veo por aquí y llego Ah Mira vamos a

1:44:06

imprimir esto digo Ah mira Hola pyon y

1:44:08

digo para qué voy a definir una variable

1:44:11

global si yo solo lo utilizo dentro de

1:44:13

mi código que después llega una

1:44:16

casuística en la que como teníamos

1:44:18

nosotros antes hay que imprimirla fuera

1:44:19

y digo Bueno pues igual tiene sentido

1:44:21

que la haga global porque la tengo que

1:44:23

utilizar dentro de una función pero

1:44:25

también la tengo que utilizar fuera pero

1:44:26

por ejemplo este ola aquí es lo que

1:44:28

hablamos que ya nunca lo voy poder

1:44:30

utilizar porque aquí el ámbito Este sí

1:44:32

que es local dice no se puede acceder

1:44:35

desde fuera de la función Entonces

1:44:37

siempre intentar restringirlo al máximo

1:44:39

Y a medida que vayan apareciendo nuevas

1:44:42

casuísticas valorar no directamente

1:44:44

paséis de variables locales a globales

1:44:46

porque hagan falta No no no no de

1:44:48

valorar si tiene sentido el acabar

1:44:51

llevándolo hacia fuera y ahora aquí y

1:44:53

que también lo estáis diciendo por ahí

1:44:54

es donde pueden entrar también lo que se

1:44:56

llama modificadores de acceso que en

1:44:57

algunos lenguajes este ámbito este scope

1:45:00

posee palabras reservadas para poder

1:45:02

acceder desde diferentes partes del

1:45:05

código modificadores como public como

1:45:07

package como private por ejemplo como

1:45:10

protected siempre intentar limitar al

1:45:13

máximo y conocer Cuál es el rango de

1:45:15

actuación que soporta vuestro lenguaje

1:45:18

para poder hacer vuestro código pues más

1:45:20

seguro y qué más cosas nos pedía el

1:45:22

ejercicio dice bueno que haga Sprint por

1:45:24

consola de los resultados con ejemplos y

1:45:26

que cualquier lenguaje puede tener más o

1:45:27

menos posibilidades por supuesto pero lo

1:45:30

que os digo que van a tener estos

1:45:31

ejercicios esta parte pues es bastante

1:45:33

simple porque son los fundamentos del

1:45:35

lenguaje pero os ponía aquí una parte

1:45:37

extra para ya practicar pues algo más la

1:45:40

parte de lógica un extra Y qué nos decía

1:45:43

que tenía que hacer este extra Pues mira

1:45:45

dificultad extra Quiero una función que

1:45:46

reciba dos parámetros del tipo cadena de

1:45:48

texto y retorno un número vale Así que

1:45:51

voy a intentar ver qué hace esto dice

1:45:53

bueno que reciba dos parámetros voy a

1:45:56

crear una función y qué tenía que acabar

1:45:59

haciendo tenía que acabar imprimiendo

1:46:01

pues Vale imprime al parecer tenía que

1:46:04

acabar imprimiendo números del un al 100

1:46:06

Yo le voy a llamar print numbers por

1:46:08

ejemplo y recibía dos parámetros me dice

1:46:11

que recibe un texto uno y un texto dos

1:46:15

así que le voy a llamar text 1 text 2 y

1:46:18

que acaba retornando un número entero

1:46:21

por ejemplo yo le voy a acabar aquí Def

1:46:22

Endo también todo esto y qué tenía que

1:46:24

hacer la función la función imprime

1:46:26

todos los números del un al 100 Entonces

1:46:28

ahora aquí ya empezamos a combinar cosas

1:46:29

que aprendimos en otras clases Cómo hago

1:46:32

para imprimir números del uno al 100 yo

1:46:34

por ejemplo en python tengo un Rango

1:46:36

para que me cree todo ese conjunto de

1:46:37

números del uno al 101 porque el último

1:46:40

lo excluye si yo hiciera ahora mismo

1:46:42

aquí un print de Number y yo llamara la

1:46:44

función que es print numbers le tendría

1:46:47

que pasar dos textos de momento con los

1:46:49

textos no hago nada entonces Bueno lo

1:46:50

dejo vacío corro el programa ya veis

1:46:53

imprime del 1 al 100 que vemos por aquí

1:46:55

perfecto pero el programa pedía hacer

1:46:56

dos cosas Si el número es múltiplo de

1:46:58

tres muestra la cadena de texto del

1:47:00

primer parámetro Ah vale pues vamos a

1:47:03

ponerlo aquí texto uno texto dos dice si

1:47:07

el número If el número es múltiplo de

1:47:10

tres nos decía por aquí muestra la

1:47:12

cadena de texto del primer parámetro

1:47:14

vale esto lo vimos también como

1:47:16

deberíamos hacer pues al número si

1:47:18

nosotros le hallamos el módulo de tres y

1:47:20

esto es cer0 significa que es múltiplo

1:47:22

así que en este caso lo que tendría que

1:47:24

acabar imprimiendo es el texto el texto

1:47:26

uno que yo tengo por aquí y en caso

1:47:29

contrario els aquí es donde tendría que

1:47:31

imprimir el número Vale qué tenemos por

1:47:33

aquí vamos al principio 1 2 texto 1 4 5

1:47:37

texto 1 7 8 testo 1 por qué Porque el

1:47:40

tres es múltiplo de tres El Seis es

1:47:42

múltiplo de tres el nu es múltiplo de

1:47:44

tres el 12 es múltiplo de tres por eso

1:47:47

en vez del número imprime el texto pero

1:47:48

nos decía también que si el número por

1:47:51

caso contrario es múltiplo de C que

1:47:53

muestre el valor de la segunda cadena

1:47:55

Cómo resolveremos eso pues con un el If

1:47:57

no el If en este caso pues no múltiplo

1:48:01

de tres sino múltiplo de cco y no

1:48:03

imprimiendo en este caso el texto un

1:48:05

sino imprimiendo el texto dos aquí lo

1:48:07

tenemos y nos dice un último caso que es

1:48:10

Oye si el número es múltiplo de TR y de

1:48:12

5 a la vez imprimir los dos textos

1:48:14

concatenados Claro si yo ahora hago aquí

1:48:17

otro elif y hago mira que sea múltiplo

1:48:19

de tres and también sea múltiplo de C

1:48:23

así tengo en cuenta la casuística y aquí

1:48:24

lo que tengo que acabar imprimiendo pues

1:48:26

es el texto un más el texto dos los

1:48:29

concatena Pero si yo lanzo esto vamos a

1:48:31

ver que en ningún caso voy a ver el

1:48:33

texto uno y el texto dos concatenados

1:48:36

por qué Porque en realidad se está

1:48:37

colando por una de estas situaciones

1:48:39

antes porque antes de ser a la vez

1:48:41

múltiplo de tres y de c Puede que sea

1:48:43

múltiplo de tres solo o múltiplo de

1:48:45

cinco solo con lo cual lo que tendríamos

1:48:47

que hacer es esta condición tendría que

1:48:49

pasar a ser la primera por si se da el

1:48:51

caso en el el número es múltiplo de los

1:48:54

dos a la vez vamos a verlo ahora ahora

1:48:56

sí que lo veremos veis y lo tenemos

1:48:58

claro el tres solo es múltiplo de tres

1:49:00

el cin solo es múltiplo de cinco por eso

1:49:02

imprimimos tres texto dos pero el 15 es

1:49:05

múltiplo de tres y de cinco a la vez por

1:49:07

eso imprimimos texto un y texto dos a la

1:49:09

vez esto es un ejercicio muy típico que

1:49:12

le llamamos fis bas por si alguna vez

1:49:15

así escrito fis bas es un ejercicio muy

1:49:18

típico en programación para imprimir fis

1:49:20

bas o fis bas por si lo veis en algunas

1:49:22

especie de prueba técnica o ejercicio de

1:49:25

lógica o algo así pero el ejercicio nos

1:49:28

mandaba un extra decía la función

1:49:29

retornará al número de veces veis que no

1:49:32

estamos haciendo ningún return dice

1:49:34

retornar el número de veces que se ha

1:49:35

impreso el número en lugar de los textos

1:49:37

dónde imprimí el número solo aquí aquí

1:49:40

teníamos textos entonces aquí deberíamos

1:49:42

llevar un contador tener aquí una

1:49:44

variable por ejemplo que yo le voy a

1:49:46

llamar count que inicializo cero y que a

1:49:48

este count cada vez que Se imprime el

1:49:50

número count yo lo que hago es

1:49:51

incrementarlo un para que lo cuente y al

1:49:54

acabar este bucle for yo retorno el

1:49:56

contador Así que yo ahora no solo voy a

1:49:58

llamar a print numbers sino que voy a

1:50:01

imprimir el resultado del ror ahora se

1:50:04

va a encargar de lanzarnos todo aquí lo

1:50:06

veis y al fin lo que va a hacer es

1:50:09

imprimir el número de veces que ha

1:50:10

mostrado números 53 y 53 veces ha

1:50:14

mostrado un número en vez de imprimir

1:50:16

las palabras Fish o bas o Fish B

1:50:24

vamos con este reto que decía

1:50:26

estructuras de datos Este era el reto

1:50:28

que teníamos que acabar resolviendo hoy

1:50:30

y decía esto muestra ejemplos de

1:50:31

creación de todas las estructuras

1:50:32

soportadas por defecto en tu lenguaje

1:50:34

claro aquí de lo que se trata es de que

1:50:37

esto sirva para cualquier lenguaje de

1:50:40

programación Así que en cierto modo los

1:50:42

enunciados de estos ejercicios están

1:50:44

pensados para que se tengan que ir

1:50:46

adaptando no es lo mismo si yo estoy

1:50:48

programando aprendiendo Java que si

1:50:49

estoy aprendiendo python Okay aún así S

1:50:52

como todos estos ejercicios corresponden

1:50:55

a fundamentos que me veáis a mí

1:51:05

programável fundamental la explicación

1:51:08

que yo voy dar es la misma para python

1:51:11

que para Java que para javascript que

1:51:13

para Swift que para colding que para

1:51:14

Cesar que para el que sea aún así lo de

1:51:17

siempre aquí tenéis los ejercicios Este

1:51:19

es el reto tres que es el que vamos a

1:51:21

resolver hoy y si tenéis dudas si

1:51:23

también queréis ver correcciones en

1:51:25

otros lenguajes aquí tenéis todo lo que

1:51:27

ha enviado la comunidad y vosotros

1:51:28

podéis seguir enviando correcciones de

1:51:30

este reto Y de todos los anteriores que

1:51:32

se sigue revisando Así que voy a venir

1:51:34

por aquí como os decía voy a abrir el

1:51:36

ejercicio y también como os decía lo voy

1:51:38

a resolver en python voy crear un nuevo

1:51:39

fichero le voy a llamar mde se tiene que

1:51:41

llamar con el nombre de nuestro usuario

1:51:43

en giop y Vamos a ponernos a resolverlo

1:51:47

vamos a ir leyendo el ejercicio y vamos

1:51:49

a ir

1:51:52

primero y después resolviendo el

1:51:54

ejercicio lógico avanzado qué nos decía

1:51:56

el ejercicio muestra ejemplos de

1:51:58

creación de todas las estructuras

1:51:59

soportadas por defecto en tu lenguaje

1:52:00

claro ahora llega alguien aquí y dice

1:52:03

pero qué son las estructuras Ah De eso

1:52:05

se trata aprender a programar que

1:52:07

nosotros también tenemos que aprender a

1:52:08

buscar que nosotros también tenemos que

1:52:10

buscar nuestras fuentes de información y

1:52:12

ser capaces de ir entendiendo los

1:52:14

diferentes conceptos que acaban

1:52:15

conformando los fundamentos del lenguaje

1:52:17

No yo ahora lo voy a explicar Pero me

1:52:19

gusta el punto este de búsqueda inicial

1:52:22

que tenéis que hacer con cada red para

1:52:24

que así también os peleéis un poquito y

1:52:26

de verdad ir ganando esa soltura a la

1:52:29

hora de Buscar información y de tener

1:52:31

que pelear o y igual que no sois capaces

1:52:33

de resolver el ejercicio tampoco pasa

1:52:35

nada siempre Vais a aprender hagáis el

1:52:37

ejercicio no lo hagáis lo hagáis mejor

1:52:39

lo hagáis peor Pero si poco a poco

1:52:40

estáis peleando ya con el lenguaje

1:52:42

estáis aprendiendo eso eh darlo por

1:52:45

sentados así que qué son las estructuras

1:52:47

Al fin y al cabo una estructura en un

1:52:50

lenguaje nos sirve para organizar datos

1:52:52

nosotros ya hemos visto en fundamentos

1:52:54

en clases anteriores que tenemos pues

1:52:57

diferentes tipos de datos fundamentales

1:53:00

primitivos bueno según como los nombres

1:53:02

lenguaje no las cadenas de texto los

1:53:04

números los decimales los buanos bueno

1:53:07

esto ya lo hemos visto pero qué pasa si

1:53:09

nosotros ahora queremos agrupar varias

1:53:12

variables No pues aquí es donde entran

1:53:15

las estructuras y hay diferentes

1:53:16

estructuras en todos los lenguajes en

1:53:18

unos lenguajes más en otras menos pero

1:53:20

sí que es cierto que hay ciertas

1:53:22

estructuras que se repiten en

1:53:24

prácticamente todos los lenguajes aquí

1:53:26

como ya os digo Bueno tenéis que un poco

1:53:28

Mostrar las estructuras soportadas por

1:53:31

defecto después hay lenguajes que se

1:53:33

extienden y que acaban creando

1:53:34

estructuras super complejas Pero bueno

1:53:36

digamos a nivel fundamental Cuáles son

1:53:38

las estructuras de vuestro lenguaje

1:53:40

entonces teníais que buscar eso y ahí

1:53:42

teníais que empezar a trabajar con ellas

1:53:44

así que me voy a venir por aquí y vamos

1:53:46

empezar a revisar un poco Cuáles son las

1:53:49

estructuras por defecto de python en

1:53:51

vuestro lenguaje hay más hay menos se

1:53:54

llaman diferentes es posible pero que

1:53:56

van a hacer algo prácticamente igual o

1:53:59

muy parecido eso también lo podéis dar

1:54:01

por seguro Así que vamos con la primera

1:54:03

estructura que hay por defecto en python

1:54:05

que son las llamadas listas vale una

1:54:08

lista es una estructura ordenada donde

1:54:10

nosotros empezamos a guardar pues Oye

1:54:12

cada uno de los elementos las listas hay

1:54:15

lenguajes que separan el concepto de

1:54:18

lista del concepto de array o de arreglo

1:54:21

que puede que os suene también en python

1:54:24

como tal el array puramente no existe lo

1:54:27

que existe son las listas vale

1:54:28

básicamente una estructura que nos sirve

1:54:30

para guardar varios elementos de forma

1:54:32

ordenada Okay entonces yo ahora me voy a

1:54:34

venir por aquí y le voy a llamar por

1:54:35

ejemplo ya AC había que poner ejemplos

1:54:37

my list y me voy a crear una lista Qué

1:54:39

es una lista como tal pues donde puedo

1:54:41

guardar varios elementos qué podría

1:54:43

acabar guardando en esta lista Pues no

1:54:45

lo sé vamos a guardar pues nombres por

1:54:49

ejemplo le voy a poner a guardar nombres

1:54:51

de

1:54:52

personas de la comunidad pues bry estoy

1:54:56

leyendo a Black estoy viendo a wolfy

1:55:01

bionos Entonces esto es una estructura

1:55:04

Qué significa que ahora lo que tengo es

1:55:06

una variable que se llama my list que si

1:55:09

yo imprimiera por aquí print esta lista

1:55:11

lo que está guardando es un conjunto

1:55:14

ordenados de datos de datos de qué tipo

1:55:16

Estos son strings esto ya los hemos

1:55:18

visto simplemente son strings Entonces

1:55:21

nosotros de esta manera hemos podido

1:55:22

agrupar diferentes datos en una única

1:55:25

variable Ok entonces eso es para lo que

1:55:27

sirve una estructura pero la principal

1:55:30

función de una estructura no es solo

1:55:32

guardar más de un dato es poder trabajar

1:55:35

y manipular estos datos de manera más

1:55:38

fácil Qué quiere decir que yo por

1:55:39

ejemplo he creado esta lista pero qué

1:55:41

nos dec el ejercicio utiliza operaciones

1:55:44

de inserción borrado actualización y

1:55:47

ordenación Uy uy uy eso ya nos está

1:55:49

dando una clave significa que las

1:55:52

estructuras en los lenguajes de

1:55:53

programación nos permiten hacer estas

1:55:55

cosas y tiene todo el sentido que

1:55:57

nosotros tengamos estructuras que yo

1:55:58

ahora por ejemplo estoy aquí con mi

1:56:00

lista y digo Hala en mi lista estaba

1:56:02

guardando Imagínate los usuarios de un

1:56:06

chat no y ahora entra una nueva persona

1:56:08

en el chat y yo quiero guardar la

1:56:10

referencia a esa nueva persona que está

1:56:12

entrando digo okay Entonces qué tendría

1:56:15

que hacer pues la lista tiene una

1:56:17

operación que se llama appen que en cada

1:56:20

lenguaje se va a llamar de una forma

1:56:21

pero las listas o los arris si son

1:56:25

mutables si permiten su modificación

1:56:28

pueden llegar a hacer operaciones como

1:56:30

esta Añadir datos por es una estructura

1:56:32

Así que imagínate que ahora llega a este

1:56:34

punto de mi código y quiero añadirle un

1:56:37

nuevo usuario pues veo a Castor Pues

1:56:40

venga ha entrado Castor y ya está con lo

1:56:42

cual si yo ahora vengo aquí y imprimo mi

1:56:45

lista vemos que primero la lista tiene a

1:56:47

cu pero después entra una persona más

1:56:49

Castor y aquí vemos otra de las

1:56:52

características de las listas o de los

1:56:53

arr que su orden es el orden de de

1:56:58

inserción de cada uno de los elementos

1:56:59

el orden Lo estamos marcando aquí pero

1:57:02

ahora llegado a este punto yo voy a

1:57:04

Añadir un nuevo elemento dónde lo añade

1:57:06

lo añade al final hay operaciones para

1:57:08

Añadir Al principio para Añadir por el

1:57:10

medio para Añadir en una posición

1:57:12

concreta Sí pero por defecto Esta es una

1:57:15

estructura que va a ir añadiendo al

1:57:17

final también es posible que vuestro

1:57:18

lenguaje ya que estamos hablando de

1:57:20

listas igual lo que tenga implementado

1:57:22

Son estructuras de pila o de cola que

1:57:24

nosotros también podríamos trabajar con

1:57:26

listas un poco simulando ese tipo de

1:57:28

estructuras pues quizás más puras en

1:57:31

lenguajes de programación pero ya digo

1:57:32

depende un poco del lenguaje en mi caso

1:57:35

como lo que tengo es una lista para

1:57:36

Designar ese tipo de estructura ordenada

1:57:38

pues aquí estamos Entonces le meto esto

1:57:40

sería pues la inserción que nos estaba

1:57:42

pidiendo el ejercicio no Pero y si

1:57:45

quisiera borrar Pues tengo una operación

1:57:47

que dice remove y ahora digo Pues mira

1:57:50

quiero eliminar a abráis esta sería la

1:57:53

operación de eliminación en mi caso pues

1:57:55

una opción que se llama remove esto es

1:57:57

eliminación vamos ahora a volver a

1:57:59

imprimir la lista A ver qué muestra la

1:58:01

lista lo veis bry ya no está se lo ha

1:58:04

cargado qué más cosas dice Ah mira

1:58:06

actualización ostras para poder

1:58:08

actualizar un elemento de la lista

1:58:10

primero tenemos que saber Cómo acceder a

1:58:12

un elemento de la lista Así que yo ahora

1:58:14

vengo aquí a my list y algunas listas

1:58:17

pues como dejan acceder es por la

1:58:19

posición que ocupa el elemento imagínate

1:58:22

Esta es el la pinta que tiene la lista

1:58:24

ahora después de eliminar a bly en la

1:58:26

posición eh eh cero empezamos a contar

1:58:28

desde cero está Black en la un wolfy en

1:58:30

la dos visions y en la tres Castor

1:58:33

Imagínate que quiero cambiar a wolfy

1:58:36

porque digo Bueno Quiero actualizar

1:58:37

ahora en la posición dos wolfy ya no

1:58:40

está y va a estar otra persona Entonces

1:58:41

qué podría hacer podría eliminarlo y

1:58:44

después intentar insertarlo reordenar y

1:58:46

no sé qué Pero yo lo que puedo hacer es

1:58:47

acceder a una posición primero voy a

1:58:49

acceder a la posición uno black enl cer

1:58:52

wolfi en la uno okay Qué pasa si yo

1:58:55

ahora accedo a esta posición a la

1:58:57

posición uno quién está en la posición

1:58:58

uno aquí lo vemos wolfy esto es como el

1:59:01

acceso Pero si yo ahora quisiera

1:59:03

actualizar a wolfy pues tendría que

1:59:05

acceder a su posición y darle un nuevo

1:59:07

valor Pues que ahora wolfy va a ser

1:59:09

cuervillo por ejemplo así de claro ahora

1:59:12

venimos por aquí e imprimimos otra vez

1:59:14

toda la lista esto en realidad sería la

1:59:17

actualización vamos ahora a imprimir qué

1:59:19

tenemos teníamos a Black a wolfy a

1:59:21

Visión no sa Castor pero wolfi estaba en

1:59:24

la posición uno y ahora lo hemos

1:59:25

cambiado por cuervillo y ahora tenemos

1:59:27

ya veis en la posición uno a cuervillo

1:59:29

una actualización para esto para lo que

1:59:31

nos vale la estructura y por supuesto

1:59:33

para más cosas más Pero aquí lo tenemos

1:59:34

inserción borrado actualización

1:59:36

ordenación ostras Cómo co ordenación

1:59:38

claro una estructura ya que tiene

1:59:41

diferentes elementos pues llegado el

1:59:43

caso podríamos llegar a ordenarlo Yo

1:59:46

podría acceder a mi lista y en python

1:59:49

por ejemplo hay una operación que se

1:59:50

llama short que por efecto lo que va a

1:59:53

hacer es seguir un criterio designado

1:59:55

por el sistema Por supuesto si nosotros

1:59:57

quisiéramos podríamos modificar este

1:59:59

criterio para por ejemplo ordenar

2:00:01

siguiendo lo que a nosotros nos diera la

2:00:03

gana pero en cadenas de texto si yo

2:00:05

ahora vengo por aquí y le hago esta esta

2:00:08

ordenación y ahora imprimo mi lista

2:00:10

vamos a ver lo siguiente qué tenemos

2:00:12

Black Castor cuervillo y visions Qué ha

2:00:15

hecho pues se ha ordenado

2:00:16

alfabéticamente por defecto si yo le

2:00:18

hago un short a un listado en el que hay

2:00:20

cadenas de texto como es en en este caso

2:00:22

pues lo va a hacer de forma alfabética

2:00:24

si hubiera eh números lo iba intentar

2:00:26

ordenar de forma ascendente si hubiera

2:00:29

números y textos pues haría un mix

2:00:31

primero con los números después con los

2:00:32

textos etcétera Pero ya digo esto lo

2:00:34

solemos hacer cuando los datos son muy

2:00:37

básicos si nosotros tenemos objetos que

2:00:39

acaben siendo mucho más complejos que

2:00:42

eso ya lo veremos cuando sigamos con la

2:00:43

ruta de estudio Nosotros le podemos

2:00:45

acabar indicando el criterio que a

2:00:47

nosotros nos dé la gana para que esto se

2:00:48

ordene precisamente como querramos no

2:00:51

como el sist tema tiene implementado por

2:00:53

defecto entonces Bueno aquí tenemos un

2:00:55

poco todo esto Esta es la primera

2:00:56

estructura que tenemos por defecto en

2:00:58

python lo repito dependiendo del

2:01:02

lenguaje tendréis más o menos

2:01:03

estructuras con nombres más o menos

2:01:05

parecidos con operaciones más o menos

2:01:07

parecidas pero el fundamento de

2:01:09

estructura que sirve para guardar datos

2:01:11

que podemos acceder modificar actualizar

2:01:13

borrar no sé qué eso lo vamos a poder

2:01:15

hacer en todos los lenguajes vale otro

2:01:16

tipo de estructura también muy típico en

2:01:19

lenguajes de programación es lo que

2:01:20

llamamos tuplas le voy a llamar una

2:01:22

variable maí tuple Qué es una tupla una

2:01:25

tupla vuelve a ser una estructura en la

2:01:28

que nosotros podemos guardar más de un

2:01:29

dato Pero hay una peculiaridad Y es que

2:01:32

las tuplas son inmutables es decir como

2:01:36

creemos la tupla inicialmente Ahora aquí

2:01:39

este tipo de cosas que veíamos inserción

2:01:42

eliminación actualización esto no va a

2:01:44

existir es un tipo de estructura muy

2:01:46

segura en el que nosotros ya en su

2:01:47

momento de creación tenemos clarísimo lo

2:01:49

que va a llevar imagínate una tupla en

2:01:52

la que yo quisiera guardar Pues mis

2:01:54

datos personales mi nombre mi apellido

2:01:56

mi alias vamos a llamarlo así por

2:01:59

ejemplo @ mouredev y mi edad por ejemplo

2:02:02

aquí con int que sea 36 pues veis lo que

2:02:05

yo he hecho ya no lo he hecho con el

2:02:07

corchete que es como creamos las listas

2:02:09

en realidad en python que esto no lo

2:02:12

hemos hecho pero si hacemos un type de

2:02:15

My list aquí veremos lo siguiente Class

2:02:17

List nos está diciendo que es una lista

2:02:19

si no os creíais el tipo de dato que es

2:02:21

esto el tipo de dato que tenemos aquí es

2:02:23

list Okay igual que esto que vemos aquí

2:02:25

que vemos tuple qué es esto vale venga

2:02:28

voy a mirar el type de tuple a ver qué

2:02:30

es en este caso y vemos ahora es una

2:02:32

tupla porque la he creado con paréntesis

2:02:34

básicamente un tipo de dato reservado

2:02:36

que se llama tuple vamos a ver si es

2:02:38

verdad esto de que es inmutable no es

2:02:41

inmutable fijaos qué operaciones tengo

2:02:44

en la tupla tengo un count aquí poco más

2:02:47

eh pero ya no tengo operaciones para

2:02:49

Añadir para eliminar lo lo único que

2:02:52

podría hacer yo con la tupla son

2:02:54

operaciones de acceso vengo por aquí

2:02:56

solo podría hacer un acceso vengo aquí y

2:03:00

que tengo por ejemplo en la posición uno

2:03:02

vemos moure y que tengo en la posición

2:03:06

tres Pues tengo 36 mi edad y que tengo

2:03:10

en la posición cuatro Tengo un Por

2:03:13

qué Porque tengo elemento cero elemento

2:03:16

un elemento dos elemento 3es en la

2:03:18

posición cuatro no tengo nada con lo

2:03:20

cual nuestro programa acaba petando Okay

2:03:23

pero qué podría hacer con la tupla por

2:03:25

efecto en python hay una operación del

2:03:27

sistema que se llama short Entonces yo

2:03:29

le podría pasar a la tupla podemos

2:03:31

utilizar la operación sorted y pasarle

2:03:33

la tupla y Alguien podría pensar Okay

2:03:35

pues me voy a guardar el resultado otra

2:03:38

vez en mi tupla y me dice Uy sorted

2:03:41

tupla Uf Por qué está fallando Esto vale

2:03:44

porque en realidad sorted lo que está

2:03:46

devolviendo es algo que aún no sabemos

2:03:48

lo que es pero que le llama iterable es

2:03:49

decir nos está devolviendo un objeto

2:03:52

pero que en realidad Esto inicialmente

2:03:55

va a ser una lista y el sorte de este

2:03:57

que vemos aquí me dice ostras no puedo

2:04:01

acabar utilizando este comparador menor

2:04:04

que entre un entero y un String acabamos

2:04:07

teniendo un problema de ordenación por

2:04:09

culpa de los tipos de datos en una tupla

2:04:11

Pues dice Oye me has metido números me

2:04:13

has metido cadenas de texto y no sé muy

2:04:15

bien que hacer Bueno podemos modificarlo

2:04:17

para que nos funcione y decir mira para

2:04:19

no rompernos la cabeza voy a cambiar la

2:04:20

edad a una cadena el texto y ahora lo

2:04:22

voy a lanzar vale Y ahora vemos Que sí

2:04:25

que funciona pero cuando imprimimos el

2:04:27

tipo de tupla qué nos dice lista o esto

2:04:30

era una tupla y nos ha cambiado a lista

2:04:32

por qué Porque el sorted lo que nos

2:04:34

devuelve es una lista si nosotros

2:04:35

quisiéramos que ahora con el sorted

2:04:37

volviera a ser una estructura inmutable

2:04:40

llamada tupla tendríamos que utilizar el

2:04:42

constructor de tupla decirle no no no

2:04:44

tuple así nos sirve para crear un objeto

2:04:47

de tipo tupla que ya veremos también lo

2:04:49

que es el concepto de objeto pero de

2:04:50

momento entender así yo puedo hacer que

2:04:53

la lista que tengo aquí la voy a

2:04:54

transformar la voy a castear en realidad

2:04:57

a tupla le voy a cambiar el tipo de dato

2:04:59

y ahora Cuando vengo por aquí veis lo

2:05:01

que dice ya pone Clash tupla vuelve ser

2:05:04

una tupla y tenemos la manera de ordenar

2:05:07

una tupla la podemos imprimir si queréis

2:05:10

Para que veamos cómo ha ordenado esto y

2:05:12

veamos fijaos os acordáis lo que yo os

2:05:14

decía que si tenía números y textos lo

2:05:16

que hace primero seguir el criterio de

2:05:18

ordenación por números y después por

2:05:19

textos Pero eso sí siendo todo textos lo

2:05:21

primero que ha metido es el 36 lo

2:05:23

segundo está a por la roba y después ya

2:05:26

ha metido la b y la m me ha ordenado la

2:05:29

tupla pero gracias a que ha acabado

2:05:31

generando una lista y después yo la he

2:05:33

vuelto a transformar en tupla otra vez

2:05:35

inmutable así que puedo hacer la

2:05:37

ordenación pero ya veis que con un

2:05:39

ligero truco no entonces ya vemos que

2:05:42

las tuplas Pues bueno nos dejan hacer

2:05:43

menos cosas Si quisiéramos trabajar con

2:05:45

tuplas Pues casi tendríamos que acabar

2:05:47

transformando la tupla en una lista

2:05:49

trabajar con la tupla como si si fuera

2:05:51

una lista modificando eliminando

2:05:53

cambiando lo que sea y después igual si

2:05:55

queremos que vuelva a ser inmutable pues

2:05:57

otra vez volviendo a transformarlo en

2:05:59

una tupla qué caso se utilizan las

2:06:01

tuplas básicamente cuando queremos una

2:06:03

estructura de datos que sea inmutable

2:06:05

que no queremos cambiar como este caso

2:06:07

si yo no quisiera que nadie tocara Mis

2:06:09

datos Porque en realidad mi programa lo

2:06:11

que quiero que uses es esto y no quiero

2:06:13

que le metas la mano para cambiar

2:06:15

absolutamente nada porque sé que eso

2:06:17

puede acabar suponiendo un peligro y

2:06:19

también para el programa Va a ser más

2:06:21

eficiente porque es una estructura que

2:06:22

ya está reservada en memoria que no va a

2:06:24

crecer que no va a decrecer Y eso se

2:06:26

maneja muy rápido pero claro en realidad

2:06:28

tiene cosas a favor pero también tiene

2:06:30

limitaciones Okay aún así estudiar cómo

2:06:33

funciona si existe la tupla en vuestro

2:06:35

lenguaje de programación Y de qué manera

2:06:37

tenéis que interactuar con ella porque

2:06:39

ya digo que pueden existir pues ligeras

2:06:40

modificaciones Así que venga más

2:06:43

funciones qué más funciones tenemos en

2:06:45

python en python tenemos algo que se

2:06:46

llaman set o sets ya que estamos

2:06:49

poniendo todo en plural Qué son los sets

2:06:51

pues por supuesto los sets es otro tipo

2:06:53

de estructura así que me voy a crear una

2:06:55

estructura que se llama myset en este

2:06:57

caso cómo vamos a crear el set bueno en

2:07:00

python está bastante Guay porque con

2:07:02

corchetes creamos listas con paréntesis

2:07:04

creamos tuplas y con llaves creamos sets

2:07:07

y yo ahora puedo venir por aquí todo

2:07:08

tranquilo y me voy a crear un set igual

2:07:12

que la tupla y vamos a imprimir el tipo

2:07:14

de myset para que veáis que en el

2:07:16

sistema también existe un tipo de dato

2:07:18

que se llama set aunque aún no sepamos

2:07:20

Qué hace aquí lo tenéis cl set Vale

2:07:22

tengo un set Qué hacen los sets serán

2:07:24

inmutables los sets no no Para eso ya

2:07:27

teníamos las tuplas a ver qué

2:07:28

operaciones nos tiene el set Ah mira ya

2:07:30

Uh esto ya deja hacer muchas cosas

2:07:33

parece que esto es una lista Mira update

2:07:35

ad vemos aquí ostras igual Tiene

2:07:38

bastantes cosas Bueno pues vamos ir

2:07:40

haciendo lo que nos pedía el ejercicio

2:07:41

lo primero vamos a imprimir por aquí el

2:07:44

set para ir viendo si de verdad Esto va

2:07:46

cambiando no imprimo mi set y lo primero

2:07:48

que se nos pedía y que ya habíamos hecho

2:07:50

la lista era esto inserción Pues cómo

2:07:53

insertaremos un dato en un set a ver

2:07:55

tenemos un ad Imagínate que yo ahora

2:07:57

quisiera Añadir Pues no lo sé mi email

2:08:00

no y Pongo aquí mouredev

2:08:03

gmail.com me añado Okay vamos a ver si

2:08:06

de verdad el set ahora añadido esto

2:08:08

vuelvo a imprimirlo Okay Uf habéis visto

2:08:10

esto había un set aquí que era bry mour

2:08:13

36 @ mouredev Pero si yo había metido

2:08:16

primero bry moure @ mouredev 36 Cómo

2:08:19

imprime esto desordenado y ahora le

2:08:21

metido el email y lo ha vuelto a

2:08:23

desordenar Pues bueno vamos a partir de

2:08:26

que el set por definición es una

2:08:29

estructura desordenada aquí no os podéis

2:08:32

fiar de la posición de un elemento los

2:08:35

sets Son estructuras buenísimas para

2:08:38

guardar muchos datos buenísimas para

2:08:40

recorrer esos datos pero no para

2:08:43

intentar Buscar datos Porque en realidad

2:08:47

aquí lo estáis viendo si yo ahora me

2:08:49

guiara por esto diría okay Pues si me

2:08:51

voy a mys a la posición cero del set que

2:08:55

vamos a presuponer que yo puedo acceder

2:08:57

así no igual que hacíamos con las listas

2:09:00

igual que hacíamos con las tuplas voy a

2:09:01

venir por aquí esperar primero esto Esta

2:09:03

era la creación esta era la operación

2:09:06

que teníamos aquí de inserción y ahora

2:09:08

con esta teóricamente yo debería acceder

2:09:10

y digo Oh error Por qué por qué no tengo

2:09:14

una operación de acceso porque no tiene

2:09:16

ningún sentido en realidad Qué hago yo

2:09:18

con esto si en realidad yo nunca voy a

2:09:20

saber que hay en cada posición Por qué

2:09:22

querría yo acceder a la posición cero si

2:09:25

no hay nada que me esté asegurando que

2:09:28

va a haber en esta posición los sets se

2:09:30

estructuran de manera super óptima Y eso

2:09:32

se basa en que todos los datos que están

2:09:36

guardando en la estructura Al fin y al

2:09:39

cabo lo que tienen por debajo toda la

2:09:41

lógica para su inserción para su

2:09:44

eliminación que veremos ahí es en forma

2:09:46

de Hash por eso en algunos lenguajes de

2:09:48

programación igual lo encontraréis con

2:09:50

el nombre de Hash okay Porque lo que

2:09:52

está haciendo es transformar todos sus

2:09:54

datos en un Hash para que sea mucho más

2:09:56

fácil de localizar estos valores y

2:09:58

diremos vale pero aún no sé para qué me

2:10:01

vale todo esto acabaremos llegando

2:10:03

vuelvo por aquí y ya vemos que no

2:10:05

podemos acceder pero imagínate que yo

2:10:08

ahora aquí en mi lista quisiera Añadir

2:10:10

dos veces a Castor vamos a ver cómo

2:10:13

quedaría nuestra lista he añadido dos

2:10:15

veces a Castor tengo dos veces a Castor

2:10:18

en la lista tiene sentido si yo tengo

2:10:20

una bolsa donde tengo una naranja y

2:10:22

metro otra naranja pues hay dos naranjas

2:10:25

no decir hay como dos cadenas de texto

2:10:27

este caso que son iguales pero imagínate

2:10:31

que ahora vengo yo por aquí y añado dos

2:10:33

veces el email Oh qué ha pasado si yo he

2:10:35

añadido dos veces mouredev @gmail por

2:10:38

qué Aquí no se muestra pues de ahí que

2:10:40

se esté utilizando un set esa manera de

2:10:42

serializar los datos para que sea tan

2:10:44

fácil accesible a ellos de manera

2:10:46

interna sirve principalmente los sets

2:10:48

para evitar duplicados es una est dura

2:10:51

no ordenada pero que como es super

2:10:54

rápida a la hora de Buscar nos sirve muy

2:10:57

bien para guardar una integridad de que

2:10:58

los datos no estén duplicados Así que

2:11:00

aquí lo tenéis yo he metido dos veces

2:11:02

mouredev @gmail pero no es que se haya

2:11:05

insertado solo una es que en realidad

2:11:07

Cuando se ha intentado insertar la

2:11:09

segunda vez ha visto que ya existía y

2:11:11

sin más pues lo que ha hecho es No

2:11:13

insertarlo si nosotros en una lista no

2:11:15

quisiéramos guardar duplicados sería un

2:11:17

proceso más lento porque tendríamos que

2:11:19

buscar si de verdad existe un elemento

2:11:21

en la lista y Lo tendríamos que buscar

2:11:23

por el propio valor del elemento en

2:11:25

cambio el set por debajo lo que hace es

2:11:27

crear una clave alfanumérica un Hash

2:11:30

básicamente que le va a permitir

2:11:32

trabajar con estos datos superrápido

2:11:33

vale más cosas que podemos hacer vale la

2:11:36

inserción funciona de esta manera no

2:11:38

tenemos los duplicados pero en realidad

2:11:40

podemos borrar ya que el acceso no lo

2:11:42

podíamos en realidad sí que podemos

2:11:43

borrar un pop update discard Clear veis

2:11:48

que tenemos aquí un pop igual si

2:11:49

quisiéramos trabajar pues con con esas

2:11:51

estructuras que hablábamos antes de cola

2:11:54

de pila Pues bueno estas estructuras por

2:11:56

defecto en python pues algunas ya nos

2:11:57

permiten interactuar de esta manera

2:11:59

digamos eliminando elementos Pues por el

2:12:01

principio por la cola según el tipo de

2:12:02

estructura que estemos intentando

2:12:04

simular tenemos una operación que es

2:12:06

remove Y si ahora vengo aquí a remove y

2:12:08

le paso Pues no lo sé moure podré

2:12:11

eliminar pues vamos a verlo okay pues

2:12:13

vale la eliminación sí que funciona y

2:12:15

tiene todo el sentido claro acceder a

2:12:17

una posición concreta no tiene sentido

2:12:19

duplicar no tiene sentido porque es un

2:12:20

set pero eliminar o insertar sí que

2:12:23

tiene todo el sentido qué nos faltaba

2:12:25

ahora que ya Hemos llegado a la

2:12:26

eliminación Pues nos falta la parte de

2:12:28

actualización de verdad creéis que

2:12:30

tendrá sentido una actualización como

2:12:32

tal que yo viniera por aquí myset no sé

2:12:35

update y vemos aquí Uf el update en

2:12:38

realidad aquí no significa que esté

2:12:41

actualizando un valor en concreto en

2:12:43

realidad aquí el update lo que hace Es

2:12:45

simplemente ampliar los datos que ya

2:12:48

tenemos en este set por si le quisiera

2:12:51

vamos concatenar más datos a esta propia

2:12:53

estructura Así que no lo mal interpreté

2:12:56

como que pueda ser el cambiar un dato

2:12:58

por otro si queréis actualizar un dato

2:13:00

por otro lo mejor siempre es eliminarlo

2:13:02

e insertarlo porque en realidad Este

2:13:04

cambio no es como una lista que le

2:13:05

estamos guardando la posición aquí la

2:13:07

posición nos importa nada porque la

2:13:09

posición es variable okay Así que aquí

2:13:11

la actualización sería eliminación

2:13:14

inserción Pero lo que sí que podemos

2:13:16

hacer es la parte de ordenación digo

2:13:18

cómo cómo la parte de ordenación A ver

2:13:20

vamos a probar la técnica esta que

2:13:22

utilizamos antes el shorted porque un

2:13:24

short Tenemos aquí algo así short no no

2:13:26

tenemos pero sí que podemos hacerle el

2:13:28

shorted porque esto prácticamente se lo

2:13:30

podríamos aplicar a cualquier objeto y

2:13:31

después ya veremos si nos falla o no y

2:13:33

vemos tenemos el shorted Esto me lo voy

2:13:35

a guardar en myset y vamos a imprimir

2:13:37

Qué tipo de dato es después de hacer el

2:13:39

s y vemos lo que vuelve pasar Hala otra

2:13:41

vez en realidad lo hemos ordenado pero

2:13:44

claro si queremos ordenarlo qué nos

2:13:46

tiene que acabar devolviendo Pues nos

2:13:47

tiene que acabar devolviendo una

2:13:48

estructura mutable y ordenada el set por

2:13:51

definición no es ordenado con lo cual no

2:13:53

nos puede devolver un set Así que mismo

2:13:55

problema aquí lo tenemos que le

2:13:57

intentamos hacer la magia esta del set

2:13:59

vamos a imprimirlo primero como lo

2:14:01

ordenaría nuestro ser ordenado tendría

2:14:02

esta pinta pues lo que vimos antes no

2:14:04

números la @a bry tal Okay vamos a

2:14:07

hacerle la trampa de transformarlo a set

2:14:09

igual que hicimos con la tupla y vamos a

2:14:11

ver ahora esto ya vuelve a ser un set

2:14:13

por Class Pero qué problema Tenemos aquí

2:14:15

que no se ha ordenado se ha vuelto a

2:14:17

desordenar porque lo repito por

2:14:19

definición el set no se puede ordenar

2:14:22

Okay no se puede ordenar en realidad el

2:14:25

set no es una estructura ordenada Así

2:14:27

que aunque le hagamos esto y la trampa

2:14:29

de lista generación nos da igual porque

2:14:31

si os dais cuenta ya cuando creamos la

2:14:33

inserción inicial esta inicialización ya

2:14:35

cuando lo imprimí Ya podía no darnos ni

2:14:37

este orden así que olvidémonos de la

2:14:40

parte de ordenación y ya por último hay

2:14:43

otra estructura básica existe más

2:14:45

estructuras sí pero a nivel decore del

2:14:48

lenguaje a nivel fundamental a nivel

2:14:51

primitivo la última estructura que

2:14:52

tenemos en python es el diccionario lo

2:14:55

repito que vuestro lenguaje tiene más

2:14:56

menos está perfecto el ejercicio se

2:14:58

trataba de que lo teníais que buscar y

2:15:00

ahora que conocéis que existen estos

2:15:02

Pues también tenéis que ver pues bueno

2:15:03

Cuáles son comunes Cuáles no son comunes

2:15:05

Cuáles tiene y cuáles no tiene vale Qué

2:15:07

es un diccionario de momento vamos a

2:15:08

crearlo como hicimos lo otro a ver si

2:15:10

somos capaces de ir viendo que hace el

2:15:12

diccionario voy a crear aquí algo que se

2:15:14

llama myd vale un set que no lo he

2:15:16

puesto antes el tipo de dato es set no

2:15:18

Aunque ya lo vimos aquí cuando lo

2:15:19

estábamos creando de nuevo Qué es un

2:15:20

dicionario el tipo de datos dict Y cómo

2:15:22

creamos un diccionario lo creamos

2:15:24

también entre llaves y ahora me podéis

2:15:26

decir cómo entre llaves entre llaves

2:15:28

creamos el set cómo voy a saber yo que

2:15:30

esto es un diccionario en vez de un set

2:15:32

si yo ahora le empiezo a meter aquí

2:15:33

datos entre llaves por qué Porque la

2:15:35

manera de guardar estos datos no sigue

2:15:38

esta estructura de meterle datos y

2:15:40

separarlos por comas en realidad

2:15:42

Nosotros sí que separamos datos por

2:15:44

comas pero el formato de los datos que

2:15:47

guardamos es clave valor Nosotros le

2:15:51

asociamos una clave a cada uno de los

2:15:53

datos que tiene este diccionario

2:15:55

Imagínate que ahora intento transformar

2:15:57

todo esto en un diccionario Pues claro

2:15:59

Así no sería un diccionario tan fácil

2:16:01

como que ver esto voy a imprimir el tipo

2:16:04

de m dict me dice set me da igual que

2:16:06

aquí le pongas dit esto es un set

2:16:08

obviamente pero si yo ahora lo que hago

2:16:10

es asociarle una clave a cada uno de

2:16:13

estos valores que es una clave pues lo

2:16:15

que entendemos por clave al final es ese

2:16:18

punto de acceso que nosotros tenemos

2:16:19

para acabar llegando un dato por ejemplo

2:16:21

la clave de name que podría la clave de

2:16:23

bry podría ser name Y cómo separo la

2:16:26

clave del valor con dos puntos así

2:16:29

estaré indicándolo mira aquí tengo un

2:16:31

diccionario con clave name y valor bry y

2:16:34

moure podía ser el apellido aquí y mour

2:16:37

de podría ser el alias y 36 podía ser la

2:16:41

edad se pueden crear claves de

2:16:43

diferentes tipos de datos sí

2:16:45

efectivamente Pero bueno Aquí vamos a

2:16:46

intentar hacerlo todo con strings porque

2:16:49

creo que queda muchísimo más y porque

2:16:51

suelen ser criterios de búsqueda

2:16:53

bastante fáciles que la clave podría ser

2:16:54

un entero si alguien le diera la gana

2:16:57

hacer esto de clave esto podría ser una

2:16:58

clave perfectamente Y esto compilara y

2:17:00

vemos que ahora ya tenemos aquí que esto

2:17:02

es un diccionario pero en mi caso creo

2:17:04

que es como mejor se entiende de hecho

2:17:06

lo vamos a hacer así con un salto de

2:17:07

línea para que quede mejor estructurado

2:17:09

vemos que lo que tenemos es un

2:17:10

diccionario con clave name valor brise

2:17:12

surname alias y h y ahora que ya tenemos

2:17:15

este diccionario vamos a intentar ver

2:17:17

cuáles son sus propiedades cómo funciona

2:17:19

todo esto qué teníamos que probar pues

2:17:21

Vale teníamos la parte de la inserción

2:17:23

Pues venga vamos a intentar insertar

2:17:25

datos en myit qué operaciones tenemos

2:17:27

bueno vemos que hay aquí unas cuantas

2:17:29

operaciones tenemos montonazo de

2:17:31

operaciones que queremos insertar un

2:17:33

dato lo que hicimos antes si nosotros

2:17:35

queremos insertar un dato en este caso

2:17:38

Aunque podríamos insertarlo directamente

2:17:40

qué se suele hacer solemos Acceder al

2:17:43

dato que nosotros queremos insertar

2:17:46

Imagínate que yo ahora quiero insertar

2:17:48

el email pues la manera de Acceder al

2:17:51

email si existiera veis esto sería igual

2:17:54

que con la con la lista pero en vez de

2:17:56

una posición porque aquí no tenemos

2:17:58

posiciones volvemos tener algo muy

2:18:00

parecido a la estructura de set de que

2:18:02

todo lo que tenemos aquí en nuestra

2:18:03

estructura o si la queréis imprimir

2:18:05

antes fijaos veis aquí en realidad

2:18:08

nosotros no tenemos una estructura como

2:18:10

tal en la que podamos acceder a cada uno

2:18:12

de los elementos vemos que esto nos da

2:18:14

un intento Acceder al elemento

2:18:15

cero ya que volvemos a lo mismo los

2:18:18

diccionarios por definición no son

2:18:20

ordenados Aunque en python sí que es

2:18:22

cierto que desde hace unas cuantas

2:18:24

versiones pero por a nivel de diseño no

2:18:27

a nivel conceptual en realidad un

2:18:28

diccionario sí que acaba guardando los

2:18:30

datos ordenados pero es por cómo han

2:18:33

decidido implementarlo en python pero no

2:18:35

porque la estructura de diccionario

2:18:37

fundamentalmente sea ordenada porque lo

2:18:39

que tenemos son claves valores claves

2:18:41

valores que también van a funcionar por

2:18:42

un Hash Okay solo que en python en

2:18:44

concreto han decidido que los

2:18:46

dicionarios acaben siendo ordenados pero

2:18:48

ya digo por una decisión más a nivel de

2:18:50

entación Entonces yo no puedo acceder a

2:18:52

un elemento cero porque conceptualmente

2:18:54

no estaríamos seguros de lo que va a

2:18:57

haber en el elemento cero Entonces cómo

2:18:59

accedo yo a los valores en realidad yo

2:19:01

tengo que acceder por clave Cuál es la

2:19:03

clave name surname alias lo que sea si

2:19:06

yo ahora hago esto vemos Que si accedo a

2:19:09

name lo que me devuelve es bry el valor

2:19:11

asociado a la clave Esta es la operación

2:19:14

de acceso que teníamos aquí pero antes

2:19:17

estábamos haciendo la parte de inserción

2:19:19

Cómo tendría que insertarle un Val valor

2:19:20

lo que decíamos antes yo primero lo que

2:19:22

tengo que hacer es como si quisiera

2:19:24

acceder a una clave email no lo tengo

2:19:26

pero yo de esta manera le puedo indicar

2:19:28

que ahora lo que voy a tener es una

2:19:29

clave email y que ahora el valor de

2:19:31

email va a ser igual a lo que teníamos

2:19:33

antes mouredev mouredev

2:19:35

@gmail.com y si ahora imprimo mi

2:19:38

diccionario completo vamos a ver lo

2:19:40

siguiente que al final de todo tengo una

2:19:42

clave email con el valor mour dep y ya

2:19:45

os digo en este caso sí que es ordenado

2:19:47

porque en python el diccionario es

2:19:49

ordenado pero no os fiéis de Okay Por

2:19:51

favor no os fiéis de eso vale aquí

2:19:53

tenemos la inserción Pero y si yo

2:19:56

quisiera hacer actualización Pues en

2:19:58

este caso los dicionarios suele ser

2:20:00

bastante fácil porque el concepto de

2:20:02

acceso o de inserción en realidad es el

2:20:04

mismo que el de actualización que yo

2:20:06

ahora lo que quiero es actualizar mi

2:20:08

edad pues accedería primero a la edad a

2:20:10

mi dicionario a la edad age Imagínate

2:20:13

que ya cumplo años y le digo que ahora

2:20:15

mi edad es 37 si yo ahora vengo por aquí

2:20:18

e imprimo el diccionario lo que Vais a

2:20:20

ver aquí es que ahora ha pasado la edad

2:20:22

de 36 a 37 pero si no existiera el campo

2:20:25

edad como nos ha pasado con el email lo

2:20:27

iba a acabar insertando ya veis que

2:20:28

podemos acceder de una manera muy segura

2:20:31

a todos los datos del diccionario Okay

2:20:32

Cómo podríamos acabar ordenando los

2:20:35

datos del diccionario Ahora aquí sí que

2:20:37

tenemos el punto ese de que los

2:20:39

diccionarios son ordenados en python lo

2:20:41

vuelvo a repetir lo vuelvo a repetir voy

2:20:43

a poner que esto es una actualización

2:20:45

bueno no hemos No hemos hecho el borrado

2:20:48

Qué pasa si yo quiero borrar qué

2:20:49

hacíamos aquí insertamos si había una

2:20:51

operación que era remove después de

2:20:52

haber hecho una inserción o lo que fuera

2:20:54

me voy a cargar el apellido Pues a ver

2:20:56

Vengo al diccionario Cómo haré la

2:20:58

eliminación Yo sé que el apellido está

2:21:01

en surname y aquí podríamos pensar igual

2:21:04

tengo una operación delete remove no

2:21:08

tengo nada pero lo que sí tengo es una

2:21:10

operación reservada del sistema que se

2:21:12

llama Dell de delete entonces si yo

2:21:14

ahora ejecuto Esto del de este elemento

2:21:16

me lo va a acabar borrando y lo vemos

2:21:18

aquí print mi diccionario esto sería la

2:21:21

eliminación y vamos a ver esto Dónde

2:21:23

está el apellido No está se lo ha

2:21:25

cargado ya veis que hay ligeras

2:21:26

modificaciones nos falta la ordenación

2:21:29

tendremos ordenación aquí o no tendremos

2:21:31

bueno mismo truco volvemos al dicionario

2:21:34

sorted Ah no hay nada pero si le paso

2:21:37

sorted y el diccionario por defecto va a

2:21:40

intentar ordenar algo a ver que es capaz

2:21:42

de hacer esto sorted del diccionario e

2:21:44

imprimo el diccionario Y esto es lo que

2:21:46

yo entiendo por ordenación a ver si lo

2:21:48

ordena qué tengo Uf tenía un diccionario

2:21:51

y de repente Ahora solo tengo las claves

2:21:53

Eso sí las claves ordenadas pero claro y

2:21:55

dónde están los datos se perdieron y el

2:21:57

diccionario ahora es una lista Uf no no

2:21:59

no no en realidad yo lo que tengo que

2:22:00

hacer para ordenar es acabar accediendo

2:22:02

a todos los ítems Al conjunto de claves

2:22:05

y valores ya que por defecto si yo se lo

2:22:07

paso sorte solo me va a pillar las

2:22:09

claves Pero en cambio Si yo vengo aquí a

2:22:11

my dict y voy a items ems es una

2:22:14

operación de los diccionarios que en

2:22:15

realidad me devuelve todos estos datos

2:22:18

las claves y los valores a ver qué tengo

2:22:20

ahora aquí aquí ojo H alias pero vemos

2:22:23

que no está devolviendo como una lista

2:22:25

que contiene tuplas una lista que tiene

2:22:27

una tupla que es h37 otra tupla que es

2:22:30

alias mouredev otra tupla que es email y

2:22:32

ya parece que está ordenado parece no a

2:22:34

la e la n lo ha ordenado por clave pero

2:22:36

claro no tengo un diccionario me lo ha

2:22:38

acabado convirtiendo en una lista qué

2:22:40

tendré que hacer pues mismo truco de

2:22:42

antes acabo transformando esta lista de

2:22:45

tuplas en un diccionario y esto

2:22:47

finalmente volverá a ser un diccionario

2:22:49

veis y ahora ya tenemos un diccionario

2:22:52

que se ha ordenado de esta forma hemos

2:22:54

visto las estructuras que existen en

2:22:56

python cada uno de vosotros pues tenía

2:22:59

que haber visto pues Cuáles son las

2:23:00

estructuras de su lenguaje una vez

2:23:02

tenemos el ejercicio hay esta parte que

2:23:04

digo dificultad extra opcional Bueno

2:23:06

sobre todo la parte opcional la debería

2:23:08

poder implementar todo el mundo pero si

2:23:10

estáis empezando muy muy de cero Pues

2:23:12

que os centré en aprender el lenguaje y

2:23:14

que nos pongáis aquí a hacer esta parte

2:23:16

opcional donde de verdad practicamos un

2:23:17

poco más lógica aún así yo os

2:23:19

recomendaría que si inicialmente veis

2:23:21

que no sois capaces de asumir la parte

2:23:24

esta de dificultad extra que más

2:23:25

adelante lo intentéis resolver o que lo

2:23:27

intentéis resolver aunque no lleguéis a

2:23:30

una corrección pero por lo menos

2:23:31

intentáis ahí pelear un poquito con esta

2:23:33

parte extra Porque aquí es donde De

2:23:35

verdad vamos a poner en práctica lo

2:23:37

aprendido Bueno pues vamos a hacer algo

2:23:39

parecido me voy a venir Yo por aquí y le

2:23:41

voy a llamar a esta parte extra voy a

2:23:43

poner aquí estructuras y aquí extra y

2:23:45

vamos a intentar resolver el ejercicio

2:23:47

este extra que decía Crea una agenda de

2:23:49

contactos por terminal entonces Bueno

2:23:51

aquí es donde De verdad nos tenemos que

2:23:52

pelar un poquito más con qué teníamos

2:23:54

que hacer en este ejercicio dice debes

2:23:56

implementar las funcionalidades de

2:23:57

búsqueda inserción actualización y

2:23:58

eliminación de contactos ya veis un

2:24:00

ejemplo real para el que podríamos

2:24:02

utilizar alguna estructura dice

2:24:04

implementar funcionales búsqueda

2:24:05

inserción actualización eliminación de

2:24:06

contactos cada contacto debe tener un

2:24:08

nombre y un número de teléfono vale y

2:24:10

vemos el eh Por aquí el programa

2:24:12

solicita en primer lugar que es la

2:24:14

operación que quiere realizar Okay pues

2:24:15

venga vamos a empezar a implementar

2:24:17

nuestro programa mi programa Va a ser

2:24:19

una función Estos son cosas que ya vimos

2:24:21

anteriormente Y le voy a llamar pues my

2:24:22

agenda Aquí tengo una función que yo voy

2:24:25

a acabar llamando por aquí cuando quiero

2:24:26

que se ejecute mi programa y mi programa

2:24:28

Va a estar todo dentro de esta función

2:24:30

llamada my agenda y el programa

2:24:31

inicialmente lo que decía es que tiene

2:24:34

que acabar preguntando pues qué es lo

2:24:36

que queremos hacer si queremos insertar

2:24:38

borrar actualizar eliminar por aquí

2:24:40

inserción borrado actualización

2:24:42

ordenación venga dejármelo tener por

2:24:43

aquí que lo voy a ver más fácil vale

2:24:45

tenemos búsqueda entonces podría decirle

2:24:47

aquí en el momento que se arranque pues

2:24:50

lo que quisiéramos hacer no escribe un

2:24:52

uno que sea insertar contacto un

2:24:55

programa interactivo por terminal

2:24:56

también podríamos hacer por aquí varias

2:24:58

opciones Pon aquí búsqueda inserción

2:25:01

actualización eliminación Bueno pues voy

2:25:03

a empezar por búsqueda Buscar contacto

2:25:05

insertar contacto actualizar contacto y

2:25:08

eliminar contacto se escribe 1 dos 3 o

2:25:11

cuatro y el programa decía que Oye

2:25:13

también se debe proponer una operación

2:25:15

de finalización del programa Pues si

2:25:17

teclea cinco el número cinco esto por

2:25:19

poneros lo mucho más fácil no podría ser

2:25:22

todo lo complejo Que quisiéramos pero

2:25:23

sin más voy a poner aquí salir okay Esto

2:25:25

es lo primero que le vamos a presentar a

2:25:27

nuestro usuario y aquí lo que tendríamos

2:25:28

que hacer en el momento que se arranca

2:25:30

Este programa sería obtener qué es lo

2:25:32

que va a escribir el usuario qué

2:25:34

responde el usuario Pues mira para eso

2:25:36

Por ejemplo en python tenemos una

2:25:37

operación que se llama input que esto lo

2:25:39

que acaba recogiendo es lo que teclea el

2:25:42

usuario y pulsa enter así que voy a

2:25:44

venir por aquí y le voy a escribir

2:25:46

selecciona una opción y Esto me lo voy a

2:25:49

guardar en una variable que se llama

2:25:51

option qué haría nuestro programa si lo

2:25:53

arrancamos vemos esto dice tat ta ta

2:25:55

selecciona una opción lo vemos por aquí

2:25:57

selecciona una opción Bueno aquí podría

2:25:59

escribir lo que quisiera cinco enter

2:26:01

Bueno mi programa finaliza porque no

2:26:03

estoy tratando este dato vamos a hacer

2:26:04

varias cosas primero vamos a hacer aquí

2:26:07

un salto de línea inicial para separar

2:26:10

estas ejecución o simplemente le voy a

2:26:12

hacer Bueno lo vamos a hacer así esto y

2:26:14

ahora Aquí sí que le voy a hacer un

2:26:16

barra un salto de para que más o menos

2:26:17

se vaya separando toda la ejecución Okay

2:26:19

pero ahora que ya tengo esta opción qué

2:26:21

tendría que hacer pues bueno si el

2:26:23

usuario If la option Esta es igual a uno

2:26:27

pues haríamos una cosa y el If si option

2:26:30

es igual a 2 pues haríamos otra cosa

2:26:32

okay Ahora aquí podemos utilizar ya que

2:26:34

estamos aquí un poco haciendo cosas más

2:26:36

avanzadas hay una estructura que

2:26:38

funciona bastante bien para esto cuando

2:26:39

estamos examinando el valor de una única

2:26:41

variable que es el switch que eso lo

2:26:43

tenéis en muchos lenguajes y en python

2:26:46

desde la versión 310 creo tenemos el

2:26:49

match Entonces qué quiero acabar

2:26:50

revisando el valor de option y una vez

2:26:53

lo reviso Qué diferentes casos de uso de

2:26:56

este valor tengo Pues tengo el Case de

2:26:59

que valga uno esto es como hacer

2:27:00

diferentes els If no un If y varios

2:27:03

elsif el Case de que valga dos 3 4 5 2 3

2:27:08

4 5 no en cada caso voy a hacer una cosa

2:27:11

y después también tengo el caso por

2:27:13

defecto que simplemente en Case con gu

2:27:15

bajo que esto sería que por supuesto el

2:27:17

usuario puede acabar escribiendo algo

2:27:19

que

2:27:20

no sea 1 2 3 4 5 vale en realidad Cuando

2:27:24

utilizamos If el sif cuando utilizamos

2:27:27

el llamado switch o en este caso Cómo se

2:27:29

llama en python que smch pues bueno

2:27:31

habitualmente en el momento que tenemos

2:27:33

condiciones complejas ahí solemos

2:27:35

utilizar el el If el el shif y cuando

2:27:37

estamos revisando valores de diferentes

2:27:39

variables pero en este caso si os fijáis

2:27:41

yo lo que quiero es hacer diferentes

2:27:43

cosas pero siempre observando Cuál es el

2:27:46

valor que va a tener una única variable

2:27:48

no quiero revisar varias cosas Solo

2:27:50

quiero saber los diferentes valores que

2:27:52

va tomando option entonces tiene más

2:27:54

sentido utilizarlo Pues con un switch o

2:27:57

en este caso con un match Okay vale Y

2:27:58

ahora Aquí vamos a ir haciendo pues

2:28:00

diferentes cosas vamos a irnos al caso

2:28:02

más más fácil Qué pasa si no escribe Ni

2:28:04

uno ni dos ni tres ni cuatro ni cinco

2:28:06

Pues yo le voy a acabar diciendo al

2:28:07

usuario Ey escríbeme una opción válida

2:28:09

le voy a decir No lo sé opción no válida

2:28:12

y le puedo poner por favor elige una

2:28:15

opción elige una opción del uno al cinco

2:28:18

que son las opciones que que yo en

2:28:20

realidad hago algún tipo de lógica no

2:28:22

con las otras no hago nada vale vamos a

2:28:24

irnos ahora sí que a otra que podría ser

2:28:28

bastante fácil el caso de salir pues

2:28:30

bueno si hay cinco yo le voy a decir

2:28:32

aquí al usuario print saliendo de la

2:28:34

agenda ya está pero claro Ahora aquí

2:28:37

tenemos otro problema que es qué pasa

2:28:39

con esto Esto se ejecuta de forma

2:28:41

secuencial primero está línea después

2:28:43

está línea después está línea pero en el

2:28:44

momento que selecciono algo la función

2:28:46

llega al final finaliza en realidad yo

2:28:48

tengo que hacer que esta preguntas se

2:28:51

repitan De qué manera se repitan en

2:28:53

bucle no Entonces qué voy a hacer voy a

2:28:55

meter toda mi lógica dentro de un bucle

2:28:57

dentro de un bucle que en realidad se

2:28:59

ejecute de manera infinita no así que

2:29:02

qué podemos hacer un bucle que funciona

2:29:04

muy bien para repeticiones en base a un

2:29:06

criterio es el While el bucle While que

2:29:09

también existe en la gran mayoría de

2:29:10

lenguajes y que también lo vimos en un

2:29:12

reto anterior le voy a decir While true

2:29:14

Qué significa While true pues While true

2:29:16

esto es una condición que indica que

2:29:18

siempre es verdadero mientras sea

2:29:20

verdadero y cuándo va a cambiar esta

2:29:22

condición en realidad no va a cambiar

2:29:23

nunca Entonces esto se va a ejecutar

2:29:25

infinito Cómo podemos hacer que se

2:29:28

detenga que se rompa este bucle bueno en

2:29:30

la gran mayoría de los lenguajes también

2:29:32

hay funciones de lenguaje de ruptura en

2:29:34

python el nombre que tiene es break un

2:29:37

break lo que hace es salir del bucle que

2:29:40

se está ejecutando en el momento que se

2:29:42

ejecute esta línea break se va a salir

2:29:44

del Wild Aunque este Wild en realidad

2:29:46

sea infinito hay otra gente que le crea

2:29:48

un flag por ejemplo pues yo que sé voy a

2:29:50

crear una función que se llame is on

2:29:53

como que está arrancado y yo le voy a

2:29:55

decir que vale true y le voy a decir

2:29:56

mira Mientras esté funcionando esté

2:29:58

encendido repítete qué podría hacer yo

2:30:01

aquí is on y le cambio el valor A false

2:30:04

qué haría cambiaría el propio criterio

2:30:06

que está haciendo que se ejecute de

2:30:07

forma infinita este While como ya lo

2:30:10

cambiamos a false se saldría Pero bueno

2:30:12

ya veis que esto lo estamos

2:30:13

implementando pues con más líneas

2:30:15

realidad yo en python tan fácil como

2:30:17

hacer un break y se me va a salir del

2:30:18

bucle en el que esté así Así que esta es

2:30:20

la manera de yo parar la ejecución de mi

2:30:22

programa si me salgo del bucle se acabó

2:30:25

Entonces le puedo dejar aquí

2:30:26

tranquilamente que esto se ejecute de

2:30:28

manera infinita que no voy a tener

2:30:29

riesgos y ahora ya sí que nos tenemos

2:30:31

que ir a las operaciones difíciles nos

2:30:33

vamos a ir a las operaciones difíciles

2:30:35

que es empezar a implementar la búsqueda

2:30:37

de un contacto la inserción la

2:30:39

actualización y la eliminación y lo

2:30:41

primero que tenemos que pensar es Okay

2:30:43

Cuál es la estructura que vamos a

2:30:45

utilizar para modelar los datos de

2:30:47

nuestra agente qué tenemos por aquí ah

2:30:50

vamos a ver qué nos pedía el ejercicio

2:30:52

debes implementar funcionalidades bla

2:30:54

bla bla y dice el programa solicita en

2:30:56

primer lugar Cuál es la operación que

2:30:57

quiere realizar eso ya lo estábamos

2:30:58

haciendo y los datos necesarios para

2:31:00

llevarla a cabo a ver qué datos el

2:31:01

programa no puede dejar introducir

2:31:03

números de teléfono okay Pero qué es en

2:31:05

realidad lo que tiene que guardar dice

2:31:06

Crea una agenda de contactos de terminal

2:31:08

y lo que nos dice es ta ta ta cada

2:31:10

contacto debe tener un nombre y un

2:31:12

número de teléfono Qué estructura se nos

2:31:14

adapta en el momento que tenemos que

2:31:16

guardar Pues un nombre y una estructura

2:31:18

un nombre y una estructura un nombre y

2:31:19

una estructura una lista no es muy

2:31:21

óptimo porque una lista solo guardábamos

2:31:23

un dato podíamos guardar una lista de

2:31:26

tuplas ig damos tuplas porque cada

2:31:29

elemento de la lista que sea una tupla

2:31:30

doble con el nombre y con el número de

2:31:32

teléfono podríamos hacer eso Okay Eh no

2:31:34

está mal lo podríamos hacer así o en

2:31:36

realidad podríamos utilizar un

2:31:38

diccionario un diccionario en el que la

2:31:41

clave pues pueda ser el nombre digo cada

2:31:42

contacto no sé qué digo Ey

2:31:44

funcionalidades de búsqueda tal digo

2:31:46

claro con el diccionario que la clave

2:31:48

sea el nombre y que el valor sea el

2:31:50

número de teléfono por ejemplo o si os

2:31:52

ha dado la gana y que la clave sea el

2:31:54

número de teléfono porque queréis Buscar

2:31:55

por número de teléfono Pues venga

2:31:57

hacerlo Aunque habitualmente la búsqueda

2:31:59

la solemos hacer por nombre para Buscar

2:32:01

el número de teléfono por supuesto

2:32:02

podríamos acabar implementando que se

2:32:04

busquen los dos sentidos Pero bueno aquí

2:32:05

un poco Depende de lo que quisieres

2:32:07

complicar Bueno vamos a partir por lo

2:32:09

primero dijimos que vamos a necesitar

2:32:12

una estructura de diccionario así que me

2:32:14

voy a crear agenda y voy a inicializar

2:32:16

un diccionario a vacío ya está Esto para

2:32:18

mí es un diccionario cuando le meta

2:32:20

datos pues Ya veré aunque esto ya sabéis

2:32:22

esto inicialmente es un set Pero bueno

2:32:24

inicialmente es un set pero que yo voy a

2:32:27

acabar transformando en un diccionario

2:32:28

en el momento que le meta datos vamos

2:32:30

para ir probando voy a llamar a la

2:32:31

operación pas en todos porque pas lo

2:32:34

único que hace Es simplemente no

2:32:35

ejecutar nada para que nos desaparezcan

2:32:37

los errores ya que cada condición Case

2:32:39

necesita código yo le estoy metiendo pas

2:32:41

para que no ejecute nada y así ya

2:32:43

podamos empezar a probar vale vamos a ir

2:32:45

implementando siguiendo una especie de

2:32:47

orden lógico en lo que tenemos que hacer

2:32:48

claro cómo voy poder buscar y cómo voy

2:32:50

poder actualizar o eliminar si no he

2:32:52

insertado Así que vamos a empezar por la

2:32:53

operación dos vamos a insertar y voy a

2:32:55

venir por aquí y vamos a pensar Cuál es

2:32:57

la lógica que tenemos que desencadenar

2:32:59

si nosotros queremos insertar un usuario

2:33:01

qué tendríamos que hacer Pues bueno le

2:33:03

tendríamos que pedir el nombre si yo

2:33:06

selecciono el dos sería insertar así que

2:33:09

ya sabemos Cómo podemos hacer las

2:33:11

labores de inserción tan fácil como que

2:33:13

tengo que venir por aquí y decir

2:33:15

introduce un nombre introduce el nombre

2:33:17

del contacto del contacto y el nú número

2:33:20

no font primero uno y después le pido el

2:33:22

otro introduce el teléfono del contacto

2:33:25

Okay ya tenemos esto qué tendría que

2:33:27

hacer con name y con f pues me tendría

2:33:30

que ir a la agenda la clave cuál sería

2:33:32

el nombre y cuál sería el valor el

2:33:35

teléfono buo ya está ya estaríamos

2:33:37

guardando la clave y el valor Pero qué

2:33:40

pasaría vamos a venir por aquí el

2:33:42

programa no puede dejar introducir

2:33:44

números de teléfono no numéricos Y con

2:33:47

más de 11 dígitos o el número de dígitos

2:33:51

que queráis porque empezasteis a decir

2:33:52

en mi país son 12 en mi país son 300 en

2:33:55

mi país hay números de teléfono de cinco

2:33:56

Bueno he puesto 11 por poner algo pero

2:33:58

le ponía lo que os diera la gana Okay

2:34:00

entonces antes de insertar tenemos que

2:34:02

realizar una comprobación que todos sean

2:34:05

números If voy a poner por aquí por

2:34:07

ejemplo F y Aquí empieza a entrar La

2:34:09

magia de cada uno de los lenguajes por

2:34:11

ejemplo en python podíamos venir por

2:34:13

aquí y decir habrá algo así como is

2:34:16

digit ostras una operación que nos torna

2:34:20

verdadero falso y nos dice si F Está

2:34:24

compuesto por dígitos genial Vale

2:34:26

entonces si son dígitos and qué más la

2:34:30

longitud de teléfono leng phone qué

2:34:32

tenía que ser para poder insertar en

2:34:34

realidad decía aquí e ta ta ta ta número

2:34:36

de teléfono y no puede tener más 11

2:34:39

dígitos bueno Qué entendemos por esto

2:34:41

que la longitud de fo yo voy a decir que

2:34:44

sea mayor que cer0 and la longitud de

2:34:46

font tiene que ser menor o igual que 11

2:34:49

para yo así permitir insertar en caso de

2:34:53

que no se cumpla esto tendremos un els

2:34:56

querrá decir que no se ha cumplido este

2:34:58

criterio y yo ahora aquí le podría

2:35:00

lanzar un print al usuario y decirle

2:35:03

debes introducir un número de teléfono

2:35:06

con menos de 12 dígitos por ejemplo este

2:35:11

podría ser mi criterio y así lo aviso y

2:35:13

solo lo dejo insertar si en realidad son

2:35:16

todo dígitos y está entre 1 y 11 bueno

2:35:19

podríamos decir no porque claro Debería

2:35:22

ser un número con más de nueve da igual

2:35:24

Es decir ahí la lógica la que nos diera

2:35:26

la gana inventar en mi caso os he puesto

2:35:29

que controlara que tuviera como máximo

2:35:31

11 Entonces esta es la lógica que

2:35:32

estamos desencadenando por supuesto aquí

2:35:34

se trata más de practicar el tema de

2:35:36

estructuras que que esto sea aquí la

2:35:38

agenda definitiva y he visto aquí que

2:35:40

hay un error que he puesto len len y es

2:35:43

len font un máximo máximo de 11 dígitos

2:35:46

ponemos este criterio por ejemplo okay

2:35:48

Así que ya ya tenemos la parte de

2:35:50

inserción ya tenemos la inserción qué

2:35:52

más cosas podemos hacer vale ahora que

2:35:54

ya hemos insertado podríamos hacer el

2:35:56

buscar vamos a intentar implementar eh

2:35:59

la búsqueda para implementar la búsqueda

2:36:01

yo le tendría que pedir el nombre

2:36:03

introduce el nombre del contacto a

2:36:05

buscar podría poner por aquí y cuando ya

2:36:08

tenemos el nombre qué haría Pues con el

2:36:11

name si el nombre está en qué in agenda

2:36:15

otra operación muy típica con las

2:36:17

estructuras realizar tareas de búsqueda

2:36:20

por ejemplo yo para buscar si una clave

2:36:22

existe en un diccionario en python es

2:36:24

tan fácil como esto si la clave está en

2:36:27

el diccionario si se cumple esto nos va

2:36:29

a entrar por este If si no pues

2:36:31

tendremos aquí un Else Okay qué

2:36:33

tendremos en el Else por empezar por el

2:36:35

caso de que no lo ha encontrado pues

2:36:37

podemos tener vamos a interpolar esto le

2:36:39

voy a pasar el nombre pues el contacto y

2:36:42

el nombre que me ha pasado el nombre que

2:36:44

hemos escrito name no existe puedo poner

2:36:46

no lo hemos encontrado Pero en cambio Si

2:36:48

lo hemos encontrado Ahora aquí sí que

2:36:50

podré hacer un print y le podré decir el

2:36:53

número de teléfono del contacto le podré

2:36:55

decir el número de teléfono de el nombre

2:36:58

que H has introducido es Y ahora cómo

2:37:00

accedemos al valor asociado a la clave

2:37:04

me voy al diccionario que era agenda me

2:37:07

voy a la clave que era name y así accedo

2:37:09

al valor ya está otra operación más

2:37:11

implementada la operación de búsqueda

2:37:14

actualizar contacto vamos a eliminar

2:37:16

porque eliminar seguro que es mucho más

2:37:18

fácil qué Tendremos que qu hacer pedirle

2:37:20

el nombre más de lo mismo introduce el

2:37:22

nombre del contacto a eliminar cómo

2:37:24

hacemos la búsqueda lo mismo If aquí si

2:37:27

el nombre está en la agenda cómo hacemos

2:37:29

la eliminación ya vemos que eso era muy

2:37:31

fácil lo habíamos visto aquí arriba para

2:37:32

eliminar de un contacto simplemente del

2:37:35

el diccionario y la clave del el

2:37:37

diccionario agenda y la clave name lo

2:37:40

que acaba de meter el usuario en caso

2:37:42

contrario qué será el els Pues

2:37:43

básicamente lo mismo que pusimos aquí el

2:37:45

contacto no sé qué no existe le

2:37:48

pondríamos lo mismo ya está última

2:37:49

operación que nos falta la operación

2:37:51

tres la operación de actualización de

2:37:53

contacto qué tenemos que hacer Pues lo

2:37:55

mismo introduce el nombre del contacto a

2:37:59

eliminar que aquí lo puse mal a

2:38:01

actualizar si lo encontramos o si no lo

2:38:03

encontramos en caso de que no lo

2:38:05

encontremos o otra vez lo mismo este

2:38:07

contacto pues no existe pero en caso de

2:38:09

que exista qué hacemos ahora le tenemos

2:38:12

que pedir el nuevo número de teléfono

2:38:14

cuál es el nuevo número de teléfono

2:38:16

introduce el teléfono del contacto y una

2:38:19

vez ya ha introducido el teléfono del

2:38:21

contacto qué tenemos que hacer más de lo

2:38:23

mismo aquí lo tenéis otra vez tendríamos

2:38:26

que repetir este código el que nosotros

2:38:28

lo que estamos haciendo es otra vez

2:38:30

revisando si es un son todo dígitos si

2:38:33

cumple este criterio etcétera lo veis

2:38:35

claro Ahora aquí nos puede surgir algo y

2:38:37

es que este código todo este código lo

2:38:41

he repetido Exactamente igual aquí y

2:38:43

aquí qué podríamos hacer podría

2:38:45

centralizar recordáis que en una lección

2:38:47

anterior hablamos de de la posibilidad

2:38:50

de crear funciones dentro de funciones

2:38:53

Venga pues yo que sé podría crear una

2:38:56

función aquí dentro que sirviera para

2:38:59

insertar o para lanzar toda esta lógica

2:39:02

de inserción lo que vemos aquí lo

2:39:04

podríamos hacer esto ya es un poquito

2:39:06

más avanzado y yo no os quiero complicar

2:39:08

la vida entonces en cierto modo os lo

2:39:10

voy a dejar así como todo super indicado

2:39:13

pero con vistas a que tengáis claro que

2:39:16

esto en realidad es una mala práctica en

2:39:18

el momento que nosotros tenemos esto y

2:39:21

estamos repitiendo código algo estamos

2:39:23

haciendo mal esto todo esto debería

2:39:26

convertirse en una función de inserción

2:39:29

de usuario o semejante Okay yo podría

2:39:32

venirme por aquí y crear una función

2:39:35

imaginaos aquí Def insert contact y yo

2:39:39

venir por aquí y decirle Pues mira todo

2:39:41

esto que tenemos aquí Dónde está toda

2:39:43

esta parte toda esta parte en realidad

2:39:45

desde aquí el pH valdría Pero bueno

2:39:48

podríamos decirlo pues no Mira desde la

2:39:50

parte del font que es donde yo le voy a

2:39:51

hacer esta lógica pues yo me podría

2:39:53

venir por aquí y que todo esto formara

2:39:56

parte de esta lógica vemos todo esto

2:39:57

aquí está podría valer que yo ahora

2:39:59

quiero lanzar esta lógica tan fácil como

2:40:02

que yo ahora sin más vengo por aquí y

2:40:05

llamo insert contact Y dónde estaba

2:40:08

haciendo también toda esta lógica no sé

2:40:10

qué aquí igual que el debes introducir

2:40:12

todo esto todo esto todo esto Esta parte

2:40:14

de font insert contact hemos reutilizado

2:40:17

este código por supuesto hay más código

2:40:19

repetido pero para que veáis con este

2:40:20

que era el código como más complejo que

2:40:22

teníamos como lo estábamos reutilizando

2:40:24

Okay incluso podríamos revisar que el

2:40:26

Case fuera el dos o el tres y aquí

2:40:28

desencadenando si fuera el uno o otro

2:40:30

Bueno en realidad Hay muchas formas de

2:40:32

optimizar el código pero ya digo como

2:40:34

estamos a nivel de fundamentos tampoco

2:40:36

quiero pasar vale vamos a ver si ahora

2:40:38

corro mi programa que acabo encontrando

2:40:40

vamos a ir viéndolo por aquí digo Buscar

2:40:42

contacto insertar contacto no sé qué

2:40:44

pues vamos a ir haciéndolo Pues voy

2:40:47

poner un número que no existe El Seis

2:40:49

qué ha dicho opción no válida elige una

2:40:51

opción del uno al cco una a opción no

2:40:53

válida elige una opción del uno al cco

2:40:56

vale Voy a insertar contacto el dos y me

2:40:58

dice introduce el nombre del contacto

2:41:00

brce introduce el teléfono del contacto

2:41:02

ves como me lo está poniendo bien 666

2:41:05

6666 61 por ejemplo Hala ya me lo ha

2:41:08

insertado podríamos lanzar un mensaje

2:41:10

diciendo que se ha insertado

2:41:12

correctamente podríamos en realidad

2:41:14

Bueno yo en mi caso tiro para adelante

2:41:16

cuando ya inserto vuelvo a preguntar

2:41:18

insertar un contacto actualiz el

2:41:19

contacto Pues voy a volver a insertar

2:41:21

uno y ahora voy a insertar a mouredev y

2:41:23

el número es 666 66 66 6 2 ya está voy a

2:41:28

buscar el contacto el nombre del usuario

2:41:30

que quiero buscar moure dice Hala el

2:41:33

contacto moure no existe vale es verdad

2:41:36

voy a buscar porque en realidad era

2:41:38

bryce y me dice el número de teléfono de

2:41:40

bry es 666 no sé qué un y ahora voy a

2:41:42

buscar a m dep y me dice es66 no sé qué

2:41:46

dos okay Y ahora Quiero actualizar el

2:41:48

número vamos al tres Yo quiero

2:41:50

actualizar a moure Bris Qué tonto si

2:41:52

moure no existía Aquí está no no en

2:41:54

realidad quería actualizar a mour de

2:41:57

porque ahora el nuevo número es 666 66

2:42:00

66 6 3 ya no dos vengo por aquí

2:42:03

actualizado vamos a buscarlo lo busco

2:42:05

Busco a mouredev y vemos que ahora ya

2:42:07

acaba en tres qué quiero eliminarlo el

2:42:09

cuatro A quién quiero eliminar a

2:42:11

mouredev eliminado porque no nos ha

2:42:13

dicho que hay un fallo Ahora cuando

2:42:15

Busco el contacto y Busco a mouredev me

2:42:18

dice el contacto de no existe y ya por

2:42:20

último cinco sale del programa se cierra

2:42:23

lo veis estamos creando la lógica que

2:42:26

demuestra que entendemos Cómo funcionan

2:42:28

las estructuras vale eso es un poco lo

2:42:30

que tenéis que pensar pero aplicado este

2:42:32

ejercicio y aplicado a cualquier

2:42:33

ejercicio que haga yo no estoy

2:42:34

intentando cubrir todos los casos de uso

2:42:36

para la agenda perfecta estoy intentando

2:42:38

cubrir algunos casos de uso de un

2:42:41

proyecto que podría ser medio real pero

2:42:43

que lo más importante es que con esto

2:42:46

hemos visto Cómo podemos con una

2:42:48

estructura llevarlo a algo más real por

2:42:50

supuesto podríamos hacer más cosas y

2:42:52

pedir confirmar o decirle cuando se

2:42:55

inserte correctamente mostrárselo al

2:42:57

usuario pues podríamos hacer 1 cosas o

2:43:00

que yo ahora Claro si ahora pongo un

2:43:01

nombre con minúscula y lo busco con

2:43:03

mayúscula pues no me lo va a encontrar

2:43:05

es así es decir esos errores existen en

2:43:07

nuestro programa pero no se trata de eso

2:43:09

se trata más de la parte eh asociada a

2:43:12

lo que estamos aprendiendo en esta

2:43:13

lección más que cómo la llevamos a la

2:43:14

práctica vosotros en vuestro ejercicio

2:43:17

podéis hacer lo que queráis y es bueno

2:43:19

yo aquí porque Oye tenemos un tiempo

2:43:20

límite y si ahora me pongo a aquí a

2:43:23

hacer esa agenda perfecta Pues nos

2:43:24

tiramos 10 horas no Y si nobre tiene

2:43:26

apellidos podríamos hacerlo y podréis

2:43:28

hacer un buscador que solo buscara por

2:43:30

nombre o por una parte del nombre aquí

2:43:32

el nombre en realidad o es completo o no

2:43:35

lo encuentra fin de la historia así es

2:43:37

como va a funcionar pero poneros a

2:43:39

implementarlas Y si cubrís 50 casos de

2:43:42

uso más de los que yo os propongo eso

2:43:45

está genial dec está bien porque eso os

2:43:47

va a servir para aprender a vosotros

2:43:49

ya digo esto nunca se trata de

2:43:51

demostrarme a mí lo buenos o malos que

2:43:53

sois con el lenguaje se trata de que

2:43:55

vosotros os demostré a vosotros mismos

2:43:57

que estáis aprendiendo el lenguaje

2:43:58

Entonces si le veis eh mejoras a mi

2:44:01

ejercicio meter todas las que podáis

2:44:03

porque eso os va a valer para

2:44:10

practicar quién nos decía este ejercicio

2:44:13

número cuatro decía muestra ejemplos de

2:44:16

todas las operaciones que puede realizar

2:44:18

con carena con cadenas de caracteres en

2:44:20

tu lenguaje algunas de estas operaciones

2:44:22

podrían ser Busca todas las que puedas

2:44:24

esto es muy importante Por qué digo

2:44:26

Busca todas las que puedas porque

2:44:27

dependiendo del lenguaje de programación

2:44:30

Puede que haya operaciones comunes entre

2:44:32

todos los lenguajes pero Puede que haya

2:44:34

algunas un poco más más propias del

2:44:37

lenguaje yo os pongo ejemplos también

2:44:39

para que os deis cuenta de que qué es

2:44:41

esto de operaciones con cadenas de texto

2:44:43

y veis aquí acceso a caracteres

2:44:45

específicos subcadenas longitud

2:44:48

concatenación petición recorrido

2:44:50

conversión a mayúsculas a minúsculas

2:44:52

reemplazo división Unión interpolación

2:44:54

verificación veis ejemplos de

2:44:56

operaciones con cadenas de texto con

2:44:59

cadenas de caracteres muy habituales

2:45:01

haciendo vuestra búsqueda vuestro propio

2:45:03

estudio que es lo importante Igual

2:45:05

encontráis más o menos es un poco lo que

2:45:07

teníais que Representar en el ejercicio

2:45:09

y después pues ya veremos la dificultad

2:45:11

extra pero primero vamos a quedarnos con

2:45:13

el ejercicio Así que vengo como siempre

2:45:14

aquí a visual Studio code yo lo voy a

2:45:16

resolver en python m.py como si y ahora

2:45:19

aquí me voy poner un poco A contaros qué

2:45:22

podríamos hacer con las cadenas

2:45:24

simplemente voy a hacer aquí operaciones

2:45:27

voy a poner aquí y vamos a empezar a

2:45:28

operar con cadenas de caracteres para ir

2:45:32

aprendiendo Qué cosas podíamos hacer a

2:45:34

ver si vosotros también tenéis esto no

2:45:36

lo tenéis o si más o menos llegamos a un

2:45:39

consenso en diferentes cosas que podemos

2:45:41

hacer con el lenguaje de programación

2:45:43

vamos a ello cadenas de caracteres

2:45:45

primera cosa que se me ocurre operación

2:45:47

de concatenación os tenemos cadenas de

2:45:50

caracteres voy a poner aquí un ejemplo

2:45:51

por ejemplo le voy a llamar s1 y le voy

2:45:54

a llamar Hola s2 le voy a llamar python

2:45:58

dos cadenas de texto sin más lo que os

2:46:00

dé la gana Por qué Porque seguramente

2:46:01

las voy a empezar a utilizar a lo largo

2:46:03

de las diferentes operaciones que yo

2:46:05

puedo realizar con cadenas de texto Cómo

2:46:08

es la concatenación Pues bueno la

2:46:10

concatenación es tan fácil como que y la

2:46:13

por supuesto las tenéis que ir

2:46:14

imprimiendo para ir viendo los

2:46:15

resultados la concatenación es tan fácil

2:46:17

como a una cadena de texto sumarle otra

2:46:20

imagínate cadena de texto String 1 más

2:46:24

String 2 si yo ahora imprimo esto que

2:46:27

acabaremos viendo H la python todo junto

2:46:29

bueno por supuesto la concatenación

2:46:31

puede ser algo más compleja y yo ahora

2:46:33

le quiero meter Pues un espacio en el

2:46:34

medio pues le meto un espacio en el

2:46:36

medio y le quiero meter una admiración

2:46:38

al final o un espacio con una coma por

2:46:41

ejemplo Y ahora qué pasa y falta por qué

2:46:44

porque tenemos que concatenar todo con

2:46:45

mases así tenemos cadenas de texto

2:46:48

creadas con anterioridad y otras que las

2:46:50

estamos creando en el propio print sin

2:46:51

ser una variable las concatenando todas

2:46:53

con mases y ahora veo aquí Hola python

2:46:56

Pues bueno concatenación muy bien Qué

2:46:58

más cosas podemos hacer podemos repetir

2:47:00

cadenas de texto vuelvo vuelvo a repetir

2:47:03

hablando de repetición que que yo

2:47:05

implemente estas operaciones no quiere

2:47:07

decir que existan en todos los lenguajes

2:47:09

ni quiere decir que en todos los

2:47:10

lenguajes se hagan igual vale pero sí

2:47:13

que os sirve un poco para entender esas

2:47:16

diferentes operaciones que hay y

2:47:17

buscarlas en vuestro lenguajes o Buscar

2:47:20

operaciones extra que sirvan para tratar

2:47:22

cadenas de caracteres por ejemplo cuando

2:47:25

hablamos de repetición voy a venir por

2:47:27

aquí y voy a hacer otro print Imagínate

2:47:28

que yo quiero repetir tres veces la

2:47:31

cadena s1 Pues yo podría hacer esto no

2:47:33

s1 + s1 + s1 al imprimir esto Hola hola

2:47:38

hola pero en python Por ejemplo si yo

2:47:40

quiero repetir una misma cadena n veces

2:47:43

es tan fácil como hasta utilizar el

2:47:45

símbolo de multiplicación y las veces

2:47:47

que lo quiero repetir s1 por TR en

2:47:49

realidad es Hola hola hola tan fácil así

2:47:52

es tan fácil hacer una repetición de una

2:47:53

cadena de texto en python también tengo

2:47:56

la parte de indexación por ejemplo cómo

2:47:58

haría la parte de indexación la parte de

2:48:00

indexación básicamente es acceder a un

2:48:03

carácter concreto de una cadena de texto

2:48:05

en realidad eh Acceder al índice vamos a

2:48:09

la cadena de texto me voy a quedar con

2:48:11

la s1 y Imagínate que yo quiero acceder

2:48:14

a la letra que está en el índice cero si

2:48:17

yo me voy a la letra que está en el

2:48:19

índice cer0 qué tendré la H Y si

2:48:22

empezamos a concatenar diferentes

2:48:24

índices el índice cer0 el un el dos el

2:48:27

tres el cuatro así estos primeros índice

2:48:31

1 dos y tres desde el cero empezando a

2:48:34

contar qué acaba imprimiendo aquí Hola

2:48:36

Pero cómo la acaba imprimiendo en

2:48:38

realidad Porque yo he accedido a cada

2:48:40

una de las letras si yo accediera solo a

2:48:42

la cer Esto me imprimiría solo la H Ya

2:48:45

está entonces una forma de acceder por

2:48:47

índice a cada uno venga qué más longitud

2:48:50

Cómo podemos combinar una cadena de

2:48:52

texto con alguna operación del sistema

2:48:55

como es en el caso de python o con

2:48:57

operaciones propias de caracteres como

2:49:00

puede ser en otros lenguajes yo puedo

2:49:02

obtener la longitud de una cadena de

2:49:04

texto con una función en este caso que

2:49:06

es la longitud leng si yo me fuera a la

2:49:08

segunda cadena de texto y le digo Ey

2:49:10

Cuál es la longitud de la segunda cadena

2:49:12

de texto me dice seis Por qué Porque en

2:49:14

realidad python tiene seis letras tan

2:49:15

fácil como eso qué más cosas podría

2:49:18

hacer lo que se llama slicing no voy a

2:49:20

poner porción quizás el término que más

2:49:22

me gusta cadena de texto por ejemplo la

2:49:25

s2 otra vez Cómo puedo hacer para

2:49:28

quedarme con una porción por ejemplo

2:49:30

solo me quiero quedar con esto h o y n o

2:49:35

con el ton este final Pues en realidad

2:49:37

yo en python le puedo decir ahora que

2:49:39

conocemos la indexación los índices le

2:49:41

puedo decir en qué índice quiero que

2:49:43

empiece y en qué índice quiero que acabe

2:49:45

claro la p es el índice cer 1 2 es decir

2:49:49

quiero empezar la t índice 2 Y a dónde

2:49:51

quiero llegar a la n 2 3 4 5 decir

2:49:55

empiezo en el do le indico dos puntos el

2:49:58

dos es el índice inicial el cco es el

2:50:01

índice final hago el Play digo to Por

2:50:03

qué Porque en realidad este slicing

2:50:06

vamos a verlo 0 1 2 3 4 5 Oh Cómo es

2:50:11

esto Cómo es esto por qué Porque en el

2:50:14

slice el índice final no se tiene en

2:50:17

cuenta es es decir va del dos al cinco

2:50:21

como nosotros teníamos aquí excluyendo

2:50:23

el cinco por eso pone top si yo ahora le

2:50:26

pongo el seis que veríamos t pero

2:50:29

también tenemos otra forma que hacerlo

2:50:30

El Seis esto si en realidad queríamos un

2:50:33

slice concreto pero si queremos que el

2:50:35

slce vaya del dos hasta el final Mira me

2:50:39

imprime lo mismo yo le puedo indicar que

2:50:41

en realidad quiero que llegue hasta el

2:50:42

final de la cadena de texto le digo que

2:50:44

empiece en el dos y que no le pongo nada

2:50:46

al final con lo cual se va justo hasta

2:50:48

el final y si lo quiero hacer al revés

2:50:50

si quiero que empiece desde el principio

2:50:52

pero que vaya hasta el dos le podría

2:50:54

decir que empiece en el cero o en

2:50:56

realidad le podría decir que vaya De

2:50:58

nada a dos y veis que hace p en ambos

2:51:01

casos índice cer0 e índice uno aquí lo

2:51:04

tenéis Pues bueno diferentes formas de

2:51:06

obtener porciones vamos a hacer una

2:51:09

búsqueda Yo podría intentar Buscar si de

2:51:12

verdad un carácter existe o pertenece a

2:51:16

una cadena de texto vamos a hacer esto

2:51:18

voy a intentar Buscar si la palabra Hola

2:51:22

pues tiene la letra a Pues yo le podría

2:51:26

decir Ey a in s1 que es Hola A ver qué

2:51:30

me responde me dice true dice ostras es

2:51:33

verdadero y si yo pongo o Ho me dice

2:51:37

true también es verdadero lo veis

2:51:39

entonces en cierto modo así podemos

2:51:41

estar buscando si un caráter o una

2:51:44

cadena de caracteres está contenida

2:51:46

dentro de otra cadena de caracteres en

2:51:48

cambio Si yo le pusiera pues la i que me

2:51:51

va a decir false bien fácil no hacer la

2:51:53

búsqueda más cosas que podemos hacer con

2:51:56

caderas de caracteres porque en realidad

2:51:58

podemos hacer muchas por eso os digo que

2:51:59

a veces nos ponemos a aprender un

2:52:01

lenguaje pero cuando nos ponemos a

2:52:02

repasar cada parte es Cuando

2:52:04

verdaderamente acabamos entendiendo la

2:52:06

potencia del lenguaje y creo que quizás

2:52:09

con todos los tipos de datos Pues bueno

2:52:11

podemos evitarlo un poquito pero las

2:52:12

cadenas de texto es un tipo de dato tan

2:52:14

tan tan tan común y tan tan potente

2:52:17

Quizás es uno de los que tiene más

2:52:18

posibilidades que está bien aunque sea

2:52:20

de vez en cuando hacerle un repaso para

2:52:22

entender que tenemos todas estas

2:52:24

posibilidades y cuando tengamos que

2:52:25

tratar pues con cadenas de caracteres

2:52:27

que muchas de estas cosas después se

2:52:28

pueden aplicar a otros tipos de

2:52:30

estructuras saber que existen y después

2:52:32

intentar llevarlo a nuestras necesidades

2:52:33

búsqueda hacemos reemplazo deir

2:52:36

podríamos reemplazar podríamos decirle

2:52:38

Ey yo tengo una cadena de texto por

2:52:40

ejemplo la s1 y le puedo decir que donde

2:52:44

aparezca la o tengamos una a por ejemplo

2:52:47

entonces para eso en las cadenas existe

2:52:50

una operación que se llama replace y yo

2:52:52

le puedo indicar cuál es el carácter que

2:52:54

quiero reemplazar o la cadena de

2:52:56

caracteres en este caso la o y por lo

2:52:58

que yo lo quiero reemplazar por una A

2:53:00

qué me va a acabar imprimiendo esto me

2:53:02

va a escribir ala en vez de Hola otra

2:53:04

cosilla más que podemos hacer por

2:53:06

supuesto revisar porque es casi

2:53:08

imposible hablar de todísima las

2:53:10

posibilidades incluso todas las

2:53:12

variantes que hay dentro de cada

2:53:14

posibilidad pero en el momento que

2:53:15

sabéis que existe la opción de reemplazo

2:53:18

de despues si hay otras opciones de

2:53:19

reemplazo que podemos hacer Pues con

2:53:21

ciertas variaciones revisarlas porque

2:53:23

las vais también a acabar encontrando

2:53:25

Okay igual que tenemos es reemplazo

2:53:27

tenemos la división podemos dividir

2:53:29

cadenas de caracteres para ello cómo lo

2:53:32

hacemos venga me vengo un print otra

2:53:34

operación que tenemos dentro de las

2:53:35

cadenas de caracteres igual que tenemos

2:53:37

el el replace tenemos el Split le podría

2:53:40

decir Pues corta la cadena por dónde No

2:53:43

lo sé en este caso voy a poner la cadena

2:53:45

dos le voy a decir que la corte por la t

2:53:48

a ver qué acabo obteniendo qué tengo p

2:53:51

por un lado on por otro claro el corte

2:53:54

indica Uy Me he cargado el lugar por

2:53:57

donde corto podríamos hacer muchas cosas

2:54:00

para que esto no se perdiera pero

2:54:01

habitualmente por defecto los lenguajes

2:54:04

por donde tú dices que corte suelen

2:54:06

desechar ese criterio de corte porque

2:54:09

muchas veces decimos e corta por los

2:54:11

espacios en blanco por los espacios en

2:54:12

blanco cierto modo ya los acaba

2:54:14

eliminando aquí le he dicho que corte

2:54:15

por la t pues la t ya no existe por

2:54:17

supuesto podríamos acabar va recuperando

2:54:18

la t no hay ningún problema pero en

2:54:20

principio aquí lo tenemos tenemos p y on

2:54:23

Y qué estructura vemos por aquí pues

2:54:25

seguramente esto es un array un arreglo

2:54:27

una lista claro tenemos ahora dos

2:54:30

cadenas de texto al hacer el corte por

2:54:31

la t qué acaba significando esto que

2:54:34

realidad tenemos Pues bueno dos

2:54:35

elementos metidos en una estructura que

2:54:37

es lo que nos va a acabar devolviendo

2:54:39

que tuviéramos imagínate p tonton corte

2:54:44

lo veis acortado por las dos tes esto en

2:54:48

que lenguajes puede ser ligeramente

2:54:50

diferente a veces corta por la primera

2:54:53

aparición del criterio que nosotros le

2:54:55

estamos marcando depende el lenguaje ya

2:54:57

os lo digo depende un poquito del

2:54:58

lenguaje pero quedaros con que en el

2:55:00

momento que lo hagáis de verdad entender

2:55:02

cómo se está comportando más cosas que

2:55:04

podemos hacer aparte de la división

2:55:07

hablaba en el enunciado de la conversión

2:55:10

a mayúsculas mayúsculas y minúsculas yo

2:55:13

puedo venir a una cadena de texto por

2:55:16

ejemplo a la s1 y decir decirle e lo

2:55:19

quiero convertir a mayúsculas apper pero

2:55:22

también puedo venir a la misma cadena de

2:55:24

texto y decirle lo quiero convertir a

2:55:26

minúsculas lower Así que vengo por aquí

2:55:28

ya veis Hola en mayúsculas Hola todo en

2:55:31

minúsculas que sabéis que la H estaba en

2:55:33

mayúsculas la primera y hasta Mira

2:55:35

mayúsculas minúsculas y primera letra en

2:55:40

mayúsculas voy a poner otro ejemplo

2:55:43

vamos a hacer un print me voy a crear

2:55:45

una cadena de texto por ejemplo mi

2:55:46

nombre Bright moure y voy a llamar a una

2:55:49

operación que es title a ver qué hace

2:55:52

title title acaba devolviendo bry moure

2:55:55

ha puesto la primera letra de cada

2:55:58

palabra en mayúsculas pero he puesto I

2:56:02

letras en mayúsculas voy a volver poner

2:56:04

la misma cadena de texto y ahora voy

2:56:06

Llamar a capitalize a ver qué hace

2:56:08

capitalize solo pone la primera letra de

2:56:11

la cadena de texto mayúscula veis que el

2:56:13

moure Sigue estando minúsculas es más

2:56:15

habitual utilizar estas operaciones yo

2:56:18

creo que de lo que parece o yo lo he

2:56:20

utilizado bastante sobre todo para

2:56:22

formatear para guardar con una misma

2:56:24

estructura para mostrar por pantalla que

2:56:26

no haya problemas si igual en base de

2:56:28

datos he guardado una forma y tú después

2:56:30

en la parte gráfica ya quieres que tenga

2:56:33

esa homogeneidad o lo que sea Pues venga

2:56:36

le aplicas este tipo de operaciones este

2:56:38

tipo de funciones que ya veis que son

2:56:39

bien simples más cosas voy a poner otra

2:56:42

operación que también tenemos dentro de

2:56:44

la propia cadena de texto eliminación de

2:56:48

espacios al principio y al final que

2:56:50

esto también es muy típico usarlo un

2:56:52

poco a veces hasta para asegurar el tipo

2:56:54

de dato vuelvo aquí y voy a poner bry

2:56:56

mowy y le voy a dejar este espacio

2:56:58

delante y este espacio detrás y voy a

2:57:01

llamar a una operación que se llama

2:57:04

strip esta operación strip lo que va a

2:57:06

acabar haciendo es venga si tiene

2:57:08

espacios al principio y al final se los

2:57:10

quitas aquí veis que bry ya aparece a

2:57:13

esta altura lo que significa que lo ha

2:57:14

quitado y al final Por supuesto que

2:57:16

también los ha quitado si quisiera

2:57:18

podríamos hacer esto strip y ahora le

2:57:22

concatenados ver br moure @ mouredev y

2:57:25

veis que @ mouredev aparece al lado de

2:57:28

moure quiere decir que este espacio al

2:57:30

final de la cadena de texto se le ha

2:57:32

quitado vale hemos hecho antes la parte

2:57:35

de búsqueda vamos a hacer otra que

2:57:37

también es bastante común que es

2:57:38

búsqueda al principio y al final

2:57:42

búsqueda al principio y al final ya que

2:57:44

hemos visto aquí Cómo elimina los

2:57:46

espacios al principio y al final vamos a

2:57:48

hacer Prim y le voy a decir e la cadena

2:57:51

de texto la s1 Le puedo preguntar Start

2:57:54

with le puedo decir e cadena Tú empiezas

2:57:57

por la por la cadena de texto por la

2:58:00

letra o por lo que sea o h o Y qué me va

2:58:03

a decir true en cambio Si le digo si

2:58:05

empieza por la palabra pie por python me

2:58:08

va a decir false quien empieza por pie

2:58:11

es la segunda cadena de texto no la

2:58:13

primera igual que le puedo preguntar si

2:58:15

empieza le puedo decir ends with le

2:58:18

puedo decir e terminas por la o terminas

2:58:21

por zong y me va a decir true en el

2:58:23

primer caso porque la cadena uno termina

2:58:26

por la pero la cadena 1 No termina por

2:58:29

th Otra cosita más venga tengo otra

2:58:32

tengo otra lo que podemos hacer también

2:58:35

es encontrar la posición búsqueda de

2:58:38

posición Qué significa esto que

2:58:40

imagínate que yo tengo una frase pues

2:58:43

más larga digo bry moure @ mour y yo le

2:58:48

digo Me gustaría saber dónde está

2:58:51

la palabra mour en la cadena Porque

2:58:53

igual le quiero acabar haciendo algo o

2:58:55

lo que sea tendríamos la posibilidad de

2:58:58

utilizar una operación que se llama find

2:59:00

y aquí le podría acabar pasando esa

2:59:02

cadena de texto y le digo moure y a ver

2:59:05

qué nos dice 13 Qué significa este 13

2:59:08

qué creéis que va a significar el 13

2:59:10

vamos a contar no 0 1 2 3 4 5 6 7 8 9 10

2:59:18

11 12 133 ojo aquí está por ejemplo el

2:59:22

find nos da la posibilidad de encontrar

2:59:25

la posición donde está empezando esta

2:59:28

cadena y si yo le pusiera la m

2:59:30

únicamente veis que el primer moure no

2:59:33

lo encuentra porque empieza por m

2:59:34

mayúscula veis que si yo ahora pongo

2:59:36

mour con m mayúscula me aparece el seis

2:59:39

igual que si yo ahora pusiera solo esta

2:59:41

m me aparecería El Seis también pero que

2:59:44

si yo ahora vengo por aquí y paso todas

2:59:47

minúsculas le digo e lower Case y

2:59:50

después le hago un find por la m

2:59:53

minúscula lo que me retorna también es 6

2:59:55

es decir se queda con la primera

2:59:57

ocurrencia que coincide con el criterio

2:59:59

de búsqueda también más de lo mismo

3:00:01

funciona así en todos los lenguajes

3:00:03

depende en python en concreto Si yo le

3:00:05

digo Ey Búscame la posición de la m me

3:00:08

va a decir cuál es la primera vez que

3:00:10

aparece la m Hay posibilidad de Buscar

3:00:13

la última m por supuesto Hay posibilidad

3:00:15

de buscar la m del medio por supuesto

3:00:17

pero son variantes que ya digo no me

3:00:19

quiero parar tantísimo en eso para no

3:00:21

echar eh tiempo excesivo Pero por

3:00:23

supuesto si tenéis estas posibilidades

3:00:26

existe una posibilidad más o menos

3:00:28

compleja de acabar haciéndole porque por

3:00:30

ejemplo yo le podría decir ahora voy a

3:00:32

poner búsqueda de ocurrencias vamos a

3:00:35

venir por aquí voy a poner esta frase

3:00:37

que teníamos antes de hecho es que lo

3:00:39

estoy utilizando tanto voy a hacer una

3:00:40

cosa voy a venir por aquí y le voy a

3:00:42

llamar S3 y voy a meter todo esto porque

3:00:44

ya que la estoy utilizando tanto y vamos

3:00:46

a repetir vale digo búsqueda de

3:00:48

ocurrencias Qué es las ocurrencias las

3:00:50

ocurrencias que nos diga Cuántas veces

3:00:52

aparece un criterio de búsqueda que

3:00:54

pongo yo aquí cómo lo hago operación

3:00:56

count lanzo esto que me dice dos deir

3:00:59

Cuántas MS hay en brightmour @ mouredev

3:01:01

dos y si pongo moure que me va a

3:01:04

retornar me dice dos y si pongo mour dev

3:01:07

me dice uno okay es decir puedo poner un

3:01:09

carácter pero pensar que casi en todos

3:01:11

estos casos estamos trabajando con

3:01:13

cadenas de caracteres que en unos casos

3:01:15

en una casuística vamos a necesitar

3:01:17

Buscar un carácter solo en otros casos

3:01:19

vamos a necesitar buscar más de un

3:01:21

carácter más cosas qué podríamos hacer

3:01:24

podríamos pues formatear una cadena que

3:01:26

esto ya lo hemos visto no formateo voy a

3:01:28

poner formateo Qué significa esto que yo

3:01:30

ahora mismo vengo por aquí y hago print

3:01:33

de una cadena de texto y digo saludo

3:01:37

coma o saludo dos puntos lenguaje dos

3:01:41

puntos esto es una cadena de texto Yo

3:01:43

podría imprimir esto sin más Pero y si

3:01:45

yo quisiera Añadir a esta cadena de

3:01:48

texto estas dos cadenas de texto h y

3:01:50

python de hecho Aquí voy a acabar con

3:01:52

signo de admiración Cómo podría acabar

3:01:54

metiendo esos valores dentro Alguien

3:01:56

podría pensar Pues mira empieza a hacer

3:01:58

concatenaciones Ah saludo dos puntos

3:02:01

concatenación Hola concatenación coma

3:02:04

espacio lenguaje dos puntos

3:02:06

concatenación python concatenación signo

3:02:09

de admiración Pero y si yo supiera que

3:02:11

ya en concreto lo quiero meter aquí pues

3:02:13

vamos a hacer lo siguiente voy a poner

3:02:15

estas llaves aquí y dónde quiero que

3:02:16

vaya el otro texto pues quiero que vaya

3:02:18

aquí y una vez ya estoy indicando dónde

3:02:21

quiero que vayan mis cadenas de texto

3:02:23

puedo llamar a una operación que es

3:02:24

format y se las paso concatenadas por

3:02:27

coma name Cuál era el saludo este este

3:02:30

nombre la cadena uno y Cuál era el

3:02:32

lenguaje la cadena dos Esto va a ir por

3:02:34

orden primer sitio donde están las

3:02:37

llaves voy a sustituirlo por la cadena

3:02:39

undo uno segundo sitio donde están las

3:02:41

llaves por la cadena dos lo lanzo y

3:02:43

ahora el print este que tendría que

3:02:45

acabar mostrando saludo Hola lenguaje

3:02:49

python admiración tan fácil como esto

3:02:51

igual que tenemos el formateo en

3:02:53

realidad tenemos la posibilidad de la

3:02:56

interpolación decir que nosotros podemos

3:02:58

interpolar valores directamente dentro

3:03:01

de la cadena de texto y es muy fácil

3:03:03

vemos que tenemos estos valores

3:03:05

Imagínate que yo quisiera meter Ahora

3:03:07

aquí el s1 y el s2 sería maravilloso

3:03:11

Incluso se entiende mucho mejor que esta

3:03:13

parte y da menos lugar a errores porque

3:03:16

ya estoy sustituyendo justo lo que que

3:03:17

quiero en el lugar donde yo quiero vengo

3:03:19

por aquí y veo saludo s1 lenguaje s2

3:03:22

Pero tenemos algo que se le llama F

3:03:24

String por ejemplo en python Pero bueno

3:03:27

que la gran mayoría de los lenguajes es

3:03:29

el término interpolación si yo escribo

3:03:31

una F delante de la cara de texto ahora

3:03:33

lo que vamos poder interpretar es que

3:03:35

todo lo que esté entre llaves puede

3:03:38

hacer referencia a una variable ahora si

3:03:40

vuelvo a lanzar esto ya veo que muestra

3:03:42

lo mismo que la cadena de arriba ya que

3:03:43

ahora sí que ha sustituido el valor de

3:03:45

s1 y el valor de s2 aquí lo tenemos más

3:03:48

cosas que se nos ocurran transformación

3:03:51

en lista de caracteres Cómo es esto

3:03:54

claro yo tengo una cadena de texto por

3:03:55

ejemplo la S3 esta larga que veíamos

3:03:58

antes y si yo digo que quiero crear una

3:04:01

lista tenemos un tipo de dato que es

3:04:03

lista con la S3 qué pasará en este caso

3:04:06

Mirad lo que imprime la B la r la a la i

3:04:10

la s el espacio la m la u ha creado una

3:04:13

lista con todos los caracteres que hay

3:04:15

en mi cadena de texto otra cosilla más

3:04:17

rara Sí pero ahí está la posibilidad

3:04:20

Pero y Qué pasa si lo tenemos al revés

3:04:23

voy ahora aquí poner otra cadena de

3:04:24

texto la S4 Imagínate que yo ahora lo

3:04:27

tengo por separado y digo tengo una

3:04:30

cadena de texto que es Hola o

3:04:32

simplemente le meto el s1 otra cadena de

3:04:34

texto que es un espacio en blanco y una

3:04:37

coma la s2 y otra cadena de texto que es

3:04:40

la admiración veis que esto en realidad

3:04:42

he creado S4 en realidad Debería ser

3:04:45

lista uno porque aquí tenemos el formato

3:04:48

listado el formato array como tengo

3:04:51

cuatro elementos separados por comas

3:04:53

Pero y si yo ahora tengo un array Ya

3:04:55

vimos Cómo éramos capaces de pasar una

3:04:57

cadena de texto a una lista pero si yo

3:04:58

ahora tengo una lista y lo que quiero es

3:05:01

acabar creando una cadena de texto pues

3:05:03

tan fácil como yo venirme aquí y voy a

3:05:05

poner transformación de lista en cadena

3:05:09

qué podría hacer podría utilizar una

3:05:10

operación que se llama join que es para

3:05:12

concatenar resultados de una lista yo le

3:05:15

puedo decir mira tengo una cadena de

3:05:18

texto vacía a la que le voy a aplicar

3:05:20

join y lo que vas a concatenar con ese

3:05:22

criterio de espacio vacío es la lista un

3:05:26

qué me va a acabar mostrando Hola python

3:05:28

ha unido todo si yo le metiera un guion

3:05:31

como criterio de concatenación veis lo

3:05:33

que hace Hola gu la siguiente cadena que

3:05:35

era la coma y el espacio guion python

3:05:38

guion Ese es el criterio de Unión si yo

3:05:40

dejara un espacio un espacio Pero le

3:05:42

digo espacio en blanco une esta lista

3:05:44

siguiendo el criterio de espacio en

3:05:46

blanco nada mal no otra otra cosilla más

3:05:48

que tenemos aquí pero igual También

3:05:50

existen lo que llamamos transformaciones

3:05:52

numéricas por ejemplo con una cadena de

3:05:54

texto en cual estábamos en la S3 era la

3:05:57

última Pues yo puedo tener una cadena de

3:05:59

texto que represente un número 1 2 3 4 5

3:06:02

6 Esta es mi cadena de texto claro yo

3:06:05

ahora imprimo esto y esto va a ser una

3:06:07

cadena de texto Pero si yo en realidad

3:06:09

Quisiera que esto fuera un número si yo

3:06:12

lo que quiero es transformarlo en un

3:06:13

número en vez de una cadena de texto

3:06:16

sería tan fácil como que yo ahora al S4

3:06:18

este le digo Mira transfórmate en un

3:06:21

número entero y guárdate otra vez en s4

3:06:24

y ahora lo que tendría en realidad sería

3:06:26

un número entero lo mismo que tenemos

3:06:27

con números enteros lo podríamos hacer

3:06:29

con números decimales Imagínate que yo

3:06:31

tengo este número decimal S5 Pues yo

3:06:34

podría hacer toda la transformación Pero

3:06:36

si yo quiero que se transforme en número

3:06:38

decimal vemos que tenemos aquí int Uy Y

3:06:41

este dice estás intentando

3:06:43

transformar en número entero un número

3:06:45

que inicialmente voy a considerar

3:06:47

decimal tenemos un tipo de dato para

3:06:48

números decimales float funcionará ahora

3:06:51

me dice aquí lo tienes transformación

3:06:53

perfecta en número decimal y cómo lo

3:06:55

estoy mostrando por aquí vale Y ya

3:06:57

alguna última operación esto podríamos

3:07:00

seguir toda la clase sacando cosas que

3:07:03

podemos hacer con caracteres pero ya

3:07:05

veis que bueno hemos visto unas cuantas

3:07:07

y Espero que alguna no la conociera O al

3:07:09

contrario Espero que las conociera todas

3:07:11

y que yo no esté enseñando aquí nada

3:07:12

nuevo porque eso sería una buena señal

3:07:14

voy a hacer comprobaciones varias vamos

3:07:16

a comprobar por por ejemplo sí la cadena

3:07:20

s1 pues es alfanumérica y vemos esto Is

3:07:25

alfanum A ver qué me dice y me dice true

3:07:27

en realidad es alfanumérica tiene o

3:07:30

letras o números Pero y si le digo si es

3:07:34

solo cadena de texto le podría decir e

3:07:38

contienes o letras is Alfa y me va a

3:07:40

decir pues sí contiene solo letras Pero

3:07:42

y si yo intentara comprobar esto con la

3:07:46

S4 que veíamos aquí que tenemos un

3:07:49

Por qué un Porque habíamos

3:07:50

transformado el tipo de dato de stram a

3:07:53

entero si quisiéramos que volviera a ser

3:07:55

una cadena de texto me voy a redefinir

3:07:58

por ejemplo otra vez aquí la S4 como

3:08:00

cadena de texto ahora lo lanzamos y me

3:08:02

dice false dice ey es4 en realidad tiene

3:08:05

números no tiene letras como tú lo

3:08:07

intentabas hacer Pero en cambio también

3:08:08

tenemos una operación para que yo

3:08:10

compruebe veis esto is numeric podría

3:08:13

ver si esto es un número dice true Okay

3:08:15

podríamos hacer Bueno diferentes cosas

3:08:17

tenemos is numeric is digit Hay un

3:08:19

montón de diferentes operaciones y con

3:08:21

esto podríamos seguir infinito porque

3:08:23

operaciones de caracteres aquí veis un

3:08:25

poco todo lo que hay esto son todo

3:08:27

operaciones que podíamos hacer con los

3:08:29

caracteres solo por ser caracteres sin

3:08:32

otras combinaciones y otras funciones

3:08:34

del sistema que ya crean Pero bueno creo

3:08:36

que es suficiente ver un poquito todo lo

3:08:39

que hemos revisado aquí para que os

3:08:41

hagáis una idea de las capacidades que

3:08:43

tiene dicho esto Espero que hayáis

3:08:45

encontrado También muchas cosas cosas

3:08:47

diferentes en vuestros lenguajes lo

3:08:50

siguiente que yo quería hacer ahora era

3:08:52

la parte de dificultad extra y voy a

3:08:54

crear aquí otro bloque que diga extra y

3:08:56

Aquí vamos a intentar ir resolviendo los

3:08:59

diferentes ejercicios que esto ya era

3:09:01

como esa pequeñita parte un poco más

3:09:04

avanzada para la gente Pues que se ha

3:09:06

visto más fuerte con esta lección o que

3:09:08

ya tenía conocimientos y que dice ey

3:09:10

vale Bris yo ya sé un poco las

3:09:11

operaciones Dame algo de lógica para ver

3:09:13

si yo ahora de la manera en la que yo sé

3:09:15

manejar cadenas de texto pues puedo

3:09:17

resolver un problema lógico y os ponía

3:09:19

no un problema lógico os ponía tres os

3:09:22

decía aquí creo un programa que analice

3:09:24

dos palabras diferentes y realice

3:09:25

comprobaciones para descubrir si son

3:09:27

palindromos anagramas e isogram okay Así

3:09:31

que me voy a crear aquí una función yo

3:09:34

que sé le voy a llamar check sin más

3:09:36

porque va a hacer comprobaciones me

3:09:38

daría un poco igual y en realidad lo que

3:09:41

nos cuenta es vale muy bien tenemos esto

3:09:43

Qué pasa si yo tengo que realizar todas

3:09:46

estas comprobaciones y un programa que

3:09:48

analice dos palabras yo le podría decir

3:09:50

Word 1 Word 2 y le digo Pues mira estos

3:09:54

son strings en realidad y vamos a ver si

3:09:56

somos capaces de analizar todo lo que

3:09:58

nos pide aquí dice y realice

3:10:00

comprobaciones para descubrir si son

3:10:02

palindromos aquí ya se nos empieza a

3:10:04

complicar no palindromos Qué son

3:10:06

palindromos en realidad una palabra

3:10:08

palindroma que esta es otra de las

3:10:10

dificultades de los ejercicios que es

3:10:12

Okay Igual tenemos claro Cómo hacer la

3:10:14

lógica si supiéramos en realidad Qué

3:10:16

significa palíndromo porque igual no lo

3:10:18

sabemos Pues bueno esto nos va a pasar

3:10:20

en nuestro día a día y en nuestro

3:10:21

trabajo que a veces hay definiciones que

3:10:24

no conocemos y que tenemos que hacer

3:10:25

como una búsqueda extra ya no solo sabe

3:10:27

programarlo sino que buscar algo que

3:10:29

igual no tiene que ver con la

3:10:30

programación así que palindromos qué es

3:10:32

palindromos en realidad es que si

3:10:35

nosotros invirti el orden acabaríamos

3:10:39

encontrando una palabra igual Okay se

3:10:41

entiende decir una palabra palindroma

3:10:44

qué podría ser decirme ejemplos de

3:10:46

palabras palíndromas Pues bueno una

3:10:48

palabra palindroma por ejemplo podría

3:10:50

ser radar pensar en radar radar leído

3:10:53

Empezando por la izquierda es r d a r

3:10:56

Empezando por la derecha es r d a r es

3:10:59

lo mismo Entonces ahora tendríamos que

3:11:01

buscar la forma de comprobar si una

3:11:03

palabra es palindroma cómo hacemos esto

3:11:06

pues vamos a hacerlo de la siguiente

3:11:08

manera vamos a hacer las diferentes

3:11:10

comprobaciones ir poco a poco cómo lo

3:11:11

hacemos voy a acceder a la primera

3:11:14

palabra y tengo tengo que saber si es

3:11:16

palindroma Word un claro hemos dicho que

3:11:19

una palabra palíndromas si se lee igual

3:11:21

de derecha a izquierda que de izquierda

3:11:22

a derecha aquí habría pues diferentes

3:11:26

formas podríamos hacer una mucho más

3:11:28

compleja que es empezamos a recorrer

3:11:31

cada una de las palabras en la primera

3:11:33

empezamos por la derecha la segunda

3:11:34

empezamos por la izquierda comparamos

3:11:36

sus caracteres y en el momento que

3:11:37

comparamos sus caracteres vemos que de

3:11:40

verdad tienen ese sentido Pero y si le

3:11:43

diéramos la vuelta al orden de las

3:11:45

letras de la segunda la palabra Así

3:11:48

podríamos ver si las dos palabras son

3:11:50

iguales si yo ahora agarro la palabra

3:11:52

Word 2 y alguien decía reverse no sé qué

3:11:56

bueno Eso depende un poco del lenguaje

3:11:58

nosotros en python para dar la vuelta

3:12:00

podemos hablar un poco del slicing que

3:12:03

decíamos antes no podemos decirle desde

3:12:05

el principio hasta el fin y con ese

3:12:07

criterio de menos un para ir de atrás

3:12:09

adelante así le daría la vuelta

3:12:11

básicamente a la Word 2 vamos a ver lo

3:12:14

que nos imprime vamos a ir haciendo

3:12:16

pequeñas pruebas para ver qué pasaría en

3:12:18

este caso vamos a hacer por ejemplo la

3:12:20

impresión de esta palabra y la impresión

3:12:23

de la supuesta inversa de la Word do y

3:12:25

voy a llamar a check y le voy a pasar la

3:12:27

palabra uno que qué decíamos antes radar

3:12:30

y la palabra dos que le voy a pasar por

3:12:32

ejemplo pues python que teníamos antes a

3:12:35

ver qué imprime ves lo que imprime en el

3:12:37

primer caso imprime radar en el segundo

3:12:39

caso ves No tip pero claro si yo ahora

3:12:42

le pasara la palabra radar al la inversa

3:12:45

Y si la pasamos al revés claro en este

3:12:47

caso es como muy básico porque lo

3:12:50

tenemos Exactamente igual tenemos

3:12:52

Exactamente igual esto y estoy

3:12:54

utilizando esta forma de darle la vuelta

3:12:56

ya que vimos antes el slicing por

3:12:57

supuesto hay operación para darle la

3:13:00

vuelta de maneras más directas no

3:13:02

importa es decir el método que vosotros

3:13:04

encontréis si nosotros le damos la

3:13:07

vuelta a radar en realidad sería

3:13:09

Exactamente lo mismo Vale entonces qué

3:13:12

sería lo mejor en cada caso en este caso

3:13:14

tendríamos que comprobar si una palabra

3:13:17

palindroma con ella misma no palindroma

3:13:20

con otra palabra Esto es algo que

3:13:22

teníamos que tener en cuenta no tiene

3:13:24

sentido que yo ahora le pasa aquí radar

3:13:26

radar no radar radar Claro en realidad

3:13:29

en este caso no tiene mucho sentido

3:13:31

podríamos controlar si de verdad dos

3:13:34

palabras son palíndromas entre ellas

3:13:37

podríamos hacerlo en realidad es tan

3:13:39

fácil como encontrar que esa palabra es

3:13:42

palindroma Pues con ella misma podríamos

3:13:44

hacerlo ya que se le efectivamente al

3:13:46

revés es el palindromo en realidad es

3:13:49

con el mismo así que yo lo que debería

3:13:51

hacer es he si yo ahora le doy la vuelta

3:13:54

a la misma palabra y en realidad son

3:13:57

iguales eso significa que es palindrom

3:14:00

fijaos voy a poner un fstring por aquí y

3:14:03

le voy a decir la palabra uno es un

3:14:06

palindromo lo que voy a hacer es meterle

3:14:09

el valor de este resultado un true o un

3:14:11

false por ejemplo y lo mismo que hacemos

3:14:14

con la palabra uno lo vamos a hacer con

3:14:16

la palabra dos lanzo esto y me va a

3:14:18

decir radar es un palíndromo true y

3:14:20

ahora Aquí vamos pasarle una palabra que

3:14:22

no sea palindroma python dice radar es

3:14:25

un palíndromo true python es un

3:14:27

palíndromo false Okay este es el

3:14:29

significado verdadero de palíndromo otra

3:14:32

cosa que nos decía El ejercicio es

3:14:34

anagramas y ahora vengo por aquí hago

3:14:37

anagrama dice un anagrama es una palabra

3:14:40

que resulta de la transposición de todas

3:14:42

las letras de otra palabra ojo cambio de

3:14:46

orden de las letras letas bueno como

3:14:48

nosotros tenemos una palabra que en

3:14:50

realidad cambiándole ese orden de las

3:14:53

letras nosotros podemos acabar con

3:14:54

probando si de verdad es la misma

3:14:57

tenemos el palíndromo Okay vamos a ver

3:15:00

cómo es el anagrama claro y si yo ahora

3:15:03

hiciera una comprobación para los

3:15:06

anagramas Con amor y Roma Claro amor y

3:15:10

Roma que nos va a decir Ey ni amor es un

3:15:13

palíndromo ni Roma es un palíndromo Pero

3:15:15

cuál sería el criterio para los

3:15:17

anagramas el criterio para los anagramas

3:15:19

Es que yo podría venir aquí y hacer esto

3:15:22

y es los anagramas tienen que ser ahora

3:15:25

sí entre dos palabras no puede ser

3:15:27

anagrama con el mismo para eso ya

3:15:29

tenemos los palíndromos lo que

3:15:31

tendríamos que hacer es vale amor y Roma

3:15:33

tienen exactamente las mismas letras

3:15:36

Cómo podríamos comprobar esto de manera

3:15:37

rápida pues la manera más rápida que se

3:15:39

suele hacer en este tipo de ejercicios

3:15:41

es haciendo una ordenación si yo ordeno

3:15:44

la palabra uno y ordeno la la palabra

3:15:47

dos y en realidad el resultado es el

3:15:50

mismo Qué quiere decir que son la misma

3:15:51

palabra con lo cual estas dos palabras

3:15:53

si al ordenarlas alfabéticamente nos da

3:15:56

exactamente la misma palabra querrá

3:15:58

decir que son anagramas así que voy a

3:16:00

venir por aquí para ir un poquito más

3:16:02

rápido y voy a poner Word 1 es anagrama

3:16:06

de Word 2 y este es el criterio el

3:16:08

criterio de ordenación que nos tiene que

3:16:10

decir o false aquí ya no lo tenemos que

3:16:12

hacer en ambos sentidos nos llega con

3:16:14

esto y nos dice amor es anagrama de Roma

3:16:17

true pero claro cuando decimos radar es

3:16:19

anagrama de python Por supuesto que no

3:16:21

ahí está un poco el punto qué más cosas

3:16:23

nos pedía Ya solo una más isogram que

3:16:26

esto suele ser lo que nadie sabe que es

3:16:28

un isogram No sí que como no sabemos que

3:16:30

es un isogram vengo aquí isogram digo a

3:16:33

ver qué es un isogram dice un heterog

3:16:35

grama isogram no sé qué es una palabra o

3:16:37

frase que cada letra aparece el mismo

3:16:39

número de veces ojo entonces aquí entra

3:16:42

aquí un criterio está bien está mal en

3:16:46

una misma palabra nosotros tenemos que

3:16:49

comprobar si de verdad Aparecen las

3:16:52

letras el mismo número Cómo podríamos

3:16:54

hacer esto a ver vamos a leerlo por aquí

3:16:56

heterog grama dice un isogram es una

3:16:58

palabra en la que cada letra aparece el

3:17:00

mismo número de veces si cada letra

3:17:02

aparece solo una vez será un heterog

3:17:05

grama si aparece dos un isogram de

3:17:07

segundo orden y así sucesivamente Bueno

3:17:09

vamos a interpretar cóm que en realidad

3:17:12

nosotros en este caso podemos hacer Ey

3:17:14

las letras aparecen el mismo número de

3:17:17

veces vamos a darlo como que es válido

3:17:19

Okay o incluso nosotros podíamos llevar

3:17:22

el término isogram al heterog ya que el

3:17:26

heterog grama es como un isogram de

3:17:28

primer orden le podríamos Llamar aquí

3:17:30

tendríamos que buscar de verdad cuántas

3:17:32

veces se está repitiendo cada una cómo

3:17:34

lo hacemos Aquí sí que podríamos

3:17:37

complicarnos bastante vamos a ver cosas

3:17:39

que se nos puedan que se nos puedan

3:17:41

ocurrir podríamos comprobar si de verdad

3:17:44

la longitud de una palabra es igual

3:17:46

igual a la longitud de un set Pero qué

3:17:49

conseguiríamos con esto vamos a ver más

3:17:51

cosas por ejemplo eh voy a hacer la

3:17:53

longitud de la palabra de la Word 1 si

3:17:56

es igual al set de la palabra Word vamos

3:18:00

aquí set de Word y hago la longitud Qué

3:18:03

va a pasar en este caso esto en realidad

3:18:05

sería la forma de comprobar que existen

3:18:08

el mismo número de veces como aquí en

3:18:10

realidad nos da igual Que aparezca una

3:18:13

vez o dos o tres fijaos en la definición

3:18:16

no me voy poner a decir que es un

3:18:17

heterog un isogram de segundo orden de

3:18:20

Tercer orden no vamos a quedarnos con

3:18:21

esto dice ey un heterog grama es una

3:18:23

palabra o frase que no contiene ninguna

3:18:25

letra repetida en cambio Ahora aquí al

3:18:28

isogama es una palabra o frase que cada

3:18:30

letra aparece el mismo número de veces

3:18:32

qué hacemos Cómo podemos comprobar que

3:18:34

una palabra tiene letras el mismo número

3:18:37

de veces en realidad vamos simplemente a

3:18:40

imprimirlo por un lado la longitud de

3:18:42

Word 1 y por otro lado vamos a imprimir

3:18:45

la longitud del set de Word vamos a

3:18:48

hacer un caso un poco más limitado o

3:18:50

vamos a pasarle solo el primer caso y

3:18:52

vamos a ver qué nos dice qué nos dice 5

3:18:55

y 3 longitud de radar cco longitud del

3:18:58

set 3 por qué porque esta r lo vemos ojo

3:19:02

la r está repetida la a está repetida la

3:19:06

d no está repetida entonces un set no

3:19:09

guarda repeticiones Qué significa que

3:19:11

tenemos la r la a y la d no está mal no

3:19:14

en cambio Si nosotros le hacemos la

3:19:16

longitud de la palabra tenemos cinco Qué

3:19:18

significa el isogram el isogram volvemos

3:19:21

aquí cada letra está repetida el mismo

3:19:24

número de veces si yo ahora hago esto y

3:19:26

le digo si la longitud es igual a la

3:19:29

longitud del set qué significará

3:19:32

tendremos así un isogram vamos aquí otra

3:19:34

vez a lo mismo que hacíamos antes wordu

3:19:37

es un isogram si nosotros venimos por

3:19:39

aquí y le hacemos esto Dónde está esto

3:19:42

que veíamos aquí dice radar es un

3:19:44

isogram pols Y si le pasáramos las

3:19:46

segunda palabra Word do es un isogram

3:19:49

queé nos dice aquí true Por qué Porque

3:19:51

en realidad python tiene solo una vez la

3:19:54

p una vez la i una vez la t una vez una

3:19:56

o de esta forma seríamos capaces de

3:19:59

realizar el cálculo de ese heterog grama

3:20:02

o isogama de primer orden okay Pero y si

3:20:05

tuviéramos que comprobar si tiene dos

3:20:08

Claro Ahora aquí esto ya nos fallaría

3:20:10

Imagínate que yo ahora tengo una palabra

3:20:13

Simplemente repitiéndolas yo hago python

3:20:16

py python python es un isogram de

3:20:18

segundo orden porque cada letra se

3:20:21

repite el mismo número de veces y nos

3:20:23

dice python python es un isogama false

3:20:25

aquí ya tenemos un problema lo veis Qué

3:20:28

pasa habría formas de hacerlo mucho más

3:20:31

sencillo pero vamos a hacerlo como de

3:20:32

una forma como muy natural sin

3:20:35

complicarnos mucho Yo podría venir aquí

3:20:37

y empezar a revisar cada una de las

3:20:40

palabras y Podría empezar a almacenar

3:20:43

todas las letras de la palabra Cuántas

3:20:46

veces desaparecen vamos a intentar hacer

3:20:48

esto vamos a hacerlo como de una forma

3:20:50

muy muy muy indicada venga vamos a hacer

3:20:52

un for Word in Word 1 por ejemplo vamos

3:20:56

a ver cómo tendríamos que hacerlo en

3:20:58

este caso qué voy teniendo yo aquí si

3:20:59

hago esto Pues en el momento que lo

3:21:01

lanzo tengo cada una de las letras claro

3:21:03

y si yo hago aquí un diccionario voy a

3:21:05

crear Word 1 o Word Dick por ejemplo

3:21:08

vamos a hacerlo de esta manera aquí

3:21:10

podría acabar definiendo el diccionario

3:21:13

Cómo ya sabéis que tenemos la palabra

3:21:15

reservada adit o ya lo podemos indicar o

3:21:17

como nos dé la gana y podríamos ir

3:21:19

guardando Aquí Cuál es esa manera si os

3:21:21

fijáis nosotros estamos utilizando cosas

3:21:23

que ya hemos visto anteriormente

3:21:25

recordáis Cuál era la lección de

3:21:27

estructuras si yo me voy ahora aquí a la

3:21:29

lección de estructuras a cómo os lo

3:21:31

corregí yo el último día decíamos Ey un

3:21:33

diccionario aquí tenemos el diccionario

3:21:35

estamos ya empezando a aplicar cosas que

3:21:38

vimos antes tengo aquí el diccionario

3:21:39

qué podría ir haciendo al diccionario a

3:21:42

Word it le podría decir venga la palabra

3:21:44

que yo tengo podrías entar ir guardando

3:21:47

el número de veces que la tienes así que

3:21:49

voy a Acceder al dicionario Word dict

3:21:51

voy a hacer get voy a intentar acceder a

3:21:54

esta palabra al Word y le voy a decir

3:21:56

que cada vez que acceda le sume uno pero

3:21:59

que por defecto en realidad comience en

3:22:01

cero nosotros hacemos todo esto Y si

3:22:04

hacemos un print del Word vamos a ver

3:22:06

queé nos imprime Fíjate nos va a decir

3:22:08

aquí con esta palabra la r esta dos

3:22:10

veces la esta dos veces la de esta una y

3:22:12

si hiciéramos esto mismo con la palabra

3:22:15

dos que verí íamos la p está do la i

3:22:18

está do la t está do la H está do la o

3:22:20

está do la n está do lo veis aquí muy

3:22:23

bien pues ahora que ya tenemos esto

3:22:25

nosotros podríamos hacer otra

3:22:26

comprobación Que es en el momento que ya

3:22:29

hemos realizado todo esto por qué no

3:22:31

intento revisar si este diccionario no

3:22:35

podría irme al diccionario y empezar a

3:22:37

revisar Cuál es la longitud vengo por

3:22:39

aquí y empiezo a revisar Cuál es la

3:22:42

longitud de cada una de las letras

3:22:44

Cuántas ocurrencias hay de cada letra

3:22:46

este cer0 lo que significa es el valor

3:22:48

por defecto de en caso de que yo busque

3:22:50

este elemento y aún no esté Cuál es el

3:22:52

valor que yo quiero guardar cer0 Por eso

3:22:54

Después yo le voy incrementando uno

3:22:55

podría sin más ir accediendo al valor ir

3:22:58

sumándole uno 0 + 1 pero si ya existiera

3:23:01

sería Ey Cuánto es esto 1 + 1 2 etcétera

3:23:03

python python python lo que teníamos

3:23:05

venga lo voy a poner cuatro veces antes

3:23:08

de enseñaros aquí otra cosa más y vemos

3:23:10

fijaos aquí python python python no está

3:23:13

porque estoy con la palabra uno vamos

3:23:15

con la palabra dos vamos a imprimir el

3:23:17

diccionario y vemos 4 4 4 4 Okay venga

3:23:21

antes de esto yo ya tengo el diccionario

3:23:23

y ahora tendría que empezar a revisar

3:23:24

tendría que acabar viendo Okay Cuál es

3:23:27

el valor que tiene cada uno pues tan

3:23:29

fácil como yo podría decir isogama

3:23:31

crearme una variable que sea isogram

3:23:33

aquí isogram y le digo que el isogram es

3:23:37

true y que en el momento que revisamos

3:23:40

cada palabra yo digo bueno y Cuál es el

3:23:43

valor de ese isogram por defecto yo le

3:23:45

puedo decir decir mira el valor de ese

3:23:47

isogram en realidad es que nosotros

3:23:50

tenemos que acabar revisando cada una de

3:23:52

las ocurrencias y ver que tiene la

3:23:54

longitud yo puedo empezar aquí a revisar

3:23:57

cada uno de estos elementos o puedo

3:23:59

quedarme con el valor inicial de los

3:24:01

elementos del isogama de lo que fuera le

3:24:03

puedo decir eh len la longitud que fuera

3:24:06

isogram len voy a Acceder al primer

3:24:09

elemento del diccionario y yo podría

3:24:11

decirle Mira el primer elemento del

3:24:13

diccionario el elemento cero pues cuánto

3:24:16

vale No pues en este caso valdría cuatro

3:24:18

y yo ahora cada vez que reviso tengo que

3:24:20

decir e si la longitud de la palabra que

3:24:24

yo tengo por aquí que en realidad es la

3:24:27

longitud del isogama Word count es

3:24:29

distinto de la longitud del isogram esto

3:24:32

que va a significar que en realidad

3:24:34

isogram es igual a false y yo ya podría

3:24:37

decirle Mira break finaliza vamos a

3:24:39

revisar esto y vamos a ver qué acabaría

3:24:41

imprimiendo aquí esto se puede hacer

3:24:43

muchísimo más rápido pero os quiero

3:24:45

decir que ahora aquí os estoy enseñando

3:24:46

Cómo combinar muchas cosas que ya hemos

3:24:48

visto antes vamos a ver qué acaba

3:24:50

imprimiendo en isogram qué le está

3:24:52

pasando porque estoy intentando Acceder

3:24:55

al primer valor del diccionario estaba

3:24:57

yo aquí con mi listado todo feliz pensar

3:25:00

que los diccionarios Al fin y al cabo no

3:25:02

están ordenados Entonces nosotros si

3:25:04

queremos acceder a un diccionario

3:25:07

tendríamos que acceder a uno de los

3:25:09

valores de este diccionario a propósito

3:25:12

Entonces cómo podríamos hacer todo esto

3:25:14

puedo acceder a las kis puedo acceder a

3:25:17

los propios ves Vamos a ver ahora esto

3:25:20

vamos a ver ahora en estos ves que

3:25:22

tenemos ahora en los vus qué podría yo

3:25:25

hacer ahora Aquí vamos a los vus vamos a

3:25:27

acceder a los vus Pero dentro de estos

3:25:29

vus Yo podría acceder a uno de estos

3:25:32

valores podría acceder a uno de esos

3:25:34

primeros valores recordáis como lo

3:25:36

explicábamos en la clase anterior

3:25:38

también que nos íbamos a cada uno de los

3:25:40

dicionarios para que retomemos donde

3:25:42

estábamos y era venga yo tengo

3:25:44

dicionarios claro los dicionarios que

3:25:46

pas que si yo quiero acceder a un valor

3:25:48

tengo que ir Lo veis aquí lo tenemos

3:25:50

Okay pero veis que teníamos algo que

3:25:51

eran ems tras Y si yo me voy a los items

3:25:54

qué acabo encontrando si yo me fuera

3:25:56

aquí a los ems intentamos hacer los ems

3:25:58

a ver qué nos imprime porque es posible

3:26:00

que acabemos obteniendo algo que

3:26:02

nosotros queremos hce items Perdón items

3:26:04

dice Ah No mira en realidad esto no es

3:26:07

lo que quería qué más cosas teníamos

3:26:09

recordáis Qué sería lo perfecto que aquí

3:26:12

igual que nosotros podemos acceder a las

3:26:15

kis y las kis nos acaba teniendo este

3:26:17

resultado con todas las Kiss ahora vamos

3:26:20

a las Kiss qué tenemos r a d si nos

3:26:23

fuéramos a los vus qué tenemos en los

3:26:25

vellus que lo vimos antes do 2 1 Uh esto

3:26:29

ya tiene mejor pinta Qué pasa si y ahora

3:26:31

tenemos los vus toda esta implementación

3:26:34

la podríamos mejorar un poquito

3:26:35

podríamos acabar diciendo vale Yo ahora

3:26:38

tengo los vellus y voy a ponerle vellus

3:26:40

aquí tenemos todos los valores ya

3:26:42

tenemos el contador Qué nos falta la

3:26:44

longitud del isogram que podría acabar

3:26:46

yo haciendo pues la longitud del isogram

3:26:48

Ahora sí me voy a los vus y me quedo con

3:26:52

el primer elemento ahora la longitud del

3:26:53

isogama sí que está determinada por esto

3:26:56

vus nos da un fallo por qué Pero si

3:26:59

antes hemos imprimido por aquí vus

3:27:01

recordáis qué era este vus Qué nos está

3:27:04

retornando velus en realidad si nosotros

3:27:07

ahora le hacemos una transformación a

3:27:09

una lista veis como transformación tras

3:27:12

transformación dice Uy y ahora el len

3:27:15

qué es esto Por qué Porque en realidad

3:27:18

esto ya es un número igual que el

3:27:20

isogram blen y ahora nos dice e false

3:27:23

Por qué Porque por supuesto es 2 2 1 2 2

3:27:26

1 no es lo que estábamos buscando Pero y

3:27:29

si nosotros ahora aquí en vez de hacerlo

3:27:31

con la primera palabra la hacemos con la

3:27:34

segunda palabra qué nos va a decir por

3:27:36

qué porque ahora los valu es 4 4 44 y va

3:27:39

a empezar a comprobarlo Y va a ver que

3:27:41

en todos tiene el cuat ya veis que esta

3:27:43

es una forma un poco más rebuscada pero

3:27:46

os la quería hacer así para que veáis

3:27:48

cómo combinamos un montón de cosas que

3:27:50

ya hemos visto anteriormente para eso os

3:27:51

lo voy a dejar aquí un poco indicado lo

3:27:53

vamos a hacer con la palabra dos por

3:27:55

ejemplo y le voy a decir Word do y ahora

3:27:57

nos cargamos esto es un isogram ya

3:27:59

sabéis que todo esto podríamos hacerlo

3:28:02

aquí una función meterlo dentro lo que

3:28:05

fuera queréis que lo hagamos ya lo vimos

3:28:07

Este término funciones dentro de

3:28:08

funciones Def isogram le pasamos la

3:28:11

palabra Word que va a ser un String y le

3:28:14

vamos a decir que por ejemplo nos

3:28:16

retorne un boolean ahora hacemos todo

3:28:19

esto aquí dentro y en vez de Word 2 lo

3:28:22

que reviso es la Word Okay qué

3:28:24

tendríamos que hacer ahora aquí Word 1

3:28:27

es un isogram y aquí que tendríamos que

3:28:29

acabar metiéndole simplemente la llamada

3:28:31

a isogram con la Word 1 en este caso y

3:28:35

con la Word 2 en este caso y ver lo que

3:28:38

nos dice radar es un isogram vemos Non y

3:28:40

Non Por qué Porque lo que nos falta es

3:28:43

hacerle aquí un return de isogram y nos

3:28:46

dice radar es un isogram false eh python

3:28:48

python python python es un isogama y nos

3:28:51

dice aquí podríamos hacer una cosa Esto

3:28:53

lo está especializando aquí le podríamos

3:28:55

decir que esto es una letra o le

3:28:56

podríamos decir que es un carácter le

3:28:58

podíamos decir carácter ya que esto Solo

3:29:00

es un carácter y acaba revisando pu Solo

3:29:03

este carácter y vemos que nos daría

3:29:04

Exactamente lo mismo Okay pues aquí está

3:29:07

un poco la implementación del ejercicio

3:29:09

lógico no complejo pero que sobre todo

3:29:13

en este último caso teníamos que darle

3:29:15

un poquito de vuelta para acabar

3:29:17

entendiendo que quizás la comprobación

3:29:19

de ese geograma de primer orden es

3:29:22

bastante rápido pero en el momento que

3:29:24

cada letra se repitiera más de una vez

3:29:25

Igual aliá vamos un poco ya digo hay

3:29:27

maneras más óptimas de hacerlo pero no

3:29:30

con muchos elementos que hayamos visto

3:29:32

durante esta ruta de

3:29:37

estudio hoy creo que no era un reto

3:29:40

difícil pero es un concepto que muchas

3:29:43

veces tardamos tiempo en entender que

3:29:46

muchas veces pasamos tiempo programando

3:29:48

y no tenemos ni Claro que la gran

3:29:51

mayoría de lenguajes de programación

3:29:53

tienen este concepto interiorizado e

3:29:54

implementado que es el concepto de valor

3:29:56

y de referencia y ya veremos si incluso

3:29:59

la gente que cree que sabe lo que es

3:30:01

valor y referencia ya veremos si sabéis

3:30:05

Cómo se aplica el concepto de valor y

3:30:07

referencia en vuestro lenguaje por eso

3:30:09

el ejercicio que os propuse porque

3:30:11

encima el concepto de valor y referencia

3:30:13

digamos que es un estándar en

3:30:14

programación pero lo gracioso de todo

3:30:17

esto es que el concepto de valor y

3:30:19

referencia no funciona igual en todos

3:30:20

los lenguajes y de aquí el ejercicio de

3:30:22

que tuvieres un poco que descubrir Okay

3:30:25

y cómo funciona en vuestro lenguaje si

3:30:27

intentáis hacer estos ejercicios que yo

3:30:29

os propongo leemos el ejercicio y nos

3:30:30

ponemos a resolverlo valor y referencia

3:30:32

muestra ejemplos de asignación de

3:30:34

variables por valor y por referencia

3:30:36

según su tipo de dato muestra ejemplos

3:30:38

de funciones con variables que se le

3:30:40

pasa por valor y por referencia y cómo

3:30:42

se comportan en cada caso en el momento

3:30:44

de ser modificadas puf claro leemos esto

3:30:47

y qué pasa que si no conocemos cuál es

3:30:50

el concepto de valor y de referencia

3:30:53

pues igual es que no entendemos ni

3:30:56

simplemente qué nos pide el ejercicio

3:30:58

Vale entonces esto es un poco también

3:31:00

por qué yo prefiero ir planteando

3:31:02

ejercicios dejando esta semana y a la

3:31:04

semana siguiente explicarlo porque así

3:31:06

también os doy tiempo un poco a yo creo

3:31:08

que una de las partes más importantes en

3:31:09

programación que es aprender a pelearse

3:31:12

también con los conceptos y que yo

3:31:13

suelte esto y haya gente que lo tenga

3:31:15

muy claro claro y otra gente que diga es

3:31:17

que no sé ni cómo empezar Pues bueno hay

3:31:19

una cosa preciosa que se llama Google y

3:31:21

hasta otra que se llama ch gpt que le

3:31:23

podéis decir qué es paso por valor paso

3:31:25

por referencia y ahí lo entendéis igual

3:31:27

lo leéis la primera vez tampoco tenéis

3:31:29

ni idea tampoco os vais a enterar

3:31:31

absolutamente De nada y al cabo de un

3:31:33

rato acabaré viendo Ah mira mira esto ya

3:31:35

tiene un poquito más de sentido y lo

3:31:37

acabáis entendiendo todo vale Así que eh

3:31:39

Como yo digo lo suelo explicar en lo

3:31:43

suelo explicar en python pero aún así

3:31:44

que eso no os preocupe porque ya digo es

3:31:47

un concepto general Solo que hay que

3:31:48

elegir un lenguaje vale voy a crear un

3:31:50

fichero mover de.pie y vamos ir leyendo

3:31:53

el ejercicio no lo voy a leer entero

3:31:54

porque creo que leerlo entero serviría

3:31:56

solo para demostrar que sé leer pero no

3:31:58

para ir entendiéndolo poco a poco no así

3:32:01

que vamos a ir poco a poco hablando de

3:32:03

qué es esto de el valor la referencia o

3:32:08

lo que sea vale vamos a ir por aquí y

3:32:10

nos dice un poco que lo demostremos con

3:32:11

tipos de dato nos dice e Ponme algún

3:32:14

ejemplo de tipos de dato por valor vale

3:32:16

Esto es lo primero que teníais que haber

3:32:18

entendido Qué es eso de por valor Qué es

3:32:21

eso de referencia vale básicamente

3:32:23

pensar que hay un elemento común que

3:32:25

entra aquí y que diferencia al paso por

3:32:28

valor y al paso por referencia o a los

3:32:30

elementos guardados por valor a los

3:32:32

elementos que actúan como referencia

3:32:34

hablamos de que cuando un elemento es

3:32:37

definido por valor o se modifica

3:32:40

mediante valor hablamos de que ese

3:32:42

elemento básicamente es único y ese es

3:32:46

elemento único cada vez que nosotros lo

3:32:49

enviamos a otra instancia cada vez que

3:32:51

nosotros lo asignamos a otra variable lo

3:32:54

que estamos creando es un nuevo elemento

3:32:57

Okay Digamos que al modificar la

3:32:59

variable original no va a afectar a

3:33:02

otras variables a las que se le haya

3:33:04

asignado la variable principal esto

3:33:06

puede sonar bastante loco pero os

3:33:09

prometo que hoy acaba esta clase y

3:33:11

vosotros entendéis perfectamente que es

3:33:13

esto del valor y la referencia os decía

3:33:16

también que dependiendo del lenguaje de

3:33:18

programación habrá tipos de dato por

3:33:20

valor y por referencia no tienen que ser

3:33:22

en todos los lenguajes igual incluso

3:33:24

Aunque el tipo de dato en primera

3:33:26

instancia sea por valor o por referencia

3:33:28

puede no comportarse igual en según qué

3:33:31

lenguajes Okay pero bueno deciros que

3:33:33

habitualmente los tipos de datos

3:33:35

primitivos un entero una cadena de texto

3:33:39

un Flow suelen ser tipos de datos por

3:33:41

valor así que por ejemplo voy a definir

3:33:44

un tipo de dato por valor aquí en python

3:33:46

que quiero definir un entero por ejemplo

3:33:48

voy a llamar my int a y le voy a dar un

3:33:51

valor 10 esto es un entero vamos a meter

3:33:53

un print para ir viendo si de verdad

3:33:55

somos capaces de entender qué es esto

3:33:57

del valor y la referencia y lo voy a

3:33:59

imprimir sin más si yo imprimiera esto

3:34:03

obviamente vamos a tener 10 y si yo

3:34:05

creara otro entero que le voy a llamar

3:34:07

my int b y le voy a dar el valor 20 y lo

3:34:11

voy a imprimir por aquí my int a my int

3:34:14

B los enteros ya digo en py funciona

3:34:16

como variables por valor y qué tenemos

3:34:18

Pues bueno 10 y 20 Okay hasta aquí

3:34:21

tampoco hay mucho drama Porque en ridad

3:34:24

estos datos no se están ni mezclando si

3:34:26

yo viniera Ahora aquí y hago my int B es

3:34:30

igual a my int A qué pasaría ahora my in

3:34:34

B es my In A eso quiere decir que my in

3:34:38

B pasa a valer lo que vale a si yo ahora

3:34:41

comentar esta línea y lanzo Mi código

3:34:44

que acabo mostrando por sola 10 y 10 es

3:34:46

decir my in a vale 10 my in B vale lo

3:34:50

que vale My int a Y si yo me viniera por

3:34:53

aquí y lanzar esto ahora vale 10 y 20

3:34:56

porque my in B vale lo que vale My a

3:35:00

pero yo le cambio el valor y le digo que

3:35:02

vale 20 entonces el valor de a lo pierde

3:35:05

y de repente pasa a valer este nuevo

3:35:07

integer que es 20 Pero y si yo viniera

3:35:09

aquí a my in a y le dijera que Ahora

3:35:12

tiene otro valor que ahora tiene valor

3:35:14

30 esto significa aría algo cambiaría

3:35:17

algo no en realidad my in a vale 30 my

3:35:20

in B vale 20 ya está qué más cosas le

3:35:23

podríamos hacer a esto a ver si somos

3:35:25

capaces de marear los valores Pues no lo

3:35:27

sé que yo viniera aquí otra vez a

3:35:30

comentar esta línea y decirle le voy a

3:35:32

dar a my in a el valor de 30 y voy a

3:35:36

lanzarlo cuánto vale My in a 30 y my in

3:35:40

B cuánto vale 10 os fijáis que está

3:35:42

pasando aquí B se ha quedado con el

3:35:45

valor de se a en este punto pero que a a

3:35:48

futuro haya cambiado a vale 10 aquí b De

3:35:51

repente pasa a valer lo que vale a

3:35:53

cuánto vale a 10 entonces B vale 10 esta

3:35:56

my in a le volvemos a cambiar el valor y

3:35:59

le decimos 30 pero Qué ha pasado con b b

3:36:02

en este momento exacto se queda con el

3:36:05

valor de a que era 10 con lo cual la a

3:36:07

vale 30 y la b vale 10 que es justamente

3:36:10

lo que valía en el momento que se le

3:36:12

asignó a a b Qué significa que nosotros

3:36:15

una variable por valor cada vez que se

3:36:18

asigna otra variable a ella en realidad

3:36:20

nosotros estamos haciendo una copia del

3:36:22

valor le estamos diciendo Ey Ah cuánto

3:36:24

vales valgo 10 en este momento Okay pues

3:36:27

me quedo con tu valor y me lo asigno fin

3:36:29

de la historia me da igual lo que te

3:36:31

pase a ti valor a a lo largo de todo el

3:36:34

programa yo solo me voy a quedar con

3:36:36

cuánto valías en este momento porque te

3:36:38

voy a copiar el valor pero ya está Okay

3:36:40

Así de fácil así de fácil explicar un

3:36:42

poco Cuál es el HM de alguna forma eh

3:36:46

esas variables como llamamos por valor

3:36:48

Pero qué pasaría si hacemos tipos de

3:36:51

dato por referencia aquí os pediría algo

3:36:54

muy importante que es por favor estudiar

3:36:56

en el lenguaje en el que estéis Cuáles

3:36:58

son los tipos de dato por valor que

3:37:00

tenéis en vuestro lenguaje y cuáles son

3:37:03

los tipos de dato por referencia Porque

3:37:04

pueden variar entre lenguajes vamos a

3:37:06

los tipos de datos por referencia y

3:37:08

vamos un poco intentar hacer lo mismo

3:37:10

que hicimos antes voy a venir por aquí

3:37:12

voy a comentar esta línea y vamos a

3:37:14

hacer esto aquí vamos a ir un poco

3:37:16

comparando Qué pasaría en estos casos

3:37:19

por esta parte Ahora yo tendría que

3:37:21

saber en mi lenguaje Cuáles son los

3:37:23

tipos de datos por referencia Pues bueno

3:37:25

los tipos de datos por referencia en

3:37:27

python originalmente son todos los tipos

3:37:31

de datos que no son primitivos es decir

3:37:33

que no son ni un entero ni un float ni

3:37:37

una cadena de texto ni un booleano por

3:37:39

ejemplo tipos de datos pero que sí que

3:37:41

tenemos en el lenguaje imagínate una

3:37:43

lista una tupla un Dion

3:37:46

un set ya hemos visto esos tipos de

3:37:47

datos Pues bueno esos tipos de datos son

3:37:50

por referencia y Qué significa

3:37:52

básicamente la referencia lo vamos a

3:37:54

entender muy rápidamente voy a crear

3:37:55

aquí una lista le voy a llamar por

3:37:56

ejemplo my list a y voy a crear una

3:37:59

lista que tenga los valores 10 y 20 dos

3:38:02

enteros Bueno una lista sin más y vamos

3:38:04

a empezar a imprimir aquí mi lista a

3:38:07

pero también voy a crear otra lista que

3:38:10

se llame b y esta lista B va a tener los

3:38:12

valores pues por ejemplo 30 y 40 y vamos

3:38:16

a imprimir la lista a y la lista B por

3:38:18

supuesto lo que vamos a ver aquí es 10

3:38:20

20 que es la lista a 30 40 que es la

3:38:22

lista B intentamos hacer cosas parecidas

3:38:26

a las de aquí y si yo vengo por aquí y a

3:38:28

la lista a a la lista B Perdón le asigno

3:38:32

la lista A bueno vamos por aquí 10 20 10

3:38:35

20 tiene sentido no cuánto vale a pues a

3:38:37

vale 1020 cuánto vale B el valor de a 10

3:38:41

20 hasta aquí podríamos decir que se

3:38:43

comporta Exactamente igual que el caso

3:38:45

anterior que lo que aún sin entender muy

3:38:48

bien Por qué llamamos variables que

3:38:50

funcionan por valor No qué le hacíamos

3:38:53

antes aquí le decíamos e yo le daba un

3:38:56

nuevo valor tenemos myis b y le voy a

3:38:58

dar un nuevo valor digo 10 20 30 40 okay

3:39:02

No pasa nada Es decir myis B pasó a

3:39:05

tener el valor de a yo luego en la

3:39:07

siguiente instrucción le dije No mira yo

3:39:10

lo que quiero que valgas es 3040 vale

3:39:12

todo entendido Pero y si ah digo Mira yo

3:39:15

tenía la lista a pero ahora a la lista B

3:39:18

Le voy a Añadir un nuevo número en esta

3:39:20

lista le voy a hacer un append y yo sé

3:39:22

que ahora la lista B tiene el valor de a

3:39:24

10 20 le voy a meter un nuevo número

3:39:27

vale Y voy a comentar el valor de la

3:39:29

lista a y vamos a ver esto qué tengo en

3:39:31

la lista B Bueno yo creo que Eso está

3:39:34

clarísimo no en la lista B si teníamos

3:39:36

el valor de la lista A que era 1020 y

3:39:38

ahora le hemos añadido un 30 en la lista

3:39:40

B que es lo que estamos imprimiendo aquí

3:39:41

tenemos 10 20 30 pero voy a imprimir

3:39:45

ahora ahora el valor de la lista a ahora

3:39:48

Pero qué pasa se ha bugueado esto o qué

3:39:50

estoy imprimiendo aquí la lista a y

3:39:52

también la lista b y resulta que tanto

3:39:54

la lista A como la B tienen lo mismo

3:39:57

pero cómo es esto posible yo en realidad

3:39:59

a la lista a nunca le añadí el 30 yo en

3:40:03

realidad se lo añadí a la B Bueno pues

3:40:05

aquí es donde entra el concepto de

3:40:08

variable por referencia o de dato por

3:40:10

referencia nosotros decíamos que aquí

3:40:13

cada vez que se creaba una nueva

3:40:14

variable y le

3:40:29

[Música]

3:40:36

[Música]

3:40:45

valer a en realidad la dirección de

3:40:47

memoria de B es independiente y la

3:40:49

dirección de memoria de a sigue siendo

3:40:51

independiente Por eso cada una tiene su

3:40:54

valor por eso aunque yo siga modificando

3:40:56

y después les cambie los valores no pasa

3:40:58

absolutamente nada Es decir cada una

3:41:00

sigue ocupando su posición de memoria

3:41:02

pero ahora aquí tenemos lo que llamamos

3:41:04

la referencia tenemos la lista a y

3:41:06

teníamos la lista B esto lo podemos

3:41:09

entender como que esta lista a en

3:41:12

realidad había aquí una dirección de

3:41:13

memoria la M1 con lo que fuera y otra

3:41:16

dirección de memoria la m2 pues la a

3:41:19

apuntaba a esta M1 la B apuntaba a esta

3:41:22

m2 No pasa nada vale Pero ahora aquí

3:41:25

Nosotros hemos definido una lista hemos

3:41:27

definido una lista A que tiene una

3:41:30

posición de memoria la que sea la m3 y

3:41:33

la b que tiene la M4 creamos la lista se

3:41:36

crea una variable se crea otra variable

3:41:38

muy bien aquí lo tenemos todo

3:41:40

diferenciado pero llega un momento en el

3:41:43

que nosotros le decimos B igual a A qué

3:41:46

está pasando aquí que la dirección de

3:41:48

memoria esta de a ahora le estamos

3:41:50

diciendo e b ahora lo que pasa ya que tú

3:41:53

eres una lista y vas a actuar como

3:41:56

referencia en el momento que dicen B = a

3:41:58

no copia el valor de a y lo asigna al

3:42:01

valor de B lo que le hace es no no no a

3:42:04

Tú tienes la posición de memoria m3 pero

3:42:07

ahora B te estoy diciendo que es a y

3:42:10

pasa

3:42:11

esto ahora B pasa a apuntar a la

3:42:15

posición de memoria de a por eso lo que

3:42:17

veíamos aquí es lo siguiente que en el

3:42:20

momento que yo asigno la B a la a y la

3:42:23

añado 30 tanto lista A como lista B

3:42:26

están en la misma dirección de memoria

3:42:28

con lo cual no es que haya dos datos

3:42:30

aquí tenemos dos variables pero en

3:42:32

realidad los datos están almacenando

3:42:34

dentro de la misma posición de memoria

3:42:36

con lo cual al modificarse la B se ha

3:42:38

modificado la a no es que se haya

3:42:40

modificado es que en realidad los dos

3:42:42

estaban observando exactamente mismo

3:42:45

valor y esa es un poco la diferencia el

3:42:47

valor y la referencia Okay puede

3:42:50

resultar un poco confuso al principio

3:42:51

pero a veces y sobre todo cuando estamos

3:42:53

empezando nos ponemos a manipular datos

3:42:56

variables tipos de datos estructuras

3:42:59

primitivos y esto que me creo por aquí

3:43:01

no sé qué Y de repente hacemos cosas de

3:43:03

este estilo y llegamos a un punto que

3:43:05

dijimos ostra Sí sí si yo asign la B

3:43:07

porque le quería hacer unos cambios a la

3:43:09

lista b y la a la quería dejar inmutable

3:43:12

pues si tenemos valores por referencia

3:43:14

que sepáis que que la podemos liar que

3:43:16

lo que estemos tocando en la referencia

3:43:18

es lo que se va a modificar en todas las

3:43:20

variables que estén leyendo ese puntero

3:43:23

básicamente a la dirección de memoria

3:43:26

que tiene estos datos no copiamos el

3:43:28

valor nos quedamos con la dirección de

3:43:30

memoria de la variable original cuando

3:43:32

se modifica la nueva variable se

3:43:34

modifica también la variable original y

3:43:36

eso es algo que yo quería que de alguna

3:43:39

forma descubrieras por vuestros propios

3:43:41

medios porque si no hasta que no se

3:43:44

entiende No se ve no fallar pero hasta

3:43:47

que no se ve actuar como debe actuar el

3:43:49

valor y la referencia y entendéis el

3:43:52

porqué de ambos casos podemos estar con

3:43:55

un concepto equivocad himo y con un

3:43:57

concepto que es básico saber qué

3:43:59

funciona por valor y qué funciona por

3:44:02

referencia Okay es como tener punteros

3:44:04

son punteros en realidad Solo que tú

3:44:06

aquí por valor tienes un puntero a una

3:44:09

dirección y a otra dirección y cada vez

3:44:11

que aparece una variable se copia el

3:44:12

valor y se crea una nueva dirección de

3:44:15

memoria pero aquí se está aprovechando

3:44:17

la dirección de memoria pero el

3:44:19

ejercicio no acababa aquí decía muestra

3:44:20

ejemplos de asignación de variables por

3:44:21

valor y por referencia Bueno ya lo hemos

3:44:23

hecho no pero muestra ejemplos de

3:44:25

funciones con variables que se le pasan

3:44:28

por valor y por referencia y cómo se

3:44:30

comportan en cada caso en el momento de

3:44:33

ser modificadas Vale pues vamos a

3:44:36

quedarnos por aquí y ahora Aquí voy a

3:44:38

poner funciones con datos por valor y me

3:44:42

da igual me creo la función que a a mí

3:44:45

me dé la gana tan fácil como voy a crear

3:44:47

una función de datos por valor que se

3:44:48

llame my in Punk ya está tengo aquí una

3:44:51

función una función que va a recibir un

3:44:54

entero por ejemplo my int y vamos a ver

3:44:57

lo que pasa venga me voy a crear otro

3:44:58

entero para que no tengamos en cuenta

3:45:00

los anteriores my in C que va a tener el

3:45:03

valor 10 okay Y aquí dentro decía el

3:45:06

ejercicio que venga pasa por valor y por

3:45:09

referencia y cómo se comportan en cada

3:45:10

caso en el momento de ser modificadas

3:45:12

voy a modificar my Inc claro ya estoy

3:45:15

aquí my int le voy a decir que valga 20

3:45:18

Okay y voy a imprimir el valor de My int

3:45:21

y voy a llamar a my in fun y le voy a

3:45:23

pasar my int y ahora Aquí voy a acabar

3:45:26

imprimiendo print my ince Qué pasará en

3:45:29

este caso bueno my Inc qué tenemos aquí

3:45:32

de primero un 20 por qué Porque se llama

3:45:34

la función y primero Se imprime esto con

3:45:36

lo cual Pues bueno bien le paso my Inc

3:45:39

aquí tenemos el parámetro lo modifico a

3:45:41

20 y lo imprimo vale 20 todo el sentido

3:45:44

del mundo Y cuánto vale My Inc Pues

3:45:46

sigue valiendo 10 aquí lo tenemos una

3:45:48

copia del valor como el valor se

3:45:50

modifica y no pasa absolutamente nada my

3:45:53

Inc sigue valiendo 10 a pesar de que lo

3:45:56

pasemos por parámetro y yo aquí dentro

3:45:58

modifique su valor otra cosa es que yo

3:46:00

viniera aquí y hiciera my Inc es igual a

3:46:04

30 yo aquí en realidad estoy en el scope

3:46:08

modificando my Inc Y qué vemos aquí me

3:46:11

dice Uy dice Es que no puedo ni acceder

3:46:14

ahora mismo como lo tienes así

3:46:15

directamente no te vengas arriba porque

3:46:18

en realidad este my in C Mira yo sigo

3:46:20

valiendo 10 no lo estoy modificando Okay

3:46:22

habría maneras de modificarlo Pero bueno

3:46:24

entenderlo con que lo que le llega a una

3:46:26

función al fin al cabo se lo tenemos que

3:46:27

acabar pasando en la mayor parte de los

3:46:29

casos vale tenemos esta función con

3:46:31

datos por valor Pero qué pasa si el

3:46:33

ejemplo es funciones con datos por

3:46:36

referencia pues me voy a crear my list c

3:46:40

my list c que en realidad va a tener

3:46:42

1020 me voy a crear otra función que sea

3:46:46

my list fun que va a llevar una lista

3:46:50

que va a ser tipo list y dentro vamos a

3:46:52

hacerle una modificación qué le podemos

3:46:54

hacer a esta modificación pues le puedo

3:46:57

hacer my list le añado un valor como

3:47:00

hacíamos antes la añadimos 30 y ahora

3:47:02

vamos a hacer un print dentro de la

3:47:03

función de mylist y vamos a hacer un

3:47:06

print fuera de la función de mylist y lo

3:47:09

que nos falta es Llamar a la función

3:47:11

mylist fun y le pasamos mylist ya sabéis

3:47:14

que si veis este ma list podría venir

3:47:16

aquí igual esto si creeréis que queda un

3:47:18

poco más ordenado cóm definimos como

3:47:20

llamamos a la función con que esté

3:47:21

anteriormente definida es suficiente

3:47:23

vale hagan sus apuestas qué va a pasar

3:47:25

ahora my list c vale 102 yo se la paso

3:47:28

aquí le añadimos 30 my list bueno

3:47:31

podríamos estar casi seguros de que my

3:47:33

list va a ser 10 20 30 pero qué va a ser

3:47:35

my list qué tenemos 10 20 30 valor de My

3:47:39

list 10 20 30 valor de My list c aquí se

3:47:43

está cumpliendo la referencia fijaos que

3:47:45

a pesar de que nosotros llamáramos a la

3:47:47

función con un valor 1020 que el nombre

3:47:50

del parámetro de la función sea distinto

3:47:53

si yo ahora aquí le hago el appen Qué

3:47:55

pasa problema eh se modifica igual es un

3:47:58

puntero apuntamos a la dirección de

3:48:00

memoria lo cambiamos dentro de la

3:48:02

función se cambia fuera porque mylist en

3:48:04

realidad lo que tiene es la referencia

3:48:06

al valor de mylist C Que es 1020 por eso

3:48:09

aunque lo cambiemos dentro no estamos

3:48:11

libres de que se cambie también fuera en

3:48:14

este caso okay Así que muy muy

3:48:16

importante pero aquí es donde puede

3:48:19

pasar otra cosa aquí en el medio me voy

3:48:21

a crear my list d y my list d ahora

3:48:25

vamos a intentar hacer la misma jugada

3:48:27

vamos a decirle que my list d es my list

3:48:30

okay Y ahora a my list d le vamos a

3:48:33

Añadir otro valor le voy a Añadir el 40

3:48:36

y voy a imprimir my list del vale esto

3:48:39

es tan fácil ya hay dudas qué pasaría

3:48:43

ahora qué nos dice nuestra lógica que

3:48:45

claro yo tengo un puntero un puntero de

3:48:48

C con los valores 1020 yo se lo paso

3:48:50

aquí y por eso al Añadir la my list el

3:48:53

30 yo ya tenía un 30 tanto en My list

3:48:56

como en My list d si yo ahora my list se

3:48:58

lo asigno a my list d y hago un append

3:49:02

lo veis aquí qué deberíamos suponer que

3:49:04

yo ahora cuando corro el programa que

3:49:06

tenemos 10 20 30 40 10 20 30 40 10 20 30

3:49:12

40 vemos cómo en realidad este puntero

3:49:15

sigue afectando la dirección del puntero

3:49:18

sigue siendo común y me importa bien

3:49:20

poco que yo lo haya modificado aquí

3:49:23

porque por supuesto lo va a cambiar en

3:49:24

My list pero también lo va a cambiar en

3:49:27

My list C Que es lo que venía de antes

3:49:29

que en realidad ha era el valor este que

3:49:31

teníamos aquí vale hacemos otra cosa

3:49:34

vamos a hacer un cambio voy a hacer

3:49:36

ahora aquí igual que teníamos la d voy a

3:49:38

crear my list e y my list e va a ser my

3:49:42

list y yo voy a dejar de trabajar dentro

3:49:45

con my list yo la asigno a una nueva

3:49:47

Porque quiero trabajar con varias y le

3:49:49

digo ahora mira my list e es lo que yo

3:49:52

tengo aquí y lo que asigno a my list e

3:49:55

es lo que tengo aquí y lo que acabo

3:49:57

imprimiendo es my list e my list solo

3:50:00

vale Para darle el nombre al parámetro y

3:50:02

yo aquí ya lo asigno a una nueva

3:50:04

variable lanzamos el programa que

3:50:06

tenemos Bueno no importa es decir este

3:50:08

comportamiento no lo voy a repetir más

3:50:10

tenemos el puntero sigue apuntando

3:50:12

etcétera Así que no valdría para nada

3:50:14

darle esta especie de vueltas no porque

3:50:17

en realidad seguimos teniendo este

3:50:19

puntero eso significa que esta relación

3:50:22

no se puede romper nunca no en realidad

3:50:25

sí que existen mecanismos sí que existen

3:50:27

mecanismos para nosotros crear una nueva

3:50:29

referencia en la gran mayoría lo podéis

3:50:32

Buscar como mecanismos de copiado o algo

3:50:34

así es decir para intentar simular el

3:50:37

comportamiento que tenemos en El Paso

3:50:40

por valor o de las variables por valor

3:50:42

Okay en algunos lenguajes Pues igual si

3:50:44

la hacemos a la lista un copy hay una

3:50:46

función que se llama copy pues a veces

3:50:48

funciona o si tenemos la lista y el

3:50:51

contenido de la lista creamos una nueva

3:50:53

lista con ese contenido a veces funciona

3:50:55

también No eso lo que tenéis que acabar

3:50:58

haciendo es buscando en vuestro lenguaje

3:51:01

Cuál es la manera en la que podemos

3:51:03

romper esa especie de relación con el

3:51:05

puntero así que por favor también tener

3:51:08

muy presente cómo hacerlo en ese caso

3:51:10

Pero bueno Esto no acaba aquí esto era

3:51:12

como para entender el concepto general

3:51:14

de lo que era el valor y referencia que

3:51:16

espero que hayáis entendido aunque le

3:51:18

hayamos dado alguna vuelta creo que era

3:51:20

importante estar intentando romper todo

3:51:22

eso para que así vosotros bueno os

3:51:24

quedará un poquito más claro Qué pasa

3:51:26

cuando yo trabajo con valor Qué pasa

3:51:28

cuando yo trabajo por referencia y lo

3:51:30

fácil que es que si no lo tenemos claro

3:51:32

lo fácil que es meter la pata pensando

3:51:34

que nosotros ahora tenemos nuestra

3:51:35

función que está haciendo maravillas

3:51:37

pero en realidad nos está cargando el

3:51:39

código de todo lo que tenemos fuera

3:51:40

también así que eso también es bastante

3:51:42

importante vamos a seguir haciendo otros

3:51:44

ejemplos porque ahora me voy a ir a la

3:51:46

parte que yo suelo proponer como

3:51:48

avanzada no lo que os digo Siempre de de

3:51:50

estos ejercicios que hago es bueno os

3:51:52

pongo la parte del ejercicio que es para

3:51:54

entender el concepto y practicarlo ya

3:51:55

con código pero para la gente que lo

3:51:57

tenga ya un poquito más claro o si os

3:51:58

veis más fuertes o o si con el paso del

3:52:00

tiempo ya queris decir Ey me meto a él

3:52:03

porque ya tengo muy claros los conceptos

3:52:04

yo os recomiendo que siempre hagáis esa

3:52:06

parte que os digo Aquí dificultad extra

3:52:08

pero que es dificultad extra con muchas

3:52:10

comillas no a veces será más fácil y

3:52:11

otras veces será más difícil vamos a ver

3:52:13

qué nos pedía el ejercicio a ver qué qué

3:52:16

pasaba con una manera pues un poquito

3:52:18

más avanzada de poner estos conceptos en

3:52:20

la práctica crea dos programas que

3:52:22

reciban dos parámetros cada uno

3:52:24

definidos como variables anteriormente

3:52:26

cada programa recibe en un caso dos

3:52:28

parámetros por valor y en otro caso por

3:52:31

referencia estos parámetros los

3:52:32

intercambia entre ellos y su interior lo

3:52:35

retorna y su retorno se asigna a dos

3:52:37

variables diferentes a las originales a

3:52:39

continuación imprime el valor de las

3:52:41

variables originales y las nuevas

3:52:42

comprobando que hayan invertido bueno

3:52:44

esto en cierto modo Pues

3:52:47

con las variables por valor es bastante

3:52:51

fácil nos dice que quemos primero por

3:52:53

valor por aquí vamos a crear un par de

3:52:55

variables igual que hicimos antes pues

3:52:57

me voy a crear una variable que se llame

3:52:59

my int d y le voy a dar el valor 10 y my

3:53:03

int e y le voy a dar el valor 20 y ahora

3:53:06

aquí nos decía que creá una función que

3:53:08

recibiera estas dos variables primero

3:53:11

por valor y después por referencia a ver

3:53:13

cómo éramos capaces de hacer el

3:53:15

intercambio hacer el intercambio

3:53:16

devolver reasignar y pintar su valor

3:53:19

veis aquí comprobando que se ha

3:53:20

invertido el valor pues vamos a crear

3:53:22

una función que sea capaz de realizar

3:53:25

ese intercambio creo una función y le

3:53:27

voy a poner value sin más para que

3:53:30

entendamos Que Esto va a hac un cambio

3:53:32

por valor me da igual le podríamos poner

3:53:34

que llamarle como si queremos con todas

3:53:36

las palabras de intercambio por

3:53:38

referencia o lo que nos diera la gana

3:53:40

pero bueno le voy a poner value y esto

3:53:42

tiene value a que va a ser un entero y

3:53:44

value b que va a ser otro entero y lo

3:53:47

que nos decía El ejercicio es vale Ahora

3:53:49

tienes que hacer la lógica que sea capaz

3:53:51

de intercambiarlos ostras vale Cómo

3:53:54

puedo hacer ahora que tenga un retorno

3:53:57

en el que el valor a que va a valer 10

3:53:59

cuando llamemos aquí a value yo le voy a

3:54:01

pasar my in d y my int e que lo de antes

3:54:05

si queréis lo pasamos para aquí abajo yo

3:54:07

tengo Esto se lo paso Esto va a acabar

3:54:10

retornando algo y yo lo que tengo que

3:54:12

hacer ahora es guardar en dos variables

3:54:15

nuevas podría decirle venga Lo que te

3:54:17

venga aquí es my int F y my int G Esto

3:54:22

es lo que voy a retornar porque en

3:54:24

realidad yo le podría indicar que esto

3:54:26

retorne por ejemplo una tupla un par de

3:54:28

valores pero Y cómo hago yo eso cómo

3:54:30

puedo hacer yo el intercambio para que

3:54:32

value a valga lo de B Val B valga porque

3:54:35

claro lo primero que podemos caer es

3:54:36

value a le digo es igual a V B digo yo

3:54:40

ya pero ahora ya le cambiaste el valor y

3:54:41

ya no sabes lo que vale a porque lo has

3:54:43

machacado te has cargado el valor de a

3:54:45

con el valor de B ya la estás liando

3:54:47

aquí lo que suele hacer es utilizar lo

3:54:48

que se llama una variable auxiliar no

3:54:50

voy a crear aquí una variable que se

3:54:51

llame temp y a la variable temp le voy a

3:54:54

dar el valor de a por qué Porque yo

3:54:56

ahora aquí en temp me quedo lo que vale

3:54:58

a que era justo el valor que yo iba a

3:54:59

perder cuando lo machacar con el valor

3:55:02

de B en el momento que yo ya tengo esto

3:55:03

y que value a vale el de B yo le puedo

3:55:06

decir que el value de B es el de temp he

3:55:09

invertido los valores teóricamente y

3:55:10

ahora aquí los voy a retornar el value

3:55:13

de a y el value de B vamos a hacer lo

3:55:15

siguiente voy a hacer un print aquí

3:55:17

donde voy a imprimir my int d y my int

3:55:22

que son las variables originales 10 20

3:55:24

no y ahora voy a imprimir aquí F y G

3:55:27

primero vamos a hacer esto voy a

3:55:28

comentar toda la lógica de nuestra

3:55:30

función intercambiadora voy a lanzarlo

3:55:33

qué vemos 10 20 10 20 claro d vale 10 e

3:55:36

vale 20 lo tenemos F y G No hemos hecho

3:55:39

nada hemos devuelto a y b ningún

3:55:42

misterio pero ahora vamos a la lógica

3:55:44

esta de intercambio y vamos a lanzarlo

3:55:46

que tenemos 10 20 20 10 ha funcionado la

3:55:49

lógica de intercambio hemos sido capaces

3:55:52

de al valor de a darle el de b y al de B

3:55:55

darle el de a y aquí lo tenemos

3:55:56

intercambiado vale eh No hay mucho

3:55:58

misterio aquí como casi se copian los

3:56:01

valores siempre por qué vamos a tener un

3:56:03

problema vale Pero y si nos vamos a por

3:56:05

referencia con todo el rollo ese de

3:56:07

antes de que se conserve el puntero no

3:56:09

sé qué por referencia venga y vamos a

3:56:11

intentar hacer algo parecido me voy a

3:56:13

copiar esto y de voy a llamar ref value

3:56:15

a value b pero en este caso van a ser

3:56:18

listas para que sean por referencia Esto

3:56:20

me lo cargo y ahora aquí va a ser my

3:56:22

list e my list F my list G y my list h y

3:56:28

llamamos a la función que le hemos

3:56:30

llamado ref y esto tiene que ser una

3:56:32

lista 10 20 primera lista 30 40 40

3:56:36

segunda lista y hacemos la impresión lo

3:56:39

lanzamos que tenemos 10 20 30 40 10 20

3:56:42

30 40 no se han invertido para que se

3:56:44

invirtiera tendríamos que tener 10 20 30

3:56:46

40 30 40 10 20 qui decir que de verdad

3:56:49

se han cambiado okay Vale intentamos

3:56:51

hacer la lógica copiamos la lógica del

3:56:54

cambio vale temp Val a Val a = a Val B

3:56:57

Val B ig a temp lanzamos esto pum qué ha

3:57:00

pasado funciona el intercambio ya pero

3:57:03

cómo ha funcionado pero si si esto de

3:57:05

las referencias y el puntero Y qué ha

3:57:09

pasado en este caso Bueno pues vamos a

3:57:12

ver rápidamente qué ha pasado y por

3:57:14

porque aquí esta misma lógica de verdad

3:57:16

ha funcionado tenemos temp y un puntero

3:57:19

el puntero de la lista a Okay ahora

3:57:22

tenemos aquí la lista A que pasa a tener

3:57:24

el puntero de la lista B sin ningún

3:57:26

problema y ahora la lista B que ya está

3:57:29

el puntero en la lista a pasa a tener la

3:57:31

B el puntero de la lista A lo veis Aquí

3:57:34

sí que podemos hacer el intercambio sin

3:57:37

ningún problema porque en realidad

3:57:38

tenemos esta variable que está

3:57:41

quedándose no con el valor en este caso

3:57:43

se está quedando con el puntero este

3:57:45

temp tiene su puntero guardado a buen

3:57:47

recaudo que es el valor de a el puntero

3:57:49

a y el puntero a a en realidad lo veis

3:57:53

aquí este puntero a ya está almacenado

3:57:55

en temp con lo cual Aunque cambie el

3:57:57

puntero de la A a la B que es el

3:58:00

problema que teníamos antes cuando

3:58:01

tocábamos los datos en realidad el

3:58:03

puntero sí que ha quedado almacenado en

3:58:05

una nueva variable vamos a hacerle un

3:58:06

appen con un 50 por ejemplo y vamos a

3:58:09

lanzarlo y vamos a ver que okay Sí sí la

3:58:12

referencia era nueva pero pero fijaos

3:58:14

como aquí sí que se está conservando el

3:58:16

puntero tenemos esa nueva referencia

3:58:18

asignada que se ha generado con temp

3:58:20

pero el puntero que sigue apuntando a

3:58:22

los valores así que si yo ahora aquí

3:58:24

dentro sí que modificara tanto a como B

3:58:28

vemos que esto fuera sí que se aplica

3:58:30

incluso Y si yo viniera aquí a temp y

3:58:32

ahora temp le hago un appen de 50 y

3:58:35

borro estos veis el temp que aquí nos

3:58:38

vale para esa nueva posición de memoria

3:58:41

que estamos ahora guardando para que

3:58:42

pierda esa Referencia para

3:58:44

intercambiarla vemos que en realidad sí

3:58:46

que está añadiendo este 50 Así que a

3:58:48

veces hasta tenemos que hacer esa

3:58:50

pequeña diferenciación de que Uy pero

3:58:52

hast hasta dónde va eso del paso por

3:58:54

valor en este caso el paso por

3:58:56

referencia habitualmente cualquier

3:58:58

objeto que sea por referencia si lo

3:59:01

estamos asignando a otra variable ya nos

3:59:05

tiene que saltar algo así en la cabeza

3:59:07

para decir e e por qué yo necesito

3:59:09

asignarlo a otra variable Cuál es el

3:59:11

motivo por qué yo tendría que asignarlo

3:59:13

a otra variable si tengo una variable

3:59:15

con los datos que yo quiero por qué iba

3:59:18

yo a querer esto que veis aquí claro

3:59:20

para un intercambio pues puede tener

3:59:22

sentido me parece genial pero si lo que

3:59:24

quiero es modificar los datos digo Por

3:59:27

qué pues en el momento que tú quieras

3:59:30

modificar datos de una variable por

3:59:32

referencia cópiala si quieres dejar una

3:59:35

como estaba y otra con un nuevo estado

3:59:37

Imagínate que no lo sé lo que tienes es

3:59:40

un usuario estás editando los datos del

3:59:43

usuario y y yo me llamo bry en mi objeto

3:59:46

que se llama bry o en mi lista que tiene

3:59:48

mis datos bry moure y edad y yo ahora

3:59:50

Quiero actualizar la edad y le quiero

3:59:52

poner una nueva porque voy a cambiar mi

3:59:54

fecha de nacimiento Pues claro si yo

3:59:56

quiero guardar la referencia a la nueva

3:59:58

y a la vieja porque le quiero recordar

4:00:00

imagínate por un mensaje en pantalla

4:00:02

algo así como e que antes tu valor era

4:00:04

36 y ahora lo quieres poner 37 claro ahí

4:00:07

tienes por ejemplo la lógica en la que

4:00:09

deberías conservar los dos objetos

4:00:11

Entonces eso ya te implica cambiarlo

4:00:13

pero si lo único que quieres

4:00:14

actualizarlo no tienes ningún motivo

4:00:15

para cambiarlo aún así no es una

4:00:17

práctica tan habitual estar asignando

4:00:20

referencias a otras variables porque no

4:00:23

tendría ningún sentido solo tendría

4:00:25

sentido si de verdad tú necesitas una

4:00:27

copia pero si de verdad tienes lo mismo

4:00:29

piensa que van a acabar siguiendo el

4:00:31

mismo flujo y lo que tú cambies en una

4:00:32

se va a cambiar en otra y que vas a

4:00:34

acabar perdiendo el control porque si

4:00:35

ahora estas dos variables que tienen la

4:00:38

misma referencia toman caminos muy

4:00:39

distintos por la aplicación igual tu

4:00:41

variable se cambia en no sé que pantalla

4:00:44

y empieza a cambiar lo que tenías en

4:00:46

otro lado cuando igual sus caminos se

4:00:48

han separado Así que intentar que o que

4:00:51

sea única o que se copie no separarla O

4:00:53

reasignar la porque sí cuando

4:00:55

seguramente No ganis nada es un poco la

4:00:57

idea y sobre todo pensar que lo que yo

4:00:59

he explicado aquí con python a nivel

4:01:01

teoría y práctica lo de variable y

4:01:04

referencia en teoría Sí en la práctica

4:01:06

puede que vuestro lenguaje tenga algunas

4:01:08

diferenciaciones y que justo la lista

4:01:10

pues que no que no es por referencia no

4:01:12

es lo habitual no es lo habitual Pero

4:01:13

hay ha lenguajes que por ejemplo

4:01:15

trabajan todo por valor se hacen copias

4:01:17

de todo no existe la posibilidad de

4:01:19

apuntar a una dirección de memoria así

4:01:20

que por favor eso mirarlo muy muy bien y

4:01:23

si no lo mejor de todo es comprobarlo

4:01:26

Cómo funcionan Porque así es como os

4:01:27

vais a enterar bien concepto muy básico

4:01:30

Pero quizás no tan fácil la primera

4:01:32

[Música]

4:01:37

vez Hoy estamos con este es el que vamos

4:01:40

a resolver hoy y vamos a explicar qué es

4:01:42

esto de la recursividad pero la la

4:01:44

semana pasada le programamos algo a la

4:01:45

web que es esta parte que veis aquí que

4:01:47

son estadísticas reales de la web

4:01:49

estadísticas reales de cómo está

4:01:52

participando la comunidad en el roadmap

4:01:54

en la ruta de estudio veis que ya han

4:01:56

enviado 33 lenguajes

4:01:59

1711 contribuciones poquita broma eh Es

4:02:02

decir tenéis

4:02:04

17711 ejercicios diferentes aportados

4:02:07

por la comunidad y 457 personas

4:02:10

distintas que han aportado estos 1700

4:02:13

ejercicios eh Y si os vais aquí a

4:02:14

ranking completo que es algo que

4:02:16

programamos como digo la semana pasada

4:02:18

podéis ver estas estadísticas que estas

4:02:19

estadísticas se regeneran una vez al día

4:02:22

Estos son datos reales pero cada 24

4:02:24

horas se actualiza la web y podéis ver

4:02:26

pues bueno Cuáles son los lenguajes que

4:02:27

más están utilizando en Qué porcentaje

4:02:29

por ejemplo python es el más utilizado

4:02:31

un

4:02:32

38,4 por de los ejercicios enviados

4:02:35

están hechos en python un 18,41 están

4:02:38

hechos en javascript Java Y bueno ya han

4:02:39

ido apareciendo nuevos lenguajes hasta

4:02:42

un total de 33 leng lenguajes y que esto

4:02:45

yo creo que es lo más divertido ahora

4:02:46

también hay ranking de usuarios según lo

4:02:48

que participéis enviando correcciones y

4:02:50

según el número de lenguajes que

4:02:52

utilicéis vais subiendo En el ranking y

4:02:54

aquí tenéis el ranking Bueno pues desde

4:02:56

Miguel que está loco y ha enviado 64

4:02:59

contribuciones en 15 lenguajes distintos

4:03:01

o Ángel o coden bueno pues aquí tenéis

4:03:05

que aparecer Seguiremos implementando

4:03:07

más cosas Seguiremos metiendo yo que sé

4:03:09

un buscador para que os encontréis más

4:03:11

fácil o lo que sea Pero bueno de momento

4:03:13

tenemos esta parte de estadísticas que

4:03:15

es lo que implementamos la semana pasada

4:03:17

Así que hoy vamos a explicar qué es esto

4:03:19

de la recursividad y vamos a resolver

4:03:21

varios ejercicios y vamos a crear un

4:03:23

nuevo fichero llamado

4:03:25

mdp ya que yo voy a resolver el

4:03:27

ejercicio en python ejercicio

4:03:29

recursividad ese concepto que la primera

4:03:32

vez que lo vemos Yo creo que asusta

4:03:35

tanto porque no no Lo acabamos

4:03:37

entendiendo bien no Entonces vamos a

4:03:39

leer primero el ejercicio y después ya

4:03:41

veremos cómo lo explicamos no bueno

4:03:43

decía ejercicio entiende el concepto de

4:03:45

recursividad creando una una función

4:03:48

recursiva que imprima números del 100 al

4:03:51

cer claro yo ahora llego aquí y lo

4:03:53

primero que podemos pensar es Okay no

4:03:56

tengo ni idea Qué es eso de recursividad

4:03:59

os ponía algo s s s simple esto es muy

4:04:02

simple Pero quería que entendiera bien

4:04:05

Cuál es el concepto de recursividad

4:04:06

primero con un ejercicio muy simple y

4:04:08

después os ponía dos ejercicios extra ya

4:04:11

más complicados que tienen mucho más

4:04:13

sentido acabar utilizando la

4:04:15

recursividad Así que vamos a ello Qué es

4:04:17

la recursividad vale el concepto de

4:04:19

recursividad básicamente para que lo

4:04:20

entendáis es una función que se llama a

4:04:23

ella misma ya está eso a grandes rasgos

4:04:26

es la recursividad Qué significa que yo

4:04:28

ahora me voy a crear aquí una función y

4:04:30

digo Hello Y si yo dentro hago Hello

4:04:34

esto Qué pasa bueno Esto básicamente

4:04:36

acaba resultando un bucle infinito yo

4:04:38

ahora si llamara a la función Hello

4:04:40

llamaría a esta función y cada vez que

4:04:42

entran a esta se llamaría ya misma qué

4:04:45

significaría Esto bueno bucle infinito

4:04:47

ya sabéis hasta que prenda fuego el

4:04:49

ordenador se estaría ejecutando o hasta

4:04:51

que matáramos el proceso dónde podemos

4:04:54

encontrar una semejanza con las

4:04:56

funciones recursivas pues con lo que

4:04:57

entendemos como concepto de bucle de

4:05:00

ciclo un bucle for un bucle While lo que

4:05:03

sea vale porque imagínate que yo ahora

4:05:06

Quiero plantear un bloque de código que

4:05:08

se tenga que ejecutar ese mismo bloque

4:05:10

de código n veces ahí es cuando cuando

4:05:13

empezamos a pesar Ey tengo que hacer un

4:05:15

print de un ola 10 veces podría decir Ah

4:05:18

vale tengo que hacer print de un ola 10

4:05:21

veces Pues claro hago un bucle for que

4:05:23

se ejecute 10 veces y hago Hola Hola

4:05:25

Hola Bueno pues entendamos Que la

4:05:27

función recursiva lo que va a hacer Es

4:05:29

que este código se ejecute una vez tras

4:05:32

otra vale Y aquí es donde podemos

4:05:35

aplicar ese concepto de recursividad qué

4:05:37

pasa que ahora alguien puede pensar Vale

4:05:40

y la recursividad A qué aplica la

4:05:42

recursividad

4:05:44

Entonces yo ahora cuando tenga que hacer

4:05:45

un bucle for hago una función recursiva

4:05:48

no Eso es lo importante que yo puedo

4:05:50

utilizar el ejemplo para que entendáis

4:05:52

que es un bloque de código que se va a

4:05:54

ejecutar más de una vez por eso es

4:05:56

recurrente por eso es recursivo y por

4:05:58

eso podemos explicar que se parece a un

4:06:01

bucle for por ejemplo pero es cierto que

4:06:04

tenemos que de alguna forma entender

4:06:07

cuándo tiene sentido utilizar

4:06:09

recursividad y cuándo tiene sentido

4:06:12

utilizar un bucle eso algo Bastante

4:06:14

importante porque si no claro podemos

4:06:16

pensar Pero de qué me vale a mí la

4:06:18

recursividad si a nivel conceptual hasta

4:06:21

puede ser más complejo y lo que es más

4:06:24

importante a nivel de recursos igual

4:06:27

puede acabar haciendo que nuestro

4:06:29

programa pues sea menos óptimo Okay

4:06:32

entonces bueno de momento vamos a

4:06:34

intentar diseñar la función recursiva

4:06:36

que haga lo que nos pedía el primer

4:06:38

ejercicio para entender el concepto y

4:06:40

después explicaré por qué utilizar uno

4:06:43

Por qué utilizar otro y ejemplos que de

4:06:46

verdad sí que aplican mejor ese concepto

4:06:48

de recursividad que quizás Este primer

4:06:49

ejercicio que como quería que fuese muy

4:06:51

simple nos va a valer para entender la

4:06:54

recursividad pero no es una buena

4:06:57

práctica justo lo que vamos a hacer vale

4:06:59

decía que yo tengo que acabar creando

4:07:01

pues una función de Cuenta atrás no que

4:07:04

diga los números del 100 al cero Qué

4:07:06

significa que necesito acabar

4:07:08

imprimiendo por consola 19 99 98 97 Vale

4:07:11

entonces por qué no hago una función que

4:07:13

se llame Cuenta atrás por ejemplo

4:07:15

Countdown ya está Esta es una función y

4:07:18

qué podría acabar haciendo la función

4:07:20

imprimiendo un número okay Y por qué no

4:07:22

le paso un número a la función Pues

4:07:24

venga number le puedo decir y un int y

4:07:27

la función nos dice Cuenta atrás lo que

4:07:29

nosotros intuimos que va a hacer esta

4:07:30

función es empezar a contar hacia atrás

4:07:33

decir que si yo llamo a la función

4:07:35

Countdown con un 10 esta función lo que

4:07:38

debería hacer es hacer esa cuenta para

4:07:40

atrás muy bien lo primero que yo podría

4:07:42

hacer es un del número ejecutamos esto

4:07:45

qué vemos por consola un 10 bueno quizás

4:07:48

una cuenta atrás pues no eh vale pero

4:07:53

entendiendo que una función recursiva es

4:07:55

aquella que se llama a sí misma Cómo

4:07:58

podríamos hacer una cuenta atrás resulta

4:08:01

bastante obvio si yo ahora imprimo el

4:08:03

número que se me pasa y me llamo a mí

4:08:06

mismo pero restándole uno al valor que

4:08:09

se me pasa en realidad pensemos esto voy

4:08:12

llamarme a mí mismo y al número que le

4:08:14

llega a esta función le voy a restar uno

4:08:17

Cómo entendemos esto llamo la función

4:08:19

inicialmente con 10 10 llama con down

4:08:22

imprime 10 se vuelve a llamar a ella

4:08:24

misma pero ya no con el valor 10 con el

4:08:26

valor 10 - 1 9 se llama ella misma

4:08:29

imprime nueve se llama all misma imprime

4:08:31

ocho se llama all misma imprime siete

4:08:33

entendéis Este es el concepto de

4:08:35

recursividad Entonces yo ahora lo lanzo

4:08:37

Y qué pasa dice qué va a pasar aquí qué

4:08:40

creéis que va a pasar esto lo va a

4:08:42

imprimir bien va a hacer hacer una

4:08:43

cuenta atrás Sí sí En realidad lo va a

4:08:46

hacer bien pero qué va a hacer 10 9 8 7

4:08:49

6 5 4 3 2 1 0 -1 -2 -3 -4 -5 claro se va

4:08:55

hasta el infinito buque infinito

4:08:58

fuego eh muerte y destrucción en el

4:09:00

proyecto Vale qué tenemos que hacer

4:09:03

siempre sí o sí en una función recursiva

4:09:06

una función recursiva que lo único que

4:09:08

hace es llamarse a ella aunque esté

4:09:10

variando su criterio Tendremos que

4:09:11

acabar indicándole e recursiva Sí pero

4:09:15

según qué criterio hasta cuándo quiero

4:09:18

que sea recursivo no pues en este caso

4:09:20

es también muy fácil le puedo decir mira

4:09:23

si el número que me estás pasando Es

4:09:26

mayor o igual que Cero en realidad Pues

4:09:28

haz tu lógica de recursividad imprime el

4:09:31

número y réstale uno Okay qué acabará

4:09:34

pasando imaginemos que le pasamos el 10

4:09:37

10 9 8 7 6 eso lo va a hacer todo

4:09:39

perfecto llega al 0 c es mayor o igual

4:09:42

que 0 Eh sí 0 es igual a 0 imprime 0 y

4:09:46

se llama a ella misma con 0 - 1 Cuánto

4:09:50

es 0 - 1 -1 -1 es mayor o igual que 0 no

4:09:54

ya no cumple el criterio Qué pasa cuando

4:09:56

no cumple el criterio no se ejecuta más

4:09:58

se sale de ese ficticio bucle que al fin

4:10:02

y al cabo se estaba sucediendo gracias a

4:10:04

llamarse allá misma Vamos a ver si

4:10:06

funciona nuestro nuestra Cuenta atrás

4:10:09

Pues venga vengo por aquí y dice Uy

4:10:11

lánzate qué tenemos 10 10 9 8 7 a ver

4:10:15

vale esto ya funciona pues Cómo era el

4:10:18

caso de uso que se nos pedía en el

4:10:20

ejercicio nos decía Crea una función que

4:10:23

cuente de 100 a cero placa tenemos una

4:10:26

función que cuente de 100 a cer ya está

4:10:27

100 99 98 hasta que llega a cer0 el os1

4:10:32

ya no lo tiene en cuenta porque ya no

4:10:33

cumple el If fin de la historia aquí

4:10:35

tenéis un concepto para entender la

4:10:37

recursividad Cómo hay que cumplir dos

4:10:39

cosas que se llama ella misma y que y

4:10:42

que en algún momento

4:10:43

se detenga vale eso para empezar es una

4:10:46

función recursiva esto es una función

4:10:48

recursiva es el mejor uso de una función

4:10:50

recursiva no esto también era algo que

4:10:52

quería que entendiera porque esto para

4:10:54

qué nos valdría hacer algo así tan

4:10:56

complejo teniendo que controlar esto

4:10:58

cuando yo le puedo decir mira Hazme un

4:11:00

bucle que empiece en 100 que acabe en

4:11:02

cero y ya está Hazme un for Hazme un

4:11:04

Wild Hazme lo que sea y ya está y se

4:11:06

acabó y no tenemos que tener una función

4:11:08

que podemos decir Uf Y qué complejidad

4:11:10

pueda acabar ganando esto y si acabo

4:11:12

creando un B infinito aquí porque no me

4:11:14

doy cuenta y el criterio lo pongo mal lo

4:11:16

que sea vale Y por eso os ponía la parte

4:11:19

extra esto de dificultad extra que

4:11:21

Siempre os digo por favor intentar hacer

4:11:23

la dificultad extra porque no no es tan

4:11:25

difícil como puede parecer no Al fin y

4:11:27

al cabo lo único que tenéis que pensar

4:11:29

es hay una parte de ejercicio para

4:11:32

entender el concepto para practicar el

4:11:34

concepto y después la dificultad extra

4:11:36

quizás ya para sí acabáis de entender el

4:11:38

concepto para que sigáis practicando yo

4:11:40

os recomiendo que tarde o temprano le

4:11:42

hagáis esa dificultad extra a todos los

4:11:44

ejercicios que yo voy proponiendo que

4:11:46

igual esta semana decir buf ya me costó

4:11:48

entender lo de recursividad porque era

4:11:50

un concepto que yo nunca Viera Pues

4:11:51

bueno sigue estudiando Sigue practicando

4:11:54

pero vuelve a esta parte intenta sacar

4:11:56

adelante esta parte porque aquí con la

4:11:59

dificultad extra es como verdaderamente

4:12:01

vas a acabar entendiendo y practicando

4:12:02

más el concepto de recursión okay Así

4:12:05

que vamos a ver la parte extra que la

4:12:07

parte extra Es la que a mí me va a

4:12:09

servir para poder explicaros verdad

4:12:13

Cuándo hay que utilizar recursividad la

4:12:15

parte extra nos decía utiliza el

4:12:17

concepto de recursividad para calcular

4:12:19

el factorial y calcular el valor de un

4:12:21

elemento concreto la sucesión de

4:12:22

fibonacci claro aquí lo de siempre

4:12:24

decimos Bris tío eh Me acabo de enterar

4:12:27

más o menos ahora de que va la

4:12:29

recursividad cómo te atreves a ahora a

4:12:31

decirme un factorial y un fibonacci que

4:12:33

yo eso igual lo estudié hace tiempo y ya

4:12:35

no me acuerdo ni lo que era bueno esto

4:12:37

son conceptos muy básicos a nivel de

4:12:39

matemática que no recordáis lo que era n

4:12:43

número factorial digo Qué es la función

4:12:46

factorial y cómo usarla y dice el

4:12:48

factorial de un entero positivo n el

4:12:50

factorial n se define por el principio

4:12:52

que se produce como el producto de todos

4:12:54

los números positivos desde un hasta n

4:12:57

Bueno lo entendemos Qué es el factorial

4:12:59

de 5 1 por 2 por 3 * 4 por 5 ya no Bueno

4:13:03

buscabais pero esto Ahora ya tiene que

4:13:06

saltar un clic en nuestra cabeza y decir

4:13:08

ostras para para para Cómo que parece

4:13:11

que hay una sucesión de números y el

4:13:14

ejercicio lo que me pedía en esta

4:13:16

primera parte de la dificultad avanzada

4:13:19

era calcular el factorial de un número

4:13:21

concreto Vale pues venga vamos poco a

4:13:23

poco y vamos a ver si ahora os puedo

4:13:25

explicar un paso más dentro de Cuándo

4:13:28

usar recursividad y cuando no usar

4:13:30

recursividad vale voy a crear una

4:13:31

función y le voy a llamar factorial vale

4:13:34

porque va a ser esa función que me va a

4:13:36

servir para calcular el número factorial

4:13:38

Imagínate que yo ahora quiero calcular

4:13:40

el factorial de cco pues qué Tendremos

4:13:43

que hacer pasarle un número el número

4:13:45

que queremos calcular un entero okay Y

4:13:47

qué tiene que acabar haciendo la función

4:13:49

me tiene que acabar retornando el valor

4:13:51

factorial con lo cual le puedo decir que

4:13:53

me va a retornar también un entero y voy

4:13:55

a llamar a esta función imaginando que

4:13:57

nosotros queremos decirle Mira calcúlame

4:13:59

el factorial de cco y como lo va a

4:14:02

retornar imprimelo vale muy bien Qué

4:14:04

dijimos que era el cálculo del número

4:14:07

factorial dijimos que en realidad si yo

4:14:09

le paso cinco tendría que ser algo así

4:14:11

como eh 1 * 2 * 3 * 4 y por 5 el

4:14:18

resultado de multiplicar todo esto

4:14:20

acabaría dando el número factorial vale

4:14:23

en realidad aquí vemos una sucesión Y si

4:14:25

yo partiera del cinco en realidad todo

4:14:27

esto es lo mismo que 5 * 4 * 3 * 2 y por

4:14:32

1 no por cer0 porque si le llego aquí al

4:14:35

cer0 ya todo pasa a valer cero Okay

4:14:37

entonces bueno empezamos a entender que

4:14:40

el número factorial de cer Y esto es

4:14:41

algo que teníamos que haber endido

4:14:43

dentro de nuestra búsqueda de Cuál es la

4:14:45

definición Cuál es el factorial de cero

4:14:48

el factorial de cer0 en realidad si

4:14:50

nosotros nos dicen Ey calcula el

4:14:51

factorial de cer0 si no tuviéramos ni

4:14:54

idea y nos pusiéramos aquí a buscar las

4:14:56

reglas o lo que sea digo factorial de

4:14:58

cero a ver a ver no sé factorial de cero

4:15:01

dice ostras el factorial de cer0 es uno

4:15:04

vale Okay teníamos que entender teníamos

4:15:06

que acabar llegando a esa conclusión de

4:15:08

que okay Si a nuestra función en

4:15:11

realidad le pasamos un cero esta función

4:15:13

nos tiene que acabar retornando un uno

4:15:15

ya no vale hacer todo el rollo este

4:15:17

porque en realidad el cero necesitamos

4:15:19

que sea ese número positivo y que al fin

4:15:21

y al cabo Pues el número sea vamos a

4:15:23

intentar que sea mayor de de cero por

4:15:27

ejemplo para poder calcular ese

4:15:29

factorial Bueno pues podríamos poner

4:15:31

diferentes criterios que no tenemos ni

4:15:33

idea factorial de un número negativo

4:15:36

esto existe Existen los factoriales de

4:15:38

números negativos alguien se ha

4:15:39

preocupado en controlarlo cómo nos decía

4:15:42

la representación como nos decía el

4:15:44

factorial de un entero positivo entonces

4:15:46

podríamos eh intentar controlar algo y

4:15:49

decir Oye si a la función que me pasan

4:15:52

Pues el número no es positivo Pues

4:15:55

podría intentar Pues imprimir algo es

4:15:58

decir que está mal o lo que sea o

4:16:00

devolver un cero como vosotros quisiera

4:16:03

aquí podríais utilizar diferentes

4:16:05

criterios podríais hacer criterios algo

4:16:07

así como Mira para representar que de

4:16:09

verdad el factorial si me retorna a cero

4:16:11

podría decir que es el factor tutorial

4:16:13

de un número que a mí en realidad no me

4:16:14

está valiendo puede decir Bueno pues If

4:16:16

number por ejemplo es eh menor que cer0

4:16:20

yo sin más voy a hacer return 0o porque

4:16:23

para mí no es un número válido esto en

4:16:25

un programa Eh pues que de verdad

4:16:27

tuviera que controlar el factorial

4:16:29

podría dar una excepción pero aún no

4:16:30

sabemos lo que es una excepción

4:16:32

podríamos imprimir un mensaje podríamos

4:16:34

poner muchas cosas podría venir por aquí

4:16:36

y decir pues le pongo un print y digo

4:16:38

los números negativos no son válidos yo

4:16:41

que sé ponemos lo que nos da la gana no

4:16:42

podríamos hacer eso y retorno un cero

4:16:45

como Pues mira ya no me vale o retorno

4:16:47

un número negativo o retorno una

4:16:49

excepción o lo que sea ya os digo que la

4:16:51

interpretación que vosotros le queráis

4:16:53

dar al ejercicio se la dais vosotros que

4:16:55

no habéis controlado Esto bueno entender

4:16:57

el por qué Sí o por no lo habéis hecho

4:16:59

no se trata de que la solución acabe

4:17:02

siendo exactamente lo que yo hago pero

4:17:04

bueno ver como yo lo intento ir

4:17:06

razonando vale Pero en cambio sí que

4:17:08

teníamos otra opción por aquí que era el

4:17:11

If ostra Y si el número en realidad es

4:17:13

cer0 Claro si el número era cero qué

4:17:15

teníamos que acabar retornando uno

4:17:18

porque esto ya lo teníamos claro

4:17:19

entonces ostras vale a ver qué nos va

4:17:21

haciendo nuestro ejercicio si yo le paso

4:17:22

el cero porque el ejercicio ya va a

4:17:24

hacer algo concreto ya va a empezar a

4:17:26

saber qué hacer Mira uno el factorial de

4:17:29

0 es 1 y si le paso el factorial de -1

4:17:32

qué acabaría diciendo mi programa Pues

4:17:34

mira los números negativos no son

4:17:36

válidos si me retorno un cero bueno la

4:17:38

interpretación que nosotros quisiéramos

4:17:40

Estos son como los casos fáciles Pero

4:17:42

qué falta en realidad falta el caso

4:17:45

complejo vamos a decir que yo le pase de

4:17:47

verdad un número entero positivo cómo

4:17:50

calculamos el factorial Cómo dijimos que

4:17:52

era el factorial de 5 1 * 2 * 3 * 4 y *

4:17:55

5 o lo que es lo mismo 5 * 4 * 3 * 2 y *

4:17:57

1 vale entendiendo lo que hicimos en el

4:18:00

ejercicio anterior cuál podría ser la

4:18:02

regla a aplicar en este punto podría ser

4:18:05

que el número factorial es igual al

4:18:08

número que yo le paso multiplicado por

4:18:11

el número -1 así empezaríamos a crear la

4:18:16

secuencia que acabe retornando el número

4:18:18

factorial Bueno vamos a hacer un retor

4:18:20

de Esto vale le paso un cinco o vamos a

4:18:23

hacerlo más fácil Le intento pasar un

4:18:27

dos claro el número factorial de 2 es 2

4:18:30

* 1 2 * 1 2 qué tenemos aquí qué nos

4:18:33

dice ostras factorial un 2 2 por qué nos

4:18:38

dice un tres por qué Por qué tenemos

4:18:40

aquí un tres quién me lo explica este

4:18:42

number es menor que cer0 no ay que tenga

4:18:45

que explicar estas cosas bueno entender

4:18:48

un poco cómo funciona al final la

4:18:50

agrupación según el tipo de operando que

4:18:52

estamos lanzando okay fijaos que aquí lo

4:18:54

que estaba haciendo en realidad era 2 *

4:18:56

2 4 - una 3 por eso nos daba 3 en

4:18:59

realidad lo que tenemos que hacer es 2 *

4:19:02

2 - 1 bien vale claro el factorial de 2

4:19:06

nos lo calcularía bien okay Pero y si le

4:19:08

paso el factorial de uno factorial de

4:19:10

uno qué tendría que dar Uy nos da cer0

4:19:13

ostras claro la acabo de liar aquí por

4:19:15

qué Mm porque estoy multiplicando por

4:19:18

cer0 igual aquí tenemos un problema

4:19:19

estoy multiplicando el número por el

4:19:21

número os1 que sería 1 y C no vale Pero

4:19:24

nos empezamos un poquito a acercar a la

4:19:27

solución volvamos al caso que teníamos

4:19:29

al principio que le paso cinco qué tengo

4:19:32

20 Ah vale 5 * 4 y si yo ahora quisiera

4:19:35

que hiciera 5 * 4 por 3 por 2 por 1 en

4:19:40

realidad yo tendría que seguir metiendo

4:19:41

Pues bueno y el número en este caso -1 y

4:19:45

-1 no cada vez Tendría que ir restándole

4:19:48

uno al número vale Y esto tendría que

4:19:53

esta operación vamos a quitar la parte

4:19:55

del final sí lo empezamos a pensar bien

4:19:57

esta operación el número por el número

4:20:00

-1 en realidad Lo tendríamos que repetir

4:20:03

hasta que de verdad el número valiera

4:20:05

cer0 pensarlo 5 * 4 y después 4 * 3 y

4:20:10

después 3 * 2 y después uno y ya está y

4:20:15

tendríamos que acabar acumulando todo

4:20:17

eso podríamos pensar Okay igual ya lo

4:20:19

tenemos claro cómo podremos hacer eso de

4:20:22

forma automática es bastante fácil

4:20:24

pensar que si yo ahora multiplico el

4:20:27

número que le llega por la llamada

4:20:29

recurrente a factorial pensar que sería

4:20:32

esto 5 por el factorial de 4 por el

4:20:36

factorial de 3 por el factorial de 2 por

4:20:40

y yo ahora lanzo esto y veo 120 120 no 5

4:20:44

* 4 * 3 * 2 * 1 y cuando llegara a cer0

4:20:48

porque voy a llegar en algún momento a

4:20:49

cer0 en realidad lo que voy a tener es

4:20:52

return 1 ya no me llamo a mí mismo

4:20:55

llegará un momento en el que yo no voy a

4:20:58

tener que llamar a mí mismo que esto

4:20:59

sería lo mismo que si queréis hacerle

4:21:01

aquí un Else vale si yo hiciera un Else

4:21:03

aquí esto sería Exactamente lo mismo la

4:21:05

condición por defecto Entonces tenemos

4:21:07

en realidad una función factorial que es

4:21:09

capaz de romper su ejecución va a romper

4:21:11

su ejecución en el momento que el número

4:21:13

llega a cero o que en realidad el número

4:21:15

se lo pasemos mal y ya sea un número

4:21:17

negativo entonces sin más esta función

4:21:20

factorial ahora empieza a cobrar un

4:21:22

poquito más de sentido Porque podríamos

4:21:23

pensar sí esto lo podríamos hacer con un

4:21:26

bucle por supuesto prácticamente todas

4:21:28

las funciones recursivas las podemos

4:21:30

resolver con bucle pero ahora vamos a

4:21:32

intentar entender un poco la lógica de

4:21:34

cuándo yo recomendaría empezar a

4:21:37

utilizar funciones recursivas en vez de

4:21:40

bucles como tal Vale cuando un una

4:21:42

función se puede acabar dividiendo en

4:21:45

otros subproblemas esto es un

4:21:48

subproblema no que el número valga menor

4:21:50

que que sea menor que cer0 que el número

4:21:52

sea cer0 que el número sea mayor que

4:21:54

cero Estos son como pequeños problemas

4:21:57

dentro del problema general y en

4:21:59

realidad lo que tenemos es toma de

4:22:01

decisiones y la ejecución exacta de esos

4:22:05

problemas según pues una variable que

4:22:08

tenemos aquí número Vale cuando en

4:22:09

realidad podemos empezar a descomponer

4:22:12

un problema o cuando tenemos jerarquías

4:22:15

vale esto seguramente ya nos esté dando

4:22:18

un indicio de que Okay si lo tengo que

4:22:21

hacer esto con un bucle podría hacerlo

4:22:23

pero en realidad entender ese bucle nos

4:22:25

podría resultar hasta más complejo y

4:22:27

esto si ya lo llevamos a tipo de

4:22:29

problemas más complicados cuando

4:22:32

hablamos ya de estructuras de árbol

4:22:34

estructuras que se acaban dividiendo

4:22:36

tiene muchísimo más sentido por qué

4:22:38

porque nosotros le podemos acabar

4:22:40

indicando diferentes caminos de

4:22:42

excursión para seguir profundizando en

4:22:44

distintos niveles aquí en realidad lo

4:22:46

único que queríamos era contar de cinco

4:22:49

a cero no algo parecido a lo que tenemos

4:22:52

aquí pero en realidad pensar que lo que

4:22:54

vamos haciendo es acumulando ese

4:22:56

resultado porque aquí tenemos esta

4:22:58

multiplicación pero esta multiplicación

4:23:00

que en realidad va a llegar hasta el

4:23:02

nivel más bajo hasta que el número valga

4:23:04

cero y se va a ir acumulando todo por

4:23:06

eso acabamos teniendo el 120 acabamos

4:23:09

multiplicando siempre este número por el

4:23:11

resultado del factorial que es a su vez

4:23:13

otra vez la ejecución del factorial otra

4:23:15

vez la ejecución del factorial otra vez

4:23:17

la ejecución del factorial Qué es más

4:23:19

rápido bcle recursividad depende porque

4:23:22

no es cuestión de rapidez muchas veces

4:23:24

es cuestión de optimización de recursos

4:23:26

y muchas veces hasta es cuestión de

4:23:29

inteligibilidad de acabar entendiendo

4:23:32

Qué hace nuestro código porque nosotros

4:23:33

podremos después acabar llegando a este

4:23:35

punto decir Ey claro qué hacemos en un

4:23:37

bucle quizás romper esa ejecución de una

4:23:40

manera más abrupta o tener que acumular

4:23:42

ular este resultado si tuviéramos un

4:23:44

bucle que tiene que acabar acumulando

4:23:46

resultados qué tendríamos que hacer una

4:23:47

variable fuera y eso le puede acabar

4:23:49

añadiendo complejidad al propio

4:23:51

ejercicio en este caso si os fijáis el

4:23:53

factorial es autoconclusivo él mismo se

4:23:56

encarga de acumular valores y el mismo

4:23:59

se encarga de resolver noos el resultado

4:24:01

no tenemos que depender de un bucle con

4:24:04

variables externas con criterios

4:24:06

externos y un poco intuyendo Hacia dónde

4:24:08

va a ir todo nuestro flujo Así que en

4:24:10

este caso ya se ve muchísimo más claro y

4:24:13

si no lo veis claro des con este caso

4:24:15

Aún se puede llegar un poquito más lejos

4:24:17

por supuesto se puede llegar lejísimos

4:24:19

pero no me quería complicar en exceso no

4:24:22

que os ponía por aquí calcular el valor

4:24:24

de un elemento concreto según su

4:24:26

posición en la sucesión de fibonacci y

4:24:29

ahora manos a la cabeza sucesión de

4:24:31

fibonacci ya estamos otra vez bry qué es

4:24:33

esto de la sucesión de fibonacci Pues

4:24:35

bueno Google qué tal venga vamos por

4:24:37

aquí y venimos y decimos he fibonacci y

4:24:40

ahora ya vemos aquí sucesión de

4:24:42

fibonacci ostras en matemática la

4:24:44

sucesión de fibonacci se trata de una

4:24:46

serie infinita de números naturales que

4:24:48

empiezan desde 0 1 y continúa añadiendo

4:24:50

los números que son la suma de los dos

4:24:51

anteriores Qué nos está diciendo esto ya

4:24:54

nos tiene que hacer clic dice sucesión

4:24:56

números dos anteriores repetir

4:24:58

operaciones vale puede acabar teniendo

4:25:01

sentido repetir la misma lógica porque

4:25:03

vemos lo que tenemos aquí la sucesión de

4:25:05

fibonacci empieza cero 1 Okay 0 + 1 1 1

4:25:09

+ 1 2 2 + 1 3 3 + 2 5 5 + 3 8 vemos como

4:25:14

se empieza aquí a acumular y digo vale

4:25:16

Okay pues a ver si somos capaces de

4:25:18

hacer esto mismo pero con un ejercicio

4:25:21

vale bueno venga vamos a crearnos una

4:25:24

función una función que se llame

4:25:25

fibonacci a ver si ahora dándole una

4:25:28

lógica que pueda aplicarle a una función

4:25:31

recursiva somos capaces de resolver este

4:25:33

número de fibonacci qué tenemos que

4:25:35

pasar la función un número igual que

4:25:37

antes number un entero y este nos tiene

4:25:39

que acabar dando un resultado otro

4:25:41

entero Vale pues ya tengo por aquí el

4:25:43

número entero y el resultado vamos a

4:25:44

llamar a fibonacci cómo nombre de la

4:25:47

función le pasamos Pues en este caso lo

4:25:49

mismo el cinco vamos a empezar con un

4:25:51

número bajo y el resultado lo vamos a

4:25:53

imprimir print Okay pues venga vamos a

4:25:56

imprimirlo y vamos a ver qué tendríamos

4:25:58

que hacer aquí volvemos a lo mismo Qué

4:26:00

pasa si de verdad nos entra un número

4:26:02

negativo aquí hablábamos sucesión de

4:26:04

fibonacci números positivos pues

4:26:06

podríamos decirle Okay vale vale calma

4:26:08

vamos a controlarlo vamos a ir a los

4:26:10

casos fáciles hasta llegar a la parte de

4:26:12

recursividad Y cómo acabamos

4:26:14

resolviéndolo Vale pues vuelvo a decir

4:26:17

lo mismo si el número es menor que cer0

4:26:19

qué tengo que acabar haciendo pues le

4:26:21

puede decir mira pues voy a hacer esto

4:26:23

voy a acabar retornando este cero y voy

4:26:26

a acabar diciendo Mira la posición pues

4:26:28

tiene que ser mayor que cer0 porque aquí

4:26:30

le teníamos que indicar cuál era la

4:26:32

posición concreta a la que queríamos

4:26:33

llegar es decir cuántas veces queremos

4:26:35

hacer esa suma acumulada hasta llegar a

4:26:38

un punto concreto es decir cuántas veces

4:26:40

quiero ejecutar fibonacci Vale pues digo

4:26:43

pues puedo poner la posición tiene que

4:26:45

ser mayor que cero tiene que ser mayor

4:26:47

que cero el ejercicio nos contaba aquí

4:26:49

Ey según su posición la función recibe

4:26:52

la posición pues Vale digo pues la

4:26:54

posición tiene que ser mayor que cer0 y

4:26:55

retorno un cero lo de antes esto un

4:26:57

ejercicio tendríamos que calcular este

4:27:00

caso límite de manera e no es que valga

4:27:03

cero esto podría acabar desencadenando

4:27:05

un error en el programa pero como

4:27:07

nosotros aún no llegamos a esas partes a

4:27:09

Cómo controlar esos errores pues vamos a

4:27:11

quedarnos en la parte tema simple que es

4:27:12

Mira voy a retornar un cero como que yo

4:27:14

le he pasado un número y voy a retornar

4:27:16

un cer0 valor mínimo para que todo esto

4:27:18

siga funcionando Vale qué más cosas

4:27:21

Tenemos que tener en cuenta cuando

4:27:22

ejecutamos fibonacci Qué pasa si nos

4:27:25

piden el fibonacci de uno el If pensar

4:27:28

cuando vimos la sucesión si nos piden la

4:27:31

primera posición de fibonacci que es

4:27:33

cero claro no tenemos dos números como

4:27:36

para acabar calculando porque dice que

4:27:38

es la suma de los dos anteriores 3 y 5

4:27:41

dan 8 o y 13 dan 21 21 y 34 dan 55 pero

4:27:45

si le digo Ey Y si te digo Esa primera

4:27:48

vez Qué pasa si te digo calcúlalo en la

4:27:51

posición uno pues en la posición uno

4:27:54

sabemos que vale cer0 Porque así es la

4:27:56

regla al contrario si nos dicen y

4:27:58

calcúlame la posición cer0 porque aquí

4:28:00

estoy viendo los números negativos Pero

4:28:02

tiene que ser menores o iguales que cero

4:28:04

es decir cualquier número menor o igual

4:28:06

a cer es un número no válido porque

4:28:09

tiene que ser una posición si es

4:28:10

una posición la posición cero no existe

4:28:12

como tal si en programación s en

4:28:14

estructuras pero si quiero la posición

4:28:16

cero del número de fibonacci no la tengo

4:28:18

es que no he empezado a hacer fibonacci

4:28:20

vale Pues imagínate que yo ahora le digo

4:28:22

que ahora sí quiero la posición uno qué

4:28:25

me va a retornar la posición uno pues ya

4:28:27

lo vimos si le pasamos en la posición

4:28:30

uno va a ser un cero y en la posición

4:28:33

dos aquí claro tampoco tengo dos atrás

4:28:37

aquí no tenía ninguno Y si le mando la

4:28:39

posición dos en realidad no tengo dos

4:28:42

números anteriores para sumarlos Solo

4:28:44

tengo uno entonces la posición dos tengo

4:28:46

que saber también que por otro lado la

4:28:48

posición dos también es un caso digamos

4:28:51

especial Que es que en la posición dos

4:28:53

vale uno Estos son como los casos más

4:28:55

simples los casos un poco siguiendo la

4:28:57

regla un poco los casos que nosotros

4:28:59

cuando nos pusimos a buscar qué es

4:29:01

fibonacci y vemos de la manera en la que

4:29:03

se calcula el número de fibonacci

4:29:04

dijimos vale cer0 menor que cer0 no nos

4:29:06

vale si es posición uno cer0 a muerte

4:29:09

porque no tengo dos números atrás si es

4:29:10

posición dos uno a muerte porque no

4:29:12

tengo dos números atrás Solo tengo uno y

4:29:14

llegamos a lo difícil y Qué pasa si el

4:29:17

número que me pasan ahora ya me dice que

4:29:19

es una posición por ejemplo la tres se

4:29:22

puede simplificar los dos sifs se puede

4:29:24

simplificar lo que tú quieras Se podría

4:29:26

simplificar por supuesto es lo de

4:29:28

siempre lo voy a repetir una vez más

4:29:29

porque creo que esto es importante

4:29:31

porque a veces confundimos la manera en

4:29:33

la que yo explico con la manera perfecta

4:29:36

óptima pensar esto es una ruta de

4:29:38

estudio la ruta de estudio hay gente que

4:29:39

sabe más y hay gente que sabe menos y yo

4:29:42

tengo que explicar de manera que todo el

4:29:44

mundo se entere de lo que yo estoy

4:29:47

haciendo aquí podríamos hacer algo así

4:29:49

viendo estos ifs podríamos acabar

4:29:52

concluyendo Ey si el número es menor o

4:29:56

igual que dos yo lo que podría es acabar

4:29:59

retornando el número -1 porque sé que

4:30:02

con dos vale uno y sé que con Uno Vale

4:30:04

c0 podríamos hacerlo y haríamos una

4:30:06

optimización pero en realidad con esto

4:30:09

estaríamos perdiendo en cierto modo la

4:30:12

explicación purista del cálculo del

4:30:14

número de fibonacci eso tenerlo en

4:30:16

cuenta porque cuando explico a veces Leo

4:30:18

ese tipo de cosas de eh bry ese código

4:30:22

es mejorable es optimiza este If se

4:30:25

puede condensar en uno Sí pero es la

4:30:27

manera de que yo ahora si pongo esto

4:30:30

fijaos que no vemos bien representado lo

4:30:33

que es la propia regla acabando por

4:30:36

entender de que Ey si la posición es la

4:30:38

uno o la dos pues son posiciones raras

4:30:40

que no me van a acab permitiendo Pues el

4:30:43

cálculo directo porque aún no tengo los

4:30:45

números suficientes atrás para calcular

4:30:47

Okay entonces por eso a mí me gusta

4:30:49

dejaros esa manera más indicada por

4:30:52

supuesto Esto no es una clase para si

4:30:54

quisiéramos aprender programación al

4:30:56

máximo nivel no estaríamos haciendo este

4:30:58

ejercicio tan tan tan tan simple para

4:31:00

alguien que sepa programar bien pero

4:31:02

pensemos que aquí lo que estamos

4:31:03

explicando en primer lugar es el

4:31:05

concepto de la lección que es qué es

4:31:07

recursividad y después de eso con el

4:31:09

ejercicio intentamos Pues que que quede

4:31:12

lo más entendible siguiendo la regla que

4:31:14

nos manda aplicar vale Por eso yo lo

4:31:16

dejo de esta manera vale incluso lo

4:31:18

podríamos optimizar y aún poniéndolo

4:31:20

aquí menor igual que dos y podríamos

4:31:22

hacer el círculo aú lo podríamos hacer

4:31:24

aún más No pero no es la forma en la que

4:31:27

a mí me gusta acabar explicando Pero

4:31:29

ahora sí que llegamos al punto en el que

4:31:31

y si me pasa la posición tres ostras en

4:31:34

la posición tres yo ahora sí que

4:31:36

posición 3es posición un posición dos

4:31:39

posición tres si me manda a calcular el

4:31:41

valor del número de fibonacci en la

4:31:43

posición 3 yo ahora sí que ya tengo dos

4:31:46

números atrás ya podría sumar 0 + 1 y me

4:31:49

da 1 Entonces ya todo lo que sea tres o

4:31:52

mayor que tres que es justo este els ya

4:31:54

haría referencia a números que yo

4:31:57

verdaderamente puedo acabar calculando

4:31:59

okay Y cómo lo acabo calculando Pues si

4:32:03

a mí me pasan este número sería el

4:32:06

cálculo de este número cómo sería el

4:32:09

número de fibonacci de la posición

4:32:11

anterior más el número de fibonacci de

4:32:14

la posición dos veces anterior que

4:32:16

Alguien podría pensar no es este número

4:32:19

-1 más el número -2 podríamos allegar a

4:32:23

pero en realidad es esto Claro en el

4:32:26

primer caso podríamos pensar posición 3

4:32:29

3 - 1 2 a ver a ver Vámonos a los

4:32:32

números de fibonacci posición 3 esta

4:32:35

posición 0 1 posición 1 2 3 3 - 1 no no

4:32:40

no no no no confunda dais la posición

4:32:43

con el número que tiene que calcular que

4:32:45

yo le paso un tres ya veis que aquí no

4:32:46

tenemos un tres ni de broma y que

4:32:48

restarle a 3 1 en realidad no es el

4:32:51

valor 3 - 1 2 no es el valor del número

4:32:53

anterior y 3 - 2 es 1 no da la posición

4:32:56

del anterior en realidad lo que tenemos

4:32:58

que hacer es calcular el número de

4:33:00

fibonacci en esa posición Eso es lo

4:33:03

importante intentemos hacerlo con ese

4:33:05

caso más fácil posición que nos pasan la

4:33:08

tres y quién me calcula el número de

4:33:10

fibonacci yo dónde tengo la posibilidad

4:33:12

de calcular el número de fibonacci de

4:33:15

vamos a irnos aquí a tres quién se

4:33:17

encarga de calcular el número de

4:33:18

fibonacci en realidad esta función me

4:33:21

está calculando el número de fibonacci Y

4:33:23

si yo en vez de hacer esto a secas le

4:33:26

digo no no no calcúlame el número de

4:33:29

fibonacci de este número por qué no me

4:33:30

llamo a mí mismo y por qué no me llamo a

4:33:33

mí mismo con el valor -1 y el valor -2

4:33:38

simplemente con esto nosotros tenemos el

4:33:40

cálculo vamos a ejecutarlo y vamos a

4:33:43

entenderlo me dice uno la posición tres

4:33:45

se corresponde con el uno sí le voy a

4:33:48

pasar la posición cuatro Ya veis que nos

4:33:50

debería dar dos dos la posición 5 tres

4:33:53

estamos bien posición 5 1 2 3 4 5 3

4:33:58

ostras cómo está funcionando esto vamos

4:34:00

a entenderlo posición cinco llega

4:34:03

nuestro programa nos viene por aquí un

4:34:05

cinco posición cinco nos va a decir Ey

4:34:07

calcúlame el fibonacci en la posición cu

4:34:10

más la posición Pos 3 porque la suma de

4:34:13

esos dos en la posición cco si quiero

4:34:16

calcular 1 2 3 4 5 esto que vemos aquí

4:34:20

tengo que calcular el fibonacci en la

4:34:22

dos y posición en la uno y os decía Cuál

4:34:24

es el resultado de calcular fibonacci en

4:34:26

la posición 5 1 2 3 4 5 pues es el

4:34:30

resultado de fibonacci en la posición 4

4:34:32

y fibonacci en la posición 3 vale Y eso

4:34:35

ya nos lo hacía la función entonces va a

4:34:37

acabar teniendo como resultado fibonacci

4:34:39

la posición 4 un dos fibonacci la

4:34:41

posición tres un uno lo Suma 1 + 2 3 y

4:34:45

eso es justo lo que está imprimiendo

4:34:47

aquí y aquí aún lo vemos mucho más claro

4:34:49

cómo en realidad pensar ahora que esto

4:34:52

lo tenemos que hacer con un bucle sería

4:34:54

ejecutar esta lógica la lógica que

4:34:57

nosotros aplicamos a fibonacci veis que

4:34:59

aquí lo llamamos dos veces y lo llamamos

4:35:01

con distintos valores ahora pensar cómo

4:35:03

Lo tendríamos que hacer con un bucle

4:35:04

Sería más complejo a la hora de

4:35:06

entenderlo Porque aquí sí que tendríamos

4:35:08

que acumular los valores de una manera

4:35:09

distinta en cambio nosotros no seg amos

4:35:12

que e yo te digo que te calcules con lo

4:35:14

que tú quieras pensar que si yo ahora le

4:35:16

dijera

4:35:20

calcúlala para la posición tres Y cuánto

4:35:23

da uno entonces 2 + 1 en realidad es la

4:35:25

posición 5 y por eso nos acaba dando un

4:35:27

tres y por eso yo ahora si quiero y

4:35:29

decirle aquí la posición 10 vamos a ver

4:35:32

ostras qué tenemos aquí 34 esto lo está

4:35:35

haciendo bien venga posición 10 1 2 3 4

4:35:39

5 6 7 8 9 10 aquí lo tenemos lo veis

4:35:43

fijaos cómo nos va resolviendo todo esto

4:35:45

y ahora Aquí vemos que esto es muy fácil

4:35:47

de resolver pero ahora intentar pasar

4:35:50

esto a un bucle Ya verás como sí que os

4:35:52

resulta más complejo a la hora de

4:35:54

entenderlo porque tenéis que utilizar la

4:35:56

misma operación con dos criterios dos

4:35:58

veces pero ahora pensar en un problema

4:36:01

mucho más complejo en una recursión con

4:36:03

un criterio mucho más complejo en una

4:36:06

estructura mucho más compleja si esto lo

4:36:08

tenemos que acabar controlando con un

4:36:09

bucle sí que lo que acabamos vendo Mira

4:36:12

las torres de hanoi por ejemplo es un

4:36:14

ejercicio muy muy clásico ahí tenemos

4:36:15

que estar

4:36:18

desapilar lo con un bucle nos puede

4:36:20

costar mucho más y nos va a obligar a

4:36:22

utilizar pues diferentes variables

4:36:25

diferentes datos para guardar esos

4:36:28

resultados temporales en cambio aquí

4:36:30

dejamos que sea la propia función la que

4:36:32

se resuelva all misma no se trata ahora

4:36:35

de que de repente como entendemos el

4:36:36

concepto de recursividad todo vaya a ser

4:36:39

recursivo tengamos que utilizar la

4:36:41

inclusividad en cualquier problema que

4:36:43

nos aparezca se utiliza muchísimo Back

4:36:45

tracking por supuesto todo lo que sea

4:36:46

revisión revisión revisión de mí mismo

4:36:48

de mí mismo de mí mismo de mi estructura

4:36:50

qué tengo qué tengo en esos casos es muy

4:36:53

habitual más que ya digo de que ahora

4:36:55

sepáis que existe este concepto y

4:36:57

empezar a utilizarlo en todos los lados

4:36:59

es el que acabéis desarrollando la

4:37:01

propia lógica que hace que entendáis el

4:37:04

por qué esto funciona así porque eh

4:37:06

sinceramente es algo que cuesta porque

4:37:08

no acabamos visualizando de primeras qué

4:37:11

está pasando aquí porque estoy haciendo

4:37:13

un ror pero un return de llamarme a mí

4:37:15

mismo por favor seguirlo hacerlo con

4:37:17

ejemplos muy simples por eso quería

4:37:19

empezar por el ejemplo más tonto del

4:37:21

mundo que no tiene ningún sentido

4:37:22

utilizar recursividad en este caso y en

4:37:25

estos hasta podría ser según para qué

4:37:27

hasta medio cuestionable mucho más claro

4:37:30

lo vemos en fibonacci por la propia

4:37:32

llamada varias veces a la función que

4:37:35

igual lo vemos en el número factorial

4:37:36

pero por favor quedaros bien con por lo

4:37:39

menos que existe este concepto para que

4:37:42

llegado el caso cuando lo tengáis que

4:37:43

utilizar que sepáis que existe y si no

4:37:46

lo tenéis que usar nunca tampoco os

4:37:48

preocupéis ya digo no es algo que

4:37:49

tengamos que utilizar mucho Y puede que

4:37:52

igual en vuestra vida según en que

4:37:53

trabajéis pues no lo tengáis presente en

4:37:55

la gran mayoría de las veces pero es uno

4:37:58

de los conceptos más básicos en

4:38:00

programación pero que de verdad Nos

4:38:02

empiezan a despertar algo a nivel lógico

4:38:05

que dice Uy esto tengo que sentarme y

4:38:07

tengo que razonarlo con calma para

4:38:09

acabar entendiendo entonces bueno Espero

4:38:11

que de verdad hayáis entendido por lo

4:38:13

menos este concepto tan recursivo pero

4:38:16

que no es tan complejo de verdad de

4:38:22

entender y las picolas dice ejercicio

4:38:25

implementa los mecanismos de

4:38:26

introducción y recuperación de elementos

4:38:28

propios de las pilas stacks lifo y las

4:38:30

colas q fifo utilizando una estructura

4:38:33

Ray o lista dependiendo de las

4:38:34

posibilidades de tu lenguaje y claro si

4:38:36

aún no teníais ni idea de esto y queréis

4:38:37

empezar a hacer ejercicio podéis pensar

4:38:39

Bris no he entendido eh Nada básicamente

4:38:42

las pilas y las colas son dos

4:38:45

estructuras básicas en la grandísima

4:38:49

mayoría de lenguajes de programación por

4:38:51

qué porque tienen un mecanismo a la hora

4:38:53

de trabajar con datos muy concretos

4:38:56

Entonces habitualmente cuando se está

4:38:58

estudiando sobre todo estructuras de

4:39:00

datos o asignaturas parecidas o cuando

4:39:02

estamos un poco introduciéndonos en el

4:39:04

mundo de la programación pues aunque ya

4:39:07

hemos visto lecciones de array listas

4:39:10

diccionari sets sí eh contábamos la

4:39:13

teoría de esas estructuras pero en

4:39:16

realidad no nos hemos parado a revisar

4:39:18

bien sobre cuál es el funcionamiento

4:39:21

como tal sí que es cierto que las pilas

4:39:23

y las colas son dos tipos de estructuras

4:39:26

fundamentales que han servido para

4:39:29

generar muchas otras estructuras y mucho

4:39:31

muchos otros mecanismos dentro de los

4:39:34

lenguajes Okay entonces no es porque

4:39:37

digamos utilicemos pilas y colas ahí

4:39:40

constantemente no Sí pero no solo que lo

4:39:43

utilizamos de manera encubierta muchas

4:39:44

veces pero quería que le dedicáis el

4:39:47

tiempo a decir vale la mejor manera de

4:39:49

aprender programación es entendiendo el

4:39:50

porqué de las cosas así que os decía que

4:39:53

aunque las utilicemos de forma

4:39:55

encubierta Pues creo que está bien

4:39:56

acabar entendiendo un poco dónde radica

4:39:59

ese funcionamiento vale Así que os puse

4:40:01

el ejercicio de Okay no vamos a

4:40:03

implementarlo ahí desde císaro

4:40:11

Cómo funcionaría si nosotros

4:40:16

basán algo mucho más fundamental por

4:40:18

ejemplo en un array o en una lista según

4:40:20

lo que tengáis según la estructura que

4:40:22

tengáis en en el lenguaje que hayáis

4:40:24

elegido vale Así que venga me voy a

4:40:27

venir por aquí y voy a crear Pues un

4:40:29

comentario ejercicio voy a poner por

4:40:31

ejemplo y después haremos la parte del

4:40:33

extra pero vamos a empezar por esta

4:40:34

parte y nos decía que implementándose

4:40:41

decía algo así como lifo dijo Oh vale

4:40:44

vamos a detenernos Qué es una pila

4:40:47

vosotros qué entendéis por una pila

4:40:49

Bueno pues la acción de apilar en muchos

4:40:51

casos No pues yo tengo este muñeco y

4:40:54

apilo y apilo no bueno Y empezamos a

4:40:58

Pilar cosas bueno pila de folios pila de

4:41:01

libros pila de lo que os dé la gana y os

4:41:04

daba la pista por si alguien estaba muy

4:41:06

despistado y nunca ha visto nada

4:41:09

parecido os ponía por aquí lifo bueno

4:41:12

son unas siglas que pertenecen con la

4:41:14

forma en la que nosotros trabajamos con

4:41:16

las pilas y son unas siglas que en

4:41:18

realidad hay que traducirlo de inglés es

4:41:21

Last in first out que es Last último en

4:41:25

entrar el primero en salir Entonces eso

4:41:28

ya nos da la clave de cómo suponemos que

4:41:31

funcionan las pilas nosotros tenemos una

4:41:34

estructura que va guardando elementos

4:41:36

que va apilando dice Last in first out

4:41:40

ahora pensar que empezáis a Pilar un

4:41:42

libro encima de otro vale Last in Cuál

4:41:46

es el último elemento que ha entrado el

4:41:48

libro que hemos puesto arriba de todo y

4:41:50

si nosotros quisiéramos empezar a sacar

4:41:53

libros cuál sería el primero que saldría

4:41:55

el en realidad el último que ha entrado

4:41:59

último en entrar primero en salir Okay

4:42:02

ahora vamos a pensar en una estructura

4:42:04

que nosotros ya tengamos en nuestro

4:42:05

lenguaje por ejemplo una lista pero

4:42:07

vamos a intentar darle el funcionamiento

4:42:10

de un una pila a una estructura que

4:42:12

nosotros por ejemplo ya hemos visto y

4:42:14

que ya conocimos le voy a llamar a esta

4:42:15

variable stack sin más porque vamos a

4:42:18

intentar que funcione como un stack como

4:42:20

una pila imaginaos que yo ya tuviera una

4:42:22

lista aquí vacía Vale y ahora vamos a

4:42:25

pensar lo de los libros que decíamos

4:42:27

antes claro cómo funciona una lista por

4:42:29

ejemplo en python Yo tengo un elemento

4:42:31

que se llama appen para Añadir elementos

4:42:33

en la lista Okay entonces yo venía por

4:42:36

aquí y por ejemplo añado el elemento uno

4:42:39

y vamos a ir imprimiendo por ejemplo

4:42:41

aquí qué tenemos en el stack vale Yo

4:42:43

lanzo esto y qué me va a decir pues

4:42:45

tengo uno y si yo añadiera varios

4:42:48

elementos dos un tres Vale qué

4:42:51

acabaríamos teniendo acabaríamos

4:42:53

teniendo una lista con un uno un dos y

4:42:56

un tres Okay pero esto de momento es una

4:42:58

lista pero cómo funciona una lista si yo

4:43:01

ahora Quiero obtener un elemento claro

4:43:03

por una lista nos podemos desplazar

4:43:05

libremente también por un array porque

4:43:07

son elementos ordenados Pero si yo

4:43:09

quisiera que esta lista se comportara

4:43:12

como una pila yo lo que tendría que

4:43:14

hacer es que tendría que acabar

4:43:16

implementando una operación en este

4:43:18

stack que me permitiera recuperar un

4:43:21

elemento y eliminarlo desapilar el

4:43:24

elemento y cuál es el elemento que yo

4:43:26

tengo que desapilar cómo era la regla

4:43:28

que acabamos de decir de la pila dijimos

4:43:30

Last in first out Cuál es el último que

4:43:32

ha entrado el tres Pues yo tendría que

4:43:34

buscar una forma de Recuperar el

4:43:37

elemento tres de desapilar el elemento

4:43:39

tres Cuál es el elemento 3 Cómo

4:43:41

accederías en una lista en un array Pues

4:43:44

el elemento tres es el último es decir

4:43:47

la forma que yo tendría de acceder a

4:43:49

este elemento sería en realidad la

4:43:51

longitud de la lista vale pero la

4:43:53

longitud os1 porque le voy a decir e

4:43:55

Cuál es la longitud de la lista y me va

4:43:56

a decir tres porque tienes tres

4:43:58

elementos pero claro la posición tiene

4:44:00

que ser la dos Entonces el el total de

4:44:02

elementos de la lista os1 Okay entonces

4:44:05

yo ahora aquí si hiciera esa opción de

4:44:08

de alguna forma desapilar vamos a a

4:44:11

llamarle voy a quedarme con el stack

4:44:14

item Por ejemplo yo así de alguna forma

4:44:17

podría decir Ah vale ahora voy a

4:44:19

imprimir el elemento que voy a desapilar

4:44:21

stack item y antes de desapilar voy a

4:44:24

imprimir el stack a ver cómo estaba

4:44:26

vamos a ver eh teóricamente Así vamos a

4:44:29

desapilar esto en realidad hablando más

4:44:32

a nivel puro cada vez que nosotros

4:44:34

metemos un elemento en una pila Esto es

4:44:38

lo que se le llamaría la opción de Push

4:44:39

Cómo estamos tiendo un elemento Push y

4:44:42

la opción de desapilar en realidad es lo

4:44:45

que Nosotros llamamos voy a dejar esto

4:44:48

esto sería el Push y esto sería lo que

4:44:50

Nosotros llamamos pop como nosotros

4:44:51

estaríamos haciendo un Push de elementos

4:44:54

y llega un momento en el que nosotros le

4:44:55

decimos Vale ahora tienes que desapilar

4:44:57

empieza a hacer pop Okay pero qué

4:45:00

pasaría vamos a lanzar esta ejecución Y

4:45:02

qué vemos tenemos una pila que tiene el

4:45:05

elemento 1 2s y TR nosotros desapilar Ah

4:45:08

vale ostras mira Está bien yo he apilado

4:45:11

el elemento correcto Last in el último

4:45:14

en entrar fue el tres el que yo he

4:45:15

recuperado Ah sí Mira es el tres pero

4:45:18

cuando yo vuelvo a imprimir vuelve a

4:45:19

estar los tres Qué pasa que la opción de

4:45:21

desapilar es recuperar un elemento y

4:45:24

eliminarlo es decir que la opción de

4:45:27

desapilar tendría que ser también

4:45:29

eliminar este elemento el elemento del

4:45:32

índice que yo justo he desapilar

4:45:34

Entonces ahora si lanzamos esto vemos lo

4:45:37

que tiene 1 2 3 desapilar

4:45:41

Ahora solo tiene uno y dos Okay entonces

4:45:43

Oye esta es la opción aún así de

4:45:46

desapilar qué pasa podría dar fallos

4:45:48

podría lo que quiero es que entendamos

4:45:51

de forma muy muy muy muy muy pura Cómo

4:45:54

es la acción basándose en una estructura

4:45:57

que conocemos que es la lista de apilar

4:46:00

de Push y de desapilar de pop Okay pero

4:46:03

sí que es cierto que la lista por

4:46:06

defecto por ejemplo en python si yoora

4:46:08

accediera al stack yo tengo tengo una

4:46:11

operación que es directamente pop Pero

4:46:14

tenemos algo que es Push no pero tengo

4:46:16

pop pues pop en realidad vamos a hacer

4:46:18

este print aquí el primer desap que

4:46:21

nosotros hacemos y ahora vamos a

4:46:23

imprimir qué pasaría con pop esto no

4:46:26

tiene porque estar en todos los

4:46:27

lenguajes Pero la realidad es que por

4:46:29

ejemplo nuestra lista ya tiene el

4:46:31

mecanismo y decimos pop y hace ostras

4:46:35

Qué ha hecho el pop el mecanismo este

4:46:36

manual que montamos des apila el tres y

4:46:39

el pop nativo de la lista des apila el

4:46:42

dos que es el elemento que quedaba

4:46:43

después del tres y vemos que después la

4:46:45

lista pasa a tener solo el uno lo veis

4:46:48

en realidad pues bueno en python la

4:46:50

lista lo que nosotros entendemos por

4:46:52

lista en python internamente es una pila

4:46:55

porque tiene la operación pop que hace

4:46:58

justo lo que se supone que haría una

4:47:00

estructura que funcione internamente con

4:47:03

el mecanismo de con el mecanismo lifo

4:47:05

okay Así que esto es a nivel conceptual

4:47:08

así que ya tenemos lo que es una pila

4:47:10

Pero qué pasaría con la cola vamos ahora

4:47:13

a hacer una cola A ver cuál es la

4:47:15

diferencia de la cola en este caso y

4:47:17

pensar que entender cómo funcionan

4:47:19

estructuras y conocer diferentes tipos

4:47:21

de estructuras nos pueden acabar

4:47:23

sirviendo para según la lógica que

4:47:25

nosotros tengamos que montar en nuestra

4:47:27

app que trabajar con una estructura así

4:47:29

metiendo elementos y quitándolo de una

4:47:31

manera concreta es algo más que habitual

4:47:33

Así que vamos a ver ahora qué pasaría

4:47:35

con una cola cola en español Q en inglés

4:47:39

que no me quiero liar y aquí también os

4:47:43

decía el mecanismo que tiene que

4:47:46

utilizar Pues en vez de ser lifo es fifo

4:47:49

vale si lifo significaba Last in first

4:47:52

out Qué significará fifo significará

4:47:54

First in first out Qué es eso First in

4:47:58

el primero en entrar es el primero en

4:48:00

salir y ahora cómo será esto Pues bueno

4:48:02

vamos a hacer una estructura también con

4:48:04

una lista y vamos a añadirle elemento

4:48:08

Cómo añadiríamos elemento Pues bueno

4:48:10

idad yo puedo seguir añadiéndolo igual

4:48:13

porque el mecanismo que tiene la lista

4:48:15

para Añadir elementos Aunque nosotros

4:48:17

podríamos Añadir elementos en sitios

4:48:18

concretos y tal por defecto Nosotros le

4:48:20

podríamos volver decir lo mismo Pues

4:48:22

mira quiero Añadir otra vez tres

4:48:24

elementos comento el uno el dos y el

4:48:26

tres y voy a imprimir como está la cola

4:48:29

vale a la acción de Añadir elementos hay

4:48:33

gente que le llama también Push a esta

4:48:35

opción bueno eh digamos que aquí sería

4:48:37

encolar desencolar sería en que

4:48:39

básicamente emp a meterle elementos pero

4:48:42

ahora Llegará el momento en el que

4:48:43

nosotros tenemos que retirar elementos

4:48:45

de que cómo hacemos esto claro yo aquí

4:48:48

ya no puedo venir e intentar hacer por

4:48:51

ejemplo esto digo Bueno pues le hago pop

4:48:54

no Qué pasará si le hago pop a la cola

4:48:57

si le hago pop a la cola lo que

4:48:58

acabaremos teniendo es que lo que está

4:49:00

desencolado en realidad es el tres en

4:49:02

realidad está haciendo que funcione como

4:49:04

una pila pero nosotros queremos que

4:49:05

funcione como una cola es decir que el

4:49:07

primero que ha entrado el uno es el que

4:49:10

nosotros tendríamos que quitar Okay pues

4:49:13

cómo podríamos hacer esto con la

4:49:14

operación de pop en realidad claro la

4:49:17

lista digamos que no deja de ser una

4:49:19

estructura más inteligente y más

4:49:22

compleja que la pila y la cola la lista

4:49:24

en realidad es una estructura ordenada

4:49:26

de elementos que nos permite hacer con

4:49:28

los elementos lo que querramos acceder a

4:49:30

ellos como nos dé la gana eliminarlos

4:49:32

por donde nos dé la gana la lista es un

4:49:34

mecanismo pues como decía es una

4:49:35

estructura mucho más compleja pero que

4:49:37

por debajo tiene que implementar

4:49:39

mecanismos de pila y de de cola cómo

4:49:41

sería ahora eh la interacción de la

4:49:44

lista si fuera una cola puramente Pues

4:49:47

nosotros tendríamos que decirle pop pero

4:49:49

hace el pop del elemento cero el

4:49:50

elemento cero Cuál es el elemento cero

4:49:53

siempre va a ser el primer elemento de

4:49:54

la lista el elemento más viejo de la

4:49:56

lista o por lo menos a nivel orden que

4:49:59

es lo que importa pensar una cola Vale

4:50:01

ahora nosotros nos ponemos en una cola

4:50:03

estamos en una cola para entrar al cine

4:50:06

y empieza a llegar gente y se empieza a

4:50:08

situar una persona detrás de la otra

4:50:11

Cuál es la primera persona que van a

4:50:12

atender la persona que llegó de última

4:50:14

No eso era la pila pero en la cola si tú

4:50:18

estás para entrar o para comprar el

4:50:19

boleto del cine y te has puesto a la

4:50:22

cola Cómo se llama Okay pues la cola de

4:50:25

la persona que va a comprar es la

4:50:27

persona que está delante de todo la

4:50:29

primera persona que ha llegado allí

4:50:30

básicamente entonces aquí es cuando

4:50:32

entra el fifo First in first out la

4:50:35

primera persona que ha llegado es la

4:50:36

primera persona que van a atender Aunque

4:50:38

hayan llegado muchas personas y se hayan

4:50:40

colocado tocado por detrás por eso aquí

4:50:42

el pop lo hacemos de el elemento cero

4:50:44

ahora hago esto que desencolar de 1 2 3

4:50:48

desencolar el uno y queda el dos y el

4:50:51

tres Okay lo podríamos hacer también de

4:50:53

una manera manual por supuesto pensar

4:50:55

que teníamos aquí el mecanismo de

4:50:57

desencolado manual le voy a llamar u

4:51:00

item y claro cómo desencolar aquí

4:51:02

tenemos la cola y aquí tendríamos que

4:51:05

acceder aquí por defecto al elemento

4:51:07

cero ya está y aquí tendríamos el

4:51:09

elemento cero que yo podría acabar

4:51:11

eliminando el elemento cero siempre de

4:51:14

la q y el Q item en realidad ahora si

4:51:16

corremos el programa veis que lo que

4:51:18

primero desen colola es el uno lo

4:51:19

segundo que desen colola es el dos y

4:51:21

queda el tres al contrario que aquí que

4:51:23

en realidad quedaba el uno veis que le

4:51:25

ha dado la vuelta lo voy a cambiar

4:51:27

incluso para que queden enteros que no

4:51:29

hace falta ni que sean cadenas de texto

4:51:31

así lo dejamos como mucho más simple y

4:51:33

esto básicamente es el mecanismo de una

4:51:35

pila y de una cola entonces pensar que

4:51:37

utilizando esta estructura podéis hacer

4:51:39

que la lo

4:51:41

sea distinto aquí quiero que os quedéis

4:51:43

con el concepto más puro pensar que

4:51:46

ahora según el lenguaje en el que

4:51:48

estemos la estructura en la que os basé

4:51:51

si os basán array tendréis que

4:51:53

implementar más cosas porque la array sí

4:51:55

que es una estructura mucho más básica y

4:51:57

fundamental pero por ejemplo la lista ya

4:51:59

es una superestructura sobre la Ray que

4:52:01

en realidad Está implementando estos

4:52:03

mecanismos que también actuarían por

4:52:06

encima de la Ray Así que quedaros con la

4:52:08

teoría sobre todo y de cómo yo he

4:52:11

utilizado una estructura que ya

4:52:12

conocíamos para implementar el

4:52:13

funcionamiento de pila y de cola yo qué

4:52:15

haría en vuestro lenguaje Buscar có

4:52:18

implementar pilas y colas con una

4:52:20

estructura como un array y como una

4:52:22

lista porque igual el pop que yo tengo

4:52:24

aquí en vuestro lenguaje igual no existe

4:52:26

y hay que hacerlo a mano como yo hice

4:52:28

aquí al principio pero lo importante más

4:52:30

que nada Lo importante de verdad es que

4:52:32

entendáis el cómo funciona y como yo

4:52:35

ahora me he puesto a retocar una

4:52:37

estructura y cómo he sido capaz de ular

4:52:41

dos tipos de funcionamiento distintos

4:52:43

uno para pilas otro para colas y ahora

4:52:45

lo que os ponía aquí en el extra que yo

4:52:47

creo que esto también es muy importante

4:52:48

porque ahora dijimos bueno Bray sí

4:52:50

fantástico lo que acabas de hacer pero

4:52:53

como yo es la primera vez que veo esto

4:52:55

de verdad me valdría para algo en la

4:52:57

vida real y lo que os puse en la

4:52:59

dificultad extra que se llama dificultad

4:53:01

extra Pero simplemente son un ejercicio

4:53:03

extra no porque sea especialmente más

4:53:06

difícil por ejemplo en este caso no es

4:53:07

muchísimo más difícil Vale y os ponía

4:53:09

caso real

4:53:10

os ponía un caso real para que tengáis

4:53:12

que implementar el mecanismo de una pila

4:53:16

y por otro lado el mecanismo de una cola

4:53:19

vamos a leer el primer subejercicio y

4:53:22

vamos a implementarlo para entender Cómo

4:53:24

podríamos llegar a necesitar una pila

4:53:26

para resolver un problema lógico y os

4:53:28

ponía un problema lógico que podría

4:53:30

acabar siendo un problema real no os

4:53:32

decía utiliza la implementación de pila

4:53:33

y cadenas de texto simula el mecanismo

4:53:37

adelante y atrás de un navegador web

4:53:39

crea un programa en el que puedas

4:53:41

Navegar a una página o indicarle que te

4:53:43

quieres desplazar adelante o atrás

4:53:46

mostrando en cada caso el nombre de la

4:53:47

web y os decía que si escribía la

4:53:49

palabra adante navegaba hacia adante la

4:53:51

palabra atrás navegaba hacia atrás y

4:53:53

desencadena estas palabras son las que

4:53:55

desencadena la acción y si no nosotros

4:53:57

lo que metíamos era una URL vale Así que

4:54:00

vamos a ver cómo ahora implementar una

4:54:02

pila en un caso pues que podría estar

4:54:04

más pegado a la realidad vengo aquí a la

4:54:07

parte extra y voy a hacer aquí como la

4:54:09

implementación esto que dijimos de una

4:54:11

web Y decía que creamos un programa que

4:54:12

simular el mecanismo de una navegación

4:54:14

de una web Entonces yo que sé voy a

4:54:16

crear una función web navigation por

4:54:19

ejemplo un programa cualquiera sin más

4:54:21

vale Y voy a llamar a mi programa Aquí

4:54:23

web navigation qué decía el programa que

4:54:25

tiene que simular el mecanismo de una

4:54:27

web con una pila entonces me voy a crear

4:54:29

un stack por qué porque esta pila es la

4:54:32

que va a ser capaz de almacenar las webs

4:54:34

que como si nosotros empezáramos a

4:54:36

navegar una web pinchamos un enlace nos

4:54:38

vamos a otra web pinchamos otro enlace

4:54:39

nos vamos otra web okay Así que vamos a

4:54:42

intentar representar lo más fácil claro

4:54:44

Imagínate que yo en mi programa de

4:54:47

momento aú no tengo nada le dijera Ey

4:54:49

navega a la web moure.drapp.com.ar

4:55:10

por ejemplo podamos trabajar desde

4:55:11

terminal así que me voy a hacer un W

4:55:13

true por ejemplo para que esto se

4:55:15

ejecute en un bucle infinito y voy a

4:55:17

recoger una acción del usuario adelante

4:55:20

atrás o una web y yo le voy a meter un

4:55:22

extra para poder salir del programa vale

4:55:24

Así que voy a recuperar una acción

4:55:26

action le voy a llamar y al usuario se

4:55:29

le va a pedir algo le puedo decir añade

4:55:31

una URL o navega con las palabras

4:55:35

adelante atrás salir para que así el

4:55:38

usuario pues puede introducir pues lo

4:55:41

que él quiera Okay entonces yo me voy a

4:55:42

guardar en esta variable lo que me pida

4:55:44

el usuario si yo ahora arrancara el

4:55:46

programa veis que va a quedar aquí va a

4:55:48

ejecutar todo lo que teníamos antes pero

4:55:49

se nos va a quedar aquí la consola añade

4:55:51

una URL o interactúa con palabras

4:55:53

adelante atrás una URL como si nosotros

4:55:56

estuviéramos navegando a algún sitio

4:55:58

Vale qué va a poder pasar este action

4:56:01

Pues en realidad action igual lo que nos

4:56:04

vale es salir Qué pasa si sale pues

4:56:07

Tendremos que hacer una opción pero

4:56:08

también action igual vale la palabra

4:56:12

adelante y Igual también vale la palabra

4:56:16

atrás tilde y ya por último si no es ni

4:56:19

salir ni adelante ni atrás nosotros lo

4:56:21

interpretamos como que es una navegación

4:56:23

a una web ya digo esto es más entender

4:56:25

la lógica de la pila y de la cola que no

4:56:27

lea el chat y alguien me esté diciendo

4:56:29

es que bry podría fallar porque no sé

4:56:31

qué Y si mete una URL que no es una URL

4:56:34

no se trata de eso es decir el programa

4:56:36

no se trata de controlar urls sino de

4:56:39

utilizamos esta excusa sobre algo que

4:56:41

para nosotros es tangible que es un

4:56:43

navegador y movernos por el navegador

4:56:45

para poder entender el funcionamiento

4:56:47

por ejemplo aquí de una pila Okay lo de

4:56:49

siempre también si vosotros Mi misión

4:56:52

explicando este ejercicio es centrarme

4:56:54

en pilas y colas si vosotros queréis

4:56:56

meterle más controles y que esto acabe

4:56:58

siendo un programa donde si no mete una

4:57:01

URL válida que falle y no la deje

4:57:04

introducir o lo que sea implementar todo

4:57:06

lo que querrás pensar que estos

4:57:08

ejercicios sirven para que vosotros

4:57:10

liquis y vosotros mejoré Así que vamos a

4:57:12

intentar de momento voy a ponerle aquí

4:57:14

un pas Porque nada va a hacer nada esto

4:57:16

ya sabéis que podría ser también un Case

4:57:18

bueno Siempre os lo dejo en los casos

4:57:20

más simples para que todo el mundo lo

4:57:22

entienda tenga más o menos nivel lleve

4:57:24

más o menos tiempo aprendiendo vale Esto

4:57:26

va a empezar a preguntarle a modo de

4:57:28

bucle infinito siempre al usuario le va

4:57:30

a decir he usuario allá de una URL el

4:57:32

usuario va a teclear algo va a pulsar

4:57:34

enter y se va a desencadenar una acción

4:57:36

y le va a volver a preguntar y le va a

4:57:37

volver a preguntar le va a volver a

4:57:39

preguntar hasta cuá Hasta que el usuario

4:57:41

escriba salir Entonces cuando escriba

4:57:42

salir qué voy a hacer voy a hacer un

4:57:44

break para que se rompa este bucle

4:57:45

infinito y me acabe mi programa Ya está

4:57:47

si yo escribo salir puedo hacer aquí un

4:57:49

print y le digo saliendo el navegador

4:57:52

web Imagínate si yo hago salir digo esto

4:57:54

es todo fantasía pero para que

4:57:56

entendamos Que aquí pararías vale qué

4:57:58

haríamos en realidad si metemos algo

4:58:01

pues cómo hacíamos en un stack para

4:58:04

Añadir elementos pues lo añadí en este

4:58:06

caso con python con un append Así que

4:58:08

vengo por aquí y que qu meteríamos el

4:58:10

action lo que ha metido el usuario el

4:58:13

texto que ha metido el usuario Porque si

4:58:15

llega a este els significa que el texto

4:58:17

que ha escrito no es ni salir ni

4:58:18

adelante ni atrás que son los textos que

4:58:20

desencadenan alguna acción con lo cual

4:58:22

nosotros lo interpretarías como que es

4:58:23

una web ya digo Aquí ya depende de

4:58:25

vosotros si queréis controlar la web o

4:58:27

no Yo no lo voy a controlar porque no

4:58:28

importa porque así no nos va a servir

4:58:30

para entender ni mejor ni peor el stack

4:58:32

entonces tendríamos esto y qué podríamos

4:58:34

hacer una vez añadimos una web pues

4:58:37

podríamos empezar a imprimir aquí en qu

4:58:40

web estamos y cómo sabríamos En qué web

4:58:43

estamos Cómo funcionaba el stack

4:58:45

nosotros empezamos a a Pilar cosas pero

4:58:48

claro yo podría decirle Claro pues yo

4:58:50

ahora vengo por aquí al stack y lo que

4:58:53

imprimo es el último elemento vengo por

4:58:56

aquí len del stack os1 Y así pues claro

4:59:00

si yo no si no navego ni adelante ni

4:59:02

atrás fijaos en el programa vamos a

4:59:04

intentar probarlo vengo por aquí y le

4:59:06

digo Ey salir y qué me dice saliendo el

4:59:09

naveg web Ah mira el salir funciona Okay

4:59:12

venga vamos a probar ahora a navegar a

4:59:15

algún sitio voy a ponerle algo que no

4:59:17

sea ni salir ni adelante ni atrás moure

4:59:19

deev como si fuera una URL pincho aquí y

4:59:22

me dice moure deev y ahora veis que me

4:59:25

vuelva a preguntar añad una URL claro he

4:59:27

navegado Book infinito me vuelve

4:59:29

preguntar y ahora dem mour deev

4:59:32

imagínate que yo pinchara un enlace que

4:59:34

me lleva a moure.drapp.com.ar

4:59:40

Por qué Porque el stack siempre está

4:59:42

añadiendo al final el elemento y yo

4:59:44

siempre estoy printe el último elemento

4:59:46

digo vale Okay pero qué pasa cuando yo

4:59:48

ahora me ponga a navegar igual así ya no

4:59:50

me va a quedar tan bien todo esto pues

4:59:52

primero lo que voy a hacer aquí es poner

4:59:54

un texto que diga has navegado a la web

4:59:58

y Aquí vamos a poner lo que ya estábamos

5:00:00

imprimiendo vale pero decía y si ahora

5:00:03

me voy atrás si ahora me voy adelante

5:00:06

claro yo ahora me voy atrás y yo

5:00:07

seguiría imprimiendo la última web qué

5:00:09

pasaría en realidad yo tendría que

5:00:11

guardar alguna especie de referencia a

5:00:14

la web de que claro yo me estoy

5:00:17

desplazando atrás Cómo podríamos hacer

5:00:19

eso Okay vamos a pensar que yo ahora voy

5:00:22

atrás y tenemos que utilizar el

5:00:25

mecanismo atrás este que tenemos aquí

5:00:28

pero que en realidad tendría que acabar

5:00:31

representando cómo funciona una pila

5:00:34

Cómo haríamos todo esto vengo atrás qué

5:00:36

hacía el atrás Si nosotros tenemos que

5:00:38

intentar utilizar un stack decíamos algo

5:00:41

así como que nosotros podíamos venir al

5:00:43

stack y hacerle pop Okay entonces vamos

5:00:45

a ver a ver si somos capaces de ahora

5:00:48

haciéndole pop a ver si seríamos capaces

5:00:50

de ir hacia atrás vamos a lanzar el

5:00:52

programa voy a meter una web Le digo que

5:00:53

me voy a moure deev y me dice Has

5:00:57

navegado a m.dv y yo ahora le digo ahora

5:00:59

voy a seguir navegando htps m.dv bar

5:01:03

cursos vale Y me dice Has navegado a la

5:01:06

web cursos y ahora le voy a decir atrás

5:01:09

qué me ha dicho has navegado a la web

5:01:11

https moure.drapp.com.ar

5:01:39

soy capaz de imprimir nada aquí qué

5:01:41

podríamos hacerle vamos a hacer lo

5:01:43

siguiente le voy a hacer If si el stack

5:01:45

este que tengo por aquí la longitud del

5:01:48

stack tiene que ser qué mayor que cero

5:01:50

me debería tener algún elemento si no

5:01:53

esto sería algo así por fingir el

5:01:55

mecanismo sería algo así como que

5:01:57

nosotros estamos en la página de inicio

5:02:00

nosotros Claro partimos de una página de

5:02:02

inicio y ahora hago otra vez atrás y

5:02:05

navego a m.dv y ahora hago otra vez

5:02:07

atrás y me dice estás en la página al

5:02:10

inicio y ahora hago otra vez atrás y

5:02:12

Por qué Porque el atrás lo ves aquí

5:02:16

estoy intentando cargarme elementos de

5:02:18

una lista que en realidad no tiene nada

5:02:20

Qué Tendremos que acabar controlando

5:02:21

aquí más de lo mismo en realidad yo

5:02:23

tengo que hacer POP si la lista en

5:02:26

realidad tiene elementos entonces así ya

5:02:28

controlamos que también pueda yo querer

5:02:31

eliminar un elemento que en realidad ni

5:02:33

tenga Y ahora esta era la trampa que os

5:02:35

dejaba qué pasa con el Adelante esta era

5:02:37

la trampa esta era un poco la parte de

5:02:39

pensar que os quería dejar yo claro cómo

5:02:41

implementamos el adelante porque Alguien

5:02:43

podría pensar sí me voy al último

5:02:45

elemento o intento avanzar fijaos fijaos

5:02:49

que el explorador web no es una pila el

5:02:53

explorador web como nosotros lo

5:02:55

utilizamos en realidad es una lista es

5:02:57

una lista que muy bien Nosotros podemos

5:03:00

apilar podemos ir hacia atrás pero en

5:03:04

realidad con el mecanismo de stack

5:03:06

simplemente nosotros el adelante nunca

5:03:10

lo tenemos porque cada vez que nosotros

5:03:12

vamos para atrás nos cargamos el

5:03:14

elemento Entonces sería imposible con el

5:03:16

stack puramente hacer el mecanismo hacia

5:03:19

delante el mecanismo hacia delante sería

5:03:21

como en realidad quedarnos en la misma

5:03:24

página no haríamos nada esta Era una

5:03:26

pequeña trampa Porque alguien podía

5:03:27

pensar vale Y yo ahora me empiezo a

5:03:29

desplazar por la lista de webs pero

5:03:31

claro si me empiezo a desplazar por la

5:03:33

lista de webs En realidad tú no estarías

5:03:35

utilizando una pila porque la pila se

5:03:37

está cargando el último elemento en

5:03:39

realidad ahí sí que tendrías que

5:03:41

utilizar una lista como tal donde tú no

5:03:43

te estás cargando los elementos en

5:03:45

realidad un explorador lo que está

5:03:47

haciendo siempre es está funcionando

5:03:49

como una lista y en el momento que

5:03:52

navegamos hacia atrás y pinchamos en un

5:03:55

elan en un enlace él se carga todo lo

5:03:58

que tenía hacia delante imagínate a ver

5:04:00

si soy capaz

5:04:01

de de pintarlo imaginaos cómo

5:04:04

funcionaría el stack de un explorador yo

5:04:08

navego a esta web y después desde esta

5:04:11

web navego a esta web y después desde

5:04:13

esta web navego a esta web Entonces

5:04:16

digamos que yo ahora mismo tengo como un

5:04:18

cursor que está apuntando aquí dice ey

5:04:21

Esta es la web que se está visualizando

5:04:23

y yo ahora pincho en el explorador atrás

5:04:26

y Qué hago cuando pincho atrás que en

5:04:27

realidad el cursor se sitúa aquí pero no

5:04:30

se ha cargado este elemento este

5:04:32

elemento sigue existiendo porque yo

5:04:34

ahora si hago adante me voy aquí pero

5:04:37

qué pasaría que yo ahora estoy aquí y le

5:04:39

digo atrás Me voy atrás y yo ahora desde

5:04:42

esta web navego a otro sitio Entonces

5:04:45

qué pasaría navegaría a otra web Y

5:04:48

entonces en el momento que navego a otra

5:04:50

web el sí que se carga este elemento o

5:04:53

todos los que tuviera hacia delante y

5:04:55

empieza como una nueva lista claro Así

5:04:57

que esto era un poco la trampa para que

5:04:59

vosotros vierais decir Ey si yo con un

5:05:02

stack es que no lo puedo hacer no sería

5:05:05

un stack como tal pero pensar que tiene

5:05:08

una parte que podría funcionar con como

5:05:09

él era trampita para que no fuera tan

5:05:12

simple para que llegáramos a ese

5:05:13

funcionamiento si le habéis dado vuelas

5:05:15

si lo habéis implementado pues

5:05:16

desplazando sin eliminar o lo que sea

5:05:18

bueno que por lo menos tengáis claro el

5:05:21

Por qué un stack puramente no podría

5:05:24

hacer eso porque en el stack siempre que

5:05:26

nosotros queremos acceder a un elemento

5:05:29

lo estamos eliminando le estamos

5:05:30

haciendo el pop que vimos antes lo

5:05:32

estamos quitando Así que quedaros con

5:05:34

esa parte Entonces el adelante en

5:05:36

realidad es algo que así tal cual con el

5:05:40

funcionamiento del stack puro y duro no

5:05:42

lo podríamos hacer vale listo esto y si

5:05:44

quisiera yo ahora hacer el otro

5:05:47

ejercicio a ver qué nos pedía el otro

5:05:48

ejercicio el otro ejercicio nos decía lo

5:05:50

siguiente utilizando ahora la

5:05:52

implementación de cola y cadenas de

5:05:54

texto simula el mecanismo de una

5:05:56

impresora compartida que recibe

5:05:58

documentos y los imprime cuando así Se

5:06:00

le indica la palabra imprimir imprime

5:06:02

cada elemento de la cola el resto de

5:06:04

palabras se interpretan como nombres de

5:06:05

documentos para que veáis pues otro

5:06:07

funcionamiento pues algo parecido voy a

5:06:10

comentar este web navigation para que no

5:06:13

se llame no y me voy a crear una función

5:06:15

Def y le voy a llamar impresora printer

5:06:17

o online printer no porque era

5:06:19

compartida o shared printer vale share

5:06:22

printed ponemos por aquí y esta es como

5:06:24

esa función que va a intentar simular

5:06:26

una impresora pero en este caso con una

5:06:29

cola y qué pasa la cola inicialmente

5:06:31

también la explicamos con una lista y

5:06:34

nosotros vamos a tener un programa que

5:06:35

le va a ir pidiendo cosas al usuario es

5:06:37

decir más de lo mismo el wil TR este que

5:06:39

veíamos antes vamos a hacerlo igual y el

5:06:42

action pero aquí en este caso bueno no

5:06:44

le decimos lo de Navegar le tenemos que

5:06:45

pedir otra cosa le voy a decir pues no

5:06:48

lo sé añade le voy a decir añade un

5:06:50

documento o m selecciona imprimir o

5:06:54

salir Le puedo meter aquí lo podríamos

5:06:56

hacer así vale qué haría en este caso

5:06:58

qué tendríamos en este caso qué pasaría

5:07:00

ahora en este caso pues que lo que

5:07:02

podría pasar igual que antes teníamos el

5:07:04

salir el Adelante el atrás Pues ahora

5:07:06

action puede valer salir que este ya

5:07:08

sabemos lo que tenemos que hacer un

5:07:10

break acabamos pero también lo que puede

5:07:13

valer Es que este action sea imprimir o

5:07:17

un caso por defecto imprimir le ponemos

5:07:19

pas de momento porque no hacemos nada y

5:07:21

el pas y el último caso que sería Pues

5:07:24

que teóricamente se añada un nuevo

5:07:26

documento lo tenemos fácil no Añadir un

5:07:28

nuevo documento esto ya lo hemos visto

5:07:30

un montón de veces hoy voy a la cola le

5:07:32

hago un append y le meto la acción que

5:07:35

teóricamente va a ser un documento hasta

5:07:37

aquí perfecto pero qué pasa

5:07:40

Si queremos imprimir yo aquí podría

5:07:42

estar consultando directamente la cola

5:07:45

de mi impresión podríamos poner aquí

5:07:47

como está toda la cola de la impresión

5:07:49

perfecto podría hacer un print y hacerle

5:07:52

cola de impresión e imprimo lo que yo

5:07:54

tengo la cola para ir viendo un poco

5:07:56

pues queé tenemos aquí vale que lanzo mi

5:07:59

programa Vamos para aquí añado un

5:08:00

documento o selecciona imprimir salir

5:08:03

voy a probar el salir ya veis sale

5:08:05

perfectamente vamos ahora a meterle algo

5:08:07

imagínate que fuera pues un documento

5:08:09

que sea pues me da igual que yo quiero

5:08:12

imprimir una factura

5:08:14

factura.pdf pues como yo he puesto algo

5:08:16

distinto de salir o imprimir veis cola

5:08:18

de impresión ahora está factura PDF y

5:08:21

voy a Añadir otro documento por ejemplo

5:08:24

Pues no lo sé factura

5:08:27

2.pdf ahora la cola de impresión tiene

5:08:29

factura PDF y factura 2 PDF Qué pasa si

5:08:33

yo ahora selecciono que quiero imprimir

5:08:35

si yo selecciono que quiero imprimir me

5:08:37

voy al último elemento le hacemos un un

5:08:39

pop no antes lo explicamos lo que le

5:08:41

tenemos que hacer en realidad es un pop

5:08:44

del primer elemento lo vimos aquí en la

5:08:46

explicación en la cola es First in first

5:08:49

out que es el primer elemento que yo

5:08:50

metí factura PDF con lo cual cuando yo

5:08:52

escriba imprimir tiene que imprimir el

5:08:54

primer elemento que entró en la cola Así

5:08:56

que voy a hacer un print y voy a poner

5:08:58

imprimiendo Y qué voy a imprimir Pues de

5:09:01

mi cola el pop pero del elemento Cero en

5:09:03

este caso más de lo mismo Imagínate que

5:09:06

pulsan imprimir y ya no hay elementos

5:09:08

aquí ya hacíamos un control y decíamos

5:09:10

Ey que haya elementos no me la vayas

5:09:12

liar voy a venir por aquí y voy a hacer

5:09:14

Mira yo voy a imprimir en realidad sí en

5:09:17

este caso no el stack si la cola tiene

5:09:20

más de un elemento Okay lanzamos esto a

5:09:22

ver venga vamos a meter elementos

5:09:24

factura PDF y voy a meter ahora factura

5:09:29

2.pdf aquí tenemos cola de impresión y

5:09:32

ahora pongo imprimir y me dice

5:09:33

imprimiendo factura PDF Qué se ha puesto

5:09:36

a imprimir se ha puesto a imprimir el

5:09:37

primer elemento que entró y ahora voy a

5:09:39

venir por aquí y hago imprimir otra vez

5:09:41

y qué imprime ahora factura dos y la

5:09:43

cola de impresión ya está vacía imprimir

5:09:45

no hace nada aquí le podríamos poner un

5:09:47

mensaje de la cola de impresión está

5:09:49

vacía o lo que fuera salir y esto

5:09:51

básicamente es pues dos pequeños casos

5:09:54

de prueba para que podáis llevar no sé

5:09:57

algo más real aunque no sea esto una una

5:09:59

fantasía de aplicación lo podéis llevar

5:10:01

algo más real para qué podríamos

5:10:03

utilizar el caso de una pila y una cola

5:10:06

con el mecanismo que yo os propuse

5:10:08

[Música]

5:10:13

concepto de clases nos dice explora el

5:10:15

concepto de clase y crea un ejemplo que

5:10:18

implemente un inicializador atributos y

5:10:19

una función que los imprima teniendo en

5:10:21

cuenta las posibilidades de tu lenguaje

5:10:22

os pedía que buscaréis información sobre

5:10:24

Qué es una clase en cualquier lenguaje

5:10:26

orientado objetos que son la gran

5:10:28

mayoría el concepto de clase es un Pilar

5:10:31

básicamente Qué significa esto los

5:10:33

objetos son entidades son entidades con

5:10:35

unas características y ya hemos visto

5:10:38

algunas estructuras que hay en el

5:10:39

lenguaje de programación algunas

5:10:41

funciones Bueno ya hemos visto cosillas

5:10:44

que podemos utilizar los lenguajes de

5:10:45

programación Pero qué pasaría si ahora

5:10:48

nosotros quisiéramos empezar a crear

5:10:50

nuestra propia lógica nuestras propias

5:10:52

entidades nuestros propios objetos pues

5:10:55

sobre esto es sobre lo que se construye

5:10:57

toda la programación orientada a objetos

5:10:59

y vamos a ver qué nos pedía el ejercicio

5:11:01

a ver el concepto de clase esto qué tan

5:11:03

complejo es decía expa el concepto de

5:11:05

clase y crea un ejemplo que implemente

5:11:07

un inicializador atributos una función

5:11:09

que los imprima teniendo en cuenta las

5:11:11

posibilidades de tu lenguaje una vez

5:11:12

implementada créala establece sus

5:11:14

parámetros modifícalo imprímelos

5:11:15

utilizando la función vale el concepto

5:11:17

de clase tenéis que ver un poco cómo

5:11:19

funciona en cada lenguaje pero

5:11:21

básicamente en python Quiero crear una

5:11:23

clase Quiero crear mi propio objeto un

5:11:24

objeto que voy a modelar yo con mis

5:11:26

parámetros con mis funciones con esas

5:11:28

cosas que digo vale algo que yo quiero

5:11:30

acabar extrayendo una clase un objeto

5:11:32

hasta ahora lo que hacíamos era utilizar

5:11:34

clases mecanismos objetos que ya

5:11:36

existían dentro del lenguaje pero ahora

5:11:38

imagínate que yo quiero hacer algo que

5:11:41

no existe en el lenguaje Imagínate que

5:11:42

yo ahora lo que quisiera era definir un

5:11:45

programador Necesito un objeto

5:11:46

programador Pues bueno el objeto

5:11:48

programador no existe en el lenguaje

5:11:50

pero como tenemos la posibilidad de

5:11:52

crear clases tengo la posibilidad de

5:11:53

modelar a mi gusto esta entidad Cómo

5:11:55

creamos una clase habitualmente con la

5:11:57

palabra reservada Class todo depende un

5:11:59

poco de los lenguajes pero ya digo la

5:12:00

explicación es bastante genérica y a

5:12:03

diferencia de en python que todos lo

5:12:05

escribimos en minúsculas en snake cas

5:12:06

separado por gu bajo el nombre de las

5:12:08

clases sí que va en apper camel Case es

5:12:11

decir la primera palabra de cada frase

5:12:13

tiene que ir o si son palabras

5:12:15

compuestas o lo que sea es decir el

5:12:17

nombre cada palabra tiene que ir la

5:12:18

primera mayúscula en este caso que le

5:12:20

voy dar a esta entidad el nombre

5:12:22

programer voy a hacer una clase llamado

5:12:25

programador Okay entonces ya tengo la

5:12:27

entidad y ahora la entidad yo la podría

5:12:29

definir como a mí me diese la gana

5:12:30

Imagínate que yo ahora lo que quiero es

5:12:32

vale Quiero modelar un objeto que sea un

5:12:35

programador y este programador pues qué

5:12:37

podría tener un programador un un nombre

5:12:39

y una edad imaginemos un nombre y una

5:12:42

edad y un lenguaje imagínate Pues para

5:12:46

eso es el siguiente concepto que quiero

5:12:48

introducir que es lo que veis aquí la

5:12:50

parte del inicializador okay Así que yo

5:12:52

puedo venir por aquí y escribir init Qué

5:12:54

sería init init es una función Entonces

5:12:57

yo ahora podría crear una función de

5:12:59

inicialización que veis que lo que

5:13:01

recibe es self Es decir el objeto mismo

5:13:03

pero aparte de self aparte del objeto lo

5:13:06

que puede definir es diferentes

5:13:08

parámetros

5:13:09

Yo quisiera que un programador tuviera

5:13:11

un nombre simplemente se los paso como

5:13:12

parámetros separados con comas como si

5:13:14

fuera una función de hecho esto es una

5:13:16

función pero es una función reservada

5:13:18

propia del sistema Okay así que sin más

5:13:21

lo único que tenemos que hacer es name

5:13:23

que yo le quiero pasar el H y el

5:13:25

Language por ejemplo y esta sería la

5:13:27

manera de decir yo ahora ya tengo un

5:13:28

objeto que va a poder tener estos tres

5:13:31

valores en concreto Si lo quisiéramos

5:13:33

definir un poco más sería tan fácil como

5:13:35

decirle Mira mi objeto en realidad el

5:13:36

nombre va a ser un String el H va a ser

5:13:39

un int y el lenguaje que sea una lista y

5:13:42

le digo pues va a ser una lista aquí

5:13:44

dice retorna Non porque de momento no

5:13:46

retorna nada Pero para qué nos va a

5:13:48

servir el inicializador el inicializador

5:13:51

es lo que Define los valores iniciales

5:13:54

de nuestra clase de nuestro objeto y lo

5:13:56

que hay que hacer siempre es acabar

5:13:57

asignándoles esto lo tenemos que hacer

5:13:59

de forma obligatoria es decir yo ahora

5:14:01

le voy a pasar un parámetro que es name

5:14:03

h y languages pero tengo que acabar como

5:14:05

almacenándolos en la clase decir dentro

5:14:07

de self le tengo que decir vale Y dónde

5:14:09

quieres guardar Por ejemplo el H

5:14:11

imagínate edad y le digo que en edad voy

5:14:14

a acabar almacenando H habitualmente

5:14:16

también como buena práctica se le suele

5:14:18

dar el mismo nombre pero qué pasa esto

5:14:20

es una función aquí podríamos hacer

5:14:22

operaciones aquí podríamos acabar

5:14:23

haciendo extras vale Simplemente yo me

5:14:26

voy a guardar Esto entonces yo ya

5:14:27

tendría el inicializador okay Y qué me

5:14:29

dice aparte el ejercicio me decía Mira

5:14:32

tienes que crear una función con un

5:14:35

inicializador atributos y una función

5:14:37

que los imprima mi objeto programmer va

5:14:40

a ser inteligente porque por una parte

5:14:43

va a tener los parámetros que a mí me da

5:14:45

la gana que cuadran con la lógica que yo

5:14:46

quiero montar y también me dice que va a

5:14:49

tener la capacidad de imprimirlo

5:14:50

entonces voy a crear una función que por

5:14:52

ejemplo le voy a llamar print sin más

5:14:54

las funciones de una clase tienen que

5:14:56

acabar recibiéndose a sí mismo vale para

5:14:58

poder interactuar precisamente con estos

5:15:00

parámetros que ahora ya son propiedades

5:15:02

de clase y sin más esta función va a

5:15:05

imprimir qué puedo imprimir Puedo

5:15:06

ponerle nombre y aquí el digo sería el

5:15:10

name Uy no sabe lo que es el name por

5:15:12

qué no sabe que es el name porque tengo

5:15:14

que acceder a él a través de self nombre

5:15:17

edad self ag y lo último lenguajes y

5:15:20

aquí los lenguajes sin más pues la lista

5:15:22

languages self languages con esto sería

5:15:25

suficiente Y ahora cómo interactúo yo

5:15:27

con este programador pues imagínate que

5:15:29

ya existe este objeto que ya existe la

5:15:31

clase programador qué tendría que hacer

5:15:32

yo ahora tendría que instanciar la clase

5:15:34

recordáis que nosotros creamos una

5:15:36

variable por ejemplo my programmer y yo

5:15:39

ahora podría acceder a un objeto que es

5:15:41

programmer lo veis por aquí y yo puedo

5:15:43

instanciar el nombre de la clase y abro

5:15:46

y cierro los paréntesis para instanciar

5:15:48

para crear ese objeto Pero qué pasaría

5:15:51

este programmer veis lo que dice aquí

5:15:53

dice no no no no tú no puedes instanciar

5:15:56

si no le dices que necesita un nombre

5:15:58

una edad y unos lenguajes Entonces yo

5:16:00

vendría por aquí y diría Ah okay Okay

5:16:02

Perdona este es bryce su edad es 36 años

5:16:06

y los lenguajes decía que le que

5:16:09

pasáramos una lista pues le digo python

5:16:11

cotlin y Swift y aquí me da igual lo que

5:16:14

esté haciendo dentro fijáis Yo ya tengo

5:16:16

un objeto inteligente este objeto podría

5:16:18

acabar haciendo la lógica que a nosotros

5:16:20

nos diera la gana que esto lo veremos en

5:16:21

la parte más avanzada pero Qué significa

5:16:24

que yo ahora por ejemplo puedo venir al

5:16:26

programador al que yo he creado y dentro

5:16:28

de programador qué acabaré teniendo

5:16:30

ostras si también tengo una función que

5:16:32

Sprint Qué pasará en este caso si yo

5:16:34

ejecuto este código Vais a ver lo

5:16:36

siguiente nombre brce eda 36 lenguajes

5:16:38

ta ta ta ta ta ya tenemos ese objeto

5:16:40

inteligente ya hemos creado algo a

5:16:43

nuestra medida yo he creado este

5:16:45

programador con los datos que

5:16:47

teóricamente me pedía él y después con

5:16:49

este print he llamado una función y esta

5:16:51

función ha hecho lo que a mí me ha dado

5:16:53

la gana pues imaginaos Cómo podemos

5:16:55

empezar a definir mecanismos o

5:16:56

parámetros dentro de esto okay Imagínate

5:16:58

yo aquí solo lleva el nombre Pero y si

5:17:01

quisiera por ejemplo que el apellido

5:17:03

pues fuera opcional o poderlo cambiar o

5:17:05

no sé qué Yo podría venirme aquí y decir

5:17:07

y si un apellido surname y el surname

5:17:10

este que sea un String digo Vale Voy

5:17:13

ahora a imprimir todo nombre edad

5:17:16

lenguajes y podría imprimir Aquí también

5:17:19

apellidos y dentro de self tendré Ah

5:17:21

mira si lo creo fuera claro inicialmente

5:17:24

no me lo va a requerir pero lo voy poder

5:17:26

setear Cuando quiera vale cómo lo podría

5:17:29

cómo le podría establecer el apellido

5:17:31

que no se me pide al principio yo acedo

5:17:33

a mi programador accedo a surname y aquí

5:17:35

le digo moure y ahora voy volver a

5:17:37

llamar a print fíjate qué me dice ostras

5:17:40

que no tiene el atributo Por qué no

5:17:42

tiene el atributo vale esto es muy

5:17:44

importante tenéis que tener muy en

5:17:46

cuenta cómo funciona esto y tenéis que

5:17:48

tener en cuenta cómo funcionan vuestros

5:17:50

lenguajes para que yo ahora llegue por

5:17:52

aquí y diga e dice ostras que me dice

5:17:54

que no tengo este surname ostra y qué

5:17:57

podemos pensar Será porque no existe

5:17:59

Será porque no lo he inicializado fijaos

5:18:02

Ahora qué pasa dice inicialmente mi

5:18:04

atributo claro Oye darle algún valor

5:18:06

Incluso le podrías dar un valor Non por

5:18:08

aquí decir Ah Mira según el lenguaje

5:18:11

esto dependerá todas las características

5:18:12

del lenguaje es posible que ya que este

5:18:15

parámetro en realidad no está dentro del

5:18:17

inicializador esta propiedad pues Yo la

5:18:20

voy a meter a Non por ejemplo podría ser

5:18:22

vacío O podría ser lo que quisiera para

5:18:23

en este caso Claro en el momento que

5:18:25

intentamos acceder a ella para que de

5:18:26

verdad acceda a algo pero ya veis como

5:18:28

inicialmente apellidos Non y después

5:18:31

acaba teniendo el apellido moure otra

5:18:33

cosa que nos decía esta primera parte

5:18:34

del ejercicio decía implementa la clase

5:18:36

Ya lo hemos hecho créala la hemos

5:18:37

inicializado establece sus parámetros

5:18:39

perfecto modifícalo ostras Qué significa

5:18:43

que yo ahora también podría ir a mi

5:18:44

programador y ahora voy a pensar por

5:18:46

ejemplo que he cumplido años Así que voy

5:18:48

a acceder a ag y le voy a decir que

5:18:50

ahora tengo 37 años veis que puedo

5:18:53

modificar mi objeto y ahora por supuesto

5:18:55

si volviera otra vez aquí y volviera a

5:18:57

hacer un print pues inicialmente me

5:18:59

diría que tengo 36 años pero cuando se

5:19:01

los actualizo ya tendría 37 ya veis este

5:19:04

es el concepto más simple de clase de

5:19:07

objeto que tenemos en la gran mayoría de

5:19:09

lenguajes este concepto inicialmente es

5:19:11

así de simple Qué pasa que las clases

5:19:13

nos permiten hacer muchísimas cosas las

5:19:15

clases podemos hacer infinidad de cosas

5:19:18

más que lo que yo os he enseñado Pero

5:19:19

bueno se trata un poco de yo creo ver un

5:19:21

poco cómo funciona al principio tener un

5:19:24

mecanismo que no sea especialmente

5:19:25

complejo pero que os sirva para ver La

5:19:28

potencia de ahora decir ostras es que

5:19:30

ahora ya puedo empezar a pensar las

5:19:32

cosas a nivel de clase sería muchísimo

5:19:34

más fácil a nivel inteligible y a la

5:19:36

hora de empezar a trabajar con nuestro

5:19:37

programa Pues trabajar con objetos que

5:19:39

nosotros sabemos lo que hacen y que

5:19:40

hemos creado a nuestra medida eso es lo

5:19:42

que significa programar si no veíais

5:19:44

claro esta parte os ponía la parte de

5:19:46

dificultad extra Así que voy a venir por

5:19:48

aquí vamos a hacer la parte extra

5:19:50

dificultad extra implementa Dos clases

5:19:52

que representen las estructuras de pila

5:19:53

y cola estudiadas en el ejercicio número

5:19:55

7 de la ruta de estudio deben poder

5:19:57

inicializarse y disponer de las

5:19:58

operaciones de Añadir eliminar y

5:20:00

retornar el número de elementos e

5:20:01

imprimir todo Su contenido es decir

5:20:03

tenemos que ahora representar los

5:20:05

mecanismos de pila y de cola pero con

5:20:08

clases para que acabemos viendo como

5:20:10

ahora con clases sí que vamos a ser

5:20:12

capaces de externalizar el

5:20:15

comportamiento y de que yo ahora puedo

5:20:17

utilizar una pila o una cola y que la

5:20:19

magia se haga por dentro y yo la utilice

5:20:21

directamente así que vamos a venir por

5:20:22

aquí y vamos a crear primero eh la pila

5:20:25

un stack entonces me voy a crear una

5:20:26

clase que se llama stack y vamos a

5:20:28

intentar darle el mecanismo que nosotros

5:20:31

hemos estudiado como stack vamos a

5:20:33

crearle un inicializador eso es lo

5:20:34

primero y en el inicializador qué

5:20:36

haríamos vale En qué tipo de estructura

5:20:39

decíamos que se basaba la pila decíamos

5:20:42

Claro yo con una lista decíamos con una

5:20:45

rray con una lista puedo ser capaz de

5:20:47

montar una pila con la lógica que

5:20:49

veíamos en el ejercicio anterior Así que

5:20:50

yo voy a utilizar mi inicializador y no

5:20:52

le voy a pasar nada para que el

5:20:54

inicializador de lo único que se

5:20:55

encargue es de crear una lista vacía

5:20:58

stack qué operaciones tiene la pila pues

5:21:01

tiene la operación de apilar y de

5:21:03

desapilar que habitualmente se le llama

5:21:05

Push y pop Qué cosas tiene que hacer

5:21:08

nuestra pila nuestra pila tiene que

5:21:10

apilar Push nuestra pila tiene que

5:21:12

desapilar pop qué más cosas nos pedía el

5:21:15

ejercicio nos decía aparte de poder

5:21:17

Añadir y eliminar que es el Push y el

5:21:19

pop tiene que retornar el número de

5:21:21

elementos e imprimir todo Su contenido

5:21:23

Así que puedo tener otra función que sea

5:21:26

count Y por último decía imprimir el

5:21:28

número de elementos pues sin más le voy

5:21:30

a llamar print esta serían las cuatro

5:21:32

operaciones que tiene mi pila qué va a

5:21:34

recibir Pues en principio no va a

5:21:35

recibir nada porque seguramente tengo

5:21:38

que trabajar internamente con la pila

5:21:40

que yo he creado en formato lista Así

5:21:42

que vamos a venir por aquí qué decíamos

5:21:44

que todas las funciones deben recibirse

5:21:47

a ellas mismas a self a la clase para

5:21:50

poder interactuar con el contenido de la

5:21:51

clase así que sin más voy a venir por

5:21:54

aquí esto ya lo habíamos creado más o

5:21:56

menos en la lección anterior pero ahora

5:21:58

lo estamos abstrayendo estamos

5:22:00

abstrayendo todo el comportamiento ese

5:22:02

que parecía un poquito Random un poquito

5:22:03

errático y que íbamos haciendo según

5:22:05

programamos ahora lo que estamos

5:22:07

haciendo es que nos lo va a hacer

5:22:08

mágicamente una clase que nosotros ya le

5:22:10

hemos llamado stack vamos a hacer las

5:22:12

partes fáciles si yo tengo que acabar

5:22:15

retornando la cuenta qué tendría que

5:22:18

poner por aquí pues sin más voy a

5:22:20

retornar la longitud leng de qué del

5:22:23

stack self stack de la lista si yo tengo

5:22:26

una función que sirve para contar sin

5:22:28

más retorno la longitud de la lista

5:22:29

inicialmente que nos va a decir cero

5:22:31

Okay vamos a pensar ahora la operación

5:22:34

de Push Cómo haría para Añadir elementos

5:22:36

Claro si quiero Añadir elementos le

5:22:38

tendré que pasar un elemento ítem lo que

5:22:40

yo le quiero Añadir a la pila yo lo voy

5:22:43

a hacer de manera digamos un poco

5:22:44

abierta no le voy a decir que le voy a

5:22:46

pasar un Stream depende de si el

5:22:47

lenguaje que estáis utilizando es

5:22:48

fuertemente tipado o débilmente tipado

5:22:50

como es python no tengo por qué decirle

5:22:53

Qué tipo de dato le estoy pasando voy a

5:22:55

hacer una implementación totalmente

5:22:56

abierta voy a hacer que se le pase un

5:22:57

ítem ese ítem podrá ser un entero podrá

5:23:00

ser un Stream podrá ser la clase

5:23:01

programador yo que sé lo que podría

5:23:03

acabar guardando aquí y Cómo era el

5:23:05

mecanismo de apilar nosotros decíamos

5:23:07

vale apil añadiéndole el elemento a la

5:23:09

lista Cuál era la lista el stack Cómo

5:23:11

añadimos elementos a la lista con appen

5:23:13

Así que simplemente le hago un appen y

5:23:16

le paso el ítem Ya está ya tendríamos de

5:23:18

manera mágica la operación de Push Qué

5:23:20

hace Push A quién le importa que lo haga

5:23:22

la clase que para algo no estás trayendo

5:23:24

el comportamiento si la lógica de la

5:23:27

pila es añadirlo de primero de último en

5:23:29

el medio no es mi problema Yo sé cómo

5:23:31

funciona una pila que se encargue la

5:23:32

clase de hacer la lógica por otro lado

5:23:34

tendríamos que desapilar cómo desapilar

5:23:38

en las pilas o en las listas en realidad

5:23:41

nosotros por defecto en python ya

5:23:42

tenemos una operación que es pop

5:23:44

entonces si yo hago pop de la lista ya

5:23:46

se va a encargar de funcionar como un

5:23:48

stack como una pila dijimos que el stack

5:23:50

era lo que nosotros llamábamos lifo

5:23:52

tenía el protocolo lifo lifo la sin

5:23:54

First out es decir el último que entra

5:23:56

es el primero que sale apilánez

5:24:08

out el C el último que ha entrado es el

5:24:10

primero que sale así funciona una pila y

5:24:12

lo que hace desapilar es elimina el

5:24:14

elemento y lo retorna Así que retornamos

5:24:16

el pop lo va a eliminar pero aquí

5:24:18

también podríamos hacer una cosa Vale y

5:24:20

si la lista es vacía esto iba a petar

5:24:22

Así que vamos a hacerle un If para

5:24:24

controlar que la lista por lo menos

5:24:25

tenga elementos si la lista self stack

5:24:28

es igual a c yo aquí lo que hago es

5:24:31

return pues por ejemplo de Non le digo

5:24:32

Mira es que no tengo ningún elemento

5:24:34

podríamos implementarlo aquí pero si ya

5:24:36

tengo una operación que cuenta Mira esta

5:24:39

operación cuenta es exactamente el mismo

5:24:41

código aquí que aquí y si ya llamo a

5:24:43

self count si yo hiciera esto Esto me

5:24:45

acabaría retornando el contador veis

5:24:47

como empezamos a reaprovechar código ya

5:24:49

hace una lógica Pues bueno un poquito

5:24:51

más inteligente y ya lo último que

5:24:52

faltaría sería imprimir Cómo imprimo

5:24:55

pues vamos a hacerle un for a todos los

5:24:56

elementos y los imprimimos sin más for

5:24:58

item in self stack y vamos a imprimir

5:25:01

voy a hacer print de cada uno de los

5:25:03

elementos a ver si esto está bien o está

5:25:05

mal fijaos esta lógica define un stack

5:25:07

que yo ahora quiero usar mi stack voy a

5:25:09

crear una una variable que se llame my

5:25:11

stack cómo hacemos Ya vimos el

5:25:13

funcionamiento de clases ahora ya tengo

5:25:14

una clase que es stack como la instanci

5:25:16

así ya está yo ahora ya tendría un stack

5:25:19

creado sin necesidad de pensar que yo

5:25:21

estoy inicializando una lista No sé qué

5:25:22

Yo quiero una lista una pila y ya está

5:25:24

accedo a mi stack que quiero Añadir

5:25:26

elementos para Pilar hacemos Push vale

5:25:28

Ahora quiero contar todos los elementos

5:25:30

hago un count Okay pero claro este count

5:25:32

Qué hace retorna el count retorna

5:25:35

Cuántos elementos hay así que voy a

5:25:37

hacerle un print para poder ver cuánto

5:25:39

vale ese count una vez ya he contado Por

5:25:42

qué no los imprimo Pues accedo a mi

5:25:44

stack y llamos operación que se llama

5:25:46

print y vamos a ver qué pasa lanzo Mi

5:25:48

código a ver qué hace mi stack Ah mira

5:25:50

después de apilarlos me dice que tengo

5:25:53

tres es correcto verdad yo no llegué a

5:25:55

hacer pop en ningún momento y cuando le

5:25:57

pido que me lo imprima me imprime A B y

5:26:01

C Hay algún error aquí Cómo es la pila

5:26:03

Cómo accedemos a la pila las ste First

5:26:06

la pila muy bien pamos primero el

5:26:09

elemento a el elemento b y el elemento c

5:26:11

pero ahora pensar en libros uno encima

5:26:13

de otro Cómo recorrería pila no

5:26:16

recorrería A B y C recorrería A

5:26:20

tendríamos que ver primero lo último que

5:26:22

hemos apilado después ver qué hay debajo

5:26:24

y después ver que hay debajo con lo cual

5:26:26

nuestra operación de print es incorrecta

5:26:28

para ello sería bastante fácil

5:26:30

corregirlo por ejemplo tenemos una

5:26:31

operación en python que es reversed que

5:26:33

se lo podemos aplicar por ejemplo

5:26:35

también a una lista y nos va a cambiar

5:26:37

el orden de los elementos simplemente

5:26:40

tiempo de ejecución para poder hacer un

5:26:42

for de manera inversa esto si ahora yo

5:26:44

vuelvo a lanzar vemos que lo que tenemos

5:26:46

aquí ahora ya es cba ya lo está

5:26:48

imprimiendo bien ya tiene sentido okay Y

5:26:51

qué nos falta por aquí probar Y si yo

5:26:53

desapilar y hago POP si yo ahora

5:26:56

volviera a hacer el count qué

5:26:58

significaría significaría que después de

5:27:00

hacer el pop el count ya me dice que

5:27:02

tengo dos elementos y si sigo haciendo

5:27:04

pops voy a hacer muchos pops Esto va a

5:27:06

hacer que el programa no Peta Y si

5:27:08

después de hacer un montón de pops hago

5:27:10

un count qué me va a acabar retornando

5:27:12

cero él para en cero él va a desapilar

5:27:15

Mientras pueda cuando no puede seguir

5:27:17

desapilar Non Cómo podríamos verlo esto

5:27:20

fácil vamos a acabar imprimiendo el

5:27:22

resultado del desap porque esto va

5:27:24

dentro de la lógica de la pila elimina

5:27:26

el elemento Pero te lo devuelve para que

5:27:28

veas que estás desapilar lo Ahora aquí

5:27:30

veis que desapilar b desapilar a y

5:27:33

después empieza a desapilar Non porque

5:27:35

ya ha desapilar todo porque tiene cero

5:27:37

elementos okay entonces aquí habéis

5:27:39

visto como una lógica la hemos abstraído

5:27:42

todo dentro de la clase stack igual que

5:27:44

teníamos la posibilidad de montar un

5:27:46

stack qué otra estructura vimos en la

5:27:48

siete pues Vimos una estructura que en

5:27:50

realidad en vez de ser lifo era fifo

5:27:52

First in first out que es la estructura

5:27:54

que se conoce como cola entonces voy a

5:27:56

crear la implementación de una cola

5:27:58

vamos a pensar qué operaciones tenía la

5:28:00

cola ahora ya hemos hecho la pila Esto

5:28:01

va a ser muy fácil no va a tener un

5:28:03

inicializador Cómo montábamos la cola en

5:28:06

la lección anterior pues Pues igual le

5:28:08

decíamos que la podíamos basar en una

5:28:10

lista entonces aquí tengo mi lista vale

5:28:12

inicialmente la cola va a ser una lista

5:28:14

qué operaciones tenemos en una cola

5:28:16

claro pesar la pila lo de los libros

5:28:18

pero la cola la cola del cine os decía

5:28:20

yo fifo Qué significa First in first out

5:28:22

Si Tú empiezas a llegar a la cola del

5:28:24

cine te empiezas a poner para comprar el

5:28:26

billete lo que sea el primero que ha

5:28:28

llegado es el primero que va a ser

5:28:29

atendido okay Entonces tenemos que

5:28:31

variar ligeramente el funcionamiento qué

5:28:33

operaciones tenemos en una cola igual

5:28:35

que teníamos el Push el pop en la en la

5:28:37

pila tendremos la operación que se llama

5:28:39

encar no en que tendremos la operación

5:28:42

ya le voy poniendo el self aquí

5:28:44

Tendremos una operación que sea

5:28:46

desencolar es decir tenemos la opción de

5:28:48

meterle elementos pero también de

5:28:50

quitarlos entonces de que por aquí y

5:28:52

Tenemos también las operaciones que os

5:28:54

dije que también tenéis que crearlo

5:28:55

Exactamente igual os decía que también

5:28:57

tenéis que poder contar elementos e

5:28:59

imprimirlos así que me voy a copiar Ya

5:29:01

esta función pero en este caso

5:29:03

accederemos en vez al stack vamos a

5:29:05

acceder a la que Cómo es la operación

5:29:08

de encolar pues la operación de encolar

5:29:10

decíamos que no encol vamos en la lista

5:29:13

y ya está sin más porque lo importante

5:29:15

es después Cómo manejamos a la hora de

5:29:17

quitar elementos no a la hora de meterlo

5:29:19

podemos guardarlos en la lista sin

5:29:20

ningún problema así que venga voy a

5:29:23

meterle el elemento voy a acceder a la

5:29:26

que le voy a hacer elen tengo que acabar

5:29:27

pasando el elemento em ya está esta es

5:29:30

la implementación que teníamos en la

5:29:31

clase anterior y si quiero desencolar

5:29:34

qué Tendremos que hacer lo podré hacer

5:29:35

con el pop directamente voy a acceder a

5:29:37

la cola le voy a hacer el pop pero el

5:29:39

pop qué acaba eliminando el pop elimina

5:29:42

el último elemento que ha entrado pero

5:29:44

nosotros queremos eliminar el primer

5:29:45

elemento decir Esa primera persona que

5:29:47

está en la cola que va a ser la primera

5:29:49

en ser atendida Entonces le tenemos que

5:29:50

decir que Haz pop pero haz pop del

5:29:53

primer elemento Vale entonces Esta es la

5:29:55

forma de desencolar haciendo pop del

5:29:57

primer elemento y esto este control se

5:29:59

lo podríamos hacer Igual le podríamos

5:30:00

decir vale Pero tú desencolar elementos

5:30:02

mientras existan si la lista vale Cero

5:30:05

en realidad retorna n Porque no eres

5:30:07

capaz De desencolar nada y ahora vamos a

5:30:09

hacer nuestra implementación voy ahora

5:30:11

crear myq tenemos una cola Aquí está

5:30:14

vamos a inicializar la vamos a empezar a

5:30:16

a meter elementos en la cola podemos

5:30:18

intentar Reproducir Exactamente lo mismo

5:30:20

Para que veamos si esto tiene sentido o

5:30:22

no voy a venir por aquí voy a acceder a

5:30:24

my queue y ya sabéis en vez de Push hago

5:30:27

en queue aquí vale tengo los elementos A

5:30:30

B y C en la cola tendré A B y C bueno en

5:30:33

principio me dice que tengo tres

5:30:34

elementos con lo cual tiene pinta de que

5:30:36

la cola está bien y si yo ahora igual

5:30:38

que hicimos aquí hiciera un print a ver

5:30:40

cómo los imprime vengo por aquí hago un

5:30:43

print tenemos tres elementos e imprime c

5:30:45

b A qué pasa ahora aquí justo lo

5:30:48

contrario que el caso anterior ahora no

5:30:49

necesitamos el reverse porque ahora sí

5:30:51

que queremos imprimir sí que queremos

5:30:53

recorrer en el orden de entrada de los

5:30:55

elementos primero entró el elemento a el

5:30:57

primero que yo quiero ver a la hora de

5:30:59

imprimir es el a después el B después el

5:31:00

camos la cola en el orden que tiene que

5:31:02

ser consumida por eso si ahora yo me

5:31:04

viniera aquí a myq hiciera el qué el de

5:31:07

que Qué pasaría en el deq Ahora aquí es

5:31:09

donde va a quitar un elemento igual que

5:31:11

hacíamos antes igual que nosotros le

5:31:13

decía Mira una vez hayas quitado el

5:31:15

elemento vamos a volver a imprimir la

5:31:17

longitud Qué significaría esto que una

5:31:19

vez hay tres elementos se hace el deq de

5:31:22

uno de ellos pasamos a tener dos pero

5:31:24

tenemos los correctos vamos a hacerle lo

5:31:26

mismo Aquí voy a empezar a desencolar

5:31:29

cada uno de los elementos pero de manera

5:31:30

así un poco infinita voy a my stack

5:31:34

ahora es myq y vamos a hacerle un dq

5:31:37

aquí masivo a ver qué va imprimiendo

5:31:39

según desencolar Teníamos dos elementos

5:31:42

desencolar la B desencolar la c y

5:31:44

después empieza a desencolar n porque no

5:31:45

tiene porque ya vale cero veis ya

5:31:47

tenemos la implementación ahora sí ya

5:31:51

real ya en forma de clase Ya de manera

5:31:53

que no nos tengamos que liar como el

5:31:55

otro día y para poder utilizar como

5:31:56

nosotros querramos con la lógica propia

5:31:58

de pilas y de colas pues esto es lo que

5:32:01

una clase nos resuelve el Cómo

5:32:03

empaquetamos lógica asociada a un

5:32:06

elemento sin más

5:32:08

[Música]

5:32:12

el ecio nos decía exp por el concepto de

5:32:15

herencia según el lenguaje la herencia

5:32:17

es un mecanismo que le permite una clase

5:32:20

que en este caso al hablar de herencia

5:32:23

tendremos lo que se llama Las clases

5:32:25

padre las clases hijas las subclases las

5:32:29

clases derivadas bueno digamos que se le

5:32:32

puede llamar de muchas formas cuando

5:32:33

hablamos de herencia A cómo se establece

5:32:35

una jerarquía entre clases básicamente

5:32:38

lo que tendremos es una clase y después

5:32:39

otras subclases que van a poder heredar

5:32:43

atributos y métodos o funciones de lo

5:32:46

que llamamos la clase padre la

5:32:49

superclase la clase base significa que

5:32:51

la subclase puede extender el mecanismo

5:32:55

de esa superclase o de esa clase padre o

5:32:57

como le querramos llamar para qué nos

5:32:59

vale la herencia la herencia para lo que

5:33:01

nos sirv es para intentar promover esa

5:33:03

reutilización de código y permitirnos

5:33:06

pues crear nuas clases basadas en las ya

5:33:09

existentes sin tener que estar

5:33:11

reescribiendo el código desde cero y

5:33:13

aquí os decía el ejercicio esper el

5:33:15

concepto de herencia según todo lenguaje

5:33:17

crea un ejemplo que implemente una

5:33:19

superclase animal y un par de subclases

5:33:23

perro y gato junto a una función que

5:33:25

sirva para imprimir el sonido que emite

5:33:28

cada animal yo aún no sé muy bien Qué es

5:33:30

todo esto no Pero me voy a crear una

5:33:32

clase que se llame animal qué podríamos

5:33:34

hacerle a esta clase le podríamos dar un

5:33:36

inicializador recordáis es que bueno las

5:33:38

clases habitualmente tenían algo que era

5:33:40

el inicializador que nos servía para

5:33:43

precisamente inicializar Qué valores qué

5:33:46

parámetros necesitaba esta clase para

5:33:49

poder ser inicializada lo podríamos

5:33:51

dejar así en Blanco sin más y decirle

5:33:53

Pues mira esto se inicializa sin nada no

5:33:55

tenemos que hacerle nada más O si

5:33:57

queréis le podemos hacer aquí un extra

5:34:00

ya que vamos a tener un animal pues le

5:34:01

vamos a dar un nombre a este animal

5:34:04

Entonces yo le voy a meter un parámetro

5:34:05

para inicializar esto no era necesario

5:34:07

Pero simplemente para que entendáis un

5:34:09

poquito que vamos a hacer Aquí le voy a

5:34:10

decir que esto Recibe un parámetro que

5:34:12

es un String es decir como si yo le

5:34:13

diera un nombre a este animal si tenéis

5:34:16

un perro o un gato en casa una mascota o

5:34:19

lo que sea y le tenéis un nombre puesto

5:34:20

básicamente para que identifiquemos que

5:34:23

yo voy a crear un animal y que le voy a

5:34:24

dar un nombre de esta manera yo ya

5:34:26

tendría la clase animal pero aquí Aún no

5:34:28

vemos ningún concepto raro que tenga que

5:34:31

ver con la herencia porque decíamos cóm

5:34:33

las clases podían heredar otras no Y

5:34:35

dice Bueno y también puedes crear un de

5:34:37

subclases llamada perro y gato Pues yo

5:34:40

sin más voy a hacer esto Me voy a crear

5:34:43

otras Dos clases que sea perro y gato

5:34:45

por ejemplo dog Cat yo ahora mismo tengo

5:34:48

tres clases claro estoy reutilizando

5:34:50

código no estoy poniendo en todos los

5:34:52

casos que me estoy creando unas clases

5:34:55

una que se llama animal una que se llama

5:34:56

perro otra que se llama gato por

5:34:58

supuesto yo podría venir por aquí y yo

5:35:00

que sé tener una variable my animal y si

5:35:03

yo quiero crear un animal Pues podría

5:35:05

crearlo así si yo quiero crear un perro

5:35:07

lo crearía así si yo quiero crear un

5:35:09

gato lo crearía así pero son todas

5:35:10

independientes en realidad ninguna tiene

5:35:13

relación entre ellas Pero para qué vale

5:35:15

la herencia lo voy a volver a repetir la

5:35:17

herencia es ese mecanismo que tenemos en

5:35:19

programación orientado objetos que nos

5:35:22

sirve para heredar por un lado

5:35:24

propiedades y por otro lado funciones o

5:35:27

métodos de una clase si yo ahora

5:35:29

quisiera que mi animal tuviera un nombre

5:35:32

perfecto parámetro nombre si yo ahora

5:35:34

quisiera que mi animal pues por ejemplo

5:35:36

emitiese un sonido pues me voy a crear

5:35:39

una función y le voy a poner Sound

5:35:41

Porque quiero saber cuál es el sonido de

5:35:43

este animal digo aquí pues sonido y yo

5:35:46

ahora aquí le podría hacer un print y

5:35:48

hago este animal emite un sonido no

5:35:52

determinado Por qué Porque es que un

5:35:54

animal es un animal genérico no sé cómo

5:35:57

lo hace este sonido Pero qué pasa si yo

5:36:00

ahora quiero hacer el sonido del perro

5:36:02

Pues yo vendría por aquí y haría Sound

5:36:05

Wow y si yo quisiera hacer el ido del

5:36:07

gato vendría por aquí y haría miau estoy

5:36:10

reutilizando código no estoy utilizando

5:36:13

herencia Aparentemente no lo que estoy

5:36:15

haciendo es copy paste de todo lo que

5:36:17

tengo por aquí y ya está pero ahora

5:36:19

vamos a poner en práctica el concepto de

5:36:22

herencia el concepto de herencia os

5:36:23

decía que sirve para heredar propiedades

5:36:26

funciones de una clase base de una clase

5:36:29

padre de una superclase como nosotros le

5:36:32

querramos Llamar Cuál es nuestra

5:36:33

superclase animal y Cuáles deberían ser

5:36:35

las subclases Pues todo lo que derive de

5:36:38

un animal clases en este caso un perro y

5:36:41

un gato y cómo puedo empezar a utilizar

5:36:43

herencia aquí lo tenéis que ver y por

5:36:45

eso os digo que por favor exploré en

5:36:47

cada uno de vuestros lenguajes comoo se

5:36:49

implementa la herencia en python si yo

5:36:51

quisiera que el perro heredas el

5:36:54

comportamiento base de animal es tan

5:36:57

fácil como decirle eso perro hereda de

5:36:59

animal y gato hereda de animal pero Y

5:37:02

qué estoy consiguiendo con esto

5:37:04

Aparentemente aún no estoy haciendo nada

5:37:06

pero ahora voy a hacerlo siguiente voy a

5:37:08

venir por aquí y voy a borrar esto y voy

5:37:10

a borrar esto qué podríamos hacer ahora

5:37:12

básicamente aquí tenemos un

5:37:14

inicializador este inicializador lo

5:37:16

queremos conservar tendría que hacerle

5:37:18

variaciones si es un perro un gato no

5:37:21

digamos que esta parte es común el

5:37:23

inicializador por ejemplo podría decirle

5:37:25

que es común sin más decir que un animal

5:37:27

tiene nombre pero un perro también le

5:37:29

puedo dar un nombre cuando lo inicializo

5:37:31

y un gato también le puedo dar un nombre

5:37:33

Entonces como yo no quiero retocar esta

5:37:36

operación que es de inicialización

5:37:38

simplemente ni la voy a poner aquí Y qué

5:37:41

va a hacer perro va a heredar el

5:37:43

inicializador de animal ya está pero qué

5:37:46

va a pasar con Sound claro Ahora aquí es

5:37:48

cuando yo de alguna forma debería

5:37:50

sobrecargar entender este concepto la

5:37:52

operación de Sound voy a poner aquí

5:37:54

Sound y vamos a intentar redefinir lo

5:37:57

cómo lo puedo redefinir sin más lo voy

5:38:00

volver a utilizar aquí y en este caso

5:38:02

voy a poner print Y qué voy a poner aquí

5:38:04

el Wow que veíamos antes y qué voy a

5:38:06

hacer con el gato voy a sobreescribir

5:38:08

esa operación miau y lo que voy a hacer

5:38:10

ahora es que en realidad este Sound en

5:38:13

la clase padre la superclase le voy a

5:38:15

decir que no haga absolutamente nada y

5:38:17

vamos a intentar ver ahora qué pasa

5:38:19

vamos a probar cómo funciona todo esto

5:38:22

que yo acabo de implementar a ver si así

5:38:24

tiene más o menos sentido lo que yo

5:38:26

estoy haciendo vamos a venir por aquí y

5:38:28

voy a crear pues por ejemplo un animal

5:38:31

my animal cómo lo haré me dice que Puedo

5:38:34

ponerle un nombre animal Por qué Porque

5:38:36

bueno Esto es un anim animal genérico

5:38:38

qué podría hacer si yo ahora me voy a my

5:38:39

animal por supuesto tendría la operación

5:38:42

Sound Okay si yo ahora lanzo mi programa

5:38:44

ves se ejecuta y no hace nada Por qué

5:38:46

Porque llamo Sound aquí lo tenéis y

5:38:48

Sound no hace nada pero si yo ahora me

5:38:50

creara otro animal por ejemplo pero en

5:38:52

este caso

5:38:54

redefinieron un perro voy a crear un

5:38:56

perro y cómo le voy a llamar al perro

5:38:58

pues me da igual me lo invento hago aquí

5:39:01

perro y voy a llamarle a esta variable

5:39:03

my dog si yo ahora lanzo este código

5:39:06

vemos que dice Wow y si yo ahora me

5:39:08

crear un gato Cat y creo un gato Cat

5:39:11

gato y lanzo este código vemos miau

5:39:14

hasta Aquí más o menos todo entendido

5:39:16

vemos como en realidad el nombre es un

5:39:19

atributo común correspondiente al

5:39:21

inicializador de animal y que yo ya lo

5:39:24

tengo dentro de perro y dentro de gato

5:39:26

Al decirle que estoy heredando el

5:39:28

comportamiento de animal y como yo en

5:39:29

realidad le estoy diciendo Mira Okay el

5:39:32

inicializador es el mismo pero la

5:39:34

emisión del sonido no es la misma cuando

5:39:37

seas un perro redefin Cuál es el sonido

5:39:40

y cuando seas el gato redefin Cuál es el

5:39:43

sonido del gato Este ejemplo se ve muy

5:39:44

bien con qué hacen los animales que un

5:39:47

pájaro al ser un animal pueda volar y un

5:39:50

pez pueda nadar y un perro pues pueda

5:39:52

correr Pues también lo podríamos hacer y

5:39:54

es serían operaciones propias igual de

5:39:57

cada uno de los animales o que le

5:40:00

pudiéramos dar propiedades de estos

5:40:02

animales ya lo veremos en el ejemplo más

5:40:04

avanzado pero aquí simplemente quería

5:40:06

introducir el concepto de herencia pero

5:40:09

aparte del concepto de herencia os

5:40:11

dejaba una pequeña trampa Y es que con

5:40:13

el concepto de herencia siempre suele

5:40:16

estar ligado el concepto de polimorfismo

5:40:18

y yo el concepto de polimorfismo me lo

5:40:20

callé para que así cuando vosotros

5:40:22

entendiera lo que es herencia y os

5:40:24

pusiera aquí a sobreescribir esta

5:40:26

operación y en realidad ya estáis

5:40:28

utilizando polimorfismo sin saber Quizás

5:40:32

que lo estabais utilizando o que

5:40:33

llegasteis a pensar que la herencia lo

5:40:36

es todo la herencia el concepto general

5:40:38

de precisamente heredar propiedades y

5:40:40

funciones pero después tenemos el

5:40:41

concepto de polimorfismo Qué es el

5:40:43

polimorfismo el polimorfismo es la

5:40:45

capacidad de un objeto para tomar muchas

5:40:48

formas en este contexto de la

5:40:49

programación orientada de objetos es la

5:40:51

capacidad que tienen las clases para ser

5:40:53

tratadas como instancias de una clase

5:40:55

padre pero desde el punto de vista de lo

5:40:57

que llamamos las interfaces de que sin

5:41:00

saber qué es que él pueda comportarse de

5:41:03

una manera distinta es decir sin saber

5:41:05

que si un animal es un un gato pueda

5:41:08

comportarse de manera distinta cómo lo

5:41:10

podemos ver bueno primero tenemos este

5:41:12

polimorfismo en tiempo de compilación

5:41:14

Nosotros hemos hecho polimórfico el

5:41:17

animal diciéndole que el animal si es un

5:41:19

perro suena de una manera si es un gato

5:41:20

suena de otra manera pero ahora Aquí voy

5:41:22

a crear una función me voy a crear una

5:41:25

función fuera de perro de gato de animal

5:41:28

y de todo y le voy a llamar print Sound

5:41:31

por ejemplo y aquí le voy a pasar el

5:41:33

animal animal que es un animal y qué

5:41:36

operación tiene animal animal tiene la

5:41:38

operación por ejemplo Sound esto es una

5:41:40

operación que tenemos por fuera y ahora

5:41:42

en vez de llamar por un lado a my animal

5:41:45

Sound a my dog Sound a my Cat Sound voy

5:41:48

Llamar a mi función print Sound y lo

5:41:51

único que le voy a pasar es el animal en

5:41:53

este caso el animal genérico en este

5:41:55

caso el perro en este caso el gato qué

5:41:58

va a pasar aquí las tres tienen la misma

5:42:00

operación porque heredan de animal pero

5:42:03

qué está pasando aquí que esto Recibe un

5:42:05

animal okay Y como Recibe un animal Yo

5:42:08

estoy llamando la operación Sound y Esto

5:42:10

va a saber si es un perro un gato o qué

5:42:13

es porque claro esta operación Sound

5:42:15

cuál va a corresponder Pues en realidad

5:42:17

como está heredando de una superclase

5:42:19

ahora Aquí vamos a ver cómo entra ese

5:42:21

concepto de polimorfismo ya no en tiempo

5:42:24

de compilación que es la sobrecarga que

5:42:27

tenemos aquí de las funciones sino en

5:42:28

tiempo de ejecución como inicialmente un

5:42:31

mismo objeto que es un animal va a tomar

5:42:33

también diferentes formas y vemos lo que

5:42:35

sale aquí Guau y miau de manera mágica

5:42:38

digamos que ha inferido que en algún

5:42:41

caso Quizás es el perro y en otro caso

5:42:43

es un gato veis hasta donde llega ese

5:42:46

concepto de polimorfismo ese concepto de

5:42:50

herencia Cómo nosotros podemos heredar

5:42:53

mecanismos comoo nosotros los podemos

5:42:55

sobreescribir y como nosotros a la hora

5:42:58

de invocarlos y trabajar con ellos ya se

5:43:00

encargará el propio polimorfismo de

5:43:02

decirnos A quién pertenece cada uno lo

5:43:05

veis yo he llamado a animal y no importa

5:43:08

lo que sea este animal porque cuando yo

5:43:10

le pase un animal que ha sido

5:43:12

sobrecargado especializado o que ha

5:43:15

heredado de animal y se ha especializado

5:43:18

en ser un perro o un gato aquí le va a

5:43:20

dar Exactamente igual vemos como le paso

5:43:23

el perro y el perro Sound que es una

5:43:25

operación que viene heredada de animal

5:43:27

en un caso va a imprimir Wow En otro

5:43:29

caso va a imprimir miau ya está el

5:43:31

polimorfismo no es para nada difícil ni

5:43:34

os lo nombré porque quería que entrara

5:43:37

con el concepto genérico de herencia

5:43:39

Solo que dentro de la herencia pues

5:43:40

tenemos esa parte del polimorfismo Okay

5:43:43

y incluso tenemos estos dos tipos de

5:43:44

polimorfismo El polimorfismo en tiempo

5:43:46

de compilación que es esa sobrecarga de

5:43:48

métodos como sobrecarguen Sound y como

5:43:51

tenemos el de compilación que esa

5:43:53

sobreescritura Al fin y al cabo se acaba

5:43:56

ejecutando a medida que el código se

5:43:58

está lanzando que se está ejecutando

5:44:00

cada línea va desencadenar una lógica o

5:44:02

otra Okay realmente el polimorfismo que

5:44:04

permite permite reutilizar código

5:44:07

permite acotar código y permite evitar

5:44:10

errores vamos a ver ahora cómo con el

5:44:12

ejercicio extra podemos entenderlo un

5:44:15

poquito mejor porque ahora aquí ya vamos

5:44:16

a ver un caso de uso quizás más

5:44:19

especializado implementa la jerarquía de

5:44:21

una empresa de desarrollo formada por

5:44:23

empleados que pueden ser gerentes

5:44:25

gerentes de proyectos o programadores

5:44:27

vamos a ir paso a paso y vamos a ir

5:44:29

entendiendo esta parte tenemos una

5:44:31

empresa donde hay empleados así que me

5:44:33

voy a crear una clase donde se llame

5:44:34

employe un empleado genérico Esto es lo

5:44:37

que acabará siendo esa superclase vamos

5:44:39

a llamarle no tengo aquí mi empleado y

5:44:42

mi empleado qué va a tener cada empleado

5:44:44

tiene un identificador y un nombre

5:44:46

pensar que esto puede ser una empresa

5:44:48

totalmente real Pues yo tengo aquí mi

5:44:50

empleado y el empleado va a tener un ID

5:44:52

que puede ser un entero y un nombre que

5:44:55

va a ser una cadena de texto entonces de

5:44:57

momento estoy creando una clase self ID

5:44:59

va a ser igual ID y self name va a ser

5:45:02

igual a name vale ya tengo mi empleado

5:45:04

creado por aquí pero qué va a poder

5:45:06

hacer este empleado me dice dependiendo

5:45:08

de su labor tiene propiedades y

5:45:09

funciones exclusivas de su actividad y

5:45:11

almacena los empleados a su cargo vamos

5:45:14

a ver cómo lo vamos manejando todo esto

5:45:17

de momento vamos a decir simplemente que

5:45:19

el empleado sin más tiene este

5:45:21

inicializador Pero qué nos decía que los

5:45:23

empleados Ahora cuando los empecemos a

5:45:25

especializar cuando creemos la

5:45:26

superclass claro un empleado es algo muy

5:45:28

genérico pero yo ahora Quiero conocer Sí

5:45:31

o sí si es un gerente un gerente de

5:45:33

proyecto o un programador por ejemplo en

5:45:35

Nuestra Empresa así que voy a crearme

5:45:37

otras tres clases que será por ejemplo

5:45:39

un manager un project manager y un

5:45:42

programador aquí lo tenemos Y de quién

5:45:45

van a heredar el comportamiento lo van a

5:45:47

heredar de la superclase employee tanto

5:45:50

el manager como el project manager como

5:45:52

el programador en realidad son todos

5:45:54

empleados con lo cual ya le estoy

5:45:56

diciendo que aunque ahora te intente

5:45:58

especializar y tú tengas un rol concreto

5:46:00

en realidad todos van a tener un

5:46:02

identificador y un nombre Okay hasta

5:46:04

aquí todo bien el manager Podría tener

5:46:06

algo más menos nos dice dependiendo de

5:46:09

su labor tienen propiedades y funciones

5:46:10

exclusivas de su actividad Qué significa

5:46:12

esto que yo por ejemplo voy a decirle

5:46:15

Por ejemplo el manager Yo solo quiero

5:46:17

que tenga ID y nombre con lo cual lo

5:46:19

vamos a heredar de employee Pero va a

5:46:21

tener algo propio de los managers una

5:46:24

operación que el manager en realidad se

5:46:26

ponga a coordinar proyectos y le voy a

5:46:30

decir Venga pues tiene una operación

5:46:32

coordinate projects Esto es algo propio

5:46:34

de los managers Así que como es algo

5:46:36

propio de los manager es una operación

5:46:38

que yo estoy creando en el manager vemos

5:46:40

que no lo tenemos en esta clase padre y

5:46:42

aquí hago un print sin más y le digo

5:46:44

self name está coordinando todos los

5:46:49

proyectos de la empresa Esto es algo que

5:46:51

solo va a hacer el manager Okay pero qué

5:46:53

va a hacer el project manager Pues el

5:46:56

project manager en vez de coordinar

5:46:57

proyectos le voy a decir pues mira tú

5:46:59

project manager tú vas a coordinar en

5:47:01

vez de projects project en singular y le

5:47:04

voy a decir está coordinando su proyecto

5:47:07

ya está haciendo otra cosa y el

5:47:08

programador qué va a hacer Pues el

5:47:10

programador le voy a decir que en

5:47:12

realidad no va va a coordinar sino que

5:47:14

va a programar le voy a poner code Y qué

5:47:16

va a hacer este programador voy a

5:47:18

meterle un print voy a acceder a su

5:47:19

nombre igual que hicimos antes name y le

5:47:21

voy a decir está programando en claro

5:47:24

Qué es algo que pueden tener propio los

5:47:27

programadores Pues el lenguaje de

5:47:29

programación en el que trabajan

5:47:30

imagínate jov va a mí me gustaría

5:47:33

guardarme el lenguaje de programación me

5:47:35

gustaría que cuando yo yo creo un

5:47:37

programador le podría decir no quiero

5:47:40

que te iniciales no solo con nombre y

5:47:43

con el ID sino quiero que te iniciales

5:47:45

también con el lenguaje de programación

5:47:47

así que me voy a venir por aquí y en

5:47:49

programmer le voy a meter un

5:47:51

inicializador propio del programador

5:47:53

porque aquí le voy a meter también el

5:47:54

Language que va a ser pues una cadena de

5:47:56

texto y yo podría pensar vale muy bien y

5:47:59

ahora aquí me guardo el Language y ya

5:48:01

está pero el ID y el name en realidad no

5:48:05

los tenemos ya el la superclase si yo me

5:48:08

voy a self ahora qué podría encontrar si

5:48:10

hago init a ver qué init tengo aquí self

5:48:13

me dice Ay no no no si te llamas a self

5:48:15

te llamas a ti mismo pero qué tendremos

5:48:17

ahora al ser un ABS clase tendremos la

5:48:22

capacidad vamos a llamarla así de llamar

5:48:24

a s y ahora voy a llamar a init de Super

5:48:27

Y qué me dice init de Super que tenemos

5:48:29

un ID y un name el super la superclase

5:48:33

Qué es la superclase de programmer

5:48:35

employee entonces ahora le podemos decir

5:48:37

venga superclase tú qué necesitas para

5:48:40

acabar funcionando Necesito el ID y el

5:48:43

name ya está Entonces estamos

5:48:44

reutilizando el inicializador de la

5:48:47

superclase y aparte le estamos añadiendo

5:48:49

una propiedad propia de los

5:48:51

programadores en este caso el manager y

5:48:54

el project manager no tiene propiedades

5:48:56

propias tienen operaciones propias pero

5:48:59

en este caso sí que le podemos decir he

5:49:01

el programador aparte de la posibilidad

5:49:05

de codificar sí que le vamos a pasar un

5:49:07

lenguaje y yo ahora aquí le puedo venir

5:49:09

y decir está programando en self

5:49:11

Language porque obligatoriamente yo

5:49:13

quiero que los programadores sí que

5:49:14

tengan un lenguaje lo veis y ahora

5:49:16

aparte qué podríamos acabar haciendo qué

5:49:18

nos decía el ejercicio dice dependiendo

5:49:21

de su labor tienen propiedades y

5:49:22

funciones exclusivas y almacena los

5:49:24

empleados a su cargo un manager puede

5:49:26

tener project managers a su cargo y un

5:49:28

project manager puede tener programmers

5:49:31

a su cargo Cómo podríamos hacer esto

5:49:32

Pues voy a crear aquí una operación que

5:49:35

se llame ad employee por ejemplo sin más

5:49:38

Y qué va a recibir este ad employee

5:49:41

Bueno lo primero el self y después va a

5:49:43

recibir el empleado que lo podríamos

5:49:45

hacer así ad y le paso el empleado

5:49:47

employee de manera digamos podríamos

5:49:49

pensar incluso genérica este employee en

5:49:52

realidad es el mismo lo que estamos

5:49:55

pasando aquí Bueno pensemos esto que

5:49:57

puede acabar suponiendo para nosotros

5:49:59

podéis pensar bueno self que acedo desde

5:50:01

employee en realidad nosotros como

5:50:04

estamos dentro de esta clase este acceso

5:50:06

a employe en realidad ya lo está

5:50:07

infiriendo Qué haremos aquí pues sin más

5:50:10

vamos a añadirlo a una lista de

5:50:11

empleados si tenemos una lista de

5:50:13

empleados self cómo puede ser claro

5:50:15

podríamos tener una variable que se

5:50:17

llame

5:50:19

emplo y aquí le puedo decir y ahora le

5:50:22

añado le hago un append del empleado que

5:50:25

quiero Añadir Pero qué pasa que no

5:50:26

tenemos ni inicializado esto qué podría

5:50:28

intentar cuando tú te instancias vas a

5:50:32

crear una variable que se llame

5:50:34

employees y Esto va a ser una lista

5:50:36

hacía vemos que también podemos utilizar

5:50:38

inicializador no solo para guardar las

5:50:40

propiedades sino para por ejemplo en

5:50:42

este caso estamos definiendo una nueva

5:50:44

así Yo sé que esta lista siempre va a

5:50:45

estar vacía cuando se arranque el

5:50:47

employee cuando se instancie y le voy

5:50:49

poder Añadir empleados Qué significa

5:50:51

esto que en el momento que tenemos este

5:50:53

ad ya está significa que el manager

5:50:55

ahora va a poder Añadir ya quereda el

5:50:58

project manager va a poder Añadir ya

5:51:00

quereda Y el programador qué pasa con el

5:51:02

programador el programador no queremos

5:51:04

que tenga nadie a su cargo Pues por qué

5:51:06

no vengo por aquí sobrecargo esta

5:51:08

operación y le hago pas digo No mira muy

5:51:11

bien me parece fantástico tú le puedes

5:51:13

meter por aquí usuarios pero en realidad

5:51:15

no quiero que imprima o sin más hago

5:51:18

aquí un print y le digo un programador

5:51:20

no tiene empleados azúcar y me vengo por

5:51:24

aquí Pillo el employe digo employee no

5:51:27

se añadirá estoy especializando su

5:51:30

comportamiento todo basado en una

5:51:32

superclase vamos a empezar a trabajar

5:51:34

con ellos a ver ahora qué podría amos

5:51:36

acabar encontrando y Vais a ver cómo

5:51:38

vamos a montar la jerarquía Vais a

5:51:40

intentar entender como ahora basándonos

5:51:42

en una superclase empezamos a modificar

5:51:45

su comportamiento según la clase

5:51:48

especializada que nosotros vamos a crear

5:51:50

basándonos por un lado en la herencia y

5:51:52

por otro lado en el polimorfismo como

5:51:54

estábamos comentando muy bien voy a

5:51:55

venir por aquí ahora tengo mi empresa

5:51:57

entonces voy a crear una variable que se

5:52:00

llame my manager entonces voy a crear un

5:52:02

manager qué me dice que debe tener el

5:52:04

manager el manager sin más me decía

5:52:06

tiene que tener un identificador por

5:52:08

ejemplo el uno y un nombre por ejemplo

5:52:10

de mi empresa el manager va a ser mour

5:52:12

vale Y voy a tener un par de proyectos

5:52:15

entonces voy a tener gerentes qué podría

5:52:17

acabar poniendo Y si yo quiero que ahora

5:52:20

el project manager en realidad tenga un

5:52:23

proyecto asignado le podría decir Okay

5:52:25

pues Por qué no intentamos hacer lo

5:52:27

mismo que el programador pero en caso

5:52:29

del project manager en vez del lenguaje

5:52:31

le pasamos el project Entonces le voy a

5:52:33

poner que aquí tenemos un project

5:52:35

entonces le estoy diciendo que se se

5:52:36

comporte de una manera totalmente

5:52:37

distinta y ya está ahora me voy a crear

5:52:39

un project manager my project manager

5:52:42

entonces voy a crear un project manager

5:52:44

el project manager qué tiene que tener

5:52:45

un identificador un nombre por ejemplo

5:52:48

bry va a ser un project manager y

5:52:50

necesita ahora un proyecto En qué

5:52:52

proyecto Pues en el proyecto uno le voy

5:52:54

a decir que está trabajando proyecto uno

5:52:56

pero claro puedo tener dos project

5:52:57

manager imagínate tengo dos proyectos y

5:52:59

mi empresa voy a crear otro project

5:53:01

manager tres este va a ser moure y va a

5:53:03

trabajar en el proyecto dos qué más

5:53:05

puedo tener a ahora la lista de

5:53:07

programadores me voy a crear mis

5:53:08

programadores my programmer y vamos a

5:53:11

tener Pues un programador programmer qué

5:53:13

necesita el programador el programador

5:53:15

necesita un identificador en este caso

5:53:16

el cuatro necesita un nombre por ejemplo

5:53:19

control y qué necesita un lenguaje Pues

5:53:22

en este caso por ejemplo control

5:53:23

programa en Swift vamos a meter más

5:53:25

programadores voy a tener programador 2s

5:53:27

el tres y el cuatro el dos el tres y el

5:53:30

cuatro vamos a cambiarle los ids el

5:53:33

cinco El seis y el siete entonces puedo

5:53:35

tener a Ross puedo tener a bushi y a

5:53:40

nasos bushi por ejemplo le podemos decir

5:53:42

qu programa en Dart y Ross por supuesto

5:53:45

programan cobol y nasos pues en python

5:53:47

de momento yo ya estoy creando aquí

5:53:50

diferentes empleados generales Pero qué

5:53:53

decíamos que por ejemplo ahora un

5:53:55

manager podía tener gente a su cargo

5:53:57

tiene a los project manager a su cargo

5:53:59

Okay pues yo voy venir donde mi manager

5:54:01

y tengo la operación ad ostras y la

5:54:03

operación ad Pero de dónde sale la

5:54:04

operación ad el manager no tiene ad Sí

5:54:07

porque manager hereda de employee y

5:54:09

employee tiene la capacidad de Añadir

5:54:11

empleados muy bien y qué me dice le

5:54:14

puedo meter un empleado Okay pues Cuáles

5:54:16

son los empleados que tiene el manager

5:54:18

el manager uno digamos y el manager dos

5:54:21

ya tiene dos personas a su cargo y los

5:54:23

project manager Qué tienen a su cargo

5:54:25

los project manager a ver tienen un ad

5:54:27

Ah También tienen un ad porque lo están

5:54:29

heredando y los project manager Qué le

5:54:31

puedo Añadir pues por ejemplo los

5:54:32

programadores el primer project manager

5:54:34

tiene el programador uno y dos y el

5:54:37

segundo project manager my project

5:54:38

manager 2 tiene el programador por

5:54:41

ejemplo 3 y el programador por ejemplo 4

5:54:44

ya está intentamos montar esta jerarquía

5:54:46

y esta jerarquía sobre qué la estamos

5:54:48

montando No lo sé y si yo vengo y le

5:54:50

digo mira el programador le voy a acabar

5:54:53

añadiendo porque también podría heredado

5:54:56

al programador dos es decir voy a hacer

5:54:58

que control en realidad mande sobre

5:55:00

Roswell el programador uno tiene a su

5:55:03

cargo el programador dos vamos a lanzar

5:55:05

tod ejecución Y qué acabamos viendo

5:55:08

acabamos viendo lo siguiente employee

5:55:10

vamos a acceder por ejemplo Dónde está

5:55:12

aquí lo teníamos este employee le

5:55:14

decíamos Ey Yo quiero sobrecargar esta

5:55:16

operación y le voy a decir que en este

5:55:17

caso pues no lo sé le voy a decir que

5:55:19

puede ser un empleado genérico employe

5:55:22

punn vamos a lanzar esta operación Y qué

5:55:24

dice un programador no tiene empleados a

5:55:26

su cargo Ross no se añadirá Pero en

5:55:29

cambio en los otros no ha protestado Por

5:55:31

qué Porque para mí tanto el manager como

5:55:33

el project manager se le pueden Añadir

5:55:36

no no he especializado nada en cambio en

5:55:38

el programador Aquí sí que tenemos un

5:55:39

problema nos vamos al programador Qué

5:55:41

puede hacer el programador me voy a mi

5:55:43

programador y le voy a decir por ejemplo

5:55:45

la operación code Qué hace control está

5:55:47

programando en Swift y si me voy a un

5:55:50

project manager y le digo qué puedo

5:55:51

hacer el project manager a coordinar el

5:55:53

proyecto dice pues bry está coordinando

5:55:56

su proyecto y si me voy al manager qué

5:55:58

va a hacer el manager Pues el manager

5:56:00

puede coordinar todos los proyectos y me

5:56:02

dice mour Deep está coordinando todos

5:56:04

los proyectos de una empresa y si Ahora

5:56:07

me voy por aquí y creo una operación en

5:56:10

la superclase que se llame print

5:56:12

employees por ejemplo Esto va a imprimir

5:56:15

todos los empleados que tiene a su cargo

5:56:18

voy a hacer aquí por employee in

5:56:20

employees self employees y va a hacer

5:56:23

print de los empleados employee punto

5:56:26

que es en este caso qué nos pasaba con

5:56:27

esto employee pun name recordáis tendrá

5:56:30

esto aquí ahora voy a venir por aquí

5:56:32

donde el manager y le voy a hacer print

5:56:34

employees esto funciona imprime a brce y

5:56:37

moure y si me voy al manager y hago

5:56:39

print employees qué tendrá aquí Pues

5:56:41

tendrá a control y Ross y si me voy a my

5:56:44

programmer y hago print employees Porque

5:56:46

a mi programmer le añadí el programador

5:56:48

dos qué pone Aquí vamos a verlo lo veis

5:56:51

dice price y mour control y Ross pero en

5:56:53

este caso no nos imprime nada aunque yo

5:56:56

he intentado añadirlo No nos imprime

5:56:58

nada porque en realidad no le damos ya

5:57:00

Añadir aquí lo tenemos un programador no

5:57:02

tiene empleados a su cargo veis como

5:57:03

estamos montando la jerarquía basándonos

5:57:05

todo en una clase base y en diferentes

5:57:08

clases que nosotros vamos especializando

5:57:10

que en algunos casos heredan mecanismos

5:57:12

y que en otros casos simplemente o lo

5:57:14

sobreescribir o le añadimos

5:57:16

comportamiento Este es el concepto de

5:57:19

por un lado herencia y por otro lado

5:57:21

polimorfismo y veréis lo fácil que sería

5:57:23

seguir modificando esta jerarquía sin

5:57:26

romper una estructura para esto es para

5:57:28

lo que vale el polimorfismo y la

5:57:30

herencia es un concepto Quizás

5:57:33

inicialmente algo complicado sobre todo

5:57:36

a la hora de visualizarlo pero pensar

5:57:38

que siempre es cuestión de definir un

5:57:40

padre que tiene diferentes hijos y que

5:57:43

esos hijos heredan o sobrecargan con

5:57:45

polimorfismo diferentes propiedades por

5:57:47

un lado o funciones por otro

5:57:53

lado hoy vamos a explicar el manejo de

5:57:56

excepciones básicamente el manejo de

5:57:59

errores en los lenguajes de programación

5:58:01

los lenguajes de programación por

5:58:02

supuesto cuando estamos programando

5:58:03

podemos cometer errores pero también

5:58:05

podemos controlar esos esos errores para

5:58:06

que nuestro programa no se detenga

5:58:08

súbitamente seguro que lo habéis vivido

5:58:10

alguna vez que estáis en un programa en

5:58:12

lo que sea y de repente el programa se

5:58:13

cierra Por qué el programa se cierra y

5:58:15

lo tenéis que volver a abrir porque

5:58:16

igual pasó yo que sé se ejecutó

5:58:18

cualquier código que ha cometido un

5:58:20

error y de repente la aplicación se

5:58:23

cierra Por qué pasa eso Porque no

5:58:24

estamos controlando los errores porque

5:58:26

se ha producido un error que seguramente

5:58:29

es inesperado y no se ha hecho nada con

5:58:31

esa acción Entonces el propio lenguaje

5:58:35

de programación empezó a propagar la

5:58:36

excepción y cuando vio que nadie sabía

5:58:39

qué hacer con ese problema pum se acabó

5:58:41

se cierra el programa y no tenemos nada

5:58:43

que hacerle tenemos que volverlo a

5:58:44

arrancar Pero por supuesto hay forma de

5:58:46

controlar excepciones y esto lo hemos

5:58:48

visto mil veces como teóricamente un

5:58:51

programa nos ha dicho que se estaba

5:58:52

contr controlando una excepción que a

5:58:53

veces sucede cualquier problema y nos

5:58:55

aparece un popup dice Se ha producido un

5:58:57

error inesperado bueno eso también nos

5:58:59

ha pasado muchas veces y es porque

5:59:00

quizás hay un error medio raro que no se

5:59:02

ha hecho gran cosa con él pero por lo

5:59:04

menos se ha evitado que el programa se

5:59:05

cerrara Entonces eso también es

5:59:06

importante y es justo la lección que

5:59:08

queremos explicar hoy explora el

5:59:10

concepto de manejo de excepciones Según

5:59:11

tu lenguaje fuerz un error en tu código

5:59:13

claro lo primero que tenemos que hacer

5:59:15

para empezar a ver cómo manejamos

5:59:16

excepciones es acabar provocando un

5:59:18

error en nuestro código captura el error

5:59:20

imprimir dicho error y evita que el

5:59:22

programa se detenga de manera inesperada

5:59:24

y os digo Aquí ya una pista prueba

5:59:26

dividir 10 entre C esto es como en

5:59:28

matemáticas si dividimos 10 entre 0 Qué

5:59:29

pasa Bueno cuando estamos dividiendo un

5:59:31

papel no nos da error pero en realidad

5:59:33

tenemos ahí no podemos dividir entre

5:59:34

cero tenemos un infinito Pues mira igual

5:59:36

que si yo me vengo aquí a un programa Yo

5:59:38

tengo mi ejercicio y hago print porque

5:59:40

voy a imprimirlo y voy a decir mira voy

5:59:41

a imprimir el resultado de 10 / 5 si yo

5:59:44

ahora ejecutar este ejercicio qué me va

5:59:45

a decir dos digo fantástico muy bien

5:59:48

claro 10 / 5 es 2 pero ahora me vengo

5:59:50

arriba y le digo 10 ent cer y qué pasó

5:59:53

pum el programa se detiene hay un error

5:59:55

nos saca el trace por aquí decimos Bueno

5:59:58

pues hay un error dice claro el error lo

6:00:00

tenemos aquí en el 10 ent 0 parece que

6:00:02

se ha cometido un error y nos dice cero

6:00:04

division error division by Pero bueno el

6:00:06

programa se detuvo es decir Qué

6:00:08

significa esto que si yo ahora aquí

6:00:09

tuviera otro print que dice hola qué

6:00:11

pasa pues vamos a ver qué pasa si

6:00:13

ejecuto el programa me dice Hala Peta el

6:00:15

programa y ya no imprímelo a la que pasa

6:00:17

en cambio Si esta línea funcionase me

6:00:20

dice 10 / 1 10 Hola Qué pasa estamos

6:00:23

haciendo que el programa se detenga

6:00:25

entonces aquí es lo que teníais que

6:00:26

investigar cómo somos capaces de

6:00:29

capturar una excepción para que nuestro

6:00:30

programa no se prenda fuego decía

6:00:32

esperar el concepto fuerza el error de

6:00:34

tu código Ya lo tenemos captura el error

6:00:36

vale Pues bueno aquí depende un poquito

6:00:38

del lenguaje que estéis utilizando

6:00:40

básicamente solemos tener una

6:00:42

instrucción en la gran mayoría de

6:00:44

lenguajes que se llama trycatch Bueno ya

6:00:46

digo cada lenguaje pues estas palabras

6:00:48

reservadas pueden variar por ejemplo

6:00:49

Incluso en python pues no es trycatch en

6:00:52

python esta captura de errores es con

6:00:54

try except es decir nosotros metemos un

6:00:57

bloque try y un bloque except okay Y qué

6:01:00

tenemos en este bloque try Step pues

6:01:02

bueno en el try es donde nosotros

6:01:04

tenemos que acabar metiendo el código

6:01:07

que puede que provoque un error qué se

6:01:10

hacen las aplicaciones a nivel

6:01:11

profesional en algún lado se acaban

6:01:13

capturando todos los errores de la

6:01:14

aplicación claro no se trata que

6:01:16

nosotros vayamos metiendo ese TR Catch

6:01:18

ese TR exep en cada bloque de líneas de

6:01:20

código que vayamos programando no lo que

6:01:22

suele tener Es bueno si de verdad hay

6:01:25

estamos ejecutando un código que sí que

6:01:26

sabemos que puede llegar a petar ahí sí

6:01:29

que lo metemos explícitamente pero si no

6:01:31

lo que tenemos es como una captura más a

6:01:33

alto nivel del programa para que si se

6:01:35

comete si era algún error pues que el

6:01:36

programa no prenda fuego Okay entonces

6:01:38

Pero bueno nosotros cómo lo vamos a

6:01:39

hacer aquí Imagínate que claro yo estoy

6:01:42

haciendo una división y digo Uf quién

6:01:44

sabe que igual me aparece una división

6:01:45

entre cero y esto acaba petando Así que

6:01:47

lo voy a intentar controlar bien qué

6:01:49

pasaría con esto que bueno vamos a ver

6:01:51

qué pasa el try nuestro código como

6:01:53

siempre en el exep cuándo se va a

6:01:55

ejecutar este código exep este código

6:01:57

exep se va a ejecutar cuando se produzca

6:02:00

error entonces yo voy a venir por aquí y

6:02:01

voy a decir Se ha producido un error

6:02:03

este bloque solo se lanza si en el try

6:02:06

hay un error inesperado un error que no

6:02:09

está controlado un error que hace que

6:02:11

rompa la ejecución de nuestro programa

6:02:12

Qué nos decía el ejercicio fuerza un

6:02:14

error en tu código captura el error

6:02:16

imprime dicho error de momento vamos a

6:02:17

hacer lo siguiente yo ahora voy a venir

6:02:19

por aquí y voy a poner lo mismo de antes

6:02:20

10 2 y ejecuto mi código vale 10 / 2 5

6:02:24

esto sigue funcionando pero si ahora yo

6:02:26

pongo 10 0 que esto es lo que hacía que

6:02:29

petar el programa ejecuto mi programa Y

6:02:31

qué ha pasado Se ha producido un error

6:02:33

recordáis el print que teníamos aquí y

6:02:35

decía íamos print Hola Qué pasa ahora

6:02:38

aunque se produzca un error fijaos lo

6:02:40

que pasa se produce un error como lo

6:02:42

estamos capturando como lo estamos

6:02:44

controlando dice Uy Pues claro en

6:02:46

la línea en la que Peta si yo ahora

6:02:48

mismo esto lo metiera aquí y lo ejecutar

6:02:51

el programa ves que ya solo imprime Se

6:02:52

ha producido un error digamos que ha

6:02:54

petado en esta línea ha fallado en esta

6:02:56

línea se va directamente al bloque del

6:02:58

step se va directamente a la captura del

6:03:00

error y en la captura del error lo

6:03:01

maneja cómo lo manejamos aquí Bueno no

6:03:04

lo manejamos digamos en lo único que

6:03:06

hacemos Es imprimir que se ha producido

6:03:07

un error bueno es una pseudo manera de

6:03:10

manejar qué se espera en un programa

6:03:12

profesional que de verdad intentemos

6:03:14

reponernos del error que de verdad

6:03:15

intentemos avisar al usuario que de

6:03:17

verdad intentemos controlar que hay un

6:03:19

error inesperado que está haciendo que

6:03:21

nuestro programa falle y que nos ayude a

6:03:24

que en futuras versiones lo podamos

6:03:26

controlar mejor Bueno aquí de momento

6:03:28

simplemente avisamos de que se ha

6:03:29

producido un error pero veis que aunque

6:03:31

hemos controlado este error ya nos

6:03:33

imprime loa que pasa porque la línea la

6:03:35

que falla salta al except y a otra cosa

6:03:38

pero si yo ahora me viniera aquí y sigo

6:03:40

mi programa ahora sí que diría Se ha

6:03:42

producido un error y Hola Qué pasa

6:03:43

continúa la ejecución hace todo lo que

6:03:45

tiene que hacer en el manejo de errores

6:03:46

que solo es el bloque trp y después

6:03:48

sigue con su vida el programa no ha

6:03:50

petado el programa nos ha detenido y

6:03:53

hemos acabado controlando el error Okay

6:03:54

entonces bueno casi de momento hemos

6:03:57

sido capaces de por lo menos capturar el

6:03:59

error pero nos dice imprime dicho error

6:04:01

claro ahora tenemos aquí un problema que

6:04:04

nosotros no sabemos que error Se ha

6:04:06

producido esto de momento habitualmente

6:04:08

también en los bloques del Catch del

6:04:10

except en el bloque que se ejecuta

6:04:12

cuando se produce un error somos capaces

6:04:15

de capturar el tipo de error básicamente

6:04:17

cada lenguaje de programación tiene un

6:04:20

error llamémosle un super error un error

6:04:23

padre un error que los maneja todos en

6:04:27

python se llama exception todos los

6:04:29

errores del sistema tienen que acabar

6:04:31

derivando de excep entonces si yo le

6:04:33

digo Mira captura aquí todas las

6:04:36

excepciones es decir poner except

6:04:38

exception es lo mismo que poner except

6:04:39

porque en realidad por except se va a ir

6:04:41

cualquier excepción sin más solo que

6:04:43

nosotros ya lo veremos que podemos

6:04:44

especializar las excepciones y yo le

6:04:46

digo Mira la exception es recógeme en un

6:04:49

parámetro para que yo sepa Se ha

6:04:51

producido un error y ahora por aquí

6:04:52

vamos a imprimir Qué es este e sin más

6:04:55

voy a imprimir el contenido de la

6:04:56

excepción y voy a lanzar mi programa

6:04:58

veis lo que pone Se ha producido un

6:05:00

error division by Zero ya tenemos el

6:05:03

error que ha hecho que nuestro programa

6:05:05

fallara claro podríamos tener más tipos

6:05:08

de errores voy a poner aquí 10 / 1 para

6:05:10

que no falle pero ahora me voy a venir

6:05:11

por aquí y me voy a crear una lista que

6:05:14

tiene números 1 2 3 y 4 y ahora voy a

6:05:17

venir por aquí voy a hacer un print voy

6:05:19

a acceder a mi lista y le voy a decir

6:05:21

accede al elemento cer lo lanzamos Y qué

6:05:24

vemos 10 / 1 es 10 y el elemento c lo

6:05:27

que hay es un uno en el elemento 1 lo

6:05:30

que hay es un dos en el elemento dos lo

6:05:32

que hay es un tres Bueno estamos

6:05:34

accediendo correctamente a los elementos

6:05:36

de esta lista pero ahora Yo vengo por

6:05:37

aquí qué vemos elemento cero elemento 1

6:05:39

2s y tres vengo por aquí le digo quiero

6:05:42

Acceder al elemento 4 qué va a pasar el

6:05:44

elemento cuatro no existe en nuestra

6:05:46

lista se produce una excepción se va por

6:05:49

aquí Y empezamos a leer Se ha producido

6:05:51

un error list Index out of Range otro

6:05:54

error decir Estos son errores que el

6:05:56

sistema sí que es capaz de saber qué

6:05:58

hacer con ellos ya hemos sido capaces de

6:06:01

controlar este error y este error dos

6:06:03

tipos de errores distintos esto ya sab

6:06:05

veis puedo venir aquí lo simplificamos

6:06:07

hacemos esto a ver qué pasa vemos que

6:06:10

tenemos el mismo error creamos la lista

6:06:11

y accedemos a continuación al elemento 4

6:06:13

entonces ya somos capaces de controlar

6:06:15

dos errores distintos y de imprimir la

6:06:18

naturaleza de esos errores esta era la

6:06:21

primera parte del ejercicio vamos a la

6:06:22

dificultad esta nos dice Crea una

6:06:24

función que sea capaz de procesar

6:06:25

parámetros pero también pueda lanzar

6:06:27

tres tipos diferentes de excepciones me

6:06:29

voy a crear una función y le voy a

6:06:31

llamar pues por ejemplo process params

6:06:34

no process param y esto lo que va a

6:06:36

tener es parámetros parámetros le

6:06:38

podríamos pasar varios parámetros o le

6:06:40

podríamos decir que recibe una lista de

6:06:43

parámetros nos da un poquito igual esto

6:06:45

como lo pensaris Vale tengo esta lista

6:06:48

de parámetros y aquí podría intentar

6:06:50

hacer cosas con los parámetros qué

6:06:52

podría intentar hacer ya que tengo una

6:06:54

lista de parámetros vamos a intentar

6:06:55

hacer lo mismo voy a venir por aquí y

6:06:57

voy a hacer un print y simplemente voy a

6:06:59

intentar Acceder al elemento tres por

6:07:03

ejemplo Entonces parameters 3 de momento

6:07:06

mi función lo único que hace es esto

6:07:07

Bueno al elemento tres en la lista al

6:07:09

elemento dos por índice algo así como si

6:07:11

yo ahora viniera aquí y llamara a

6:07:13

process params y yo le paso una lista

6:07:15

que tiene un dos y tres esto básicamente

6:07:18

si lo ejecuto vemos lo que pone aquí me

6:07:20

imprime un tres en el elemento tres hay

6:07:22

un tres vale de momento tengo un

6:07:24

procesado de parámetros que en realidad

6:07:26

es que no no hace nada No pero qué decía

6:07:28

el ejercicio que en realidad necesitamos

6:07:30

un programa que sea capaz de lanzar

6:07:33

excepciones porque de momento hemos

6:07:35

hemos visto un concepto de que es el

6:07:37

sistema el que lanza excepciones pero

6:07:39

también podríamos ser nosotros los

6:07:41

encargados de lanzar excepciones vamos a

6:07:43

ir primero con las partes fáciles voy a

6:07:45

venir por aquí y vamos a intentar

6:07:47

capturar excepciones voy a hacer un try

6:07:49

voy a hacer un except y de momento ahora

6:07:52

Aquí vamos a poner igual que antes que

6:07:53

se ha producido un error de momento por

6:07:56

lo que vemos aquí lo único que tenemos

6:07:58

es un control de excepciones sin más a

6:08:01

ver qué nos dice tiene que ser capaz de

6:08:03

lanzar tres tipos diferentes de

6:08:05

excepciones una de ellas tiene que

6:08:07

corresponder con un tipo de excepción

6:08:08

creada por nosotros Entonces lo primero

6:08:10

que nos dice es captura todas las

6:08:12

excepciones desde el lugar que llamas la

6:08:14

función ostras primero vamos a intentar

6:08:16

que este programa sea capaz de lanzar

6:08:19

excepciones para eso tenemos que

6:08:21

capturar las excepciones Entonces yo

6:08:23

puedo venir aquí y le digo Mira vas a

6:08:24

capturar la excepción y esto se va a

6:08:26

llamar e os decía que aquí controlarías

6:08:29

la excepción pero en realidad nosotros

6:08:31

tendríamos que ser capaces de lanzar la

6:08:34

excepción así las capturo pero imagínate

6:08:36

que yo tengo un programa muy inteligente

6:08:38

en el que quiero acabar lanzando yo las

6:08:41

excepciones Entonces vamos a por ejemplo

6:08:44

aquí mi programa voy a venir por aquí y

6:08:46

le voy a decir si la longitud de los

6:08:49

parámetros de la lista es menor que dos

6:08:54

Pues podría ser un problema pensar esto

6:08:56

claro yo a cualquiero Acceder al

6:08:57

elemento tres Pues le voy a decir si es

6:08:59

menor que tres Esto para mí podría ser

6:09:01

un problema porque en el momento que

6:09:03

vengo aquí y hago esto esto podría

6:09:05

acabar dando un error Entonces primero

6:09:07

tengo que controlar si de verdad me pasa

6:09:09

esto okay Ya tengo esto si fuera mayor

6:09:12

que dos sería la forma de yo ejecutar

6:09:14

esto muy bien Vengo por aquí pero qué

6:09:16

pasa si es menor que tres si la longitud

6:09:20

del listado es menor que tres yo no

6:09:23

podría ejecutar Esto me iba a acabar

6:09:24

dando un error con lo cual yo tendría

6:09:26

que ser capaz de lanzar un error cómo lo

6:09:28

lanzamos habitualmente en muchos

6:09:30

lenguajes se lanza con la palabra

6:09:31

reservada throw bueno en python tenemos

6:09:34

esta palabra reservada que se llama

6:09:36

raise Cuál es el error que tenemos si

6:09:39

nos pasamos de Rango al consultar una

6:09:42

lista aquí podríamos ver los errores más

6:09:44

habituales del sistema o consultarlos

6:09:47

esto todo por supuesto está en la

6:09:48

documentación o en el momento que

6:09:50

capturamos los errores aquí podríamos

6:09:52

saber qué tipo de error básicamente los

6:09:54

errores todos están documentados del

6:09:57

sistema y yo sé que podemos tener un

6:10:00

problema a la hora de consultar el

6:10:01

índice Qué problema podemos tener a la

6:10:03

hora de consultar el índice pues Pues no

6:10:05

lo sé decíamos list Index error podría

6:10:09

ser un Index error No lo sé vosotros

6:10:11

siempre intentar Buscar errores muy bien

6:10:14

Voy a la documentación Qué problema

6:10:15

tengo o en el momento que yo intento

6:10:18

lazar esta excepción esta excepción pues

6:10:20

qué clase sería o intentar sacar siempre

6:10:23

información sobre esto porque es lo

6:10:24

mejor que tenéis incluso vosotros

6:10:26

podíais venir aquí Bueno esto ya es un

6:10:28

poquito más avanzado pero os podríais ir

6:10:30

al tipo y dentro del tipo pasarle el e y

6:10:32

decirle Cuál es la clase Cuál es el name

6:10:34

de esta excepción dejadme que comente

6:10:36

esto simplemente para que veáis lo que

6:10:38

se me va a mostrar aquí y veis esto

6:10:40

Index error cuando yo hago fallar esto

6:10:43

mira lo vamos a poner así Index error

6:10:45

entre paréntesis para que veáis el

6:10:47

nombre del error y también el tipo del

6:10:50

error el e y el Index error para que se

6:10:52

muestre esto list Index out of Range que

6:10:54

es la descripción del error y el tipo de

6:10:56

error Index error Así que yo ya sé que

6:10:58

claro cuando me paso de índice yo voy a

6:11:00

tener un Index error Así que lo que voy

6:11:02

a lanzar yo a mano porque por la lógica

6:11:04

de mi programa Imagínate yo sé que voy a

6:11:07

tener que sí o sí Acceder al elemento

6:11:09

dos por la lógica que sea la que os

6:11:11

querrás inventar entonces tengo que

6:11:13

saber que si de verdad aquí tengo menos

6:11:17

de tres elementos me va a fallar porque

6:11:19

yo quiero consultar precisamente el

6:11:20

elemento tres Así que le voy a decir que

6:11:22

quiero lanzar un Index error sin más

6:11:25

podría decir venga lánzate excepción

6:11:27

lanza un Index error porque yo sé que si

6:11:30

no lo lanzo yo si no lo controlo voy a

6:11:32

tener un problema Vale ahora por otro

6:11:34

lado Voy a hacer otro print y voy a

6:11:35

decir Imagínate que yo ahora lo que

6:11:37

quiero hacer es el parámetro c lo quiero

6:11:41

dividir entre el parámetro 1 es decir

6:11:43

quiero dividir 1 entre 2 qué tendría que

6:11:46

aquí acabar controlando pues por ejemplo

6:11:48

para que esto pudiera funcionar tendría

6:11:50

que controlar que por ejemplo el

6:11:52

parámetro 1 no fuera un cer0 para que no

6:11:54

me petara el programa porque voy a

6:11:56

dividir entre cero Así que yo le podría

6:11:58

decir vale control este error pero Else

6:12:01

If en caso de que el parámetro 1 sea

6:12:04

igual a cer esto yo sé que me va a

6:12:06

acabar provocando otro error que haría

6:12:08

que se me detuviera el programa Así que

6:12:10

lo que hago es aquí yo a mano digo Ey

6:12:13

cuidado esto haría fallar a mi programa

6:12:15

le voy a decir que ahora quiero lanzar

6:12:17

otro error Cuál era el error si ahora

6:12:19

vengo por aquí digo a ver qué error se

6:12:22

produce cuando divido entre cero y

6:12:23

tenemos cero division error Así que

6:12:26

vengo por aquí y le digo lanza este

6:12:28

error cero division r ya está Y estos

6:12:30

dos los tenemos a mano qué pasaría ahora

6:12:32

vamos a intentar hacer que falle nuestro

6:12:35

programa por ejemplo aquí esto haría que

6:12:37

falle nuestro programa si le mando a

6:12:39

process params una lista que tiene dos

6:12:41

elementos Esto va a hacer que nuestro

6:12:43

programa PT lo voy a lanzar lanzamos el

6:12:45

programa Aquí lo tenemos Index error

6:12:47

ostras Pero por qué tenemos un error

6:12:50

aquí y hemos hecho que el programa se

6:12:52

detuviese Yo podría venir aquí y hago

6:12:54

print el programa finaliza para saber si

6:12:56

esto se ejecuta veis que en ningún

6:12:58

momento Se imprime el programa finaliza

6:13:00

Por qué llamamos a process params le

6:13:03

mandamos estos dos parámetros en la

6:13:05

lista y aquí va a comprobar Oye es menor

6:13:07

que tres la longitud sí es dos para

6:13:10

nosotros eso es un error por la lógica

6:13:11

que nos dé la gana lamos un error pum lo

6:13:14

estoy capturando el error no lo estoy

6:13:16

capturando vale Cómo capturamos

6:13:18

errores ya lo vimos try except Y ahora

6:13:21

yo pongo aquí igual que antes Sprint Se

6:13:23

ha producido un error lo lanzo se

6:13:25

detiene nuestro programa no se ha

6:13:28

producido un error y el programa

6:13:29

finaliza ya hemos por un lado en esta

6:13:32

función evitado que fallara porque hemos

6:13:35

capturado el error antes y lo hemos

6:13:36

lanzado para avisar a nuestra aplicación

6:13:38

de Oye cuidado me has pasado algo que me

6:13:40

va a hacer fallar ten cuidado lo que me

6:13:42

pasas y yo ahora aquí lo controlo y digo

6:13:45

Ah vale Se ha producido un error

6:13:47

perfecto y yo ahora aquí en mi

6:13:48

aplicación pues hago lo que sea notifico

6:13:50

al usuario o hago una prueba con otro

6:13:52

número lo que me dé la gana por supuesto

6:13:55

try Step lo podríamos meter aquí pero

6:13:57

estamos intentando ver también comoo los

6:13:58

errores se propagan y somos capaces

6:14:01

nosotros de capturarlos a lo largo de

6:14:02

toda la ejecución del programa pero que

6:14:04

nos el ejercicio decía captura todas las

6:14:07

excepciones ya soy capaz de capturar

6:14:09

todas las excepciones estoy poniendo

6:14:10

except con lo cual cualquier excepción

6:14:12

que se produzca aquí yo voy a ser capaz

6:14:14

de pillar Entonces hasta aquí estamos

6:14:15

bien y me dice imprime el tipo de error

6:14:18

Uy aquí ya tenemos un problema Entonces

6:14:20

aquí yo quería que también revisar lo

6:14:22

siguiente Cómo nosotros aparte de poder

6:14:25

capturar todas las excepciones podríamos

6:14:27

hacer algo Bastante Guay que es Y por

6:14:30

qué no intento capturar solo la

6:14:32

excepción por ejemplo del error de

6:14:34

índice dice en vez de poner aquí como

6:14:36

poníamos antes exception as e para

6:14:39

capturarla ahora digo no no no Yo solo

6:14:41

quiero venir por aquí y capturar el

6:14:43

Index error y digo el número de

6:14:45

elementos de la lista debe ser mayor que

6:14:48

dos por ejemplo este es justo el error

6:14:51

que estamos haciendo aquí que si es

6:14:52

menor que tres nos va a hacer un PT voy

6:14:55

a lanzar el programa veis esto el número

6:14:57

de elementos de la lista debe ser mayor

6:14:59

que 2 Bueno no está mal no ahora hemos

6:15:02

capturado únicamente Index error muy

6:15:05

bien voy a hacer que mi lista tenga tres

6:15:07

valores ahora ya no va a fallar el

6:15:08

programa finaliza fin Pero y si yo ahora

6:15:11

aquí me hago un poco el perro y le pongo

6:15:13

un cero ahora no va a fallar por aquí ya

6:15:16

que los elementos son tres O aunque le

6:15:18

metiera más le meto más elementos aquí

6:15:20

pero cuándo va a fallar cuando le dé por

6:15:22

inspeccionar el elemento uno de la lista

6:15:24

y en realidad valga cer0 eso provocaría

6:15:26

la división entre cero de nuestro

6:15:28

programa hago esto Qué pasó nuestro

6:15:30

programa se detuvo y no ha imprimido el

6:15:33

programa finaliza Pero cómo si yo he

6:15:35

hecho un try exep ya ya tú has hecho un

6:15:36

tryp pero en el que solo estás

6:15:39

capturando Index error qué podría hacer

6:15:41

Yo vengo por aquí digo porque quiero

6:15:43

hacer un código diferente justo para

6:15:46

este error Zero division error y digo el

6:15:49

segundo elemento de la lista no puede

6:15:52

ser un cero y ahora cuando yo lo lanzo

6:15:55

mi programa ya no se detiene súbitamente

6:15:57

nos Explica el error segundo elemento de

6:15:59

la lista no puede ser un cero y el

6:16:00

programa finaliza lo veis así ya no solo

6:16:03

estamos capturando excepciones de manera

6:16:05

genérica sino que estoy capturando una

6:16:07

excepción concreta de un tipo concreto y

6:16:10

estoy desencadenando el código adaptado

6:16:13

al tipo de excepción que se está

6:16:14

produciendo por supuesto Siempre es una

6:16:16

buena práctica a pesar de que nosotros

6:16:19

capturemos este tipo de cosas que yo

6:16:21

venga por aquí y que diga Bueno except

6:16:23

pues seguramente Oye Quédate con las

6:16:25

excepciones no esto también podría estar

6:16:27

bien excepción as e y ahora print y le

6:16:30

digo Se ha producido un error inesperado

6:16:32

y vengo por aquí y ahora imprimo este

6:16:34

eror inesperado porque en este caso

6:16:36

claro se va a ir por este bloque de

6:16:38

código en el momento que no se produzca

6:16:40

ni un Index error ni un cero divisón

6:16:42

error entonces la vamos a liar pero

6:16:44

estamos haciendo que nuestro programa no

6:16:47

vamos a hacer lo siguiente voy a

6:16:49

intentar lanzar otro error vengo por

6:16:51

aquí y esto ya lo hago bien y otra cosa

6:16:53

que va a hacer nuestro programa es

6:16:55

parameters voy a ir al elemento dos y le

6:17:00

voy a sumar cinco lanzo mi programa

6:17:03

perfecto Cuál es el elemento dos 0 1 2 3

6:17:06

+ 5 8 aquí tenemos ocho pero ahora lo

6:17:09

que os decía antes voy a hacer aquí un

6:17:11

poco el perro y le voy a poner bryce y

6:17:14

ahora voy a lanzar mi programa Qué ha

6:17:15

pasado claro ahora el elemento dos de la

6:17:18

lista es un texto al texto ya no le

6:17:20

puedo sumar cinco lo podría hacer con un

6:17:23

número qué ha pasado Se ha producido un

6:17:25

error inesperado no se ha producido ni

6:17:27

un Index error que lo controlamos no se

6:17:29

ha producido ni un cero division error

6:17:31

que lo controlamos Se ha producido otro

6:17:33

error que yo no tenía ni idea idea que

6:17:35

se iba a cometer Muy bien pues se ha ido

6:17:37

por el blo exception y nos ha dicho que

6:17:40

error hay no se puede concatenar una

6:17:41

cadena de texto no entera a otra cadena

6:17:44

de texto ya está he sido capaz de

6:17:46

controlar un error que yo no sabía ni

6:17:48

que se podía producir pero mi programa

6:17:50

es seguro el programa finaliza con lo

6:17:52

cual el programa finaliza sin detenerse

6:17:55

súbitamente digamos el programa finaliza

6:17:57

sin detenerse lo tengo aquí controlado

6:17:59

vale Pero y Qué pasa si yo quisiera

6:18:02

especificar algún tipo de excepción que

6:18:05

no está en el sistema porque imagínate

6:18:07

que yo ahora quiero por ejemplo aquí

6:18:10

esto iba a ser un problema yo ahora lo

6:18:11

que quiero lo que me gustaría controlar

6:18:14

es que si el parámetro dos es una cadena

6:18:17

de texto es decir si el type de esto si

6:18:20

esto fuera una cadena de texto podríamos

6:18:22

pensar esto le digo ostras si esto se

6:18:25

cumple esto es un error para mí porque

6:18:27

claro cuando yo intente hacer esto si es

6:18:29

una cadena de texto va a petar de

6:18:30

momento vamos a hacer esto Rise excepto

6:18:32

sin más a ver si ahora nuestro programa

6:18:34

o mira voy a lanzar esta el cero

6:18:36

division exception ahora sabemos que

6:18:38

nuestro programa donde Peta es en esta

6:18:40

línea A ver qué pasa lo lanzo veis el

6:18:42

segundo elemento de la lista no puede

6:18:43

ser un cero bueno es una excepción que

6:18:45

la estamos lanzando de manera incorrecta

6:18:47

ya que estamos lanzando una excepción

6:18:49

del sistema que no representa lo que de

6:18:51

verdad está pasando lo que de verdad

6:18:52

está pasando Es que para nosotros es un

6:18:54

error que el segundo elemento de la

6:18:56

lista sea una cadena de texto vale Así

6:18:59

que voy a venir por aquí y vamos a ir a

6:19:01

otro apartado que nos decía el ejercicio

6:19:03

decía una de las excepciones que

6:19:05

lancemos tiene que corresponderse con un

6:19:07

tipo de excepción creada por nosotros de

6:19:09

manera personalizada y debe ser lanzada

6:19:11

de manera manual Qué significa que yo

6:19:13

también puedo crear mis propias

6:19:15

excepciones al final las excepciones en

6:19:17

la gran mayoría de lenguajes seguramente

6:19:19

sean una clase y yo voy a decir str type

6:19:22

error no una excepción que me acabo de

6:19:24

inventar el nombre para representar que

6:19:27

el tipo es un String y que para mí eso

6:19:28

va a ser un error Qué tengo que hacer

6:19:30

para que de verdad esto se comporte como

6:19:31

una excepción simplemente le tengo que

6:19:33

decir que herede esto ya lo vimos en

6:19:35

otra clase Ya vimos Qué significa la

6:19:37

herencia simplemente lo que le digo es

6:19:39

Mira tú hereda el comportamiento de las

6:19:41

excepciones y sin más no hagas nada pas

6:19:44

pero yo ahora ya voy a tener una

6:19:46

excepción que se va a llamar así y vengo

6:19:48

por aquí y le digo ahora lanza mi

6:19:51

excepción mi excepción personalizada

6:19:53

Okay vamos a lanzar el programa y vemos

6:19:55

aquí Se ha producido un error inesperado

6:19:58

dos puntos nada Por qué Porque claro

6:20:00

nuestra excepción personalizada por

6:20:02

defecto es que no tiene ni un mensaje y

6:20:04

yo ahora le voy a poner un mensaje

6:20:06

personalizado yo le podría poner un

6:20:07

mensaje a mi excepción y le diría

6:20:10

el segundo elemento no puede ser una

6:20:14

cadena de texto Esta es mi excepción

6:20:16

ahora lanzo mi programa y veis lo que

6:20:18

dice Se ha producido un error inesperado

6:20:20

el segundo elemento no puede ser una

6:20:21

cadena de texto tengo una excepción

6:20:23

personalizada Qué significa esto que

6:20:25

incluso con mi excepción personalizada

6:20:27

yo ahora podría venirme por aquí y

6:20:29

decirle ahora también quiero capturar mi

6:20:31

sección personalizada la puedo capturar

6:20:33

igual que las del sistema le digo ahora

6:20:35

captura str type r y simplemente lo voy

6:20:38

a imprimir porque ya sé que ya me viene

6:20:40

con el texto y veis el segundo elemento

6:20:42

no puede ser una cadena de texto y si

6:20:43

ahora se produjese otro error que yo no

6:20:45

cuento con él ya se acabaría yendo por

6:20:47

exceptio es decir tenemos dos del

6:20:50

sistema Index error ther division error

6:20:52

una creada por nosotros str type error y

6:20:55

la captura de cualquier otro error como

6:20:57

buena práctica para que no tenga

6:20:59

problemas vale digo el segundo elemento

6:21:01

de la lista Bueno en realidad este dos

6:21:03

sería el tercer elemento de la lista no

6:21:05

el tercer elemento de la lista ahora lo

6:21:07

tenemos bien entonces ya fui capaz de

6:21:09

capturar todo vale Y ahora esto aquí

6:21:11

decíamos imprime que la ejecución ha

6:21:13

finalizado Esto me va a servir para

6:21:15

explicaros alguna cosilla más que esto

6:21:17

en realidad no lo tienen todos los

6:21:19

lenguajes habitualmente los lenguajes lo

6:21:21

que sí que van a tener es esto el lugar

6:21:23

donde se inspecciona el código y la

6:21:25

captura de errores del sistema generales

6:21:28

personalizados Esto va a tener pero

6:21:29

python tiene dos cositas más que podemos

6:21:32

meter en el bloque de excepciones por un

6:21:35

lado es que nosotros le podemos indicar

6:21:38

en un blog código que se ejecute siempre

6:21:40

esto lo hacemos con la instrucción

6:21:41

Finally Y fíjate me voy a llevar esto

6:21:44

del programa finaliza sin detenerse al

6:21:46

final esto lo que va a hacer es que pase

6:21:49

lo que pase Durante este manejo de

6:21:52

excepciones incluso que se ejecute el

6:21:54

try que el process params como está

6:21:57

pasando ahora que se vaya e intente

6:21:59

manejar un error lo que va a hacer Sí o

6:22:01

sí al final es irse al Finally veis lo

6:22:04

que que pone aquí el programa finaliza

6:22:05

sin detenerse ya no solo nos ejecutaba

6:22:08

antes la línea que teníamos fuera ahora

6:22:09

si queremos hacer algo siempre imagínate

6:22:12

vamos a presuponer que en el Finally

6:22:14

informamos siempre a servidor y si se ha

6:22:16

provocado un error o no O que enviamos

6:22:18

al error el servidor o que limpiamos los

6:22:21

datos de un formulario imagínate falle o

6:22:24

no falle bueno eh pensar un código que

6:22:27

tengamos que ejecutar siempre se

6:22:29

produzca un error o no se produzca Pues

6:22:31

para eso es para lo que tenemos el

6:22:32

Finally pero aparte aún tenemos otra

6:22:35

instrucción esto no dejan de ser como

6:22:36

una especie de ifs verdad pues tenemos

6:22:39

incluso la instrucción els dentro del

6:22:41

bloque TR Step y esto Qué representa

6:22:44

Pues el els Qué es el els es que no se

6:22:47

ha cumplido ninguna de estas opciones

6:22:50

que este els es como el els de un If

6:22:52

Cuándo se ejecuta el If bueno pensar que

6:22:54

esto es como una especie de If y el If

6:22:56

no se ha producido el Index error no se

6:22:58

ha producido el cer division error no se

6:23:00

ha producido el str type error no se ha

6:23:02

producido el exception no entonces ahí

6:23:05

es cuando se ejecuta el print

6:23:06

básicamente para que lo entendáis el

6:23:08

print se ejecuta cuando no se han

6:23:10

producido errores voy a poner aquí no se

6:23:12

ha producido ningún error así de fácil

6:23:15

ahora vamos a lanzar nuestro programa en

6:23:17

nuestro programa sí que se ha producido

6:23:18

un error lo veis aquí el tercer elemento

6:23:20

no puede ser una cadena de texto y nos

6:23:21

dice el programa finaliza Aquí lo tenéis

6:23:23

nos controla el str type error y después

6:23:26

se va al Finally pero ahora voy a poner

6:23:28

todo bien en mi programa teóricamente si

6:23:30

yo pongo esto 1 2 3 4 no se va a

6:23:32

producir ningún error porque no es

6:23:34

Ninguno de los errores que tenemos

6:23:36

controlados esto se tiene que acabar

6:23:37

ejecutando bien Así que vengo por aquí

6:23:39

lanzo mi programa y vemos lo que imprime

6:23:42

aparte de los resultados de tratar esos

6:23:44

datos nos imprime no se ha producido

6:23:45

ningún error Dónde está eso en el els

6:23:48

claro no se ha producido ninguno de

6:23:49

estos errores controlados Así que

6:23:51

imprime el els y el Finally que siempre

6:23:53

lo va a hacer así que el els sí que es

6:23:55

opcional que se acabe imprimiendo no

6:23:57

igual que los errores okay Y con esto yo

6:24:00

creo que ya tenemos el manejo completo

6:24:02

de errores una explicación muy simple ya

6:24:05

veis que la explicación más simple Pues

6:24:06

será nada un segundo pero en esta un

6:24:08

poquito más compleja ya veis lanzar

6:24:10

errores del sistema crear errores

6:24:12

propios controlar errores genéricos y

6:24:15

aquí tenemos Cómo acabamos controlando

6:24:17

cada uno y como ejecutamos código

6:24:19

distinto y aparte cómo somos capaces de

6:24:22

controlar que no se haya producido un

6:24:23

error y también ejecutar un bloque de

6:24:25

código que siempre lo haga se produzco

6:24:27

un error o no Ya digo esto no existe en

6:24:30

todos los lenguajes de programación

6:24:31

manejo de errores creación de errores

6:24:33

propios sí bloes Finally habitualmente

6:24:35

pero igual lo que no tenéis Quizás lo

6:24:37

más raro es stels esto igual no lo

6:24:40

tenéis en todos los lenguajes de

6:24:41

[Música]

6:24:46

programación manejo de ficheros trabajar

6:24:49

con ficheros es algo s super habitual en

6:24:51

programación sobre todo cuando estamos

6:24:53

aprendiendo porque nos exige acabar

6:24:56

desarrollando una dinámica pues muy

6:24:58

habitual entre lenguajes de programación

6:25:00

pues lo típico poder crear un fichero

6:25:01

poder escribir un fichero poder leerlo

6:25:03

poder borrar arlo vale todo con el

6:25:05

sistema de archivos de nuestro propio

6:25:06

sistema operativo Vale qué tenía que

6:25:08

hacer el ejercicio vamos a ir primero a

6:25:10

la parte más simple desarrolla un

6:25:11

programa capaz de crear un archivo que

6:25:13

se llame como tu usuario de github y

6:25:15

tenga la extensión txt dice añá ese

6:25:18

archivo varias líneas el nombre tu edad

6:25:20

el lenguaje de programación favorito

6:25:21

tienes que imprimir Su contenido y

6:25:23

después borrarlo y vamos a ver cómo

6:25:25

somos capaces de resolver este ejercicio

6:25:26

desarrollo un programa capaz de crear un

6:25:28

archivo que se llame como tu usuario de

6:25:30

github y tenga la extensión t XT vale

6:25:32

aquí cada persona dependiendo de

6:25:34

lenguaje de programación que haya

6:25:35

elegido tendría que buscar Cómo poder

6:25:38

acabar trabajando con ficheros Okay yo

6:25:40

lo voy a explicar con python pero ya os

6:25:42

digo que la dinámica suele ser muy

6:25:43

parecida en cualquier lenguaje de

6:25:45

programación si veis los ejemplos en los

6:25:47

otros lenguajes de programación acabaré

6:25:49

entendiendo fácilmente que esa dinámica

6:25:51

esa lógica es muy parecida vale porque

6:25:53

va a haber operaciones del sistema

6:25:55

capaces de ayudarnos a crear ficheros y

6:25:57

a manejarlos en python lo que tenemos

6:25:59

que hacer es importar os operative

6:26:02

System básicamente un módulo que es

6:26:04

capaz de darnos operaciones que nos

6:26:06

permiten interactuar con el sistema

6:26:08

operativo Okay entonces para eso

6:26:10

nosotros lo que podemos hacer por

6:26:11

ejemplo es llamar una operación que se

6:26:13

llama Open Y en este Open Nosotros le

6:26:15

podríamos pasar el nombre del fichero

6:26:17

cómo queremos llamarla a nuestro fichero

6:26:19

decíamos nuestro nombre de usuario como

6:26:21

lo voy a tener que utilizar en varios

6:26:22

sitios me voy a crear por aquí una

6:26:24

variable que le voy a llamar filen y

6:26:26

nuestro fichero dijimos que se iba a

6:26:27

llamar mouredev txt entonces sin más yo

6:26:30

lo que voy a hacer es es lo que quiero

6:26:32

abrir filename vale Y aquí por ejemplo

6:26:35

en python aparte de decirle el fichero

6:26:37

que queremos abrir le tenemos que decir

6:26:39

en qué modo lo queremos abrir y aquí le

6:26:41

podríamos indicar mira como Quiero abrir

6:26:43

mi fichero es con w con write Con

6:26:46

permiso de escritura por qué porque voy

6:26:48

querer escribir algo claro nosotros

6:26:50

ahora podríamos arrancar nuestro

6:26:51

programa y no sé si lo veis aquí abajo

6:26:54

pero veis que ya Solo lanzando esa línea

6:26:56

yo ya tengo un mour de.txt ya he sido

6:26:59

capaz de crear un fichero lo crea la

6:27:01

raíz del proyecto podríamos acabar

6:27:02

indicándole una ruta no os lo pedía Por

6:27:05

qué Porque como Os pido trabajar con el

6:27:06

fichero y después borrarlo pues no me

6:27:09

importaba donde metieras el fichero ni

6:27:11

al final la localización era un poco a

6:27:14

vuestra bola como yo os lo voy a pedir

6:27:15

borrar pues sin más vale Ya tengo creado

6:27:17

el fichero Ahora aquí lo que tendríamos

6:27:19

que hacer es vale Y si yo ya tengo el

6:27:21

fichero qué podríamos hacer lo podríamos

6:27:24

guardar podríamos acabar trabajando con

6:27:26

él bueno tenemos una forma de trabajar

6:27:28

con un fichero Pues de Pues de una

6:27:31

manera bastante segura que es trabajando

6:27:32

dentro de un contexto con él para eso yo

6:27:35

en python por ejemplo le puedo hacer

6:27:36

with open de esta forma le podría decir

6:27:38

mira lo vas a abrir y lo vas a asociar a

6:27:41

una variable que yo le voy a llamar file

6:27:43

sin más y ahora dentro del Wi como si

6:27:46

fuera una especie de operación nosotros

6:27:47

podríamos Acceder al fichero y

6:27:49

tendríamos ya un flujo de conexión con

6:27:52

nuestro fichero para hacer diferentes

6:27:54

operaciones y operaciones en modo right

6:27:57

en modo escritura okay Así que yo ahora

6:28:00

podría venir por aquí y decirle right

6:28:02

dentro del fichero tengo la operación de

6:28:04

escritura ya veis qué fácil es y qué es

6:28:06

lo que quiero escribir en mi fichero qué

6:28:08

me decía el ejercicio me decía añade

6:28:10

varias líneas en este fichero tu nombre

6:28:12

la edad y tu lenguaje de programación

6:28:14

favorito por probar algo entonces por

6:28:15

ejemplo mi nombre br mour Okay y si

6:28:18

quiero escribir otra línea vamos a

6:28:19

probar esto lo que podríamos pensar es

6:28:21

si accedo tres veces a él y ahora le

6:28:23

digo mi edad hablábamos aquí 36 mi

6:28:26

lenguaje de programación favorito Bueno

6:28:28

ya que estamos en python le voy a poner

6:28:29

python vamos a lanzar mi programa vamos

6:28:32

a ir a mured viste Oh qué hace python

6:28:36

por defecto esto cada lenguaje puede

6:28:38

tener algunas diferencias pero aquí cada

6:28:40

vez que yo llamo a Wi está concatenando

6:28:42

en el fichero al final no me está

6:28:44

haciendo saltos de línea con lo cual yo

6:28:46

tendría que pensar Uy pues quizás igual

6:28:48

le tengo que acabar concatenando a cada

6:28:51

llamada al fichero un barra n le podría

6:28:54

hacer para lanzar estos saltos de línea

6:28:56

Okay o sin más hago esto y le meto un

6:28:58

barra n y ya está al final un barra n es

6:29:01

un salto de línea sin más vale Así que

6:29:03

si ahora volvier a lanzar vamos a ir por

6:29:06

aquí volver lanzar mi programa vamos a

6:29:08

mouret XT lo estáis viendo aquí ya

6:29:10

aparece bien ojo ya tenemos algo hemos

6:29:13

sido capaces de crear un fichero llamado

6:29:15

mod.txt y ya le hemos metido los valores

6:29:18

nuestro nombre edad y lenguaje lo

6:29:19

siguiente que nos decía es vale una vez

6:29:22

tienes el fichero lo siguiente que

6:29:23

tienes que acabar haciendo va a ser

6:29:26

leerlo os decía aquí el ejercicio

6:29:28

imprime el contenido Okay cómo vamos a

6:29:30

imprimir el contenido aquí podríamos

6:29:32

pensar pues No lo sé si me voy al file

6:29:36

igual que tengo un wr tendré un Red A

6:29:39

ver vamos a lanzar mi programa ojo qué

6:29:42

pone aquí ya sabemos lo que son las

6:29:44

excepciones ya lo vimos en otra lección

6:29:46

nos dice ey unsupported operation no es

6:29:49

legible Nosotros hemos accedido al

6:29:52

fichero diciéndole que la operación que

6:29:54

queríamos lanzar era una operación de

6:29:56

escritura con lo cual hemos podido

6:29:58

escribir pero si yo me pongo a leer pues

6:30:00

quizás no puedo leer le podríamos meter

6:30:02

varios permisos pero vamos a ir

6:30:04

haciéndolo parte por parte porque yo

6:30:06

ahora podría intentar hacer exactamente

6:30:08

lo mismo y decirle ahora fichero en vez

6:30:11

de acceder a ti con permisos de

6:30:13

escritura después de ya haber escrito

6:30:15

quiero acceder con permisos de lectura

6:30:17

Cuáles serán los permisos de lectura rre

6:30:20

con lo cual si yo ahora vengo por aquí y

6:30:22

accedo al file y llamo a la operación de

6:30:24

lectura a ver qué pasa Ey ya no falla el

6:30:27

programa okay Y qué nos va a dar el re

6:30:29

este pues nos va a dar el contenido del

6:30:31

fichero con lo cual yo lo que intuyo si

6:30:34

le hago un print al contenido del

6:30:36

fichero qué tengo por aquí bry 36 y

6:30:39

python justo lo que había escrito

6:30:41

perfecto pues ya hemos sido capaces de

6:30:44

crear el fichero escribirlo y leerlo muy

6:30:46

bien y si lo quiero borrar que es lo

6:30:48

último que me pedía el ejercicio en su

6:30:50

parte más simple decía Borra el fichero

6:30:53

para asegurarnos de no tener problema no

6:30:54

hace falta ni incluso que mantengamos un

6:30:56

flujo python es bastante inteligente en

6:30:58

este aspecto y nosotros podemos Acceder

6:31:00

al fichero podemos empezar a manejarlo

6:31:02

porque me decís sin cerrarlo y tal

6:31:05

incluso no nos hace falta porque él se

6:31:07

va a encargar de lanzar otras

6:31:08

operaciones por el medio en el momento

6:31:09

que nosotros hacemos accesos por eso Si

6:31:11

yo ahora lo último que quisiera es

6:31:13

borrarlo me voy a remove Y qué tendré

6:31:15

que pasarle para borrarlo sin más el

6:31:18

nombre del fichero filename qué tiene

6:31:20

que pasar ahora cuál es el fichero de

6:31:22

momento no lo estamos borrando veis aquí

6:31:23

tenemos el fichero vale Okay nosotros ya

6:31:25

estamos trabajando en un contexto seguro

6:31:28

Por qué Porque pensar que en el momento

6:31:29

que nosotros estamos haciendo el Wi con

6:31:31

el open en realidad nosotros el acceso

6:31:34

al fichero lo tenemos solo en este scope

6:31:36

Okay no es como si nosotros hiciéramos

6:31:38

el open

6:31:57

guardármelo el proceso de acceso al

6:32:00

propio al propio fichero Okay en el

6:32:02

momento que nos salimos del vale ya

6:32:04

tenemos todo esto lo último que voy a

6:32:06

hacer ya es borrarlo si lo lanzo qué

6:32:08

aparece aquí veis que aparece tachado

6:32:10

por qué Porque como lo he acabado de

6:32:12

borrar ya no lo tenemos lo crea lo

6:32:14

sobreescribe esto también es muy

6:32:16

importante y tener en cuenta con Qué

6:32:18

lenguaje de programación estés

6:32:19

trabajando porque hay lenguajes de

6:32:21

programación que por defecto concatenan

6:32:23

pero yo aquí como estoy haciendo el open

6:32:25

y con el permiso de escritura en lo que

6:32:27

me va a hacer es machacar el contenido

6:32:29

cada vez que yo lanzo el programa por

6:32:31

eso no tenemos cada vez aunque yo aquí

6:32:33

no lo lo borrara cada vez que se Lance

6:32:35

esto lo que va a hacer es escribir desde

6:32:37

cero mi nombre edad y lenguaje de

6:32:39

programación no va a continuar donde

6:32:41

quedó anteriormente Okay Porque con Wi

6:32:43

siempre lo machaca y lo vuelve a crear

6:32:45

desde cero vale Y después lo elimina

6:32:48

recordaba que estaba por aquí abajo ya

6:32:50

no lo veis vale ya tenemos esto Esta era

6:32:52

como la parte más simple para que

6:32:53

vierais únicamente Cómo interactúa era

6:32:56

muy fácil esta parte era muy fácil Por

6:32:58

qué Porque lo verdaderamente si le

6:33:00

queremos Llamar complicado era la

6:33:02

segunda parte del ejercicio la parte que

6:33:04

solemos llamar extra aquí ya tenías que

6:33:06

ya entender un poquito más Cuál es el

6:33:08

flujo a la hora de interactuar con

6:33:10

ficheros la parte extra ya nos decía

6:33:12

montar Pues un programita algo más real

6:33:14

vamos a llamarle decía por aquí

6:33:16

desarrolle un programa de gestión de

6:33:17

ventas que almacene sus datos en un

6:33:19

archivo txt cada producto se guarda en

6:33:21

una línea de archivo de la siguiente

6:33:22

manera vale vemos que tenemos un

6:33:24

programa que va a pedir hacer bastantes

6:33:26

cosas esto ya lo hemos visto en alguna

6:33:28

clase vamos a empezar a pedirle

6:33:30

diferentes acciones al usuario final por

6:33:32

terminal por ejemplo para que vaya

6:33:34

interactuando por eso yo me voy a abenir

6:33:36

por aquí y voy a hacer un wth para que

6:33:38

este programa esté infinitamente

6:33:40

preguntándole cosas al usuario Hasta que

6:33:43

el usuario decida salir okay Y aquí

6:33:45

Nosotros le podríamos acabar indicando

6:33:47

pues qué es lo que queremos que haga el

6:33:49

usuario voy a hacer un montón de prints

6:33:51

porque le puedo comentar Pues si pulsa

6:33:54

el uno va a ser Añadir producto porque

6:33:57

esto es un control de gestión de

6:33:59

inventarios por ejemplo ya veis que nos

6:34:01

decía cada producto se guarda tenemos un

6:34:04

formato también debes poseer opciones a

6:34:06

la hora de calcular la venta total y Pro

6:34:08

producto Añadir modificar consultar no

6:34:11

sé qué Así que vamos a hacer programa

6:34:13

clásico por terminal donde yo le puedo

6:34:15

decir primero al usuario Ey qué es lo

6:34:17

que quieres hacer le voy a decir Añadir

6:34:19

con el uno Añadir producto con el dos

6:34:22

consultar producto con el tres

6:34:25

actualizar producto con el cuatro borrar

6:34:27

producto con el cinco calcular la venta

6:34:30

Total que nos decía que tenía que hacer

6:34:31

el ejercicio y con el seis calcular la

6:34:34

venta por producto y ya le podemos hacer

6:34:36

Si escribes El Siete pues Sales Aquí

6:34:39

podríamos hacer como nos diera la gana

6:34:41

poniendo una palabra eh seleccionando lo

6:34:44

del listado lo que nos diera la gana por

6:34:46

eso lo primero que voy a hacer option

6:34:48

Voy a recoger lo que va a seleccionar el

6:34:50

usuario porque le voy a decir aquí input

6:34:52

que seleccione una opción selecciona una

6:34:55

opción y aquí el usuario lo primero que

6:34:56

tendrá que hacer es pues escribir 1 2 3

6:34:59

4 5 6 o siete ya está sin más vale una

6:35:02

vez ya tenemos esto que podríamos hacer

6:35:04

aquí pues empezar a revisar Cuál es el

6:35:07

número que se ha seleccionado qué

6:35:08

significaría esto Pues si la opción que

6:35:12

han seleccionado es igual a uno pues voy

6:35:14

a tener que hacer una una lógica si es

6:35:17

la dos otra lógica la tres la cuatro la

6:35:19

5 la 6 la si lo que sea vale aquí que

6:35:22

podríamos hacerlo ya sabéis que

6:35:23

podríamos montar un switch lo que os dé

6:35:25

la gana nos da igual para este ejercicio

6:35:27

ya sabéis eh En este caso seguramente un

6:35:30

switch sea mucho más óptimo a la hora de

6:35:32

empezar a evaluar aquí depende un poco

6:35:34

de las estructuras que controlé de las

6:35:36

estructuras de fluj de control de flujo

6:35:38

que tenga vuestro lenguaje Okay el

6:35:40

switch en realidad solo se queda con una

6:35:44

opción válida de las que está revisando

6:35:47

Okay y habitualmente se utiliza cuando

6:35:49

lo que estamos inspeccionando es siempre

6:35:51

la misma variable que toma diferentes

6:35:53

valores vale por si no tenéis switch en

6:35:55

vuestro lenguaje qué tendríais que hacer

6:35:57

un If y un elsif básicamente con todas

6:36:00

las opciones ya digo que aunque sea más

6:36:02

óptimo el switch en caso de que exista

6:36:04

sin más os voy a poner aquí un pas para

6:36:07

ir ejecutando todas lo que tendréis que

6:36:08

hacer es inspeccionando cada uno de los

6:36:10

valores que puede tomar por aquí nuestro

6:36:13

programa en tal caso sería el dos el

6:36:15

tres el cu el cco El Seis lo veis

6:36:19

entonces bueno tendríamos que revisar

6:36:21

todos estos hasta Cuál pues tendríamos

6:36:23

que revisar exactamente hasta el siete

6:36:26

que son todos los que tenemos y en el

6:36:27

caso de que no seleccione ninguno de

6:36:29

estos se nos iría por el els y en el

6:36:31

caso de que se nos vaya por el els Pues

6:36:33

básicamente tendríamos que volver a

6:36:34

preguntar tendríamos que decir algo así

6:36:36

como eh selecciono una opción correcta

6:36:38

una de las opciones disponibles Okay

6:36:41

podríamos poner esta Bueno ya está Y

6:36:43

ahora qué vamos a hacer Pues venga vamos

6:36:45

a empezar a implementar cada una de las

6:36:47

opciones en este caso vamos a empezar

6:36:50

por la más fácil salir si nos selecciona

6:36:52

El Siete rompemos el flujo decimos break

6:36:55

se acabó Ya tenemos la opción de salir

6:36:57

qué podríamos poner al usuario podríamos

6:36:59

decirle Pues no sé saliendo del programa

6:37:01

o algo así en realidad qué tenemos que

6:37:03

hacer la opción salir Borra el txt esto

6:37:05

ya lo teníamos por aquí si yo vengo aquí

6:37:08

le voy a llamar Exactamente igual que

6:37:10

aunque lo veáis aquí digo archivo.txt no

6:37:12

sé qué le voy a llamar también mouredev

6:37:14

txt así utilizo ya el nombre del fichero

6:37:17

qué tendría que hacer en el momento que

6:37:19

quiero salir del programa lo elimino Ya

6:37:21

está ya tenemos el eliminar de nuestro

6:37:23

programa fantástico esto era lo fácil

6:37:26

vamos a ir haciendo una por una las

6:37:29

opciones si tenemos la opción uno lo que

6:37:31

nos decía nuestro ejercicio es que

6:37:32

tenemos que guardar dar el producto es

6:37:34

decir cada producto se guarda en una

6:37:35

línea del archivo de la siguiente manera

6:37:37

nombre producto cantidad precio Okay

6:37:39

pues qué Tendremos que hacer tendremos

6:37:42

primero que recoger los datos del

6:37:44

producto para ello Yo podría venir por

6:37:46

aquí datos del producto por un lado el

6:37:48

name el nombre del producto por otro

6:37:50

podría poner aquí e nombre qué

6:37:53

tendríamos que meter pues la cantidad

6:37:56

cantidad y el precio aquí le podríamos

6:37:58

poner quantity por ponerlo en inglés No

6:38:00

Y price cantidad y precio vale ya

6:38:03

tenemos los datos que se nos piden ahora

6:38:05

qué Tendremos que hacer Tendremos que

6:38:07

escribir estos datos cómo lo escribíamos

6:38:09

Ya teníamos algo parecido aquí que me

6:38:11

puedo venir por aquí y copiar este flujo

6:38:13

vengo por aquí abrimos el fichero y me

6:38:16

decía e la manera que tú tienes de

6:38:18

guardarlo es como te dice aquí nombre de

6:38:21

producto coma cantidad vendida coma

6:38:23

precio y vamos a meter justo los datos

6:38:26

que nos han introducido el usuario aquí

6:38:28

lo de siempre no voy a controlar que el

6:38:31

precio sea un número válido noy voy a

6:38:33

controlar que la cantidad sea una

6:38:35

cantidad Pues no lo sé entera Lo que sea

6:38:38

simplemente me voy a fiar de lo que mete

6:38:40

el usuario Por qué Porque si no nos

6:38:41

vamos a empezar a poner a controlar un

6:38:43

montón de casos límite que no tienen

6:38:46

nada que ver con lo que queremos

6:38:47

aprender en este ejercicio en vuestra

6:38:49

corrección lo queréis hacer genial es

6:38:52

decir aún mejor pero bueno aquí entender

6:38:54

el porqué de esta explicación metemos

6:38:57

nombre la cantidad y el precio ya está y

6:39:00

al final le hago un salto de línea para

6:39:02

que si después tengo que escribir otro

6:39:03

producto que me lo haga en una nueva

6:39:05

línea okay Así que más o menos ya

6:39:07

tendría esto esto podríamos pensar que e

6:39:10

estaba bien así queréis que probemos

6:39:13

nuestro ejercicio vamos a hacer primero

6:39:14

la opción de ya que no tenemos vamos a

6:39:18

hacer una opción de mostrar todos los

6:39:20

productos Okay me voy a venir aquí y me

6:39:22

voy a hacer una opción por ejemplo cinco

6:39:25

voy a cambiar los valores 6 7 y 8 vale

6:39:29

la opción de borrar va a ser el ocho

6:39:31

porque voy a meter uno más y no s es más

6:39:34

simple siete y ocho porque para que lo

6:39:37

veamos Nosotros bien para poder hacerlo

6:39:39

desde terminal por ejemplo le voy a

6:39:41

montar la opción 1 2 3 4 5 que sea

6:39:46

mostrar productos yo digo esto queda un

6:39:48

poco a como vosotros queráis ir montando

6:39:50

las cosas Pero aún así Creo que está

6:39:52

bien que podamos ir viéndolos aunque el

6:39:54

ejercicio creo que no lo pedía como tal

6:39:56

vale permitía Añadir consultar

6:39:57

actualizar eliminar productos y salir yo

6:39:59

os voy a poner una opción de mostrar

6:40:01

todos porque es tan fácil como esto que

6:40:02

hicimos aquí y así en la opción de

6:40:05

mostrar productos que es la cinco Así ya

6:40:08

podemos ir viendo por terminal Qué es lo

6:40:10

que tiene nuestro programa de gestión de

6:40:12

inventario vale voy a arrancarlo mirar

6:40:14

ya lo que me dice Añadir producto

6:40:15

consultar producto voy a seleccionar la

6:40:17

opción ocho a ver si me sale dice Hala

6:40:21

qué ha pasado aquí esto podría ser un

6:40:23

problema vemos por aquí ostras estoy

6:40:25

intentando salir y borrar un fichero que

6:40:28

no existe aquí habría muchas formas de

6:40:31

hacerlo tendríamos la posibilidad de

6:40:33

comprobar si el fichero existe por

6:40:36

ejemplo podríamos hacerlo así Qué podría

6:40:38

ser lo mejor qué podría ser lo mejor a

6:40:40

veces lo que suele hacer en estos

6:40:42

programas veis aquí donde empieza el

6:40:44

programa podríamos acabar intentando

6:40:47

inicializar el fichero porque yo que

6:40:49

siempree voy a trabajar con un fichero

6:40:51

puede decir no sé quizás existe alguien

6:40:54

puede pensar o ese punto y podríamos

6:40:56

decir ostras y tengo alguna operación

6:40:58

para poder revisar si existe lo

6:41:00

podríamos hacer por supuesto Qué pasa

6:41:02

que yo lo que creo es que es muy posible

6:41:05

es muy posible que yo ahora mismo tengo

6:41:07

un fichero con el que no sé si voy a

6:41:10

acabar interactuando más adelante Lo más

6:41:13

seguro es que sí con lo cual yo podría

6:41:15

venir por aquí y vamos a probar esto yo

6:41:17

ahora vengo por aquí y voy a crearme ya

6:41:19

el fichero antes de empezar en el

6:41:21

programa a ver ahora qué pasaría vemos

6:41:23

Que de momento no estaba creado vuelvo a

6:41:25

lanzar mi programa ahora vemos esto el

6:41:27

fichero ya está por aquí ahora voy a

6:41:29

venir por aquí y voy a acabar haciendo

6:41:31

lo siguiente voy a pulsar el ocho para

6:41:33

salir Ey lo ha borrado vale

6:41:35

personalmente es muy posible que esta

6:41:38

opción funcione mejor que el comprobar

6:41:40

en cada caso si existe vamos a ver qué

6:41:42

problemas nos podría acabar dando esto

6:41:44

ya digo dependiendo del lenguaje igual

6:41:46

tenemos que utilizar una opción o otra

6:41:48

de momento vamos a ver si con esto lo

6:41:50

solucionamos voy a volver a arrancar mi

6:41:52

programa voy ahora a seleccionar la

6:41:54

opción uno que es la de Añadir yo nombre

6:41:56

y voy a poner manzana cantidad cinco

6:41:59

precio 2 manzana las Manzanas más caras

6:42:01

del mundo vale Ya está vamos a irnos

6:42:04

ahora a la opción de mostrar productos

6:42:06

digo Uy he ido aquí a la opción de

6:42:08

mostrar productos Y qué ha salido

6:42:10

manzana 52 ojo eh nuestro programa

6:42:14

parece que funciona ahora voy a venir

6:42:15

por aquí y le voy a decir que quiero

6:42:17

Añadir otro producto huevo por ejemplo y

6:42:20

en este caso Tengo 10 y el precio es uno

6:42:24

ahora los voy a listar otra vez con el

6:42:26

cinco qué ha pasado ahora al listar ya

6:42:30

no están las Manzanas y nos vamos al

6:42:32

fichero y ya no están las Manzanas Por

6:42:34

qué tenemos esto fíjate qué le pasaba a

6:42:37

esta opción esta opción de escritura lo

6:42:39

que acabamos consiguiendo con él es que

6:42:42

sí sí escribes en el fichero Durante

6:42:45

este contexto pero lo que pasa es que

6:42:48

esta W lo que nos está haciendo es

6:42:50

escribiendo borrando inicializando

6:42:53

necesitamos una opción que nos permita

6:42:55

escribir en el fichero pero añadiéndole

6:42:58

datos a lo que ya tenemos para ello esto

6:43:01

era así una pequeña la trampa que tenéis

6:43:03

que acabar viendo tenéis que acabar

6:43:05

encontrando con ella que igual empezaba

6:43:07

a machacar el fichero nosotros tenemos

6:43:08

una opción que es la a para app para

6:43:10

seguir añadiendo ahora vamos a probar a

6:43:13

ver qué pasaría en este caso arranco mi

6:43:15

programa vengo por aquí y le digo quiero

6:43:18

Añadir uno manzana 5 do ahora voy a

6:43:21

Añadir otro opción uno huevo 10 1 listo

6:43:25

todos a ver qué tenemos por aquí ya

6:43:28

tenemos manzana y ya tenemos huevo nos

6:43:30

vamos al fichero tenemos manzana tenemos

6:43:32

huevo Okay lo veis vamos a lo siguiente

6:43:35

voy a matar el programa sin borrarlo

6:43:38

para que veáis que claro como no he

6:43:40

salido de manera legal digamos Aquí está

6:43:42

el fichero Sigue estando no me lo he

6:43:44

cargado Por qué Porque quiero hacer una

6:43:46

prueba voy volver a arrancar mi programa

6:43:48

voy venir por aquí Hala otra vez la

6:43:51

hemos liado con lo cual vamos a venir

6:43:53

por aquí y ahora le voy a decir también

6:43:54

que quiero abrir el fichero en modo

6:43:55

appen a ver qué pasaría en este caso voy

6:43:58

matar el programa voy a borrar el

6:44:00

fichero voy a arrancar el programa El

6:44:02

fichero se crea correctamente voy a

6:44:04

Añadir manzana 5 a dos y voy a matar el

6:44:08

fichero Hala vale de momento Sigue

6:44:11

estando por aquí voy a arrancarlo qué

6:44:13

está pasando aquí nos lo estamos

6:44:15

cargando todo el rato os fijáis Aunque

6:44:17

yo tenga este modo appen por aquí

6:44:20

estamos teniendo un pequeño problema que

6:44:22

estamos intentando Acceder al fichero

6:44:24

accedemos al fichero qué hacemos qué

6:44:27

hacemos vamos a verlo del ejercicio de

6:44:29

arriba para que entendáis rápidamente lo

6:44:31

que está pasando Lo voy a comentar

6:44:33

porque igual nos hemos visto aquí espera

6:44:35

el fichero el nombre del fichero no o si

6:44:36

nos hemos visto Aquí medio engañados no

6:44:38

voy a venir por aquí lo voy a lanzar

6:44:40

ahora otra vez tenemos nuestro fichero

6:44:42

quiero Añadir uno manzana 5 2 mato el

6:44:46

programa tenemos manzana tenemos manzana

6:44:48

Okay entonces voy a venir por aquí voy

6:44:51

volver a arrancar mi programa qué pasaba

6:44:54

pensar todo lo que estábamos ejecutando

6:44:56

antes cómo nos lo estábamos cargando

6:44:58

porque en realidad Aquí sí que le

6:44:59

estábamos haciendo el W y estábamos

6:45:01

borrando el fichero realidad ya lo

6:45:10

borrás lo mejor en este caso pues sin

6:45:13

más yo me voy a venir por aquí y le voy

6:45:15

a dar otro nombre al fichero Y en vez de

6:45:16

llamarle mouredev XT le voy a llamar

6:45:19

pues mouredev shop. txt para intentar

6:45:23

asegurarme de que yo aunque me cargue

6:45:26

este fichero Ahora cuando lo arranque

6:45:28

muy bien Yo me puedo acabar cargando

6:45:31

esta parte fijaos okay mev ya no está y

6:45:33

el que queda es m dep Shop vamos a ver

6:45:36

ahora incluso con el código que teníamos

6:45:38

antes y vengo por aquí selecciono la uno

6:45:41

zana 5 do y ahora le digo que voy a

6:45:45

matar el programa m dep Shop Sigue

6:45:47

estando por aquí si ahora arranco de

6:45:50

nuevo el programa y me voy a mouredev

6:45:52

Shop Yo sigo teniendo manzana aunque

6:45:54

mouredev no lo tenga y si yo ahora

6:45:56

viniera aquí y seleccionara la opción de

6:45:58

Añadir uno más y pongo huevo 10 a un

6:46:01

dónde lo ha metido Ok a continuación ha

6:46:04

sido capaz de hacer el appen Así que muy

6:46:06

importante tener en cuenta Cuáles son

6:46:08

los modos primero que ties que utilizar

6:46:10

y Cómo estáis trabajando con el fichero

6:46:12

para ver si de verdad estáis

6:46:13

interactuando con el fichero que es o

6:46:15

estáis interactuando con otro vale me he

6:46:17

detenido mucho en esto porque quería

6:46:18

explicar bien esta parte porque es la

6:46:20

rara un poco de que Ey estábamos

6:46:22

perdiendo el fichero que estábamos

6:46:23

haciendo si yo ahora me viniera por aquí

6:46:24

y ya selecciono la opción ocho ya veis

6:46:27

ya ha desaparecido ya aparece tachado m

6:46:29

dep Shop el programa ya está funcionando

6:46:31

correctamente vale vamos ahora a la

6:46:34

opción dos la opción dos era consultar

6:46:37

producto Qué quiere decir que nosotros

6:46:39

tenemos que acabar pidiéndole el nombre

6:46:41

del producto que queremos consultar así

6:46:43

que sin más voy a venir por aquí y me

6:46:45

voy a quedar con el nombre que Quiero

6:46:47

consultar qué tendríamos que hacer ahora

6:46:49

ya tenemos este producto pero y ahora

6:46:53

Cómo sabemos dónde está ese producto en

6:46:55

cada uno de ellos pues lo primero vamos

6:46:58

a abrir nuestro fichero en modo lectura

6:47:00

yo ya tengo el nombre que Quiero

6:47:01

consultar lo voy a abrir en modo lectura

6:47:04

tengo mi fichero Y ahora qué tendríamos

6:47:06

que hacer Vamos a ver qué cosas tiene el

6:47:08

fichero file Ah mira me dice aquí Red

6:47:11

Line claro me le como una línea esto

6:47:15

podría estar bien no sé podríamos decir

6:47:17

por aquí voy a intentar leer las líneas

6:47:20

voy al fichero y voy a venir red Lines

6:47:22

Ah Lines es un array con lo cual yo

6:47:25

podría venir por aquí y empezar a leer

6:47:28

todas las filas en realidad Así que

6:47:30

vengo por aquí me pongo a leer las filas

6:47:32

filas y las voy a iterar por ejemplo for

6:47:35

Line inlines vamos a leerlas tengo todas

6:47:38

estas líneas lo que tendremos que acabar

6:47:40

comprobando aquí es Okay yo ya tengo

6:47:42

todas las líneas voy a ir línea tras

6:47:44

línea tendré que empezar a revisar si en

6:47:47

cada una de las líneas por ejemplo está

6:47:50

el nombre que yo le he metido Cómo

6:47:51

tendríamos que hacerlo claro lo

6:47:53

podríamos Buscar en toda la línea pero

6:47:54

si yo lo que quiero buscar el nombre a

6:47:56

esta línea le podría hacer un split

6:47:59

siguiendo qué qué tendría que hacer ese

6:48:01

split el Split que es la subdivisión Yo

6:48:03

podría hacerle un split por comas claro

6:48:06

Yo vengo por aquí le digo Mira Hazme un

6:48:08

split por comas Cómo por comas por coma

6:48:11

y espacio recordar que es como lo

6:48:13

estamos metiendo coma y espacio coma y

6:48:15

espacio y al hacer el Split por comas me

6:48:17

voy a quedar con el primer elemento el

6:48:19

elemento cero Entonces si el primer

6:48:22

elemento del producto es igual al nombre

6:48:25

que yo estoy buscando name entonces aquí

6:48:28

es donde hago el print de la línea

6:48:30

completa okay Y una vez tenemos esto

6:48:33

podría hacer un break y seguiría vamos a

6:48:35

ver qué pasa vamos a probar Ahora aquí

6:48:37

esta opción voy a cargarme es decir voy

6:48:40

a comentar el borrar para que podamos

6:48:42

hacer cositas y no estar borrando el

6:48:44

fichero para así yo tener que estar

6:48:46

metiendo nuevos productos cada vez y

6:48:48

podamos ir un poquito más rápido vale

6:48:49

voy arrancar Voy a Añadir un producto eh

6:48:52

manzana lo teníamos antes cinco manzanas

6:48:54

a $ voy a Añadir otro producto que es

6:48:58

huevo 10 huevos a uno Ahora me voy a ir

6:49:01

a la opción de eh mostrar productos que

6:49:04

era la 5co a ver qué pasa mostrar

6:49:06

productos aquí tenemos los dos me voy a

6:49:07

ir ahora a la opción de consultar

6:49:09

producto y me dice nombre y voy a poner

6:49:12

huevo veis huevo 10 1 Aquí está me lo he

6:49:15

encontrado Y si yo ahora me pusiera aquí

6:49:17

a buscar manzana por aquí manzana 52 si

6:49:21

yo me pusiera a consultar pera pues la

6:49:23

pera vemos he puesto pera y no me ha

6:49:25

encontrado nada Qué podríamos acabar

6:49:27

haciendo podríamos acabar revisando si

6:49:29

no me encontró ninguno acabar poniéndolo

6:49:31

nos da igual ya digo que eso ya sería

6:49:33

más tema de lógica aplicada a los datos

6:49:37

que estamos intentando consultar del

6:49:39

ejercicio más que el trabajar con el

6:49:40

fichero es que es lo que me importa ya

6:49:42

digo si lo hiciéramos bien podríamos eh

6:49:45

acabar aquí controlando si lo hemos

6:49:46

encontrado o no vale vamos a la opción

6:49:48

tres la opción tres lo que nos decía es

6:49:51

que tenemos que actualizar productos qué

6:49:53

podríamos hacer primero preguntar claro

6:49:55

Cuál es lo que queremos actualizar el

6:49:57

nombre la cantidad y el precio ya que lo

6:49:59

queremos actualizar una vez ya tenemos

6:50:01

todo esto podría podamos hacer algo

6:50:03

parecido aquí claro qué haríamos Buscar

6:50:06

en el fichero la línea esta tendríamos

6:50:08

que acabar dando con ellas perfecto Pues

6:50:11

casi podría acabar replicando esta parte

6:50:13

vengo por aquí vengo por aquí abro el

6:50:16

fichero y lo que tendría que acabar

6:50:18

buscando es vale Y cuál es la línea que

6:50:20

coincide con el nombre que yo quiero

6:50:22

actualizar en el momento que yo ya tengo

6:50:24

la línea Qué acabaría haciendo igual No

6:50:26

es tan fácil esto claro yo ahora vengo

6:50:28

por aquí y digo si ya existe el nombre

6:50:31

Qué acabaríamos haciendo si si ya existe

6:50:33

el nombre en realidad yo lo que podría

6:50:35

hacer es lo borramos no lo borramos lo

6:50:39

metemos de cero vamos a pensar lo

6:50:41

siguiente lo primero que voy a hacer es

6:50:43

intentar actualizarlo lo podría

6:50:45

actualizar podría ir a un fichero Buscar

6:50:48

la línea porque igual no es tan fácil

6:50:50

esa parte vale vamos a ver vengo por

6:50:52

aquí tengo el fichero dónde lo tengo

6:50:54

file Aquí está el file en el fichero qué

6:50:57

me dice en realidad aquí veo right Close

6:50:59

sick y poco más No claro cómo lo hacemos

6:51:03

cómo lo hacemos en realidad vamos a

6:51:04

hacer lo siguiente si yo encuentro el

6:51:06

nombre lo que voy a hacer es guardarlo

6:51:09

Cómo hacíamos el guardado me voy a

6:51:11

copiar esta línea porque ya era muy

6:51:12

parecida yo tengo el nombre la cantidad

6:51:15

el precio y aquí podéis decir Jer brce

6:51:17

pero es que así lo que vas a hacer es

6:51:19

escribir una nueva línea duplicada os lo

6:51:22

voy a explicar de la manera más más

6:51:23

simple trabajando una manera muy pura

6:51:25

con ficheros hay maneras más

6:51:27

inteligentes de hacerlo y mucho más

6:51:28

óptimas pero como ya digo esto se un

6:51:31

poco a lo que lo quiero mir es a que

6:51:33

intentemos pensar la lógica

6:51:35

independientemente del lenguaje de

6:51:37

programación qué haríamos qué haríamos

6:51:39

Pues yo estoy recorriendo todo el

6:51:41

fichero lo voy a recorrer completamente

6:51:43

pensar en esta lógica si existe meto mis

6:51:47

nuevos datos Y si no existe lo que hago

6:51:50

es sin más venir por aquí y escribir la

6:51:53

línea otra vez right de qué de la línea

6:51:55

Line y ahora Vais a pensar aquí bry la

6:51:59

vas a acabar liando claro la vas a

6:52:01

acabar liando porque tú Primero aquí no

6:52:03

puedes escribir aquí no puedes escribir

6:52:05

porque tienes el Red con lo cual le

6:52:07

podrías meter el append y lo agregarías

6:52:10

al final pero no nos vale agregarlo al

6:52:13

final yo lo que quiero es escribirlo

6:52:15

pero claro Cómo haces para escribirlo

6:52:18

porque necesitas primero acabar leyendo

6:52:21

cada una de las filas este redlines que

6:52:23

teníamos por aquí el fichero cada una de

6:52:27

sus filas y así yo ya puedo comprobar en

6:52:30

cada una de las filas pero claro si le

6:52:31

he hecho Wi lo he borrado qué ha pasado

6:52:34

ahora me lo he cargado todo qué

6:52:35

podríamos acabar haciendo con esto

6:52:37

podría intentar abrir el fichero antes

6:52:40

en modo lectura vengo por aquí crear una

6:52:43

variable que se llame Lines leer aquí

6:52:45

las líneas y acceder a las líneas que yo

6:52:48

he almacenado antes de borrar así me voy

6:52:51

a cargar el fichero voy a tener las

6:52:53

líneas aquí y si ya existe le meto la

6:52:56

actualización y si no existe lo escribo

6:52:58

tal cual está Vale Esta es la manera

6:53:00

como más más más más purista porque

6:53:04

depende mucho de las capacidades que

6:53:05

tenga el lenguaje y de los métodos que

6:53:07

estemos utilizando vale pero pensar la

6:53:09

lógica me quedo con lo que ya tiene el

6:53:11

fichero antes lo borro y si hay

6:53:14

actualización lo actualizo y si no le

6:53:16

meto el dato que ya tenía así soy capaz

6:53:18

de cambiar Vais a ver cómo lo voy a

6:53:19

hacer vamos a detener nuestro programa

6:53:21

vamos a ver lo que teníamos aquí manzana

6:53:23

y huevo voy a arrancar nuestro programa

6:53:25

voy a venir por aquí y le voy a Añadir

6:53:27

otro más pera le voy a Añadir 15 peras a

6:53:30

1.5 por ejemplo a ver Cómo va nuestro

6:53:33

fichero aquí lo tenemos perfecto me voy

6:53:35

a ir a la opción ahora de actualizar

6:53:37

producto y me dice Cuál es el nombre del

6:53:39

producto que quieres actualizar Por

6:53:41

ejemplo yo le voy a decir que Quiero

6:53:42

actualizar el huevo así que le voy a

6:53:44

poner huevo y me va a decir la cantidad

6:53:46

no quiero que tenga 10 le voy a poner 20

6:53:49

y el precio Imagínate que el precio se

6:53:51

ha mantenido es uno Okay fijaos lo que

6:53:54

va a pasar ahora hago esto y se ha

6:53:56

lanzado el proceso vamos al fichero

6:53:57

magia el huevo está actualizado Qué ha

6:54:00

hecho lo que ha hecho nuestro fichero es

6:54:01

lo siguiente primero ha leído todo el

6:54:04

contenido lo veis aquí ha leído todo lo

6:54:06

que ya tenía y lo he guardado en una

6:54:08

variable en Lines Entonces yo en Lines

6:54:11

Lo que ya tenía era un array con manzana

6:54:13

52 huevo 21 pera 15 1.5 siguiente que

6:54:17

lanzo lo que lanzo es escritura qué

6:54:20

hacía el escritura borraba el fichero

6:54:22

recordarlo claro Quiero borrar el

6:54:24

contenido del fichero porque yo ahora lo

6:54:26

que voy a hacer es revisar línea por

6:54:28

línea y es vale manzana La manzana es el

6:54:31

no nombre que yo quiero actualizar que

6:54:33

lo guardamos por aquí no pues lo meto en

6:54:36

la primera línea del fichero huevo es lo

6:54:38

que yo quiero actualizar Sí entonces en

6:54:41

vez de meter tal cual la línea meto la

6:54:44

línea con los datos actualizados Y

6:54:46

entonces ya entra en este caso el huevo

6:54:48

con 20 de cantidad pera es lo que quiero

6:54:51

actualizar No pues déjalo exactamente

6:54:53

como lo tenías antes este es como un

6:54:55

proceso muy manual muy poco eficiente

6:54:58

pero el más puro a nivel de lógica vale

6:55:01

seguimos qué más cosas teníamos que

6:55:03

hacer opción cuatro en la opción cuatro

6:55:05

teníamos que borrar el producto ostras

6:55:08

más de lo mismo opción borrar qué tendré

6:55:11

que hacer ahora en este caso pues es

6:55:13

bastante fácil casi la lógica que

6:55:14

tenemos que hacer es exactamente la

6:55:16

misma yo le voy preguntar por el nombre

6:55:18

del producto que Quiero borrar me voy a

6:55:20

guardar otra vez todas las líneas y lo

6:55:23

tenéis y después vuelvo a lanzar el

6:55:25

fichero pero en este caso también otra

6:55:27

vez en modo escritura y qué tengo que

6:55:29

hacer Voy ir leyendo línea por línea y

6:55:32

voy a ir escribiendo línea por línea

6:55:34

While write en el caso en el que no

6:55:37

coincida con el nombre porque eso va a

6:55:39

significar que si no coincide con el

6:55:41

nombre es que yo aú lo quiero mantener

6:55:43

en cambio Si coincide con el nombre es

6:55:45

el que yo quiero acabar borrando

6:55:46

entonces hago la misma jugada pero en

6:55:48

este caso solo me quedo con los nombres

6:55:51

que no son iguales al que yo he escrito

6:55:53

que es el que he querido borrar vale

6:55:54

siguiente ya veis que una vez lo

6:55:56

entendemos la lógica es bastante simple

6:55:58

lo siguiente que veíamos aquí mostrar

6:56:00

productos ya lo teníamos calcular venta

6:56:02

total para calcular la venta total yo

6:56:05

voy tener que almacenar en algún sitio

6:56:07

Justo eso que yo quiero acabar pintando

6:56:09

con el usuario lo que yo podría llamarle

6:56:11

pues le llamo Total que tiene valor cero

6:56:14

inicialmente qué tendríamos que hacer en

6:56:16

este caso leerlo Bueno ya hemos visto

6:56:18

Cómo leer tengo que recorrer todos los

6:56:20

ficheros me pongo a leer por aquí el

6:56:22

fichero Y qué tendríamos que hacerle a

6:56:24

estros ficheros vamos a recorrer línea

6:56:26

por línea esto ya lo hemos visto también

6:56:27

antes dónde tengo aquí venga revisión de

6:56:31

línea por línea y en en cada una de

6:56:32

estas líneas con qué me tendré que ir

6:56:34

quedando en este caso Me tendré que ir

6:56:36

quedando con la cantidad y con el precio

6:56:39

porque tendré que ir multiplicando el

6:56:40

precio de cada producto por la cantidad

6:56:42

de productos que hay en este stock decir

6:56:43

Me tengo que ir quedando con esta

6:56:45

cantidad quantity Dónde está quantity y

6:56:48

price claro cómo accedo a la cantidad

6:56:50

Cómo accedo al precio vamos a ver cómo

6:56:53

accedí al nombre así Line split

6:56:55

components aquí lo teníamos si me voy al

6:56:59

componente número uno va a ser la

6:57:01

cantidad si me voy al componente número

6:57:04

dos va a ser el precio el precio que

6:57:06

entendemos que es pues seguramente va a

6:57:08

ser un Flow es decir puede ser eh

6:57:10

decimal aquí lo que querramos controlar

6:57:13

la cantidad va a ser entera porque a mí

6:57:14

me da la gana no tiene sentido que sea

6:57:16

entera y cómo será el total pues el

6:57:19

total será el acumulado de la cantidad

6:57:21

por el precio matemática pura y dura una

6:57:24

vez ya tenemos todo esto y acaba este

6:57:27

proceso Yo vendré por aquí y haré un

6:57:29

print y voy a poner que era Eh bueno sin

6:57:31

más lo vamos a poner a continuación voy

6:57:33

a imprimir el total con esto ya

6:57:35

podríamos más o menos hacerlo y aquí

6:57:37

perdón el components no accedo al cero

6:57:39

es decir el componentes lo que quiero

6:57:41

acabar generando es el array de

6:57:42

componentes ya tenemos esto con el siete

6:57:45

en cambio lo que nos decía es que

6:57:47

teníamos que calcularlo pero para el

6:57:49

producto en sí esto es muy parecido en

6:57:52

realidad sería casi lo mismo pero

6:57:54

viniendo Yo por aquí y pidiéndole

6:57:56

primero al usuario el nombre del

6:57:58

producto que yo quiero calcular ía por

6:57:59

aquí le pediría el name en el momento

6:58:02

que yo ya tengo el name empezamos a

6:58:04

revisar aquí todas empezamos a tener Por

6:58:07

aquí todos los componentes y qué debería

6:58:09

hacer yo en este caso sí que tendría que

6:58:11

acceder a los components al cero y si es

6:58:14

igual al nombre que yo quiero calcular

6:58:16

name aquí es cuando haría la operación

6:58:19

de cálculo de cantidad del precio y del

6:58:22

total Okay Así de fácil y una vez hecho

6:58:24

esto pues lo que veíamos antes que

6:58:26

también yo me podría venir por aquí y

6:58:27

decirle venga haz un break y deja de

6:58:29

ejecutar esto porque ya lo has

6:58:30

encontrado Okay vamos a ver ahora un

6:58:32

poco si somos capaces ya con los datos

6:58:34

que tenemos aquí de calcular algo voy a

6:58:35

matar el programa voy a lanzarlo y voy a

6:58:38

decirle que quiero en este caso primero

6:58:41

calcular la venta total selecciono la

6:58:43

opción seis y a ver qué nos pone 52,5

6:58:46

Okay Qué es 52,5 fijaos eh Por aquí

6:58:50

teníamos las 20 unidades estos 20 estos

6:58:53

10 de momento tenemos 30 aquí lo tenemos

6:58:56

el 52,5 vale es decir es la suma Al fin

6:58:59

y al cabo de todos qu queremos de uno en

6:59:01

concreto y Imagínate que ahora lo que

6:59:03

quiero es de la pera pues quiero

6:59:05

calcular por producto siete y le digo

6:59:08

pera y con la pera me pone 22,5 Okay qué

6:59:12

nos falta también por comprobar el

6:59:14

borrar producto voy a decir ahora que

6:59:16

queremos Borrar producto en este caso

6:59:18

borrar producto opción y voy a decir que

6:59:20

Quiero borrar el producto manzana

6:59:23

manzana lo veis borrada la manzana

6:59:25

borrada de manera un poco tricky porque

6:59:27

ya sabéis que borramos el fichero nos

6:59:29

quedamos con lo que tenía antes y

6:59:31

escribimos todo menos lo que hemos dicho

6:59:33

que teníamos que borrar voy a volver

6:59:34

descomentar esta línea para que borre el

6:59:36

fichero en el momento que nosotros

6:59:37

salimos pero ya lo veis este proceso se

6:59:39

puede optimizar infinito es como una

6:59:42

manera muy pura de hacerlo Después según

6:59:44

el lenguaje va a haber un montón de

6:59:46

opciones para poder acceder a él y hacer

6:59:48

este tipo de cosas que yo estoy haciendo

6:59:50

a mano de manera mucho más fácil

6:59:52

podríamos reutilizar un montón de código

6:59:55

hemos repetido código a montones os lo

6:59:57

dejo todo repetido para que entendáis

6:59:59

perfectamente la lógica que hacemos

7:00:01

enada caso Pero esto se podría hacer en

7:00:04

muchísimo menos código pero no es el

7:00:07

[Música]

7:00:11

caso reto 12 Jason y xml primero vamos a

7:00:15

pararnos en explicar Qué es un Jason y

7:00:17

un xml básicamente es un formato de

7:00:20

fichero un formato de fichero igual que

7:00:22

seguramente conocéis un fichero txt que

7:00:24

es de texto plano Pues un Jason es un

7:00:26

formato que acaba en js y un xml es un

7:00:28

fichero que finaliza en punto xml son en

7:00:32

cierto modo ficheros que nos sirven para

7:00:34

estructurar datos Okay no nos quedemos

7:00:37

tanto con hablar 100% de la

7:00:39

especificación de lo que es un J un xml

7:00:42

básicamente quedaros con que son

7:00:43

ficheros de Guardado de datos

7:00:45

comunicación de datos configuración vale

7:00:48

Y que tienen una estructura muy concreta

7:00:50

y son dos ficheros que la primera parte

7:00:52

del ejercicio sobre todo trataba de que

7:00:54

buscares información sobre ellos aún no

7:00:57

vamos a ver 100% en dónde lo solemos

7:01:00

utilizar pero sí que está bien que

7:01:02

entendamos Que son dos tipos de ficheros

7:01:04

que utilizamos muchísimo en programación

7:01:06

básicamente porque los utilizamos hasta

7:01:08

para configurar nuestras aplicaciones

7:01:10

hasta para comunicarnos cliente con

7:01:12

servidor etcétera el ejercicio decía lo

7:01:15

siguiente desarrolla un programa capaz

7:01:16

de crear un archivo xml y Jason Que

7:01:19

guarde los siguientes datos haciendo uso

7:01:22

de la sintaxis correcta en cada caso

7:01:24

tenemos diferentes datos nombre edad

7:01:27

fecha de nacimiento listado lo primero

7:01:29

que voy a hacer es que yo tengo unos

7:01:31

datos y voy a intentar modelar estos

7:01:33

datos aún sin guardarlos si hicisteis el

7:01:37

ejercicio anterior ya hablábamos de

7:01:39

manejo de ficheros de escritura de

7:01:41

modificación de lectura de ficheros aquí

7:01:43

es como una evolución del ejercicio de

7:01:45

la semana pasada entonces lo que voy a

7:01:47

intentar hacer es bueno Cuáles son los

7:01:49

datos que yo tengo que guardar decía el

7:01:51

nombre la edad la fecha de nacimiento el

7:01:53

listado de lenguajes de programación

7:01:54

pues sin más yo voy a ir creando

7:01:56

variables mi nombre bry moure de momento

7:01:58

aún no sabemos nada de lo que nos pide

7:02:00

la edad age en mi caso 36 años e la

7:02:04

fecha de nacimiento por ejemplo 29 de

7:02:07

abril de

7:02:09

1987 lenguajes de programación

7:02:11

programming languages y lista de

7:02:13

lenguajes de programación por ejemplo

7:02:15

python coding y s vale ya tenemos

7:02:18

variables qué podríamos hacer ahora con

7:02:20

esto podríamos empezar a pensar qué es

7:02:22

lo necesario para empezar a escribir

7:02:25

este tipo de ficheros ya tenemos todo

7:02:27

esto Ahora lo siguiente que nos decía el

7:02:29

ejercicio era desarrolla un programa

7:02:31

capaz de crear un archivo xml y Jason

7:02:33

Que guarde los siguientes datos okay Así

7:02:36

que aquí teníamos que empezar a buscar

7:02:39

Cómo podría ser yo capaz de empezar a

7:02:42

estructurar estos datos aquí os lo

7:02:44

dejaba un poquito a lo tramp sabéis que

7:02:46

yo algunas veces os pongo sin utilizar

7:02:48

librerías del lenguaje o utilizando

7:02:50

librerías de lenguaje aquí no os puse

7:02:52

nada por qué porque de verdad quería que

7:02:55

os buscase un poquito la vida a ver qué

7:02:57

erais capaces de llegar a deducir okay

7:03:00

Porque Habrá gente que lo haya hecho a

7:03:03

mano Es decir 100% a mano de verdad

7:03:05

quería que os pelear con eso porque

7:03:07

igual hay alguien que lo quiere montar a

7:03:09

mano y Alguien que ha decidido Buscar

7:03:11

pues alguna utilidad de lenguaje que nos

7:03:13

ayude Okay entonces lo que yo suelo

7:03:16

hacer es que si no específico que no se

7:03:18

utilice en librerías es que en cierto

7:03:20

modo podéis hacerlo yo en este caso no

7:03:22

puse nada así que se trataba un poco de

7:03:24

que los buscaréis Por qué bueno porque

7:03:26

si lo queréis hacer a mano os iba a

7:03:28

ayudar a entender muy bien Cuál era la

7:03:30

estructura pero la realidad es que con

7:03:34

este tipo de ficheros en el 99% de los

7:03:37

casos lo que vamos a hacer es trabajar

7:03:39

con ellos a través de librerías Por qué

7:03:42

Porque nos van a ayudar a trabajar con

7:03:44

ellos de una manera más eficiente y más

7:03:46

segura Okay Entonces ahora aquí depende

7:03:48

un poco del lenguaje en el que estéis

7:03:50

pero por ejemplo si yo quisiera trabajar

7:03:52

con xml en python por ejemplo hay una

7:03:55

librería dentro del propio lenguaje que

7:03:58

se llama xml Okay en concreto xml y3

7:04:02

Okay en concreto xml y3 Element 3 Este

7:04:06

es un módulo que nos permite manipular

7:04:08

xml de una manera un poquito más fácil

7:04:10

quien lo haya hecho sin librerías

7:04:12

fantástico Por qué Porque así os

7:04:14

peleaste exactamente con Estos tipos de

7:04:17

ficheros Y eso es lo importante Pero

7:04:19

bueno vamos a intentar resolverlo de la

7:04:21

manera en la que yo lo haría si de

7:04:22

verdad tuviera que escribir estos datos

7:04:24

en un xml okay Así que ya que tengo todo

7:04:27

esto voy a decir que bueno Esto le voy a

7:04:29

meter un alias le voy a decir que es xml

7:04:32

okay Y aquí podríamos empezar a escribir

7:04:35

los datos vale vamos a empezar con la

7:04:37

parte del xml ya que yo tengo estos

7:04:39

datos Cómo tendríamos que hacer para

7:04:42

guardar el xml Mira me voy a crear una

7:04:44

función Def save xml una función para

7:04:48

tenerlo un poquito estructurado y qué

7:04:49

tendríamos que hacer ahora aquí Buscar

7:04:51

cómo escribir el xml lo primero que

7:04:53

tenemos que tener en un xml es un nodo

7:04:55

raíz el xml al final lo que tiene son

7:04:58

tags que tienen que ir abriendose y

7:05:00

cerrando para ar cada uno de los

7:05:02

elementos que guardamos con lo cual yo

7:05:04

lo que tengo que hacer es primero tener

7:05:06

el elemento raíz con esta librería yo ya

7:05:09

tengo la posibilidad de escribir un

7:05:11

elemento y de darle un nombre al

7:05:13

elemento qué podría hacer yo bueno ya

7:05:15

que esto es un programador una persona

7:05:18

no sé le podría llamar programmer por

7:05:20

ejemplo pero lo que voy a hacer es le

7:05:22

voy a llamar Data sin más y esto para mí

7:05:25

va a ser el Root Por qué Porque pensar

7:05:27

que un xml tiene que ir anidando los

7:05:30

datos Y esto es algo que teníais que

7:05:31

haber visto en el momento que

7:05:33

empezasteis a trabajar con este

7:05:34

ejercicio y una vez tenemos los datos en

7:05:37

este Root ya tengo mi elemento principal

7:05:40

ya podría ir añadiéndole cada uno de los

7:05:42

datos Cómo creando subelementos creando

7:05:45

hijos de ru Child vale Cómo creo un hijo

7:05:49

pues con esta librería Yo podría crear

7:05:51

un subelement pero un subelement en base

7:05:53

a qué a Root al elemento principal Y qué

7:05:56

le tendría que decir pues también darle

7:05:58

un nombre al subelement claro Imagínate

7:06:00

que yo lo que quiero hacer es guardar un

7:06:03

elemento hijo por ejemplo que sea para

7:06:06

el nombre pues le tendría que decir el

7:06:08

subelement asociado al nombre pues va a

7:06:10

ser este okay Y así lo podría hacer y

7:06:13

una vez ya tengo este hijo en este hijo

7:06:15

le podría decir Y ahora cuál es el texto

7:06:17

pues el texto sería mi nombre bry moure

7:06:20

Okay Y eso lo podría ir haciendo con

7:06:22

cada uno de los elementos Qué pasa que

7:06:25

de esta manera sería bastante manual

7:06:27

Tendría que ir creando uno por uno por

7:06:29

qué no intento crear por ejemplo una

7:06:32

estructura que guarde todos estos

7:06:35

elementos así podemos ir un poquito más

7:06:37

rápido Okay me voy a crear un

7:06:39

diccionario y le voy a llamar Data y en

7:06:41

realidad en este diccionario voy a meter

7:06:43

mis elementos Pero bueno los voy a

7:06:45

guardar dependiendo del lenguaje que

7:06:46

utilicéis pues como lo tengáis que hacer

7:06:48

en este caso en python ya sabéis clave

7:06:51

valor vale Cuáles son las claves lo que

7:06:53

vemos por aquí voy a hacer que las

7:06:55

claves sea el nombre que yo les di a las

7:06:57

variables y el valor pues sin más lo que

7:06:59

ya teníamos porque así las claves ya me

7:07:02

pueden actuar de nombre de los propios

7:07:05

nodos y aquí estamos es decir ya tengo

7:07:07

mi dicionario qué podría hacer ahora Jer

7:07:09

Pues algo tan fácil como venga ahora que

7:07:12

ya lo tienes un diccionario podría

7:07:14

recorrerlo yo podría venir aquí for key

7:07:16

y for value in Data así ya tendría todos

7:07:19

los elementos Data items Así me pongo a

7:07:23

recorrer todos los elementos y ya sería

7:07:25

capaz de ir creando hijos y qué tendría

7:07:28

que ponerle de clave la clave de mi

7:07:31

dicción y de valor el valor de mi

7:07:33

villonario y ya sería capaz de crear el

7:07:36

xml por lo menos a nivel de estructura

7:07:38

de una forma bastante automática Okay

7:07:41

Vale cuando ya tenemos todos los

7:07:43

elementos en el Root qué tenemos que

7:07:45

acabar creando un xml lo que es ese

7:07:47

árbol de jerarquía es decir algo que

7:07:49

llamamos tri y cómo lo creamos Pues con

7:07:51

esta librería igual que hay un Element y

7:07:54

un subelement tenemos algo que es el

7:07:56

Element el árbol y qué entraría en este

7:07:59

árbol en realidad C rot el elemento

7:08:02

principal ya está y una vez ya tenemos

7:08:04

esto qué podría hacer pues este Tri digo

7:08:07

que lo quiero escribir y Con qué nombre

7:08:09

por ejemplo mour d. xml dándole ya la

7:08:12

extensión que hiciera falta Okay Vale

7:08:15

vamos a ver qué resulta Cuando ejecuto

7:08:17

esto voy a venir por aquí y voy a llamar

7:08:19

a mi función save xml y de hecho aquí

7:08:22

xml file le voy a dar este nombre Aquí

7:08:25

vamos a ejecutar esto a ver qué pasa

7:08:27

lanzo esto dice Uy parece que hay aquí

7:08:29

algún problema no lo sé claro se ha

7:08:32

escrito ojo fíjate Parece que ha

7:08:34

empezado a escribir algo Data name qué

7:08:37

ha pasado parece que tenemos algún dato

7:08:40

que nos empieza a dar problemas porque

7:08:42

dice hay un error en la serialización o

7:08:44

no sé qué Y nos dice ey no puedo

7:08:45

serializar el valor 36 por qué porque en

7:08:49

realidad yo estoy escribiendo un fichero

7:08:50

de texto aunque tenga un formato xml yo

7:08:53

tendría que asegurarme que este valor

7:08:56

siempre sea una cadena de texto Así que

7:08:58

ahora voy a venir por aquí y le voy a

7:09:00

decir conviértelo siempre en este vamos

7:09:01

a volverlo a lanzar qué tengo por aquí

7:09:03

ojo ya tenemos algo no está mal no tiene

7:09:06

pinta de un xml el nodo padre que era

7:09:09

Data y cada uno de los nodos hijos nodo

7:09:12

name nodo age nodo Birthday y nodo

7:09:15

programming languages está bien casi

7:09:18

Esto no es testo plano es decir yo aquí

7:09:20

lo que he guardado es como un listado

7:09:22

pero cada elemento en realidad tiene que

7:09:25

ser un nuevo nodo qué tendríamos que

7:09:27

hacer que en el momento que existe un

7:09:30

nodo que lo que tiene dentro son varios

7:09:33

elementos deberíamos crear otro hijo

7:09:36

otro hijo para cada uno de los lenguajes

7:09:39

de programación en este caso qué

7:09:41

podríamos hacer podríamos intentar

7:09:43

revisar si el valor que tengo aquí es

7:09:47

simplemente como Tenemos aquí un dato

7:09:49

único o tenemos varios qué podría hacer

7:09:52

pues sin más voy a hacer una

7:09:54

comprobación s el valor No si en

7:09:56

realidad nosotros tenemos una instancia

7:09:59

Sí qué es lo que tenemos que comprobar

7:10:00

si tiene tiene instancia el valor los

7:10:03

datos no Y si es una instancia de qué

7:10:05

esto Qué tipo de dato es es una lista

7:10:07

por ejemplo en python podemos

7:10:08

comprobarlo así decir si el valor es una

7:10:11

instancia de lista haz algo si no haz

7:10:14

otra cosa si no ya lo tenemos en

7:10:16

realidad era si no era una lista

7:10:18

Escríbelo y ya está no nos importa qué

7:10:21

tendríamos que hacer en este caso pues

7:10:23

en este caso tendríamos que guardar los

7:10:24

diferentes datos Cómo sabemos Cuáles son

7:10:27

esos diferentes datos los diferentes

7:10:29

datos el listado Es value okay vamos a

7:10:31

recorrerlo por item in value el value es

7:10:35

el listado qué tendría que hacer yo

7:10:36

ahora pues tendría que guardar cada uno

7:10:38

de los elementos ostras claro cada uno

7:10:41

de los elementos en dónde ya no

7:10:43

directamente en Child sino que debería

7:10:46

crear otro subelement ahora cuál sería

7:10:48

el padre el rot no sería Child Y qué

7:10:51

tendría dentro pues ya que tenemos un

7:10:53

listado le puedo llamar a cada uno de

7:10:55

los elementos em esto lo podríamos

7:10:57

guardar como un subelemento podríamos

7:10:59

perfectamente o simplemente ya que estoy

7:11:01

creando el subelemento podría acceder a

7:11:03

su propiedad text y meterle el ítem

7:11:05

vamos a ejecutarlo ahora de nuevo y

7:11:07

vamos a ver lo que tenemos ahora veis

7:11:09

que ya tiene mucho mejor pinta ahora en

7:11:11

el momento que detectó que programming

7:11:14

languages era un listado ya lo que hizo

7:11:16

fue crear un elemento hijo por cada uno

7:11:19

de los elementos del listado y la ha

7:11:21

llamado ítem por supuesto claro Hay un

7:11:23

em python un item cing un item Swift yo

7:11:26

le he puesto ese nombre le podríamos

7:11:28

haber llamado Language a cada uno pero

7:11:30

ya que es un listado lo he intentado

7:11:32

dejar como algo genérico porque nosotros

7:11:33

no sabemos si ahora le metiera un

7:11:35

listado que no es de lenguajes también

7:11:37

lo iba a hacer bien entonces de momento

7:11:39

lo que hemos hecho es crear una función

7:11:42

que sea capaz de guardar Por lo menos

7:11:44

datos que tengan hasta un nivel hasta

7:11:46

ahora ya tenemos nuestro xml por aquí y

7:11:49

nos decía también que debíamos leerlo

7:11:51

que debíamos acceder a él esto nos lo

7:11:53

decía el ejercicio si vamos al ejercicio

7:11:55

decía métele todo muestra el contenido

7:11:57

de los archivos claro Así que una vez lo

7:11:59

guardamos vamos a leerlo Okay cómo lo

7:12:02

leemos esto ya es bastante fácil sobre

7:12:04

todo Si hicisteis el ejercicio anterior

7:12:06

vale ya tenemos guardado el xml ya lo

7:12:08

veis por aquí tenemos un xml perfecto

7:12:11

Pues ahora lo que voy a hacer es

7:12:14

intentar leer el xml cómo lo puedo hacer

7:12:16

esto ya lo vimos muy parecido en el

7:12:19

ejercicio anterior Simplemente si yo

7:12:21

quiero abrir un fichero with open el

7:12:23

nombre de fichero Cuál era el nombre de

7:12:24

fichero xml file y le voy a llamar as

7:12:27

xml Data Y cómo puedo mostrar los datos

7:12:31

en concreto de este xml pues sería tan

7:12:34

fácil le voy a hacer un print de los

7:12:35

datos Y ya está no vengo por aquí

7:12:38

xml Data okay Y una vez tenemos este

7:12:41

fichero yo lo que le puedo hacer es

7:12:42

venga lelo vamos a lanzar qué vemos por

7:12:45

aquí Data name age Birthday programming

7:12:50

básicamente Ya estoy imprimiendo por

7:12:52

terminal justo el ejercicio lo que

7:12:54

teníamos por aquí lo veis sin ningún

7:12:56

problema ya hemos sido capaces de

7:12:58

escribir el xml y de leerlo y ya lo lo

7:13:01

último que nos decía el ejercicio era

7:13:03

bórralo Okay cómo lo borramos por

7:13:05

ejemplo en python me voy a importar el

7:13:08

sistema operativo este módulo llamado

7:13:10

sistema operativo Por qué Porque si

7:13:12

accedo a os puedo acceder a una

7:13:15

operación que sea capaz de eliminarlo

7:13:17

simplemente llamo a remove y le paso la

7:13:19

ruta del fichero en este caso está la

7:13:21

raíz xml file yo ahora lo lanzo esto lo

7:13:24

va a imprimir y lo va a acabar borrando

7:13:26

Okay ya está listo la primera parte del

7:13:29

ejercicio qué nos decía el ejercicio que

7:13:31

hagamos Exactamente lo mismo pero

7:13:33

también con un Jason okay Así que vamos

7:13:36

a anotar por aquí que yo ahora quiero

7:13:38

hacer lo mismo pero con un Jason cómo

7:13:40

podremos trabajar con un Jason Pues

7:13:42

también con una librería en este caso

7:13:44

aún más simple import Jason ya tenemos

7:13:47

por aquí el Jason Y ahora qué tendría

7:13:49

que hacer para escribir el Jason el

7:13:51

Jason en realidad sí que es bastante

7:13:53

fácil es bastante fácil trabajar con él

7:13:55

porque lo único que tenemos que hacer

7:13:56

primero es crear el fichero Así que voy

7:13:59

a venir por aquí voy a crear primero un

7:14:01

nombre del fichero Jason file Jason file

7:14:03

y se va a llamar mouredev Jason vale

7:14:06

vamos a abrirlo como si fuéramos a crear

7:14:08

un fichero en blanco with open Jason

7:14:10

file Y si queríamos darle la posibilidad

7:14:14

de escribir abrirlo y escribirlo porque

7:14:16

aquí solo estamos abriendo para leerlo

7:14:17

con lo cual sin ningún problema pero si

7:14:19

queremos escribirlo Dentro de este

7:14:21

contexto Nosotros le tenemos que decir

7:14:23

venga Dale permisos de right esto lo

7:14:25

vimos en el ejercicio anterior una vez

7:14:28

ya tenemos el fichero creado si

7:14:31

simplemente le damos un nombre vale Y

7:14:33

qué tenemos aquí en este Jason Data pues

7:14:35

la posibilidad de poder escribirlo vamos

7:14:38

a utilizar la librería Jason Y aquí

7:14:40

tiene una operación muy Guay que se

7:14:42

llama dump que es la posibilidad de

7:14:44

nosotros pasarle un objeto y que él ya

7:14:46

lo escriba en formato Jason tenemos ese

7:14:48

objeto Sí el Data Y dónde lo queremos

7:14:51

guardar en realidad lo queremos guardar

7:14:53

en este Jason Data al que habíamos

7:14:56

accedido aquí vale vamos a lanzar

7:14:58

nuestro programa vemos un fichero

7:15:00

mouredev J Y qué tenemos aquí así de

7:15:02

fácil ha sido capaz de El diccionario

7:15:05

que nosotros le pasamos guardarlo

7:15:08

directamente en formato json ya se ha

7:15:10

apañado él okay esto es mucho más rápido

7:15:12

es decir Jason en cierto modo ha sido

7:15:15

una evolución de xml para los

7:15:18

programadores porque es muchísimo más

7:15:20

fácil manejar un Jason que un xml es

7:15:24

muchísimo más rápido es muchísimo menos

7:15:26

verboso Okay entonces una vez ya lo

7:15:28

tenemos por aquí qué podríamos hacer lo

7:15:30

siguiente bueno simplemente acceder a él

7:15:32

recordar que también nos decía he y esto

7:15:35

lo tienes que imprimir por consola Cómo

7:15:37

podríamos imprimirlo por consola aquí ya

7:15:39

lo habíamos visto que podríamos Acceder

7:15:41

al fichero veis por aquí Incluso si lo

7:15:44

queremos dejar bonito le podríamos

7:15:46

acabar diciendo Mira esto con permisos

7:15:48

únicamente de lectura vale una vez voy a

7:15:50

comentar la eliminación porque ahora voy

7:15:53

a Acceder al file con lectura vamos a

7:15:55

tener el dacta y vamos a leerlo vamos a

7:15:57

arrancar nuestro programa y aquí lo veis

7:15:59

primero se imprimido el xml y a

7:16:02

continuación se ha imprimido el Jason ya

7:16:04

está así de fácil si quisiéramos

7:16:06

borrarlo de momento lo voy a dejar

7:16:07

comentado para que veamos que somos

7:16:09

capaces de hacer las cosas Pero bueno

7:16:11

sería solo pasar el fichero y esto ya lo

7:16:13

borraría vale Esto es lo único que

7:16:15

teníais que hacer en la primera parte

7:16:17

sobre todo familiarizar con lo que sería

7:16:20

este tipo de estructura ahora vamos a ir

7:16:22

un poquito a la parte avanzada decía

7:16:24

utilizando la lógica de creación de los

7:16:26

archivos anteriores creo un programa

7:16:28

capaz de leer y transformar en una misma

7:16:31

clase custom de tu lenguaje los datos

7:16:33

almacenados en el xml y en el json Wow

7:16:36

claro Nosotros hemos tenido la

7:16:38

posibilidad de guardarlos pero lo

7:16:40

habitual no es tanto hacer esto sino la

7:16:43

operación contraria Tú ya tienes creados

7:16:46

Los ficheros Tú ya tienes podemos

7:16:48

dejarlo aquí con todo no que esto los

7:16:50

creaba los leía y los borraba Pero si yo

7:16:52

ahora quiero igual que tenemos este save

7:16:54

xml me voy a crear otra operación que

7:16:57

sea aquí save Jason para para acceder

7:17:00

rápidamente como lo escribíamos así sin

7:17:02

más y ahora puedo llamar a save Jason

7:17:05

save Jason Okay muy bien ya tenemos la

7:17:07

posibilidad de crearlo y borrarlo lo

7:17:09

siguiente que nos decía es utilizando la

7:17:11

lógica de creación utilizando la lógica

7:17:13

de creación Cuál es la lógica de

7:17:15

creación save xml save Jason o si

7:17:18

quisiéramos create xml por si queréis

7:17:21

que se entiende mejor create Jason vale

7:17:24

utilizando esta lógica de create Jason

7:17:26

por un lado create xml aquí aunque los

7:17:29

hayamos borrado hace un rato me los voy

7:17:31

volver a crear Vale ahora lo que

7:17:33

teníamos que hacer era lo contrario es

7:17:35

Sí tú ya sabes leerlos pero no se trata

7:17:38

solo de leerlos decía utilizando la

7:17:40

lógica de creación de los archivos

7:17:41

anteriores crea un programa capaz de

7:17:43

leer y transformar en una misma clase

7:17:45

custom de tu lenguaje los datos

7:17:47

almacenados ostras en una clase en un

7:17:50

tipo de estructura que ya hemos visto

7:17:51

vale de momento voy a crear una clase

7:17:53

aunque no tenga ni idea de Cómo

7:17:55

transformar los datos xml y Jason en una

7:17:58

clase si Quiero crear una clase Pues

7:18:00

bueno Class de momento me voy a ir

7:18:01

creando una clase la clase sin más le

7:18:03

voy a llamar Data porque es lo que yo

7:18:05

estaba guardando Y qué tendremos pues

7:18:07

Tendremos una serie de datos Qué tipo de

7:18:09

datos me voy a definir un init Por qué

7:18:12

Porque si yo quiero guardar datos en una

7:18:14

clase Necesito un inicializador esto

7:18:16

sabéis que depende un poco del lenguaje

7:18:18

pero básicamente es crear una clase con

7:18:19

una serie de parámetros Y qué parámetros

7:18:21

le vamos a pasar aquí el name el age el

7:18:24

Birthday y los lenguajes de programación

7:18:27

una vez ya tenemos Esto me los voy

7:18:29

guardando self igual a name igual que

7:18:32

tengo esto lo puedo hacer con todos los

7:18:33

datos esto es la creación de una clase

7:18:35

que ya hemos visto en otra lección de la

7:18:38

ruta de estudio sin más yo así sería

7:18:40

capaz de crear Pues en este caso una

7:18:42

estructura una clase que me guarde los

7:18:45

datos Y ya está Pero dónde está lo

7:18:47

difícil de todo esto lo difícil de todo

7:18:50

esto es que ahora necesitaríamos la

7:18:53

capacidad de hacerlo al inversa que

7:18:55

aunque yo tenga esta clase cómo soy

7:18:57

capaz de leer los datos una vez he

7:19:00

creado un fichero xml y Jason y de

7:19:03

transformarlos aquí vamos a ver cómo

7:19:05

podríamos hacerlo al revés ya tengo esto

7:19:08

vamos a ir a la parte de lectura Cuál

7:19:11

era la parte de lectura por ejemplo del

7:19:13

xml aquí teníamos el xml vamos a irnos a

7:19:17

leerlo otra vez Pero ahora no solo Vamos

7:19:19

a imprimir ahora vamos a intentar crear

7:19:21

una clase Data con estos datos será

7:19:24

difícil no será difícil Pues no lo sé

7:19:26

vamos a ver cómo podríamos hacer

7:19:28

teníamos los datos los lo primero es

7:19:31

intentar montarlo a revés con la

7:19:33

librería xml nosotros tenemos una

7:19:36

operación que se llama from stram cuando

7:19:39

nosotros leemos el fichero qué imprimí

7:19:41

antes una cadena de texto un churro con

7:19:43

el texto yo ya tengo una operación en la

7:19:45

que le paso el texto que es el xml Data

7:19:49

aquí y ya voy ser capaz de empezar a ir

7:19:52

generando cada uno de los datos de mi

7:19:53

xml okay Y qué tendré con esto en

7:19:56

concreto en concreto en realidad lo que

7:19:58

tendré aquí es el Root vale bueno no

7:20:00

está mal y una vez ya tengo esto qué

7:20:03

deberíamos ir haciendo recuperando cada

7:20:06

uno de los datos claro tengo el rot Qué

7:20:09

es el Root como tal dice el Root es un

7:20:11

Element Y qué vemos que tiene aquí Bueno

7:20:13

la posibilidad de añadirle de limpiarlo

7:20:16

de extenderlo de encontrar ojo y si yo

7:20:20

ahora aquí me pongo a buscar a cada uno

7:20:22

de los elementos que yo necesito para

7:20:24

crear mi clase en concreto Yo podría

7:20:26

ponerme a buscar cada uno de estos datos

7:20:28

Cuáles son estos datos yo puedo hacer un

7:20:30

find de qué del name cómo lo habíamos

7:20:33

guardado teníamos aquí name age Birthday

7:20:36

programming languages Okay pues si yo

7:20:39

busco el nombre es posible que yo lo que

7:20:42

acabe recuperando aquí es mi nombre y en

7:20:44

dónde lo tengo en el texto del nombre

7:20:46

con lo cual si yo ahora me quedo con

7:20:49

este valor esto en realidad es el name

7:20:51

vamos a irnos a los simples tengo el

7:20:53

name qué más me pasaría me pasaría

7:20:56

Exactamente lo mismo con el H y con el

7:20:58

Birthday eran textos sin más Qué era lo

7:21:02

raro lo raro en realidad era los

7:21:04

programing languages si yo ahora me voy

7:21:07

aquí y Busco programing languages lo que

7:21:09

yo voy a tener dentro del xml es otra

7:21:12

estructura con más elementos qué hacemos

7:21:14

pues bueno no sería tan difícil lo que

7:21:16

pasaría es que en el momento que yo

7:21:18

estoy intentando acceder a esto en

7:21:20

realidad s va a tener un listado de

7:21:22

elementos sería tan fácil como que yo

7:21:25

ahora una vez ya tengo esto Qué sería si

7:21:27

yo tengo un listado de elementos en

7:21:29

realidad esto es lo mismo que hacer for

7:21:32

item in aquí en este listado lo veis y

7:21:34

ahora aquí Podría empezar a acceder a

7:21:37

cada uno de los ítems no es tan

7:21:38

complicado verdad y ahora aquí Tendría

7:21:41

que ir guardando cada uno de los

7:21:42

elementos cada uno de los elementos Cómo

7:21:45

Pues en realidad yo podría crearme un

7:21:48

listado de programming languages vacío y

7:21:50

en este programming languages podría ir

7:21:53

añadiéndole los diferentes elementos

7:21:55

cómo son estos elementos Pues yo vendría

7:21:58

por aquí le haría un append y en it

7:22:00

tengo un elemento si accedo a su texto

7:22:03

voy a tener cada uno de los elementos Ya

7:22:05

está ya tengo todos estos ya puedo crear

7:22:08

mi clase en realidad ya podría crear mi

7:22:10

clase yo ahora podría venir por aquí y

7:22:12

decir Data Class le puedo acabar

7:22:15

llamando porque vamos a crear Ya esta

7:22:16

clase creo mi clase Data Y qué me pide

7:22:19

el nombre ya lo tengo name y el age lo

7:22:22

tengo también Y qué más el Birthday lo

7:22:25

tengo también y programming languages

7:22:28

los tengo también Aquí ya está he sido

7:22:30

capaz a hora de ir hacia atrás buscando

7:22:33

cada uno de los elementos que tengo y

7:22:34

una vez Ya los tengo todos Pues los

7:22:36

acabo metiendo por aquí vale o puedo

7:22:38

llamarle Data from xml para después ver

7:22:42

lo distinto okay Bueno qué pasaría ahora

7:22:44

si yo accedo aquí y le hago un PR Data

7:22:47

lo lanzamos qué me dice aquí dice Uy

7:22:50

claro parece que hay un error qué ha

7:22:52

pasado xml Data Qué es este xml Data

7:22:55

dónde nos está dando el problema nos

7:22:57

dice from stram este xml Data puede que

7:23:00

esté pasando algo por qué por qué

7:23:02

estamos teniendo aquí un problema Yo

7:23:04

podría imaginar que en principio esto

7:23:06

Debería ser suficiente verdad yo estoy

7:23:08

como leyendo el fichero ya tengo los

7:23:11

datos Está bien qué nos falta aquí

7:23:13

nosotros en el momento que tenemos el

7:23:15

fichero cómo lo leemos falta el Red

7:23:17

nosotros así solo teníamos la referencia

7:23:19

al fichero pero no teníamos los datos

7:23:20

del fichero veis que ahora Aquí está

7:23:22

fichero por aquí lo empieza leer y

7:23:25

teóricamente tenemos esto Data object

7:23:27

algo es algo Si queremos ver todos los

7:23:29

datos que tenemos Tenemos aquí podría

7:23:31

pasarlo a un dicionario le podría decir

7:23:34

muéstralo en formato dicionario la clase

7:23:36

o mira Class xml Class le voy a llamar y

7:23:39

le voy a decir imprímelo en formato

7:23:41

diccionario tengo exactamente lo mismo

7:23:43

que tenía en el fichero aquí lo veis he

7:23:45

sido capaz de realizar una

7:23:47

transformación a la inversa queremos

7:23:49

hacer esto mismo pero ahora con el Jason

7:23:52

pues más de lo mismo voy a venir por

7:23:54

aquí en este caso lo que voy a abrir es

7:23:56

el Jason file y voy a tener Jason Data

7:23:59

como decía antes trabajar con un fichero

7:24:02

Jason es muchísimo más fácil Cómo

7:24:04

creemos que tenemos que hacer para leer

7:24:07

el diccionario y todo eso Pues sería tan

7:24:10

fácil fijaos lo que voy a hacer me voy a

7:24:12

crear la clase directamente Jason Class

7:24:15

me voy a crear la clase y voy a empezar

7:24:17

a acceder a cada uno de los elementos a

7:24:19

cada uno de los elementos qué teníamos

7:24:22

aquí name H Birthday y programing

7:24:26

languages vale Cómo accedo a los

7:24:28

elementos del Jason lo primero que

7:24:31

necesito es acceder a su Data recordáis

7:24:34

algo así como cuando estaba creando Pues

7:24:36

esta raíz voy a venir por aquí y cuál es

7:24:38

la Data en realidad es el

7:24:41

jasona Red Aquí tengo los datos Y una

7:24:44

vez ya tengo los datos este red qué va a

7:24:46

hacer va a ser capaz de crear un

7:24:48

diccionario con lo cual en realidad es

7:24:50

un js dict un diccionario si yo ahora

7:24:53

accedo a cada uno de los valores del

7:24:55

diccionario por su nombre el nombre el

7:24:58

age el Birthday y los lenguajes de

7:25:00

programación tan fácil como que casi me

7:25:03

salto todo esto y accedo directamente a

7:25:06

ellos para transformarlo en esta clase

7:25:08

aquí ya no tengo los problemas del

7:25:09

listado es capaz de entenderse

7:25:11

perfectamente porque lo que tenemos

7:25:12

siempre en los Jason es una estructura

7:25:15

que dentro puede tener otra estructura

7:25:16

listados es más de lo mismo vale una vez

7:25:19

ya tengo esto lo imprimimos a ver si nos

7:25:21

lo ha creado bien Vamos a imprimir Jason

7:25:23

cl. dict si queréis para que nos lo deje

7:25:26

bonito lo ponemos así lo lanzamos y me

7:25:28

dice Uy el diccionario que no me

7:25:30

encuentras name Por qué Qué problema

7:25:32

tenemos ahora me dice que no soy capaz

7:25:34

de encontrar name dentro del diccionario

7:25:37

A ver vamos al Jason no tengo un name sí

7:25:40

que tengo un name Qué pasa aquí dice

7:25:42

Stream indicat must be in tagers not str

7:25:45

qué será esto qué transformación estamos

7:25:47

haciendo aquí Qué estamos intentando

7:25:49

Buscar Y qué está dando qué está

7:25:51

fallando Cómo empezaríamos a revisar si

7:25:54

estos datos están bien o no lo están

7:25:56

Bueno vamos a ver por ejemplo si este

7:25:59

diccionario está bien me voy a ir al

7:26:00

Jason Dick vale diccionario perfecto

7:26:03

name age Birthday programming languages

7:26:07

perfecto pues vamos a ver ahora qué es

7:26:09

lo siguiente que tendríamos que hacer

7:26:10

aquí ver si podemos Acceder al nombre al

7:26:13

diccionario al Birthday esto lo lanzamos

7:26:16

qué lo vemos error Dick name parece que

7:26:20

aunque nosotros tengamos este

7:26:21

diccionario por aquí no le gusta Por qué

7:26:24

Porque este Jason Data aunque no esté

7:26:26

pintando un diccionario bien en realidad

7:26:28

no lo está entendiendo tenemos un

7:26:30

dicionario igual esto que tienes tú por

7:26:32

aquí no es un diccionario vamos a

7:26:34

revisarlo type y a ver si esto es un

7:26:36

diccionario o no nos dice Class Stream

7:26:39

ojo Qué problema estamos teniendo aquí

7:26:41

en realidad tenemos un problema bastante

7:26:43

grave que es que nosotros nos hemos

7:26:45

puesto a leer un fichero pero que en

7:26:47

realidad este fichero es una cadena de

7:26:49

texto aquí hay que hacer un pequeño

7:26:51

extra que es que nosotros con este red a

7:26:54

la inversa no nos llega tendríamos que

7:26:57

irnos a la clase Jason y aquí llamar aow

7:27:00

y con este load si nosotros ya le

7:27:01

pasamos el fichero a ver ahora qué tiene

7:27:04

aquí ojo ya es un diccionario ya no es

7:27:07

una cadena de texto con lo cual nosotros

7:27:09

ahora nos podemos venir por aquí y al ya

7:27:11

tener un diccionario en vez de una

7:27:13

cadena de texto ya nos hace toda la

7:27:15

transformación aquí la veis bueno

7:27:17

peculiaridades que tiene cada uno de

7:27:18

estos qué más nos pedía el ejercicio

7:27:20

decía capaz de leer y transformar en una

7:27:23

clase y después ya pues borrar Los

7:27:25

ficheros sin ningún problema una vez ya

7:27:27

lo tenemos vamos a hacerle el remove de

7:27:29

cada un voy a venir por aquí y voy a

7:27:31

venir por aquí xml file Y esto es lo

7:27:34

mismo que también le voy a dejar puesto

7:27:36

por aquí vale teníamos el remove y el

7:27:38

remove lo lanzamos lo revisamos y aquí

7:27:41

vemos las impresiones de cómo era por un

7:27:44

lado el xml aquí arriba y de cómo

7:27:46

tenemos los print de la primera lectura

7:27:49

del Jason del diccionario por este lado

7:27:51

que es una clase y exactamente otro

7:27:53

igual hemos visto que estas dos últimas

7:27:55

líneas es la transformación del xml y

7:27:58

del Jason a una clase veis que tenemos

7:28:00

lo mismo lo veis aquí Exactamente igual

7:28:02

Okay solo que hemos visto esta pequeña

7:28:04

diferencia en el momento que nosotros

7:28:07

estamos buscando esta parte le estamos

7:28:09

haciendo la transformación siempre a una

7:28:11

cadena de texto porque es la manera que

7:28:13

nosotros tenemos a la hora de leerlo que

7:28:15

queremos que los dos sea Exactamente

7:28:18

igual podríamos hacerle una

7:28:20

transformación siempre a un Stream para

7:28:22

asegurarnos yo podría leer el Birthday

7:28:24

que es lo que yo sé que es raro y le

7:28:26

digo Mira Aunque sé que lo guardaste

7:28:28

como un integer en este este caso te

7:28:30

quiero guardar igual te intento

7:28:32

transformar entonces intentamos hacerle

7:28:34

hago este Jason cuando lo leo podría

7:28:36

acabar transformándolo un Stream esto ya

7:28:38

un poquito como vosotros queráis en mi

7:28:40

caso ya que estamos en python y nos da

7:28:42

igual los tipos de datos porque

7:28:44

precisamente son dinámicos voy dejar que

7:28:46

los transforme según venga voy a volver

7:28:48

a hacer el ejercicio para que veáis lo

7:28:50

que guardamos veis que en este caso lo

7:28:52

guardábamos como un entero en cambio en

7:28:54

el xml lo guardamos siempre como texto

7:28:56

por eso hay esa pequeñita diferencia

7:28:58

pero que en nuestro caso pues no nos

7:29:00

molesta hemos sido capaces de

7:29:01

transformar tanto el xml como el Jason

7:29:04

en una misma clase que hemos creado por

7:29:06

aquí y así yo creo que ya tenemos todo

7:29:08

lo que nos pedía el ejercicio y así

7:29:10

llegamos al final de esta primera parte

7:29:12

del curso de lógica de programación

7:29:13

desde cero Recuerda que la web de la

7:29:15

ruta de estudio puedes seguir

7:29:16

consultando los nuevos ejercicios y que

7:29:18

Tú mismo puedes aportar tus correcciones

7:29:20

Únete al discord y a la actividad en

7:29:21

directo y sígueme en redes sociales Si

7:29:23

no quieres perderte el contenido que

7:29:25

creo de forma diaria Espero que este

7:29:27

curso te haya resultado útil y que poco

7:29:29

a poco te ayude a programar de manera

7:29:31

más lógica Muchísimas gracias por tu

7:29:32

tiempo nos vemos en un nuevo tutorial

7:29:34

hasta luego

7:29:36

[Música]

7:29:49

[Música]

More transcripts

Explore other videos transcribed with YouTLDR.

Get the TLDR of any YouTube video

Transcribe, summarize, and repurpose videos in 125+ languages — free, no signup required.

Try YouTLDR Free