Link Search Menu Expand Document

Switch en Python

El switch es una herramienta que nos permite ejecutar diferentes secciones de código dependiendo de una condición. Su funcionalidad es la misma que usando varios if y a pesar de que en muchos lenguajes de programación existe, en Python no, pero a continuación te damos algunos trucos para simularlo.

Introducción al switch

Anteriormente hemos visto el if y el uso de if, else y elif. Pues bien, existe una clausula similar a concatenar varios elif llamada switch.

Supongamos que tenemos el siguiente código, donde tenemos una condicion y en función de su valor queremos ejecutar una sección de código distinta.

if condicion == 1:
    print("Haz a")
elif condicion == 2:
    print("Haz b")
elif condicion == 3:
    print("Haz c")
else:
    print("Haz d")

La misma funcionalidad se podría escribir de la siguiente manera haciendo uso del switch. Como puedes ver su uso tal vez resulte algo más limpio, y de hecho en determinadas ocasiones es más rápido.

switch(condicion) {
  case 1:
    // haz a
    break;
  case 2:
    // haz b
    break;
  case 3:
    // haz c
    break;
  default:
    // haz x
}

Pero tenemos un pequeño problema. En Python no existe el switch, por lo que si intentas ejecutar el código anterior, tendrás un error.

Uno tal vez podría decir: bueno, que más da, uso if/elif/else y ya esta.

La verdad que en la mayoría de los casos, sería indiferente usar if o switch, pero si analizamos el comportamiento que existe por debajo, funcionan de manera distinta. A pesar de que en Python no existe, te damos un truco que puede en cierto modo emular su funcionamiento.

Diferencia if y switch

Una de las principales diferencias, es que usando if con elif, no todos los bloques tienen el mismo tiempo de acceso. Todas las condiciones van siendo evaluadas hasta que se cumple y se sale.

Imaginemos que tenemos 100 condiciones.

if condicion == 1:
    print("1")
elif condicion == 2:
    print("2")

# ... hasta 100
elif condicion == 100:
    print("3")

else:
    print("x")

El tiempo de ejecución será distinto si la condicion es 1 o es 70 por ejemplo:

  • Si es 1: Se evalúa el primer if, y como se cumple la condición se ejecuta y se sale.
  • Si es 70: Se va evaluando cada condición, hasta llegar al 70.

Sin embargo, en el switch todos los elementos tienen el mismo tiempo de acceso. Esto se debe a que por debajo esta normalmente implementado con lookup tables.

Si trabajamos con un gran número de condiciones, el uso del switch sobre el if podría notarse.

Dado que en Python no tenemos esta herramienta, te explicamos un truco para simularlo. No obstante, si realmente te preocupan estas micro optimizaciones, tal vez no deberías usar Python.

Emulando switch en Python

Una forma de tener una especie de switch en Python es haciendo uso de un diccionario. Por lo tanto podríamos convertir el siguiente código.

def opera1(operador, a, b):
    if operador == 'suma':
        return a + b
    elif operador == 'resta':
        return a - b
    elif operador == 'multiplica':
        return a * b
    elif operador == 'divide':
        return a / b
    else:
        return None

En el siguiente:

def opera2(operador, a, b):
    return {
        'suma': lambda: a + b,
        'resta': lambda: a - b,
        'multiplica': lambda: a * b,
        'divide': lambda: a / b
    }.get(operador, lambda: None)

Es importante notar que opera2 necesita de () para realizar la llamada a la función, ya que lo que se devuelve en realidad es una función lambda.

opera1('suma', 5, 9)
# Salida: 14

opera2('suma', 5, 9)()
# Salida: 14