Condicionales

../../../_images/ali-nafezarefi-62H_swdrc4A-unsplash.jpg

En esta sección veremos la sentencia condicional if y las distintas variantes que puede asumir, pero antes de eso introduciremos algunas cuestiones generales de escritura de código. 1

Definición de bloques

A diferencia de otros lenguajes que utilizan llaves para definir los bloques de código, cuando Guido Van Rossum creó el lenguaje quiso evitar estos caracteres por considerarlos innecesarios. Es por ello que en Python los bloques de código se definen a través de espacios en blanco, preferiblemente 4. 2 En términos técnicos se habla del tamaño de indentación.

../../../_images/four-spaces.png

Python recomienda 4 espacios en blanco para indentar

Consejo

Esto puede resultar extraño e incómodo a personas que vienen de otros lenguajes de programación pero desaparece rápido y se siente natural a medida que se escribe código.

Comentarios

Los comentarios son anotaciones que podemos incluir en nuestro programa y que nos permiten aclarar ciertos aspectos del código. Estas indicaciones son ignoradas por el intérprete de Python.

Los comentarios se incluyen usando el símbolo almohadilla # y comprenden hasta el final de la línea.

Comentario en bloque
# Universe age expressed in days
universe_age = 13800 * (10 ** 6) * 365

Los comentarios también pueden aparecer en la misma línea de código, aunque la guía de estilo de Python no aconseja usarlos en demasía:

Comentario en línea
stock = 0   # Release additional articles

Ancho del código

Los programas suelen ser más legibles cuando las líneas no son excesivamente largas. La longitud máxima de línea recomendada por la guía de estilo de Python es de 80 caracteres.

Sin embargo, esto genera una cierta polémica hoy en día, ya que los tamaños de pantalla han aumentado y las resoluciones son mucho mayores que hace años. Así las líneas de más de 80 caracteres se siguen visualizando correctamente. Hay personas que son más estrictas en este límite y otras más flexibles.

En caso de que queramos romper una línea de código demasiado larga, tenemos dos opciones:

  1. Usar la barra invertida \:

    >>> factorial = 4 * 3 * 2 * 1
    
    >>> factorial = 4 * \
    ...             3 * \
    ...             2 * \
    ...             1
    
  2. Usar los paréntesis (...):

    >>> factorial = 4 * 3 * 2 * 1
    
    >>> factorial = (4 *
    ...              3 *
    ...              2 *
    ...              1)
    

La sentencia if

La sentencia condicional en Python (al igual que en muchos otros lenguajes de programación) es if. En su escritura debemos añadir una expresión de comparación terminando con dos puntos al final de la línea. Veamos un ejemplo:

>>> temperature = 40

>>> if temperature > 35:
...     print('Aviso por alta temperatura')
...
Aviso por alta temperatura

Nota

Nótese que en Python no es necesario incluir paréntesis ( y ) al escribir condiciones. Hay veces que es recomendable por claridad o por establecer prioridades.

En el caso anterior se puede ver claramente que la condición se cumple y por tanto se ejecuta la instrucción que tenemos dentro del cuerpo de la condición. Pero podría no ser así. Para controlar ese caso existe la sentencia else. Veamos el mismo ejemplo anterior pero añadiendo esta variante:

>>> temperature = 20

>>> if temperature > 35:
...     print('Aviso por alta temperatura')
... else:
...     print('Parámetros normales')
...
Parámetros normales

Podríamos tener incluso condiciones dentro de condiciones, lo que se viene a llamar técnicamente condiciones anidadas 3. Veamos un ejemplo ampliando el caso anterior:

>>> temperature = 28

>>> if temperature < 20:
...     if temperature < 10:
...         print('Nivel azul')
...     else:
...         print('Nivel verde')
... else:
...     if temperature < 30:
...         print('Nivel naranja')
...     else:
...         print('Nivel rojo')
...
Nivel naranja

Python nos ofrece una mejora en la escritura de condiciones anidadas cuando aparecen consecutivamente un else y un if. Podemos sustituirlos por la sentencia elif:

../../../_images/elif.png

Construcción de la sentencia elif

Apliquemos esta mejora al código del ejemplo anterior:

>>> temperature = 28

>>> if temperature < 20:
...     if temperature < 10:
...         print('Nivel azul')
...     else:
...         print('Nivel verde')
... elif temperature < 30:
...     print('Nivel naranja')
... else:
...     print('Nivel rojo')
...
Nivel naranja

Ejecución paso a paso a través de Python Tutor:

Operadores de comparación

Cuando escribimos condiciones debemos incluir alguna expresión de comparación. Para usar estas expresiones es fundamental conocer los operadores que nos ofrece Python:

Operador

Símbolo

Igualdad

==

Desigualdad

!=

Menor que

<

Menor o igual que

<=

Mayor que

>

Mayor o igual que

>=

A continuación vamos a ver una serie de ejemplos con expresiones de comparación. Téngase en cuenta que estas expresiones habría que incluirlas dentro de la sentencia condicional en el caso de que quisiéramos tomar una acción concreta:

# Asignación de valor inicial
>>> value = 8

>>> value == 8
True

>>> value != 8
False

>>> value < 12
True

>>> value <= 7
False

>>> value > 4
True

>>> value >= 9
False
Podemos escribir condiciones más complejas usando los operadores lógicos:
  • and

  • or

  • not

# Asignación de valor inicial
>>> x = 8

>>> x > 4 or x > 12  # True or False
True

>>> x < 4 or x > 12  # False or False
False

>>> x > 4 and x > 12  # True and False
False

>>> x > 4 and x < 12  # True and True
True

>>> not(x != 8)  # not False
True

Python ofrece la posibilidad de ver si un valor está entre dos límites de manera directa. Así, por ejemplo, para descubrir si value está entre 4 y 12 haríamos:

>>> 4 <= value <= 12
True

Nota

  1. Una expresión de comparación siempre devuelve un valor booleano, es decir True o False.

  2. El uso de paréntesis, en función del caso, puede aclarar la expresión de comparación.

Ejercicio

Dada una variable year con un valor entero, compruebe si dicho año es bisiesto o no lo es.

ℹ️ Un año es bisiesto en el calendario Gregoriano, si es divisible entre 4 y no divisible entre 100, o bien si es divisible entre 400. Puedes hacer la comprobación en esta lista de años bisiestos.

Ejemplo
  • Entrada: 2008

  • Salida: Es un año bisiesto

Solución: leap_year.py

«Booleanos» en condiciones

Cuando queremos preguntar por la veracidad de una determinada variable «booleana» en una condición, la primera aproximación que parece razonable es la siguiente:

>>> is_cold = True

>>> if is_cold == True:
...     print('Coge chaqueta')
... else:
...     print('Usa camiseta')
...
Coge chaqueta

Pero podemos simplificar esta condición tal que así:

>>> if is_cold:
...     print('Coge chaqueta')
... else:
...     print('Usa camiseta')
...
Coge chaqueta

Hemos visto una comparación para un valor «booleano» verdadero (True). En el caso de que la comparación fuera para un valor falso lo haríamos así:

>>> is_cold = False

>>> if not is_cold:  # Equivalente a if is_cold == False
...     print('Usa camiseta')
... else:
...     print('Coge chaqueta')
...
Usa camiseta

De hecho, si lo pensamos, estamos reproduciendo bastante bien el lenguaje natural:

  • Si hace frío, coge chaqueta.

  • Si no hace frío, usa camiseta.

Ejercicio

Escriba un programa que permita adivinar un personaje de Marvel en base a las tres preguntas siguientes:

  1. ¿Puede volar?

  2. ¿Es humano?

  3. ¿Tiene máscara?

../../../_images/marvel-flowchart.png
Ejemplo
  • Entrada: can_fly = True, is_human = True y has_mask = True

  • Salida: Ironman

Es una especie de Akinator para personajes de Marvel…

Solución: marvel.py

Valor nulo

Nivel intermedio

None es un valor especial de Python que almacena el valor nulo 4. Veamos cómo se comporta al incorporarlo en condiciones de veracidad:

>>> value = None

>>> if value:
...     print('Value has some useful value')
... else:
...     # value podría contener None, False (u otro)
...     print('Value seems to be void')
...
Value seems to be void

Para distinguir None de los valores propiamente booleanos, se recomienda el uso del operador is. Veamos un ejemplo en el que tratamos de averiguar si un valor es nulo:

>>> value = None

>>> if value is None:
...     print('Value is clearly None')
... else:
...     # value podría contener True, False (u otro)
...     print('Value has some useful value')
...
Value is clearly void

De igual forma, podemos usar esta construcción para el caso contrario. La forma «pitónica» de preguntar si algo no es nulo es la siguiente:

>>> value = 99

>>> if value is not None:
...     print(f'{value=}')
...
value=99

Operador morsa

Nivel avanzado

A partir de Python 3.8 se incorpora el operador morsa 5 que permite unificar sentencias de asignación dentro de expresiones. Su nombre proviene de la forma que adquiere :=

Supongamos un ejemplo en el que computamos el perímetro de una circunferencia, indicando al usuario que debe incrementarlo siempre y cuando no llegue a un mínimo establecido.

Versión tradicional

>>> radius = 4.25
... perimeter = 2 * 3.14 * radius
... if perimeter < 100:
...     print('Increase radius to reach minimum perimeter')
...     print('Actual perimeter: ', perimeter)
...
Increase radius to reach minimum perimeter
Actual perimeter:  26.69

Versión con operador morsa

>>> radius = 4.25
... if (perimeter := 2 * 3.14 * radius) < 100:
...     print('Increase radius to reach minimum perimeter')
...     print('Actual perimeter: ', perimeter)
...
Increase radius to reach minimum perimeter
Actual perimeter:  26.69

Consejo

Como hemos comprobado, el operador morsa permite realizar asignaciones dentro de expresiones, lo que, en muchas ocasiones, permite obtener un código más compacto. Sería conveniente encontrar un equilibrio entre la expresividad y la legibilidad.


EJERCICIOS DE REPASO

  1. Escriba un programa en Python que acepte la opción de dos jugadoras en Piedra-Papel-Tijera y decida el resultado (solución).

    Entrada: persona1=piedra; persona2=papel
    Salida: Gana persona2: El papel envuelve a la piedra
  2. Escriba un programa en Python que acepte 3 números y calcule el mínimo (solución).

    Entrada: 7, 4, 9
    Salida: 4
  3. Escriba un programa en Python que acepte un país (como «string») y muestre por pantalla su bandera (como «emoji»). Puede restringirlo a un conjunto limitado de países (solución).

    Entrada: Italia
    Salida: 🇮🇹
  4. Escriba un programa en Python que acepte 3 códigos de teclas y muestre por pantalla la acción que se lleva a cabo en sistemas Ubuntu Linux (solución).

    Entrada: tecla1=Ctrl; tecla2=Alt; tecla3=Del;
    Salida: Log out
  5. Escriba un programa en Python que acepte edad, peso, pulso y plaquetas, y determine si una persona cumple con estos requisitos para donar sangre.

    Entrada: edad=34; peso=81; heartbeat=70; plaquetas=150000
    Salida: Apto para donar sangre

AMPLIAR CONOCIMIENTOS

1

Foto original de portada por ali nafezarefi en Unsplash.

2

Reglas de indentación definidas en PEP 8

3

El anidamiento (o «nesting») hace referencia a incorporar sentencias unas dentro de otras mediante la inclusión de diversos niveles de profunidad (indentación).

4

Lo que en otros lenguajes se conoce como nil, null, nothing.

5

Se denomina así porque el operador := tiene similitud con los colmillos de una morsa.