web-dev-qa-db-fra.com

Mettre une déclaration if-Elif-else sur une ligne?

J'ai lu les liens ci-dessous, mais cela ne répond pas à ma question.
Python a-t-il un opérateur conditionnel ternaire? (la question concerne la synthèse de la déclaration if-else en une seule ligne)

Existe-t-il un moyen plus simple d'écrire une déclaration if-Elif-else pour qu'elle tienne sur une ligne?
Par exemple,

if expression1:
   statement1
Elif expression2:
   statement2
else:
   statement3

[METTRE À JOUR]

if i>100:
    x=2
Elif i<100:
    x=1
else:
    x=0

Je pense simplement que si l'exemple ci-dessus pouvait être écrit de la manière suivante, cela pourrait sembler plus concis.

x=2 if i>100 Elif i<100 1 else 0 [WRONG]
82
Matt Elson

Non, ce n'est pas possible (du moins pas avec des déclarations arbitraires), ni souhaitable. Tout placer sur une ligne violerait probablement PEP-8 s'il est impératif que les lignes ne dépassent pas 80 caractères.

C'est aussi contre le zen de Python: "La lisibilité compte". (Tapez import this à l'invite Python pour lire le tout).

Vous pouvez utilisez une expression ternaire en Python, mais uniquement pour les expressions, pas pour les instructions:

>>> a = "Hello" if foo() else "Goodbye"

Modifier:

Votre question révisée montre maintenant que les trois déclarations sont identiques à l'exception de la valeur attribuée. Dans ce cas, un opérateur ternaire chaîné fonctionne, mais je pense toujours que c'est moins lisible:

>>> 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
123
Tim Pietzcker

Si vous n'avez besoin que d'expressions différentes pour des cas différents, cela peut fonctionner pour vous:

expr1 if condition1 else expr2 if condition2 else expr

Par exemple:

a = "neg" if b<0 else "pos" if b>0 else "zero"
43
Lycha

Nichez une autre clause if dans l'instruction else. Mais cela ne le rend pas plus joli.

>>> 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'
11
David Lai

Il y a une alternative qui est tout à fait illisible à mon avis mais que je partagerai quand même comme une curiosité:

x = (i>100 and 2) or (i<100 and 1) or 0

Plus d'infos ici: https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not

4
Ariel

Vous pouvez éventuellement utiliser la méthode get d'une dict:

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)

Vous n'avez pas besoin de la méthode get s'il est garanti que l'une des clés est évaluée à True:

x = {i<0: -1, i==0: 0, i>0: 1}[True]

Au plus, l'une des clés doit idéalement évaluer True. Si plusieurs clés ont la valeur True, les résultats peuvent sembler imprévisibles.

4
Shane

Les gens ont déjà mentionné les expressions ternaires. Parfois, avec une affectation conditionnelle simple comme exemple, il est possible d'utiliser une expression mathématique pour effectuer l'affectation conditionnelle. Cela ne rendra peut-être pas votre code très lisible, mais cela le mettra sur une seule ligne assez courte. Votre exemple pourrait être écrit comme ceci:

x = 2*(i>100) | 1*(i<100)

Les comparaisons seraient Vrai ou Faux, et lors de la multiplication avec des nombres, ce serait 1 ou 0. On pourrait utiliser un + au lieu d'un | au milieu.

2
Ant6n

Cela dépend aussi de la nature de vos expressions. L'avis général sur les autres réponses de "ne pas le faire" est tout à fait valable pour les déclarations génériques et les expressions génériques.

Mais si tout ce dont vous avez besoin est une table "dispacth", comme appeler une fonction différente en fonction de la valeur d'une option donnée, vous pouvez mettre les fonctions à appeler dans un dictionnaire. 

Quelque chose comme:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

(qu'au lieu de

if option=="save":
    save()
...

)

2
jsbueno
if i > 100:
    x = 2
Elif i < 100:
    x = 1
else:
    x = 0

Si vous souhaitez utiliser le code mentionné ci-dessus sur une ligne, vous pouvez utiliser les éléments suivants: 

x = 2 if i > 100 else 1 if i < 100 else 0

Ce faisant, x sera assigné à 2 si i> 100, 1 si i <100 et 0 si i = 100

1
roshanpoudel

Vous pouvez utiliser des instructions if imbriquées.

# 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))
0
k0L1081

L'opérateur ternary est le meilleur moyen d'obtenir une expression concise. La syntaxe est variable = value_1 if condition else value_2. Donc, pour votre exemple, vous devez appliquer deux fois l'opérateur ternaire:

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0
0
Yoelvis Jiménez