Capítulo 4. Elige con si

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Si puedes mantener la cabeza cuando todos a tu alrededor
pierden la suya y te echan la culpa, ...

Rudyard Kipling, If-

En los capítulos anteriores, has visto muchos ejemplos de datos, pero no has hecho gran cosa con ellos. La mayoría de los ejemplos de código utilizaban el intérprete interactivo y eran breves. En este capítulo, aprenderás a estructurar código Python, no sólo datos.

Muchos lenguajes informáticos utilizan caracteres como llaves ({ y }) o palabras clave comobegin y endpara delimitar secciones de código. En esos lenguajes, es una buena práctica utilizar una indentación coherente para que tu programa sea más legible para ti y para los demás. Incluso existen herramientas para que tu código quede bien alineado.

Cuando estaba diseñando el lenguaje que se convirtió en Python, Guido van Rossum decidió que la propia indentación era suficiente para definir la estructura de un programa, y evitó escribir todos esos paréntesis y llaves.Python es inusual en este uso del espacio en blancopara definir la estructura del programa. Es uno de los primeros aspectos que notan los recién llegados, y puede parecer extraño a los que tienen experiencia con otros lenguajes. Resulta que después de escribir Python durante un rato, se siente natural, y dejas de notarlo. Incluso te acostumbras a hacer más mientras escribes menos.

Nuestros ejemplos iniciales de código han sido de una sola línea. Veamos primero cómo hacer comentarios y comandos de varias líneas.

Comenta con #

Un comentario es un fragmento de texto de tu programa que el intérprete de Python ignora. Puedes utilizar los comentarios para aclarar código Python cercano, tomar notas para arreglar algo algún día, o para cualquier otro propósito que desees. Para marcar un comentario se utiliza el carácter #; todo lo que vaya desde ese punto hasta el final de la línea actual forma parte del comentario. Normalmente verás un comentario en una línea por sí mismo, como se muestra aquí:

>>> # 60 sec/min * 60 min/hr * 24 hr/day
>>> seconds_per_day = 86400

O, en la misma línea que el código que está comentando:

>>> seconds_per_day = 86400 # 60 sec/min * 60 min/hr * 24 hr/day

El carácter # tiene muchos nombres:hash, sharp, pound, o el siniestro sonidooctothorpe.1 Lo llames como lo llames2 su efecto sólo dura hasta el final de la línea en la que aparece.

Python no tiene un comentario multilínea. Tienes que empezar explícitamente cada línea o sección de comentario con un #:

>>> # I can say anything here, even if Python doesn't like it,
... # because I'm protected by the awesome
... # octothorpe.
...
>>>

Sin embargo, si está en una cadena de texto, el poderoso octótropo vuelve a su papel de simple carácter #:

>>> print("No comment: quotes make the # harmless.")
No comment: quotes make the # harmless.

Continúa las líneas con \

Los programas son más legibles cuando las líneas son razonablemente cortas. La longitud máxima de línea recomendada (no obligatoria) es de 80 caracteres. Si no puedes decir todo lo que quieres decir en esa longitud, puedes utilizar el carácter de continuación:\ (barra invertida). Simplemente pon \ al final de una línea, y Python actuará de repente como si siguieras en la misma línea.

Por ejemplo, si quisiera añadir los cinco primeros dígitos, podría hacerlo línea a línea:

>>> sum = 0
>>> sum += 1
>>> sum += 2
>>> sum += 3
>>> sum += 4
>>> sum
10

O bien, podría hacerlo en un solo paso, utilizando el carácter de continuación:

>>> sum = 1 + \
...       2 + \
...       3 + \
...       4
>>> sum
10

Si nos saltáramos la barra invertida en medio de una expresión, obtendríamos una excepción:

>>> sum = 1 +
  File "<stdin>", line 1
    sum = 1 +
            ^
SyntaxError: invalid syntax

He aquí un pequeño truco: si estás en medio de paréntesis emparejados (o corchetes o llaves), Python no se queja de los finales de línea:

>>> sum = (
...     1 +
...     2 +
...     3 +
...     4)
>>>
>>> sum
10

También verás en el Capítulo 5que las comillas triples emparejadas te permiten crear cadenas de varias líneas.

Comparar con if, elif y else

Ahora, por fin, damos nuestro primer paso en lasestructuras de códigoque entretejen los datos en los programas. Nuestro primer ejemplo es este diminuto programa de Python que comprueba el valor de la variable booleana disastere imprime un comentario apropiado:

>>> disaster = True
>>> if disaster:
...     print("Woe!")
... else:
...     print("Whee!")
...
Woe!
>>>

Las líneas if y else son sentenciasde Python que comprueban si una condición (aquí, el valor de disaster) es un valor booleano True, o puede evaluarse como True. Recuerda queprint() es la función incorporada de Python para imprimir cosas, normalmente en tu pantalla.

Nota

Si has programado en otros lenguajes, ten en cuenta que no necesitas paréntesis para la prueba if. Por ejemplo, no digas algo como if (disaster == True)(el operador de igualdad == se describe en unos párrafos). Sí necesitas los dos puntos (:) al final. Si, como yo, a veces te olvidas de escribir los dos puntos, Python mostrará un mensaje de error.

Cada línea de print() tiene una sangría debajo de su prueba. Utilicé cuatro espacios para sangrar cada subsección. Aunque puedes utilizar la sangría que quieras, Python espera que seas coherente con el código dentro de una sección: las líneas deben tener la misma sangría, alineadas a la izquierda. El estilo recomendado, llamadoPEP-8, es utilizar cuatro espacios. No utilices tabuladores, ni mezcles tabuladores y espacios; desordena la cuenta de sangrías.

Aquí hicimos varias cosas, que explico con más detalle a medida que avanza el capítulo:

  • Asigna el valor booleano True a la variable llamada disaster

  • Realiza una comparación condicional utilizando if y else, ejecutando un código diferente en función del valor de disaster

  • Llamada a la función print() para imprimir un texto

Puedes tener pruebas dentro de pruebas, a tantos niveles de profundidad como sea necesario:

>>> furry = True
>>> large = True
>>> if furry:
...     if large:
...         print("It's a yeti.")
...     else:
...         print("It's a cat!")
... else:
...     if large:
...         print("It's a whale!")
...     else:
...         print("It's a human. Or a hairless cat.")
...
It's a yeti.

En Python, la indentación determina cómo se emparejan las secciones if y else. Nuestra primera prueba era comprobar furry. Como furry es True, Python pasa a la prueba indentada if large. Como habíamos puesto large a True,if large se evalúa como True, y la línea siguiente else se ignora. Esto hace que Python ejecute la línea indentada bajo if large:e imprimaIt's a yeti.

Si hay más de dos posibilidades que probar, utiliza if para la primera,elif (que significa else if) para las del medio y else para la última:

>>> color = "mauve"
>>> if color == "red":
...     print("It's a tomato")
... elif color == "green":
...     print("It's a green pepper")
... elif color == "bee purple":
...     print("I don't know what it is, but only bees can see it")
... else:
...     print("I've never heard of the color", color)
...
I've never heard of the color mauve

En el ejemplo anterior, comprobamos la igualdad utilizando el operador ==.Aquí tienes los operadores de comparación de Python:

igualdad

==

desigualdad

!=

menos de

<

menor o igual que

<=

superior a

>

mayor o igual que

>=

Éstas devuelven los valores booleanos True o False. Veamos cómo funcionan, pero primero, asigna un valor a x:

>>> x = 7

Ahora, hagamos algunas pruebas:

>>> x == 5
False
>>> x == 7
True
>>> 5 < x
True
>>> x < 10
True

Observa que se utilizan dos signos de igual (==) para comprobar la igualdad; recuerda que un solo signo de igual (=) es lo que se utiliza para asignar un valor a una variable.

Si necesitas hacer varias comparaciones a la vez, utiliza los operadoreslógicos (o booleanos)and, or, y not para determinar el resultado booleano final.

Los operadores lógicos tienen menor precedenciaque los trozos de código que están comparando. Esto significa que primero se calculan los trozos y luego se comparan. En este ejemplo, como hemos puesto x en 7,5 < x se calcula que es Truey x < 10 es también True, por lo que finalmente acabamos conTrue and True:

>>> 5 < x and x < 10
True

Como señala "Precedencia", la forma más fácil de evitar confusiones sobre la precedencia es añadir paréntesis:

>>> (5 < x) and (x < 10)
True

Aquí tienes otras pruebas:

>>> 5 < x or x < 10
True
>>> 5 < x and x > 10
False
>>> 5 < x and not x > 10
True

Si estás and-haciendo comparaciones múltiples con una variable, Python te permite hacer esto:

>>> 5 < x < 10
True

Es lo mismo que 5 < x and x < 10. También puedes escribir comparaciones más largas:

>>> 5 < x < 10 < 999
True

¿Qué es verdad?

¿Qué ocurre si el elemento que comprobamos no es un booleano? ¿Qué considera Python True y False?

Un valor false no tiene por qué ser explícitamente un booleano False. Por ejemplo, todos estos se consideran False:

booleano

False

null

None

entero cero

0

cero flotante

0.0

cadena vacía

''

lista vacía

[]

tupla vacía

()

dict vacío

{}

conjunto vacío

set()

Cualquier otra cosa se considera True. Los programas Python utilizan estas definiciones de "veracidad" y "falsedad" para comprobar si hay estructuras de datos vacías, así como las condiciones de False:

>>> some_list = []
>>> if some_list:
...     print("There's something in here")
... else:
...     print("Hey, it's empty!")
...
Hey, it's empty!

Si lo que estás probando es una expresión en lugar de una simple variable, Python evalúa la expresión y devuelve un resultado booleano. Así, si escribes:

if color == "red":

Python evalúa color == "red". En nuestro ejemplo anterior, asignamos la cadena "mauve" a color, por lo que color == "red" es False, y Python pasa a la siguiente prueba:

elif color == "green":

Hacer comparaciones múltiples con in

Supongamos que tienes una letra y quieres saber si es una vocal. Una forma sería escribir una afirmación larga if:

>>> letter = 'o'
>>> if letter == 'a' or letter == 'e' or letter == 'i' \
...     or letter == 'o' or letter == 'u':
...     print(letter, 'is a vowel')
... else:
...     print(letter, 'is not a vowel')
...
o is a vowel
>>>

Siempre que necesites hacer muchas comparaciones como ésa, separadas por or, utiliza en su lugar eloperador de pertenencia de Python in. He aquí cómo comprobar la vocalidad de forma más pitónica, utilizando in con una cadena formada por caracteres vocálicos:

>>> vowels = 'aeiou'
>>> letter = 'o'
>>> letter in vowels
True
>>> if letter in vowels:
...     print(letter, 'is a vowel')
...
o is a vowel

Aquí tienes un avance de cómo utilizar in con algunos tipos de datos sobre los que leerás en detalle en los próximos capítulos:

>>> letter = 'o'
>>> vowel_set = {'a', 'e', 'i', 'o', 'u'}
>>> letter in vowel_set
True
>>> vowel_list = ['a', 'e', 'i', 'o', 'u']
>>> letter in vowel_list
True
>>> vowel_tuple = ('a', 'e', 'i', 'o', 'u')
>>> letter in vowel_tuple
True
>>> vowel_dict = {'a': 'apple', 'e': 'elephant',
...               'i': 'impala', 'o': 'ocelot', 'u': 'unicorn'}
>>> letter in vowel_dict
True
>>> vowel_string = "aeiou"
>>> letter in vowel_string
True

Para el diccionario,in mira las claves (el lado izquierdo de :) en lugar de sus valores.

Novedad: Yo soy la morsa

En Python 3.8 llega el operador morsa, que tiene el siguiente aspecto:

name := expression

¿Ves la morsa? (Como un smiley, pero más corpulento.)

Normalmente, una tarea y un examen se realizan en dos pasos:

>>> tweet_limit = 280
>>> tweet_string = "Blah" * 50
>>> diff = tweet_limit - len(tweet_string)
>>> if diff >= 0:
...     print("A fitting tweet")
... else:
...     print("Went over by", abs(diff))
...
A fitting tweet

Con nuestro nuevo poder de colmillo (también conocido comoexpresiones de asignación) podemos combinarlas en un solo paso:

>>> tweet_limit = 280
>>> tweet_string = "Blah" * 50
>>> if diff := tweet_limit - len(tweet_string) >= 0:
...     print("A fitting tweet")
... else:
...     print("Went over by", abs(diff))
...
A fitting tweet

La morsa también se lleva de maravilla con for y while, que veremos en el Capítulo 6.

Próximamente

Juega con cuerdas y conoce a personajes interesantes.

Cosas que hacer

4.1Elige un número entre 1 y 10 y asígnalo a la variable secret. Después, elige otro número entre 1 y 10 y asígnalo a la variable guess. A continuación, escribe las pruebas condicionales (if, else, y elif) para imprimir la cadena 'too low'si guess es menor que secret,'too high' si es mayor que secret, y 'just right' si es igual a secret.

4.2 Asigna True o False a las variablessmall y green. Escribe algunas sentencias if/else para imprimir cuál de ellas coincide con esas opciones: cereza, guisante, sandía, calabaza.

1 ¡Como esa cosa verde de ocho patas que está justo detrás de ti!

2 Por favor, no lo llames. Podría volver.

Get Introducción a Python, 2ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.