¿Quiere implementar una construcción switch-case en Python? Aprenda los diferentes enfoques que puede adoptar para emular el comportamiento switch-case.

Si ha programado en C o JavaScript, habrá utilizado la sentencia switch-case. Pero, ¿por qué necesitamos una construcción switch-case?

Suponga que tiene un conjunto de acciones diferentes (o bloques de código). Y la acción a realizar (el bloque de código a ejecutar) depende del valor de una variable o de una expresión.

Algunos ejemplos son:

  • Asignar calificaciones a los alumnos en función de sus puntuaciones
  • Elegir técnicas de manipulación de cadenas en función de la elección del usuario
  • Realización de operaciones aritméticas sobre dos números en función de la entrada del usuario

Así que la construcción switch-case proporciona una forma conveniente de implementar dicha lógica. Cuando necesite ejecutar-en función del valor de la variable o expresión-una de las muchas acciones posibles.

Aunque Python no tiene una construcción switch-case incorporada, hay varios enfoques que puede utilizar para lograr una funcionalidad similar. En este artículo, exploraremos estos enfoques.

Emulando el comportamiento Switch-Case en Python

Veamos cómo podemos emular el comportamiento switch-case en Python mediante un ejemplo.

Escribiremos un programa sencillo que haga lo siguiente:

  • Muestrear una palabra, una cadena Python, al azar de una lista de palabras.
  • Proporcionar contexto y preguntar al usuario. Definir las operaciones de cadena -manipulación de cadenas- a realizar sobre la palabra elegida.
  • Tenga en cuenta las operaciones para el cambio de mayúsculas (minúsculas, mayúsculas, mayúsculas de título y más) incluyendo un comportamiento por defecto. Utilice los métodos de cadena incorporados en Python según sea necesario.
  • Preguntar al usuario por la entrada. Debido a que la entrada, por defecto, es una cadena, conviértala en un int mediante type casting.

Las cadenas de Python son inmutables. Así que los métodos de cadena no modifican la cadena original. Más bien devuelven una copia de la cadena con los cambios requeridos. Repasemos los métodos de cadena de Python que utilizaremos:

Método StringDescripción
lower()Devuelve una copia de la cadena en la que todos los caracteres están en minúsculas
upper()Devuelve una copia de la cadena donde todos los caracteres están en mayúsculas
título()Devuelve una copia de la cadena formateada en mayúsculas y minúsculas
swapcase()Devuelve una copia de la cadena en la que los caracteres en minúsculas y mayúsculas se convierten a mayúsculas y minúsculas, respectivamente

El siguiente fragmento de código muestrea una palabra de word_list al azar y obtiene la entrada del usuario:

import random

# Lista de palabras para elegir
lista_palabras = ["Python", "programación", "Hola", "mundo", "contexto", "Interruptor"]

# Seleccione aleatoriamente una palabra de la lista
palabra = random.choice(lista_palabras)

# Proporcione el contexto y las opciones disponibles al usuario
print("¡Bienvenido! Tiene una palabra seleccionada al azar.")
print("Elija una opción para manipular la palabra:")
print("1. Minúsculas")
print("2. Mayúsculas")
print("3. Mayúsculas de título")
print("4. Intercambiar mayúsculas")
print("5. Comportamiento por defecto")

# Obtener la opción del usuario
opción = int(input("Introduzca su opción: "))

He aquí un ejemplo que muestra cómo se modifica la cadena ‘Python’ en función de la opción del usuario:

python-switch-case

Cuando ejecute ahora el programa, se le pedirá la opción de entrada de la siguiente manera

¡Bienvenido! Ha seleccionado una palabra al azar.

Elija una opción para manipular la palabra:
1. Minúsculas
2. Mayúsculas
3. Titlecase
4. Swapcase
5. Comportamiento por defecto

Introduzca su opción: 

A continuación, procedamos a poner en práctica los distintos enfoques.

Utilizando la escalera if-elif-else

En este enfoque, utilizamos una serie de sentencias if-elif-else para cotejar la elección del usuario con las opciones predefinidas. A continuación, ejecutamos el bloque de código correspondiente en función de la entrada del usuario.

# if-elif-else 

si opción == 1
    resultado = word.lower()
elif opción == 2:
    resultado = palabra.superior()
elif opción == 3
    resultado = palabra.título()
elif opción == 4
    resultado = palabra.mayúsculas()
si no
    resultado = palabra

print(f "Su palabra aleatoria es {palabra} y el resultado es {resultado}")

Aquí:

  • Comparamos la entrada del usuario con cada opción utilizando sentencias if-elif.
  • Cuando se encuentra una coincidencia, ejecutamos el bloque de código correspondiente.
  • Si ninguna de las condiciones if-elif coincide, ejecutamos el bloque else para el comportamiento por defecto.

Ya puede ejecutar el script, introducir la opción y verificar la salida:

¡Bienvenido! Tiene una palabra elegida al azar

Elija una opción para manipular la palabra:
1. Minúsculas
2. Mayúsculas
3. Titlecase
4. Swapcase
5. Comportamiento por defecto

Introduzca su opción: 2

Su palabra aleatoria es Switch y el resultado es SWITCH.

La escalera if-elif-else es fácil de implementar. Pero puede ser un reto mantenerla. En este ejemplo, teníamos cinco casos (incluido el comportamiento por defecto). En la práctica, sin embargo, podemos tener muchos más casos. Estas largas escaleras if-elif-else son un olor a código que debería evitar.

Así que procedamos a una implementación que sea mantenible.

Utilizando mapeo de diccionario y funciones de primera clase

Puede aprovechar los diccionarios y funciones de Python para emular el comportamiento switch-case.

📑 Las funciones de Python son ciudadanos de primera clase

En Python, las funciones son ciudadanos de primera clase. Puede hacer mucho más que definir y llamar a funciones:

  • Una vez que define una función, puede asignarla a otra variable, utilizar funciones como elementos de listas, valores en un diccionario, y mucho más.
  • También puede pasarlas de un lado a otro: las funciones pueden pasarse como argumentos a otras funciones y las funciones pueden devolver funciones.

En este enfoque, utilizaremos un diccionario para asignar las opciones del usuario a las funciones o acciones correspondientes. Esta es una forma más eficiente de manejar múltiples elecciones, ya que evita una larga cadena de declaraciones if-elif.

En primer lugar, definamos las siguientes funciones para las distintas operaciones con cadenas:

# Definir funciones para cada opción
def lower_case(palabra):
    return palabra.lower()

def mayús_culas(palabra):
    return palabra.mayúscula()

def titulo_case(palabra):
    return palabra.título()

def cambiar_mayúsculas(palabra):
    return palabra.swapcase()

A continuación, hagamos lo siguiente

  • Cree un diccionario llamado choices donde las claves sean las elecciones del usuario, y los valores sean funciones o acciones a realizar.
  • Utilice el método get() del diccionario para recuperar la acción seleccionada en función de la elección del usuario. Si la elección no se encuentra en el diccionario, proporcionamos una acción por defecto especificada por una función lambda.
  • A continuación, ejecute la acción seleccionada sobre la palabra aleatoria.
# Almacenar funciones en un diccionario
opciones = {
    1: minúsculas
    2: mayús_culas
    3: title_case,
    4: swap_case,
}

# Utilice el diccionario para seleccionar y llamar a la función adecuada
resultado = options.get(option, lambda x: x)(word)

print(f "Su palabra aleatoria es {palabra} y el resultado es {resultado}")

Aquí tiene un ejemplo de salida:

¡Bienvenido! Tiene una palabra seleccionada al azar.

Elija una opción para manipular la palabra:
1. Minúsculas
2. Mayúsculas
3. Titlecase
4. Swapcase
5. Comportamiento por defecto

Introduzca su opción: 4

Su palabra aleatoria es Hola y el resultado es hELLO.

Uso de Match-Case

📝 Nota: Necesita Python 3.10 o una versión posterior para utilizar sentencias match-case.

A partir de Python 3.10, puede utilizar la sentencia match para implementar una construcción similar a switch-case. La sentencia match, con su sencilla sintaxis, proporciona una forma más intuitiva de manejar casos múltiples. El _ (guión bajo) sirve como caso por defecto.

Así es como podemos reescribir nuestro ejemplo utilizando match-case:

  • Utilizamos la sentencia match para comparar la entrada del usuario con varios casos.
  • Cada caso especifica una opción y el código a ejecutar si esa opción coincide.
  • El _ (guión bajo) sirve como caso por defecto, ejecutando código cuando ninguno de los otros casos coincide.
opción de coincidencia:
    caso 1:
        resultado = word.lower()
    caso 2:
        resultado = palabra.superior()
    caso 3:
        resultado = palabra.título()
    caso 4:
        resultado = palabra.mayúsculas()
    caso _:
        resultado = palabra # Comportamiento por defecto, devolver la cadena tal cual

print(f "Su palabra aleatoria es {palabra} y el resultado es {resultado}.")

Ahora puede ejecutar el script y verificar la salida:

¡Bienvenido! Tiene una palabra seleccionada al azar.

Elija una opción para manipular la palabra:
1. Minúsculas
2. Mayúsculas
3. Titlecase
4. Swapcase
5. Comportamiento por defecto

Introduzca su opción: 2
Su palabra aleatoria es mundo y el resultado es MUNDO.

⚙ Aunque la sentencia match proporciona una forma cómoda de implementar una construcción switch-case, está pensada para tareas de concordancia de patrones estructurales más útiles que emular el comportamiento switch-case.

Conclusión

Resumamos los diferentes enfoques para conseguir la funcionalidad switch-case en Python:

  • La escalera if-elif-else es fácil de implementar pero es un dolor de mantener. Así que utilícelas mínimamente -sólo cuando no tenga demasiadas opciones que comprobar.
  • Puede aprovechar los diccionarios y funciones de Python para emular el comportamiento switch-case. Incluya las distintas opciones y las funciones correspondientes como claves y valores del diccionario, respectivamente.
  • La sentencia match-case, introducida en Python 3.10, ayuda a implementar esta construcción switch-case con una sintaxis sencilla e intuitiva. Sin embargo, la sentencia match-case es una gran elección para casos de uso de concordancia de patrones estructurales más interesantes.

Puede encontrar los ejemplos de código de este tutorial en GitHub. Si se está preparando para entrevistas de codificación, eche un vistazo a esta recopilación de las mejores preguntas de Python para entrevistas.