Si se llega a Python desde el mundo del lenguaje C, una de las cosas que uno echa en falta es el operador ternario.
Para los que no saben lo que es, pondré un ejemplo. La gente que aprendió Pascal o Basic y llegan a C, normalmente usarían expresiones como ésta:
if (a>5) x = 3 else x = 2*a;
Un programador de C con experiencia utilizaría otra expresión, el mítico operador ternario:
x = a>5? 3 : 2*a;
En Python no hay tal construcción diseñada dentro del lenguaje, así que lo lógico sería usar algo parecido a nuestro primer ejemplo:
if a>5: x = 3 else: x = 2*a
Pero podemos usar otro artificio. Una de las cosas más naturales en Python es usar tuplas y listas, así que veamos si podemos valernos de estos objetos para nuestro propósito:
x = (2*a, 3)[a>5]
Esto resuelve nuestro problema. Por un lado, usamos una tupla para proveer de los valores que devolvemos y por otro lado utilizamos la expresión de comparación para obtener un valor con el cual indexar la tupla para obtener un valor u otro si el resultado es falso o verdadero. Atentos, que cambia el orden habitual, el primer elemento de la tupla es el valor falso y el segundo el verdadero.
Pulsa aquí para RSS
El problema que veo es que en el caso del ternario de C si a > 5 en NINGUN caso se calcularía 2*a…
En el caso de Python, no sé hasta que punto estará optimizado el hecho de montar la lista con los valores (calculando TODOS ) para luego elegir uno de ellos en funcion de la condicion dada.
A mi me parece particularmente feo que la “condición” vaya detrás, y las condiciones en orden contrario. Que poca elegancia, qué poca compostura. Aish…!
Más seriamente, usando combinatoria lógica se podría hacer?
Algo del estilo de…
x = ((a>5) AND 3) OR (2*a)
podría valer en Python? Lo pregunto porque no sé cómo van los operadores lógicos y los valores que devuelven (en Javascript x = ((a>5)&&3)||2*a funciona como esperamos, pero claro, Javascript es mucho lenguaje xD)
ahem… s/y las condiciones/y los valores
s/y las condiciones/y los valores/
Te vale así?
x = (a>5 and 3) or (2*a)
Sí, eso es.
Aunque por supuesto espero que hayas notado que iba un poco de coña. Si lo de la condición detrás ya es feo, lo de poner (condición and valor1) or valor2 es más feo aún xD
Bueno, en Ruby hay algo parecido a eso para inicializar valores en objetos
Hombre, a mi en javascript me gusta para hacer cosas como…
color = color || “verde”;
que reconozco que para tener valores por defecto en parámetros opcionales queda bastante limpio. Pero más de eso, es dificultar la lectura del código.
De hecho en Javascript es mejor usar:
color || (color = “verde”);
asi como un simple statement.
Y en el caso de Python yo lo que hago es
x = 5 if a > b else 10
Saludos
Descubrí esa sintaxis en Ruby y no sabía que se podía usar en Python. Es lo que tiene haber aprendido con la 1.5.2 y no haberme actualizado
:D 