python - tiene - ¿Poniendo una declaración if-elif-else en una línea?
sentencias en python (8)
He leído los enlaces a continuación, pero no aborda mi pregunta.
¿Python tiene un operador condicional ternario? (la pregunta es sobre condensar la instrucción if-else en una línea)
¿Hay una manera más fácil de escribir una declaración if-elif-else para que encaje en una línea?
Por ejemplo,
if expression1:
statement1
elif expression2:
statement2
else:
statement3
[ACTUALIZAR]
if i>100:
x=2
elif i<100:
x=1
else:
x=0
Siento que si el ejemplo anterior pudiera escribirse de la siguiente manera, podría parecer más conciso.
x=2 if i>100 elif i<100 1 else 0 [WRONG]
Bueno, me encontré con problemas similares hace meses, luego un día me di cuenta de que puedes aprovechar el método get
de un dict
.
x = {i>100: 2, i<100: 1}.get(True, 0)
Básicamente, i>100
e i<100
no pueden ser ambos verdaderos, por lo que si alguno de ellos es True
, obtienes el valor que deseas (2 o 1), si ninguno de ellos es True
, obtienes 0
.
Hay una alternativa que es bastante ilegible en mi opinión, pero la compartiré de todos modos solo como curiosidad:
x = (i>100 and 2) or (i<100 and 1) or 0
Más información aquí: https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not
La gente ya ha mencionado expresiones ternarias. A veces, con una simple asignación condicional como ejemplo, es posible usar una expresión matemática para realizar la asignación condicional. Esto puede no hacer que su código sea muy legible, pero lo hace en una línea bastante corta. Tu ejemplo podría escribirse así:
x = 2*(i>100) | 1*(i<100)
Las comparaciones serían Verdadero o Falso, y al multiplicar con números sería 1 o 0. Se podría usar un + en lugar de un | en el medio.
No, no es posible (al menos no con declaraciones arbitrarias), ni es deseable. Ajustar todo en una línea probablemente violaría PEP-8 donde se estipula que las líneas no deben exceder los 80 caracteres de longitud.
También está en contra del Zen de Python: "La legibilidad cuenta". (Escriba import this
en el indicador de Python para leer todo).
Puede usar una expresión ternaria en Python, pero solo para expresiones, no para declaraciones:
>>> a = "Hello" if foo() else "Goodbye"
Editar:
Su pregunta revisada ahora muestra que las tres declaraciones son idénticas, excepto por el valor asignado. En ese caso, un operador ternario encadenado funciona, pero todavía creo que es menos legible:
>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1
Puede usar declaraciones ternarias if anidadas.
# if-else ternary construct
country_code = ''USA''
is_USA = True if country_code == ''USA'' else False
print(''is_USA:'', is_USA)
# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
age_category_name = ''Young'' if age <= 40 else (''Middle Aged'' if age > 40 and age <= 65 else ''Senior'')
return age_category_name
print(get_age_category_name(25))
print(get_age_category_name(50))
print(get_age_category_name(75))
Si solo necesita diferentes expresiones para diferentes casos, esto puede funcionar para usted:
expr1 if condition1 else expr2 if condition2 else expr
Por ejemplo:
a = "neg" if b<0 else "pos" if b>0 else "zero"
Simplemente anide otra cláusula if en la declaración else. Pero eso no lo hace parecer más bonito.
>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
''zero''
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
''invalid value''
También depende de la naturaleza de tus expresiones. El consejo general sobre las otras respuestas de "no hacerlo" es bastante válido para declaraciones genéricas y genéricas.
Pero si todo lo que necesita es una tabla de "dispacth", como llamar a una función diferente según el valor de una opción determinada, puede poner las funciones para llamar dentro de un diccionario.
Algo como:
def save():
...
def edit():
...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}
option = get_input()
result = options[option]()
(que en lugar de
if option=="save":
save()
...
)