Estructuras de control de flujo (if, elif, else) y match (switch) – 100 días de Python #3

Estructuras de control de flujo (if, elif, else) y match (switch) – 100 días de Python #3

En este tercer día aprenderás a manejar el control del flujo en los programas Python. El condicional if elif else y el nuevo match (switch en otros lenguajes de programación) Puede parecer un poco complicado el temario de este tercer día, pero verás que es bastante más fácil de lo que parece.

¿Qué son los condicionales o estructuras de control de flujo?

Los condicionales son parte del código que nos permitirá que nuestro programa tome decisiones en torno a ciertas ocurrencias. Así, nuestros programas serán algo más "inteligentes" y tendrán una serie de posibilidades que irán variando en torno a acontecimientos.

Operadores de comparación

Veamos algunos de los operadores de comparación de Python, los cuales vamos a necesitar para los condicionales.

>Mayor que
<Menor que
==Igual que
>=Mayor o igual que
<=Menor o igual que
!=Diferente que

Que no te confunda el "==" con "=". Mientras que "==" sirve para comparar si dos cosas son iguales, el operador "=" solo sirve para asignar valores a variables, no puedes utilizarlo para comparar cosas.

El condicional if, elif, else

Empecemos por un ejemplo de código sencillo para que lo vayas entendiendo:

numero = 10

if numero > 7:
    print("El número es mayor que 7.")

Resultado en la consola

El número es mayor que 7.

En esta condición, le indicamos al programa que solo si el valor de la variable "numero" es mayor (>) que 7, se ejecute el print(). En cambio, si esta condición no se cumple, no se va a ejecutar nada.

Dentro del if podemos poner todo el código que queramos, no solo un print(), pero es muy importante que dejes el código de dentro indentado (tabulado) para que quede como en el ejemplo. Python es estricto con esto y no te va a dejar pasar ni una. Por si ves un IndentationError, que sepas que es un error por una mala indentación. Mira el error que soltaría si lo escribiese mal:

numero = 10

if numero > 7:
print("El número es mayor que 7.")

Error en la consola

File "d:\tests\python\100\day3.py", line 4
print("El número es mayor que 7.")
^
IndentationError: expected an indented block after 'if' statement on line 3

El error dice que se esperaba justo antes del print() una indentación.

¿Y qué pasa si queremos que se ejecute otro bloque de código si la condición del if no se cumple?

Pues en estos casos, vamos a poder añadir un else, siempre dentro de un if, pero este, no irá indentado, su código sí.

numero = 5

if numero > 7:
    print("El número es mayor que 7.")
else:
    print("El número es menor o igual a 7.")

Resultado en la consola

El número es menor o igual a 7.

Ahora que "numero" vale 5, se ejecuta el código del else.

¿Y si queremos más condiciones? En este caso, añadiremos tantos elif como necesitemos.

Esta vez, se va a ejecutar el if solo si el valor de "numero" es mayor que 7, el elif si es igual (==) a 7 y el else, si no se cumple ninguna de las otras dos.

numero = 7

if numero > 7:
    print("El número es mayor que 7.")
elif numero == 7:
    print("El numero es igual a 7.")
else:
    print("El número es menor o igual a 7.")

IFs anidados

Los if, elif, else pueden llegar a tener una complejidad enorme, ya que podemos, mediante niveles de indentación, anidar ifs dentro de otros if.

Aquí tenemos un nuevo tipo de dato, "None". El cual, da un valor de vacío a la variable. Puesto que no quiero darle ningún valor inicialmente a la variable "respuesta", lo dejo con "None", para que no me dé error.

Primero tenemos el if, else principal, el que evalúa si el usuario es mayor de edad. Si lo es, accedemos al if anidado, si no, nos dice que no podemos comprar.

En el if anidado, evaluamos las diferentes posibilidades del usuario. Si no introduce un valor del 1 al 3, le dirá siempre el mensaje del else.

# Se le pide la edad al usuario.
edad = int(input("Introduzca su edad:\n"))

# Se deja la variable sin valor.
respuesta = None

# Se evalúa si el usuario es mayor de edad. Si lo es, accede a
# la compra de alcohol.
if edad >= 18:
    print("Es mayor de edad, puede comprar alcohol. ¿Cuál desea? Introduzca un número de opción.")
    respuesta = input("1- ron.\n2- whisky.\n3- ginebra.\n")

    if respuesta == "1":
        print("Ha elegido comprar ron.")
    elif respuesta == "2":
        print("Ha elegido comprar whisky.")
    elif respuesta == "3":
        print("Ha elegido comprar ginebra.")
    else:
        print("Opción no válida.")
else:
    print("Es menor de edad, vuelva de aquí un tiempo o no empiece con el alcohol.")

Los operadores lógicos

Más operadores. Hemos llegado a los operadores lógicos, los cuales van a permitirte crear condicionales todavía más complejos.

Operador lógicoDescripción
andy
oro
notno

El operador and

Expresión izquierda andExpresión derecha andValor final de las dos expresiones
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

El operador "and" compara si dos condiciones son True. Si lo son, se cumple la condición general, si no, no. Aquí un ejemplo:

color = "rojo"
forma = "círculo"

if color == "rojo" and forma == "círculo":
    print("Es un círculo rojo.")
else:
    print("No se cumple la condición.")

Resultado en la consola

Es un círculo rojo.

Se ha cumplido la condición, porque la expresión de "color" es True y la de "forma" también. Si una de las dos es False, no se cumple la condición del if.

Además, que sepas que puedes encadenar más de un operador lógico en los if:

color = "rojo"
forma = "círculo"
tamano = "grande"

if color == "rojo" and forma == "círculo" and tamano == "pequeño":
    print("Es un círculo rojo pequeño.")
else:
    print("No se cumple la condición.")

Resultado en la consola

No se cumple la condición.

Pese a que las dos primeras expresiones se cumplen, la tercera no, y eso hace que el conjunto devuelva un False y se ejecute el else.

El operador or

Expresión izquierda orExpresión derecha orValor final de las dos expresiones
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

El operador "or" es más flexible. A este, con que se cumpla una de las expresiones del conjunto, ya devuelve True. Solo devolverá False si no se cumple ninguna.

color = "rojo"
forma = "círculo"
tamano = "grande"

if color == "rojo" or forma == "cuadrado" or tamano == "pequeño":
    print("Se cumple la condición.")
else:
    print("No se cumple la condición.")

Resultado en la consola

Se cumple la condición.

El operador not

Este operador se cumple si la expresión no es igual, es diferente.

Te dejo un ejemplo un poco más complicado, para que vayas viendo más cosas.

color = "rojo"
forma = "círculo"

if not color == "azul":
    print("Se cumple la condición.")
else:
    print("No se cumple la condición.")

Resultado en la consola

Se cumple la condición.

Aquí, evalúa siempre a la inversa, es decir, la condición se cumple si las expresiones no se cumplen. Puesto que "color" es False, devuelve True.

Podemos combinar los operadores lógicos. Mira un ejemplo:

color = "rojo"
forma = "círculo"

if not(color == "azul" and forma == "cuadrado"):
    print("Se cumple la condición.")
else:
    print("No se cumple la condición.")

Resultado en la consola

Se cumple la condición.

En un principio, puesto que no se cumple lo de "color" and "forma", no se cumple la condición, pero como con "not" tenemos todo lo contrario, si se cumple.

Si quitas los paréntesis, para aplicarle el not a todas las expresiones, tendrás que hacerlo así:

color = "rojo"
forma = "círculo"

if not color == "azul" and not forma == "cuadrado":
    print("Se cumple la condición.")
else:
    print("No se cumple la condición.")

Resultado en la consola

Se cumple la condición.

Es más práctico y legible con los paréntesis.

El condicional match de Python (switch)

A partir de la versión 3.10 de Python, se añadió la posibilidad de utilizar el condicional match (switch). Son similares a los condicionales if, pero sirven para simplificar comparaciones donde tenemos que escribir muchos elif.

error = input('Introduzca un código de error:\n')
 
match error:
    case "200":
        print('Todo ok.')
    case "301":
        print('Movimiento permanente de la página.')
    case "302":
        print('Movimiento temporal de la página.')
    case "404":
        print('Página no encontrada.')
    case "500":
        print('Error interno del servidor.')
    case "503":
        print('Servicio no disponible.')
    case _:
        print('Error no disponible.')

Voy a poner en la consola el código 300. Puesto que no está contemplado, lo que se ejecuta es el código del "case _". Este case, se ejecuta siempre que todos los otros case son False.

Resultado en la consola

Introduzca un código de error:
300
Error no disponible.

Por cierto, el "case _" puede ser cualquier cosa, no importa poner "_", esto es por convención, pero si haces esto, funciona igual:

case defecto:
        print('Error no disponible.')

Si introducimos un valor que coincide con alguno de los case, se va a ejecutar ese código. El resto se descarta.

Resultado en la consola

Introduzca un código de error:
404
Página no encontrada.

Condicional switch (match) case vs if elif else

Comparemos el condicional switch con un if elif else.

El primer case sería el equivalente al if, el resto a elif, excepto el case _ que es el equivalente a un else.

Si te fijas, con el if tenemos que estar repitiendo la condición repetidamente (error ==). En cambio, con match de Python, no.

error = input('Introduzca un código de error\n')
 
if error == "200":
    print('Todo ok.')
elif error == "301":
    print('Movimiento permanente de la página.')
elif error ==  "302":
    print('Movimiento temporal de la página.')
elif error ==  "404":
    print('Página no encontrada.')
elif error ==  "500":
    print('Error interno del servidor.')
elif error == "503":
    print('Servicio no disponible.')
else:
    print('Error no disponible.')

Lo más recomendable, es utilizar if para condiciones complejas y switch para condiciones sencillas que puedan ser repetitivas como esta.

No te pierdas todo el contenido de este curso y más cosas sobre Python.

Tienes los ejercicios y el proyecto en este enlace.

Un comentario en «Estructuras de control de flujo (if, elif, else) y match (switch) – 100 días de Python #3»

  1. Buenas tardes! Les dejo mi código el cual, si mal no entendí los criterios, funciona bien. Es algo diferente a la solución del video. Espero les sirva y un placer que pueda recibir comentarios o criticas. Saludos

    print(«BIENVENIDO A MI SEGUNDA SUPER CALCULADORA»)

    calculo= input(«Elija una opción de calculo\n 1. Suma\n 2. Resta\n 3. Multiplicación\n 4. Division\n 5. Modulo\n 6. Exponencial\n»)

    if calculo==»1″:
    print(«Ha elegido realizar una SUMA»)
    elif calculo==»2″:
    print(«Ha elegido realizar una RESTA «)
    elif calculo == «3»:
    print(«Ha elegido realizar una MULTIPLICACION»)
    elif calculo== «4»:
    print(«Ha elegido realizar una DIVISION»)
    elif calculo == «5»:
    print(«Ha elegido realizar una MODULO»)
    elif calculo == «6»:
    print(«Ha elegido realizar una EXPONENCIAL»)
    else:
    print(«Valor ingresado erroneo»)
    exit(«Por favor vuelva a iniciar la calculadora6»)

    operando_1=float(input(«Especifique el primer operando\n»))
    operando_2=float(input(«Especifique el segundo operando\n»))

    match calculo:
    case «1»:
    resultado= operando_1+operando_2
    print(f»El resultado de su suma es {round(resultado,2)} «)
    case «2»:
    resultado= operando_1 – operando_2
    print(f»El resultado de su resta es {round(resultado,2)} «)
    case «3»:
    resultado= operando_1 * operando_2
    print(f»El resultado de su multiplicación es {round(resultado,2)} «)
    case «4»:
    resultado= operando_1 / operando_2
    print(f»El resultado de su division es {round(resultado,2)} «)
    case «5»:
    resultado= operando_1 % operando_2
    print(f»El resultado de su módulo es {round(resultado,2)} «)
    case «6»:
    resultado= operando_1 ** operando_2
    print(f»El resultado de su potencia es {round(resultado,2)} «)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

curso de Python Entrada anterior Proyecto y ejercicios – 100 días de Python #3
curso de Python Entrada siguiente Soluciones de ejercicios – 100 días de Python #3