Ej. 39 : Trabajando con diccionarios…

Voy a ver otro contenedor que puedo utilizar que me abrirá un mundo de posibilidades. Se trata de el contenedor más útil: el diccionario.

Python los llama «dicts». Otros lenguajes los llaman «hashes». Lo que impota es lo que hacen cuando se comparan con las listas. Una lista puede hacer cosas como las siguientes:

Ej. 39 - Python ej lista

Podemos usar los números para indicar el número de una lista, lo que significa que podemos usar números para encontrar lo que hay en ella (ver ejercicio 34).

Lo que hace un diccionario es permitirme usar cualquier cosa, no sólo números. Un diccionario asocia una cosa a otra, sin importar lo que sea. Ejemplo:

Ej. 39 - Python ej lista 2

En lugar de usar sólo números, estoy usando cadenas para decir que elementos quiero. También puedo añadir elementos nuevos al diccionario usando las cadenas de texto, los nombres.

También puedo hacer lo siguiente:

Ej. 39 - Python ej lista 3 error

Vaya. ¡No me deja!

Mmmmmm. Es que he cerrado Python, y debería de haber continuado desde la pantalla anterior…

Ej. 39 - Python ej lista 3

Ahora si. En éste código he usado números y luego puedo ver que hay números y cadenas como claves en el diccionario cuando lo muestro en la pantalla.

Por supuesto, un diccionario en el que sólo se pueden poner cosas es muy aburrido. Se borra con la palabra clave del de la siguiente forma:

Ej. 39 - Python ej lista 4

Bien. Ahora escribo un programa interesante.

Ej. 39 - Programa 1

Me da el siguiente error en la línea 3.

Ej. 39 - Programa 1 error

He cambiado cosas (he puesto lo del código ASCII en la línea 1) y no doy con la tecla.

El error está ahora en la línea 4. 😦

No lo puedo ejecutar todavía. Jur. Dejo el resto del código aquí, aunque como todavía no lo he ejecutado, no se si tiene errores o no.

Ej. 39 - Programa 2

Corrijo cosas básicas que estaban mal desde el ppio. Los diccionarios usan LLAVES, NO CORCHETES.

Ej. 39 - Programa con errores

La línea 20 y 21 las cambio también, no estaban bien planteadas. Igual hay otra forma más parecida a lo que había en el anterior programa, pero yo he tirado de lo conocido (arriba).

Al ejecutar, voy depurando y me va saliendo lo siguiente, hasta el siguiente atasco:

Ej. 39 - Programa errores

Error en la línea 25. Cambio a llaves, pero me sale lo mismo. Me temo que es la estructura, aunque me diga invalid syntax. ¿Está mal planteado? Lo que sigue a continuación también estará mal…porque es lo mismo… 😛

Bien. Ya he salido del bache. Dando vueltas y con nuestro método favorito: pueba-error mientras sigo observando. Love it. Éste es el programa corregidoEj. 39 - Programa 1 corregidoEj. 39 - Programa 2 corregido

Que ejecutando resulta:

Ej. 39 - Terminal corregido

Nice. 🙂

PREGUNTAS

P: ¿Qué diferencia hay entre  una lista y un diccionario?

R: Una lista es una lista ordenada de elementos. Un diccionario (o dict) es para crear una relación entre unos elementos (llamados «clave») y otros (llamados «valores»).

P: ¿Para qué debería de usar un diccionario?

R: Úsalo siempre que tengas que tomar un valor «consultando» otro valor. De hecho, podrían llamarse «tablas de consulta».

P: ¿Para qué debería de usar una lista?

R: Una lista es para cualquier secuencia de cosas que necesitan estar ordenadas y sólo necesitas consultarlas por un índice numérico.

P: ¿Y si necesito un diccionario, pero necesito que esté ordenado?

R: Echa un vistazo a la siguiente estructura de datos de Python: collections.OrderedDict. Búscalo en internet y lee documentación sobre ésto.

Por curiosidad, también lo miro en pydoc y me sale ésto:

Ej. 39 - Pydoc collections.OrderedDict

Ej. 38 : Practicando con listas…

Cuando escribo el código Python mysuff.append(‘hello’), en  realidad se están desencadenando una serie de procesos dentro de Python para que suceda algo a la lista mystuff. Así funciona:

  1. Python ve que indiqué mystuff y revisa esa variable. Puede que revise si anteriormente se creó con un =, si se trata de un parámetro de una función o si es una variable global. En cualquier caso, tiene que encontrar donde aparece por primera vez mystuff.
  2. Una vez encuentra mystuff, llega al operador . (punto) y empieza a revisar las variables que son parte de mystuff. Desde el momento que sabe que mystuff es una lista, también sabe que tiene muchas funciones asociadas.
  3. Luego encuentra append y lo compara con todas las funciones y variables de mystuff. Si append está ahí, la usa.
  4. A continuación, Python ve los paréntesis y dice «¡Oh! Ésto debe de ser una función». En ese momento, llama o ejecuta la función con un parámetro extra.
  5. El parámetro extra es…¡¡mystuff!! Lo sé, es raro, ¿verdad? Pero así es como funciona Python, así que lo mejor es simplemente recordarlo y asumir que eso es lo correcto. Lo que ocurre es que la llamada a la función, en el fondo se procesa de una forma similar a append (mystuff, ‘hello’), en lugar de mystuff.append(‘hello’).

No es necesario saber que ésto está pasando pero me será de ayuda para cuando tenga mensaje de error como éste:

>>> class Thing(object) :

…  def test (hi) :

…  print «hi»

>>> a = Thing ()

>>> a.test («hello»)

Traceback (most recent call last): 

File «<stdin>», line 1, in <module>

TypeError: test () takes exactly 1 argument  (2 given)

>>>

Más adelante lo veré, pero el error significa que Python cambió a.test(«hello») por test(a,»hello») y que en algún lugar alguien se confundió y no añadió el argumento o parámentro para a.

Dedicaré algunos ejercicios para que éste concepto quede claro. Haré éste ejercicio que mezcla cadenas y listas para divertirme un poco.

Ej. 38 - Editor Ej. 38 - Terminal

PREGUNTAS

P: ¿No dijimos que no era recomendable usar bucles while?

R: Las reglas se pueden romper si tienes una buena razón. No hay que ser esclavos de las reglas.

P: ¿Qué hace stuff[3:5]?

R: Obtiene una parte de la lista, del elemento 3 al 4, lo que significa que no incluye el 5. Es similar a como funciona range (3,5).  Aunque no es lo mismo, ¿eh?. Con stuff[3:5] se obtiene una sublista de stuff, tenga lo que tenga, range sólo devuelve números.

P: ¿Por qué no funciona join(‘ ‘, stuff)?

R: Esa forma no tiene sentido. No funciona de esa manera, ya que join es un método asociado a una cadena. Reescríbelo así: ‘ ‘.join(stuff).

+ EJERCICIOS

  1. Toma cada llamada a una función y revísala siguiendo los pasos descritos anteriormente para traducirlo a lo que hace Python. Por ejemplo,   ‘ ‘.join(cosas) es join(‘ ‘ , cosas).
  2. Traduce estas dos formas de ver las llamadas a funciones. Por ejemplo, ‘ ‘.join(cosas) se puede leer como «join cosas aplicado a ‘ ‘ «. Otra forma es «Llamada a join con ‘ ‘ y cosas». En realidad es lo mismo.
  3. Busca en internet sobre PROGRAMACIÓN ORIENTADA A OBJETOS (OOP).
  4. Busca que es class en Python, no en otros lenguajes, que puede dar lugar a confusión.
  5. ¿Cuál es la relación entre dir(algo) y la class de algo?

Ej. 37 : Revisando símbolos…

Ahora voy a revisar símbolos y palabras clave de Python que ya conozco y otros nuevos que usaré en próximas lecciones.

La idea es ir completando las siguientes tablas poco a poco.

PALABRAS CLAVE FUNCIÓN
and
del
from
not
while
as
elif
global
or
with
assert
else
if
pass
yield
break
except
import
print
class
exec
in
raise
continue
finally
is
return
def
for
lambda
try
TIPOS DE DATOS FUNCIÓN
True
False
None
strings
numbers
floats
lists
SECUENCIAS DE ESCAPE FUNCIÓN
\\
\’
\a
\b
\f
\n
\r
\t
\v
FORMATOS DE CADENAS FUNCIÓN
%d
%i
%o
%u
%x
%X
%e
%E
%f
%F
%g
%G
%c
%r
%s
 %%
OPERADORES FUNCIÓN
+
*
**
/
//
%
<
>
<=
>=
==
!=
<>
()
[]
{
@
,
:
.
=
;
+=
-=
*=
/=
//=
%=
**=

Ej. 36 : Diseñando y depurando…

Ahora que he practicado con las sentencias if, voy a ver algunas reglas para los bucles for y while que me facilitarán las cosas. También voy a ver algunas cosas sobre depuración para que pueda averiguar los errores de mi programa. Por último, diseñaré un pequeño juego similar al del ejercicio anterior, pero con un ligero cambio.

REGLAS PARA SENTENCIAS IF

  1. Cada sentencia if, debe tener un else.
  2. Si ese else no pudiera ejecutarse porque no tuviera sentido, debe utilizarse una función die en el else que muestre en pantalla un mensaje de error, tal y como hice en el último ejercicio. Así se encuentran muchos errores.
  3. Nunca anidar declaraciones if más de dos niveles de profundidad. Hay que intentar hacerlo en uno. Ésto significa que si escribo un if dentro de otro if, debería trasladar el segundo if a otra función.
  4. Tratar las sentencias if como párrafos, donde cada if, elif y else se agrupen como un conjunto de frases. Añadir líneas en blanco antes y después.
  5. Las condiciones booleanas deben de ser simples. Si son complejas, trasladar los cálculos a variables en una función y usar un buen nombre para variables.

¿Se cumplen las reglas en el ejercicio anterior?

Hay que tener en cuenta que éstas «reglas», son más bien consejos para escribir un código limpio, pero en la vida real, hay que ser flexible.

REGLAS PARA BUCLES FOR

  1. Utilizar un bucle while sólo para bucles infinitos, es decir, probablemente nunca. Ésto sólo se aplica a Python. Otros lenguajes son diferentes.
  2. Utilizar un bucle for para todos los otros tipos de bucles, sobre todo si hay un número fijo o limitado de cosas a recorrer.

CONSEJOS PARA DEPURAR EL PROGRAMA

  1. No utilizar un «debugger» o depurador. Un depurador es como hacer un escáner del cuerpo completo de una persona enferma. No obtengo ninguna expresión específica que sea útil, sólo conseguiré una gran cantidad de información que no me ayudará y me confundirá.
  2. La mejor forma de depurar un programa es utilizar print para mostrar en pantalla los valores de las variables en ciertos puntos y ver así dónde está el fallo.
  3. Asegurarme de que las partes de mis programas funcionan a medida que los desarrollo. No escribir todo el código de una vez sin probar antes que se ejecuta correctamente. Escribir un poco de código, ejecutarlo y solucionar los errores.

EJERCICIO PENDIENTE

Escribir un juego similar al del ejercicio anterior, usando listas, funciones y módulos (como en el ejercicio 13).

¡¡¡Pero antes de ésto, hay que escribir un mapa del juego!!!

No es que me paralice el miedo, ejem, es que quiero avanzar, para luego volver sobre mis pasos.

😛

Ej. 35 : Tomando decisiones con funciones…

Ya he aprendido a hacer la sentencia if, funciones y listas. Ahora ha llegado el momento de mezclarlas. Voy a escribir el siguiente código e intentaré averiguar qué hace.

Ej. 35 - Programa 1Ej. 35 - Programa 2Ej. 35 - Programa 3

Ejecutando, y eligiendo opciones, me sale lo siguiente:

Ej. 35 - Terminal 1 opción

Obviamente, éste programa es tremendamente interesante para darle millones de vueltas.

Lo retomaré en un par de post para:

  1. Dibujar un mapa del juego y ver si he entendido el recorrido.
  2. Escribir comentarios en el programa
  3. Darle vueltas al juego, para ampliarlo o simplificarlo.

PREGUNTAS

P: ¿Qué hace while True:?

R: Crea un bucle infinito.

P: ¿Qué hace exit(0)?

R: En muchos sistemas operativos un programa puede abortar la ejecución con exit(0), indicando con el número pasado por parámetro si hubo un error o no. Si ejecutas exit(1), se aborta con el error, pero si se hace con exit(0), se terminará correctamente. El motivo por el que es al revés de la lógica booleana normal (con 0==False), es que así se puede usar diferentes números para indicar diferentes errores. Puedes terminar el programa con exit(100) para errores con resultados diferentes que con exit(2) o exit(1).

Ej. 34 : Accediendo a los elementos de las listas…

Las listas son muy útiles, pero sólo si podemos acceder a lo que contienen. Ya se recorrer los elementos de una lista en orden, pero, ¿y si quiero acceder concretamente al quinto elemento? Necesito saber cómo acceder a los elementos de una lista. Así es como accedo al primer elemento:

animals = [‘bear’, ‘tiger’, ‘penguin’, ‘zebra’]

bear = animals [0]

¿Parto de una lista de nombres de animales y para obtener el primer elemento uso un cero?¿cómo puede ser?

Así es como funcionan las matemáticas, Python comienza sus listas en 0 en lugar de en 1. Parece raro, pero tiene muchas ventajas.

La mejor manera de explicar por qué es motrando la diferencia entre cómo usamos los números el resto de los mortales, y cómo los usan los programadores.

En general, el orden de los animales es importante. En una carrera, no puedo tener el segundo animal sin el primero, ni el tercero sin el segundo. También es imposible tener un animal «cero», ya que el cero no significa nada. Llamamos a éste tipo de números «ordinales» porque indican un orden.

Los programadores, sin embargo, no piensan de esa manera, porque pueden tomar cualquier elemento de una lista en cualquier momento. Para ellos, la lista anterior es más como una baraja de cartas. Si quieren el tigre, lo cogen. Si quieren la zebra, también pueden cogerla. Ésta necesidad de coger los elementos de la lista al azar significa que necesitan una forma de indicar o hacer referencia a los elementos a través de una dirección o un «índice», y la mejor forma de hacerlo es que el índice empiece en 0. Las mateméticas son la manera más fácil, para éste tipo de accesos. Éste tipo de número es un número «cardinal» y significa que puede escoger al azar y es necesario que haya un elemento cero.

¿De qué sirve ésto en las listas? En pocas palabras, cada vez que quiero coger el tercer animal, traduzco ese número «ordinal» en número «cardinal», restándole 1. El «tercer»  animal está en el índice 2 y es el pingüino. Debo hacer ésto porque me he pasado toda la vida usando los números ordinales y ahora hay que pensar en cardinal. Simplemente resto uno y todo irá bien. Recuerda:

ordinal == ordenado, 1º cardinal == cartas al azar, 0

Voy a practicar.

Recordar que si digo «primero», «segundo» y siguientes, entonces estoy usando ordinales y debo restar 1. Si indico un cardinal (0, 1, 2…), entoces lo uso directamente.

animals = [‘bear’, ‘python’, ‘peacock’, ‘kangaroo’, ‘whale’, ‘platypus’]

  1. El animal de la posición 1  …   es el segundo animal, y es una pitón.
  2. El tercer animal.  …  está en la posición 2, y es un pavo real (un auténtico pavo XD).
  3. El primer animal   …   está en la posición 0, y es un oso.
  4. El animal de la posición 3   …   es el cuarto animal y es un canguro.
  5. El quinto animal   …   está en la posición 4, y es una ballena.
  6. El animal de la posición 2   …   es el tercer animal y es un pavo real.
  7. El sexto animal   …   está en la posición 5 y es un ornitorrinco.
  8. El animal de la posición 4   …  es el quinto animal y es una ballena.

Puedo usar Python para comprobar si las respuestas son correctas.

+EJERCICIOS

  1. Ampliar info sobre números cardinales y ordinales
  2. Y ahora una pregunta interesante. ¿Por qué en el año 2010 en «1 de enero de 2010» realmente es 2010 y no 2009? Pista: no se pueden tomar años al azar.

Ej. 33 : Haciendo Bucles While…

Un bucle while ejecutará el bloque de código que haya debajo siempre y cuando la expresión booleana sea verdadera.

Si escribo una línea y al final añado dos puntos, le estoy diciendo a Python que comienzo un nuevo bloque de código. Después identamos éste bloque de código. Así estructuramos los programas para que Python sepa qué queremos hacer. Éste tema lo empecé a ver en el ejercicio 29.

Más adelante, voy a hacer algunos ejercicios para entrenar la lectura de éstas estructuras, de manera similar a como hice con las expresiones booleanas.

Volviendo al bucle while. Lo que hace es valorar una condición como una sentencia if, pero en vez de ejecutar el bloque de código una vez, salta de nuevo al comienzo de éste y repite una y otra vez hasta que la expresión sea False.

El problema de los bucles while es que a veces no se detienen. Ésto es genial sólo si su intención es ejecutar el bucle hasta el Apocalipsis Mascotil (Ej. 30) o el fin de los tiempos. Pero aparte de éte caso concreto, lo normal es que quiera que los bucles finalicen en algún momento.

Para evitar éstos problemas, existen algunas reglas:

  1. No abusar del bucle while. Un bucle for es mejor, en general.
  2. Revisar las sentencias while para asegurarse de que en algún momento la condición tomará el valor False.
  3. En caso de duda, muestro en pantalla la variable de la condición al comienzo y al final del bloque de código de la sentencia while para ver que valores toma.

Poniendo en práctica…

Ej. 33 - Editor

Es importante entenderlo bien.

En pantalla en el terminal se muestra lo siguiente:

Ej. 33 - Terminal


Hay que sacarlo por Python, pero tengo atascada la ruta.

Pendiente.

PREGUNTAS

P: ¿Cuál es la diferencia entre un bucle while y un bucle for?

R: Un bucle for sólo puede repetirse tantas veces como elementos haya en una colección de cosas. Un bucle while puede repetirse de otras muchas maneras. Sin embargo, los bucles while son más difíciles de hacer bien. Normalmente se pueden hacer muchas cosas con los bucles for.

P: Los bucles son difíciles. ¿Cómo puedo entenderlos bien?

R: La principal razón por la que la gente no entiende los bucles es porque no son capaces de seguir los «saltos» que se producen en el código. Cuando un bucle se ejecuta, recorre el bloque de código y al final de éste, salta al comienzo. Para visualizarlo, sugiero escribir print en el bucle para mostrar en pantalla qué interacción o repetición está ejecutando Python y que valor tienen las variables en ese punto. Escribir print antes, en medio y al final del bucle, puede ser muy útil. Y siempre hacer pruebas uno mísmo.

+EJERCICIOS

  1. Convertir el bucle while en una función a la que pueda llamar y reemplazar el 6 de la condición (i < 6) por una variable.
  2. Usar esa función en el código modificando lo que sea necesario e ir probando con diferentes números.
  3. Añadir otra variable a los parámetros de la función que me permita cambiar el + 1 de la línea 8 y así modificar en cuánto se incrementa la variable i.
  4. Volver a modificar el código en lo que se necesite para usar la función y ver que efecto tiene.
  5. Escribir el código usando en su lugar un bucle for y range. ¿Sigo necesitando el incremento de i? ¿Qué ocurre si no lo quito?

Nota:  Si practicando, el programa se vuelve loco (muy probable), presionar Ctrl-C para abortar la ejecución del programa.

Ej. 32 : Aprendiendo con bucles y listas…

Ahora puedo hacer programas mucho más interesantes.

Sin embargo, los programas también necesitan hacer cosas de manera repetitiva y muy rápida.

En éste ejercicio voy a utilizar un bucle para generar e imprimir varias listas.

Antes de usar un bucle for, necesitamos una forma de almacenar en algún lugar los resultados del bucle. La mejor manera es hacerlo es una lista. Una lista es exactamente lo que dice su nombre, un contenedor de cosas que están organizadas en orden. No es complicado. Sólo hay que aprender una sintaxis nueva. Ésta es la forma de crear una lista:

hairs = [‘brown’, ‘blond’, ‘red’]

eyes = [‘brown’, ‘blue’, ‘green’]

weights =[1, 2, 3, 4]

Lo que hago es empezar la lista con el corchete izquierdo para abrir la lista. Luego escribo cada uno de los elementos que deseo que contenga la lista. Igual que hacía con los parámetros de las funciones. Por último, termino y cierro con corchete derecho. Python toma ésta lista y todo su contenido, y lo asigna a una variable.

Creo algunas listas usando bucles y las muestro en pantalla:


Ej. 32 - Editor Ej. 32 - Terminal

NOTA: A muchos cerebros les han enseñado que el mundo es plano. En el ejercicio anterior, tenía sentencias del tipo if dentro de otro if. Para algunos, «anidar» unas cosas dentro de otras puede dar lugar a confusión. En programación ésto está por todos lados. Encontraré funciones que llaman a otras funciones que tienen sentencias if y listas con listas dentro de listas. Ante problemas, sugiero papel y lápiz, para un análisis manual.

PREGUNTAS

P: ¿Cómo se hace una lista de dos dimensiones?

R: De una forma similar a ésta: [[1, 2, 3], [4, 5, 6]].

P: ¿Es lo mismo una lista que un array?

R: Interesante. Depende del lenguaje y la implementación. Estrictamente, las listas son muy diferentes a los arrays debido a la forma de implementación. En Ruby, las listas se denominan arrays. En Python, nos referimos a ellas como listas. Por ahora las llamamos listas, ya que Python las llama así.

P: ¿Cómo puede un bucle for usar una variable que no había sido definida antes?

R: La variable queda definida en el bucle y toma un valor en cada iteración.

P: Mmmmm. ¿Y qué es una iteración?

R: De momento, voy a remitirme a las palabras de Wikipedia…

En programación, Iteración es la repetición de un proceso dentro de un programa de computadora. Puede usarse tanto como un término genérico (como sinónimo de repetición) así como para describir una forma específica de repetición con un estado mutable (el ejercicio es el segundo caso).

Cuando se usa en el primer sentido, la recursividad es un ejemplo de iteración, pero que usa su propia notación (notación recursiva), que no es el caso de iteración.

Sin embargo, cuando se usa en el segundo sentido (caso más restringido), como vemos en el ejercicio, la iteración describe el estilo de programación usado en lenguajes de programación imperativa. Esto está en contraposición de la recursividad, la cual tiene un enfoque más declarativo.

He aquí un ejemplo de iteración basándose en asignación destructiva, en pseudocódigo imperativo:

 var i=0, a := 0        // inicializo a antes de comenzar la iteración
 for i from 1 to 3 {  // ciclo 3 veces
     a = a + i       // incremento a con el valor actual de i
     print a              // se imprime el número 6
     }

En este fragmento de programa, el valor de la variable i cambia a medida que la ejecución del programa progresa, tomando los valores 1, 2 y 3. Este cambio de valor —o estado mutable— es característico de una iteración.

Es un tema que da para mucho. Lo retomaré.

P: ¿Qué hace la función range exactamente?

R: Vamos a preguntar a pydoc:

Pydoc - range

P: ¿Por qué for i in range (1, 3): sólo tiene dos iteraciones en lugar de tres?

R: La función range () va del primer al último número, pero no incluye el último. Así que se detiene en dos, no en tres. Es la forma más común de funcionamiento de éste tipo de bucles.

P: ¿Qué hace elements.append () ?

R: Simplemente añade algo al final de la lista. Abre la línea de comandos de Python y prueba ejemplos con cada lista que crees. Así se ve mejor.

PENDIENTE

  1. Buscar info en la documentación de Python sobre las listas. ¿Qué otras operaciones se pueden usar para añadir elementos a las listas?
  2. Profundizar sobre iteración y recursividad.

Ej. 31 : Tomando decisiones…

En los post iniciales principalmente he mostado cosas en pantalla y eso era necesario para ir por buen camino. Los códigos se ejecutaban empezando por la parte superior, e iban hacia abajo hasta llegar al final. Si hice una función, podía ejecutarla más tarde, pero todavía no tenía ningún elemento para tomar decisiones. Ahora que tengo if, else y elif, puedo crear código que decide cosas.

En el último post escribí varias condiciones simples.

En éste ejercicio preguntaré al usuario y tomaré decisiones basadas en sus respuestas.

Allá voy:

Ej. 31 - Código diver

Realmente éste código es graciosísimo. Me he reído mucho mientras lo escribía y lo iba siguiendo.

Consigue su objetivo, que es captar la atención ya desde que se escribe, por tanto entenderlo mejor, para después querer cambiarlo y nunca mejor dicho, jugar con él y querer crear nuestra propia versión. Es decir, repetir y repetir y repetir, para aprender mejor y acabar de disipar todas las dudas con la práctica personal. Lo que viene siendo la esencia de un programador. El autor demuestra un dominio que ya se empieza a notar. Justo cuando me estaba empezando a desmotivar. ¡¡Por fin!!  🙂

¡¡¡Un 10 al código y al autor!!!

Al ejecutar, por supuesto, voy tomando decisiones que voy respondiendo en el terminal. Algo parecido y relacionado con el ejercicio 11, en el ej. 12, ej. 14, en el ej. 15… pero muchísimo más divertido. Decisiones que condicionarán el resultado que se muestra en pantalla.

Aquí estoy jugando a éste juego de aventura…

Ej. 31 - Juego en Terminal opción 1

He elegido la opción 2 y a continuación la 2. La primera opción «la sabía» pero con la segunda tenía dudas. Me ha guiado el amarillo… ¡¡ He sobrevivido!!! XD

Por supuesto ésto está pidiendo a gritos cambiarlo, marearlo…¡¡¡y darle todas la vueltas del mundo!!!

Lo retomaré.

PREGUNTAS

P: ¿Se puede reemplazar elif con una combinación de sentencias if/else?

R: Buena pregunta. En algunos casos si, pero depende de cómo esté escrito cada if/else. Ésto significa que Python comprobará cada combinación if/else, en lugar de sólo los primeros falsos, como lo haría  if/elif/else. Practica para entenderlo.

P: ¿Cómo indico si un número está entre un rango de números?

R: Tengo dos opciones:

  1. usar 0 < x < 100 o 1 <= x < 10, que es la notación clásica
  2. o usar x in range (1, 10).

P: ¿Y si quiero más opciones en los bloques if/elif/else?

R: Fácil. Sólo debo añadir más bloques elif para posible decisión.

Ej. 30 : Siguiendo con IF-ELSE

Enlazo con el post anterior y puntualizo.

Una sentencia IF crea una derivación en el código al que le dice: «Si ésta expresión boolenana es True, entonces ejecuta el código que hay debajo, en otro caso, sáltatelo».

Es importante el concepto que bloque de código. Los dos puntos al final de la línea de la sentencia IF, le indican a Python que voy a crear un bloque de código al que reservará (no se si es la palabra correcta reservar) 4 espacios. Es exactamente lo mismo que hacía cuando escribía funciones en la primera mitad del libro.

Un ejemplo:

Ej. 30 - Código Ej. 30 - Terminal

Interesante.

PREGUNTITAS

P: ¿Qué es elif?

R: La estructura de control ifelifelsepermite encadenar varias condiciones. elif es una contracción de else if.

Vamos a preguntar a pydoc:

Ej. 30 - Pydoc elif

Añado que me ha gustado mucho el final de ésta página pinchando aquí, donde profundiza un poco más en éste tema, para que quede claro.

P: ¿Qué ocurre si varios bloques elif son True?

R: Buena pregunta. Python comienza con la parte superior y ejecuta el primer bloque con valor True, así que sólo ejecutará el primero.