Operador ternario en Python

null

Implementando una solución al problema mencionado por @John (instalar aplicaciones en Linux sin tener conexión a Internet descargando desde el Windows del vecino) me he visto en la necesidad de aprender a programar en Python (llevaba tiempo buscando una “excusa” para tener que hacerlo).

Al poco de estar trabajando con él me he encontrado en la necesidad de hacer uso del operador ternario (aunque no sea tan obvio como los condicionales simples, soy adicto a él en todos los lenguajes que conozco pues reduce la cantidad de código necesaria) y cuál ha sido mi sorpresa al descubrir que ¡no existe! (o eso creían ellos 😉 ) no existía

A grandes males, grandes remedios

Y, aunque es verdad que en la sintaxis de Python no existe ninguna una estructura para este operador he conseguido simularlo del siguiente modo:

mensaje = (“pocas visitas”,”muchas visitas”)[visitas_diarias>1400]

Imagino que se entiende pero, como últimamente veo de todo voy a explicarlo 😉

La idea es devolver un texto (variable mensaje) que califica como un buen día si se han recibido más de 1400 visitas (“muchas visitas“) y malo en caso contrario (“pocas visitas“) consultando para ello el valor numérico de la variable visitas_diarias.

Explicando el truco utilizado

Lo único que hemos hecho es:

  1. Crear un array (vector si lo prefieres) de cadenas de texto (“pocas visitas”,”muchas visitas”)
  2. Seleccionar el elemento 0 o 1 (con el operador de acceso a arrays [])
    • Si se cumple la condición (visitas_diarias>1400) devolverá un 1
    • Si no se cumple devolverá un 0

Hay que leer más

Vale, pues tras escribir el artículo, me ha dado por buscar algunos de los post en los que leía que no existía el operador ternario para justificar dicha afirmación y me he encontrado que en el 2007 se aprobó dicho tipo de expresiones.

En concreto puede hacerse del siguiente modo:

op1 if condition else op2

de modo que nuestro ejemplo anterior quedaría

mensaje = “muchas visitas” if visitas_diarias>1400 else “pocas visitas”

Para gustos los colores pero (y no podía ser de otro modo) yo me quedo con la mía (que para eso la he hecho yo y me parece más lógica ;)).

Se admiten discrepancias al respecto (si quieres ser “baneado” de por vida ya sabes dónde y cómo comentar jejeje)

8 comentarios en “Operador ternario en Python

    • Me alegra que te haya gustado tan “artesanal” solución 😉

      Lo bueno que tiene es que puede ser usado (con los cambios lógicos) a otros lenguajes que no cuenten con dicho operador

    • Venga vale, se acepta el comentario (de momento no te “baneo” pero… no tientes tu suerte ;))

      Si te digo la verdad, conforme la voy mirando más me va gustando aunque, es algo innatural esa forma de usar el if

  1. knil dijo:

    Está bien la solución empleada, pero le veo un inconveniente:
    compara estas dos instrucciones:

    a = (f(b),g(b))[condicion]
    a = g(b) if condicion else f(b)

    El inconveniente de la primera es que tiene que llamar a la función f y g, mientras que la segunda sólo llama a la que interesa. Si la carga computacional de f y g no es muy grande, esto es insignificante, pero si se trata de funciones costosas supone un problema de eficiencia.

    Por tanto, yo me quedo con la solución standard

  2. Interesante reflexión sobre la optimización. Desde mi nivel inicial en Python me faltaría estudiar cómo hace las cosas este lenguaje de programación. ¿Realmente evalúa las funciones f(b) y g(b) o sólo ejecuta aquella que le interesa tras evaluar la condición?

    Si fuese así la solución que planteo sería igual de eficiente que la adoptada por su comunidad de desarrolladores.

    Otro detalle a tener en cuenta es que en el ejemplo que propongo utilizo cadenas de texto (vale, vale… consumen memoria ;)) y con ellas no debe evaluarse nada por lo que el rendimiento no debería verse afectado.

    Gracias @knil por una reflexión tan interesante… da gusto contar con gente “de nivel” por aquí.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s