Representación editorial de Python con una estructura match case que selecciona una opción entre varios casos.

Python: match y case, otra forma de tomar decisiones

Hasta ahora hemos hecho que Python tome decisiones con if, elif y else.

Ese mecanismo sigue siendo fundamental. Pero hay situaciones en las que el programa no necesita comprobar expresiones diferentes, sino responder de una forma u otra según el valor que contiene una misma variable.

Por ejemplo:

  • si el modo vale 1, arrancar en modo manual;
  • si vale 2, arrancar en modo automático;
  • si vale 3, entrar en mantenimiento;
  • para cualquier otro valor, avisar de que la opción no existe.

Podemos resolverlo con if / elif / else. Desde Python 3.10 también disponemos de otra estructura pensada precisamente para organizar este tipo de decisiones: match / case.

match no sustituye a if. Resuelve de forma especialmente clara otro tipo de problema: elegir qué hacer según aquello que coincide con un valor o patrón.


1. De if / elif / else a match

Supongamos que un dispositivo puede trabajar en tres modos:

modo = 2

if modo == 1:
    print("Modo manual")
elif modo == 2:
    print("Modo automático")
elif modo == 3:
    print("Modo mantenimiento")
else:
    print("Modo desconocido")

El código es correcto. Python evalúa las condiciones de arriba abajo y ejecuta la primera que sea verdadera.

Pero observa qué estamos haciendo realmente: siempre comparamos la misma variable, modo, con distintos valores posibles.

En Python 3.10 o posterior podemos expresar esa misma decisión así:

modo = 2

match modo:
    case 1:
        print("Modo manual")
    case 2:
        print("Modo automático")
    case 3:
        print("Modo mantenimiento")
    case _:
        print("Modo desconocido")

El resultado es:

Modo automático

Las dos versiones solucionan el mismo problema, pero la segunda hace visible de inmediato la idea que hay detrás:

tomar un valor y buscar qué caso coincide con él.

Comparativa visual entre if elif else y match case en Python usando el mismo ejemplo modo igual a 2; ambas estructuras producen Modo automático.

2. La estructura básica

La forma general es:

match variable:
    case valor1:
        instrucciones
    case valor2:
        instrucciones
    case valor3:
        instrucciones
    case _:
        instrucciones

Hay dos palabras clave nuevas:

  • match: indica qué valor queremos analizar;
  • case: define cada una de las posibilidades con las que queremos intentar hacerlo coincidir.

El guion bajo _ tiene un papel especial. Lo veremos enseguida.

Ejemplo

estado = "alarma"

match estado:
    case "normal":
        print("Sistema funcionando correctamente")
    case "alarma":
        print("ATENCIÓN: alarma activa")
    case "mantenimiento":
        print("Sistema detenido por mantenimiento")
    case _:
        print("Estado desconocido")

Python toma el contenido de estado y comprueba los case en orden.

Como "alarma" coincide con el segundo caso, ejecuta:

ATENCIÓN: alarma activa
Diagrama que muestra cómo Python recorre los case de arriba abajo con estado igual a alarma, encuentra la primera coincidencia y deja de comprobar los casos posteriores.

3. case _: cualquier otro caso

En una estructura if / elif / else, else recoge todo aquello que no ha cumplido ninguna condición anterior.

En match, esa función puede realizarla:

case _:

El _ actúa como comodín: coincide con cualquier valor que no haya sido capturado antes.

codigo = 7

match codigo:
    case 1:
        print("Arranque")
    case 2:
        print("Funcionamiento")
    case 3:
        print("Parada")
    case _:
        print("Código no reconocido")

Como 7 no coincide con 1, 2 ni 3, se ejecuta:

Código no reconocido

Podemos pensar en case _ como:

«si no ha coincidido nada de lo anterior, entra aquí».

No es obligatorio escribirlo. Si ningún caso coincide y no existe case _, el bloque match simplemente termina sin ejecutar ninguno de sus case.

Diagrama de una estructura match con codigo igual a 7, donde los casos 1, 2 y 3 no coinciden y case guion bajo recoge el valor restante mostrando Código no reconocido.

4. Python se queda con la primera coincidencia

Hay una idea que ya conoces de if / elif / else y que vuelve a ser importante aquí:

el orden importa.

Python recorre los casos de arriba abajo. Cuando encuentra el primero que coincide, ejecuta su bloque y termina el match.

No continúa buscando otro case.

En el nivel básico que estamos estudiando ahora, esto hace que la lectura sea sencilla:

valor
  ↓
case A  ¿coincide?
  ↓ no
case B  ¿coincide?
  ↓ no
case C  ¿coincide?
  ↓ no
case _  cualquier otro

En match, encontrar una coincidencia significa dejar de buscar.


5. Un ejemplo con input()

Podemos usar match con valores introducidos por el usuario.

Imagina el selector de funcionamiento de un pequeño robot:

opcion = int(input("Selecciona modo (1-3): "))

match opcion:
    case 1:
        print("Control manual")
    case 2:
        print("Navegación automática")
    case 3:
        print("Diagnóstico")
    case _:
        print("Opción no válida")

Si el usuario introduce:

2

el programa muestra:

Navegación automática

Aquí conviene observar algo que no ha cambiado por utilizar match: input() devuelve texto.

Por eso hemos utilizado:

int(input(...))

para convertir la entrada a un número entero antes de compararla con los casos 1, 2 y 3.

Si no hiciéramos esa conversión, "2" y 2 no serían el mismo valor.


6. ¿Cuándo usar match y cuándo if?

match no llega para jubilar a if.

Las dos estructuras pueden tomar decisiones, pero no expresan igual de bien todos los problemas.

match resulta especialmente claro cuando…

Tenemos una misma variable y queremos actuar según varios valores concretos:

match comando:
    case "start":
        ...
    case "stop":
        ...
    case "reset":
        ...
    case _:
        ...

La pregunta mental es:

«¿Con cuál de estos casos coincide este valor?»

if resulta más natural cuando…

Queremos comprobar condiciones, límites, rangos o relaciones:

if temperatura > 70:
    print("Temperatura crítica")
elif temperatura > 50:
    print("Temperatura elevada")
else:
    print("Temperatura normal")

Aquí no estamos preguntando si temperatura es exactamente un valor concreto.

Estamos evaluando expresiones:

temperatura > 70
temperatura > 50

La pregunta mental es:

«¿Es verdadera esta condición?»

Una regla práctica

Si necesitas…Suele resultar más natural
comprobar rangos o desigualdadesif / elif / else
combinar condiciones con and, or, notif / elif / else
responder a varios valores concretos de una misma variablematch / case
disponer de un caso para cualquier otro valorelse o case _

No es una prohibición. Es una forma de elegir la estructura que haga que el programa se entienda mejor.

Comparativa entre if elif else y match case en Python: if para condiciones, rangos y relaciones; match para varios valores concretos de una misma variable.

7. match no es simplemente el switch de otros lenguajes

Lenguajes como C, Java o JavaScript utilizan tradicionalmente una estructura denominada switch para seleccionar entre varios casos.

Durante mucho tiempo Python no tuvo una sentencia switch equivalente y este tipo de decisiones se resolvía habitualmente con if / elif / else.

Desde Python 3.10 existe match / case.

A primera vista puede parecer simplemente «el switch de Python»:

match opcion:
    case 1:
        ...
    case 2:
        ...

Pero esa comparación se queda corta.

match forma parte de un mecanismo denominado Structural Pattern Matching. Puede hacer bastante más que comparar números o textos: también puede reconocer la forma de estructuras y extraer información de ellas.

No necesitamos aprender todo eso ahora.

En esta primera aproximación nos quedamos con su uso más sencillo porque todavía estamos aprendiendo a diseñar decisiones con claridad.

Más adelante, cuando trabajemos con colecciones, funciones y estructuras de datos, volveremos a match. Entonces veremos por qué Python no lo llamó simplemente switch.

Lo que acabamos de aprender es la puerta de entrada a match, no su límite.


8. Un ejemplo completo

Un receptor utiliza códigos sencillos para indicar su estado:

  • 0: sin señal;
  • 1: señal recibida;
  • 2: datos válidos;
  • 3: error de comunicación.

Podemos construir el programa así:

codigo = int(input("Código recibido: "))

match codigo:
    case 0:
        print("Sin señal")
    case 1:
        print("Señal recibida")
    case 2:
        print("Datos válidos")
    case 3:
        print("Error de comunicación")
    case _:
        print("Código desconocido")

Prueba mentalmente qué ocurrirá con:

0
2
3
9

Antes de ejecutar un programa, intenta siempre anticipar qué camino seguirá.

Ese hábito es más importante que memorizar la sintaxis.


9. Errores frecuentes

Confundir case con una condición

Esto no es la forma adecuada de utilizar el nivel básico de match:

case temperatura > 30:

Si lo que quieres es comprobar si una temperatura supera un límite, la herramienta natural sigue siendo:

if temperatura > 30:

Olvidar los dos puntos

Como ocurre con if, cada cabecera necesita ::

match opcion:
    case 1:
        print("Opción 1")

Olvidar el sangrado

Los bloques que pertenecen a cada case deben quedar indentados:

match opcion:
    case 1:
        print("Correcto")

Mezclar texto y números

Si utilizas:

opcion = input("Opción: ")

la entrada "1" es texto.

Por tanto, este caso:

case 1:

no coincide con "1".

Puedes convertir antes la entrada:

opcion = int(input("Opción: "))

o trabajar deliberadamente con casos de texto:

case "1":

10. Ideas esenciales

  • match / case está disponible desde Python 3.10.
  • match indica el valor que queremos analizar.
  • Cada case representa una posible coincidencia.
  • Python comprueba los casos en orden y se queda con la primera coincidencia válida.
  • case _ funciona como comodín para cualquier otro caso.
  • match puede resultar muy claro cuando una variable puede tomar varios valores concretos.
  • if / elif / else sigue siendo la opción natural para rangos, desigualdades y condiciones lógicas.
  • match es más potente de lo que hemos utilizado aquí: su capacidad para trabajar con patrones estructurales la veremos más adelante.

11. Una idea para quedarse

Con if, la pregunta habitual es:

«¿Se cumple esta condición?»

Con match, en su forma más sencilla, la pregunta cambia:

«¿Con cuál de estos casos coincide este valor?»

Elegir bien entre ambas formas de pensar hace que el código no solo funcione: hace que también sea más fácil de leer.


Ponlo en práctica

El siguiente paso será resolver una serie de ejercicios específicos de match / case, empezando por coincidencias simples y aumentando progresivamente la dificultad.

Esa práctica se desarrollará en una pieza independiente, igual que en las anteriores entregas de Python.

Publicaciones Similares

Deja una respuesta

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