La sentencia switch-case es una característica poderosa que permite el control del flujo del programa basado en el valor de una variable o expresión. Se puede utilizar para ejecutar diferentes bloques de código, dependiendo del valor de la variable en tiempo de ejecución. A continuación un ejemplo en Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public static void switch_demo(String[] args) { int month = 8; String monthString; switch (month) { case 1: monthString = "January"; break; case 2: monthString = "February"; break; case 3: monthString = "March"; break; case 4: monthString = "April"; break; case 5: monthString = "May"; break; case 6: monthString = "June"; break; case 7: monthString = "July"; break; case 8: monthString = "August"; break; case 9: monthString = "September"; break; case 10: monthString = "October"; break; case 11: monthString = "November"; break; case 12: monthString = "December"; break; default: monthString = "Invalid month"; break; } System.out.println(monthString); } |
Así es como funciona:
- El compilador genera una tabla de salto para la declaración
- La variable/expresión del switch es evaluado una vez
- La sentencia switch busca por la variable/expresión en la tabla de salto y directamente ejecuta ese bloque de código
- Si no se encuentra un resultado, se ejecuta el código default
En el ejemplo, dependiendo de la variable month, aparece un mensaje distinto en la salida estandard. En este caso, como la variable es igual a 8, «August» se imprimirá en la salida estándar.
Sentencia Switch
Aunque los lenguajes populares como Java y PHP tienen una declaración switch ya incorporada, puede que se sorprenda al saber que el lenguaje Python no tiene uno. Como tal, puede estar tentado a utilizar una serie de bloques if-else-if, usando una condición if para cada alternativa.
Sin embargo, debido a la tabla de salto, una instrucción switch es mucho más rápido que una escalera if-else-if. En lugar de evaluar cada condición en forma secuencial, solo tiene que buscar la variable/expresión una vez y saltar directamente a la rama apropiada de código para ejecutarla.
Como se implementa la sentencia switch en Python
La forma de Python de implementar la instrucción switch es utilizar las asignaciones de diccionarios, también conocidas como matrices asociativas, que proporcionan asignaciones simples de clave-valor de uno a uno.
Aquí esta la implementación de Python de la declaración anterior. En el siguiente ejemplo, creamos un diccionario llamado switcher para almacenar todos los casos del tipo switch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def switch_demo(argument): switcher = { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" } print switcher.get(argument, "Invalid month") |
En el ejemplo, al pasar un argumento en la función switch_demo, se busca el valor en el diccionario. Si se encuentra una coincidencia, se imprime el valor asociado, de lo contrario se imprime una cadena predeterminada («Invalid Month»). La cadena predeterminada ayuda a implementar la opción «default» de la sentencia switch.
Asignación de diccionario para funciones
Aquí es donde se vuelve más interesante. Los valores de un diccionario de Python pueden ser de cualquier tipo de datos. De modo que no tiene que limitarse a utilizar constantes (enteros, cadenas), también puede utilizar nombres de funciones y lambdas como valores.
Por ejemplo, también puede implementar la instrucción switch anterior creando un diccionario de nombres de funciones como valores. En este caso, switcher es un diccionario de nombres de funciones y no de cadenas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | def one(): return "January" def two(): return "February" def three(): return "March" def four(): return "April" def five(): return "May" def six(): return "June" def seven(): return "July" def eight(): return "August" def nine(): return "September" def ten(): return "October" def eleven(): return "November" def twelve(): return "December" def numbers_to_months(argument): switcher = { 1: one, 2: two, 3: three, 4: four, 5: five, 6: six, 7: seven, 8: eight, 9: nine, 10: ten, 11: eleven, 12: twelve } # Get the function from switcher dictionary func = switcher.get(argument, lambda: "Invalid month") # Execute the function print func() |
Aunque las funciones anteriores son bastantes simples y solo devuelven cadenas, puede usar este enfoque para ejecutar bloques elaborados de código dentro de cada función.
De hecho, si llama métodos a objetos, incluso puede usar un método de envío para determinar dinámicamente a que función se debe llamar durante el tiempo de ejecución.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Switcher(object): def numbers_to_months(self, argument): """Dispatch method""" method_name = 'month_' + str(argument) # Get the method from 'self'. Default to a lambda. method = getattr(self, method_name, lambda: "Invalid month") # Call the method as we return it return method() def month_1(self): return "January" def month_2(self): return "February" def month_3(self): return "March" ... |
Basado en el argumento, la función getattr() recuperará métodos de objetos con el nombre en particular.
1 2 3 | Input: a=Switcher() Input: a.numbers_to_months(1) Output: January |
Ventajas de la implementación switch de Python
Dado que puede alterar los diccionarios de Python en tiempo de ejecución (agregar, eliminar o actualizar pares clave-valor), puede cambiar fácilmente la declaración de conmutación en tiempo de ejecución. Aquí un ejemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def zero(): return "zero" def one(): return "one" def two(): return "two" switcher = { 0: zero, 1: one, 2: two } def numbers_to_strings(argument): # Get the function from switcher dictionary func = switcher.get(argument, "nothing") # Execute the function return func() Input: numbers_to_strings(1) Output: One Input: switcher[1]=two #changing the switch case Input: numbers_to_strings(1) Output: Two |
La sentencia switch es muy útil, que no sólo proporciona un mejor rendimiento que una instrucción if-else, sino que también te deja un código más manejable. Si has tenido límites por la falta de la sentencia swith en Python, entonces con suerte, este artículo te ayudará a implementarlo.
Este artículo se encuentra basado en How to implement a switch-case statement in Python