web-dev-qa-db-fra.com

Pourquoi "if-else-break" se casse en python?

J'essaie d'utiliser l'expression if-else qui est censée rompre la boucle si la condition if échoue, mais en obtenant un invalid syntax Erreur.

Exemple de code:

a = 5
while True:
    print(a) if a > 0 else break
    a-=1

Bien sûr, si j'écris de la manière traditionnelle (sans utiliser le liner), cela fonctionne.

Veuillez me faire savoir ce qui ne va pas en utilisant la commande break après le mot clé else.

7
Manish Goel

Si je lance ceci, j'obtiens l'erreur suivante:

...     print(a) if a > 0 else break
  File "<stdin>", line 2
    print(a) if a > 0 else break
                               ^
SyntaxError: invalid syntax

Ceci est dû au fait

print(a) if a > 5 else break

est un opérateur ternaire . Les opérateurs ternaires ne sont aucune instruction if. Ceux-ci fonctionnent avec la syntaxe:

<expr1> if <expr2> else <expr3>

C'est équivalent à une "fonction virtuelle":

def f():
    if <expr2>:
        return <expr1>
     else:
         return <expr3>

Cela signifie donc que la partie à côté de else doit être une expression . break n'est pas pas une expression , c'est une instruction. Donc Python ne s’attend pas à cela. Vous ne pouvez pas return a break.

Dans python-2.x , print n'était pas non plus une fonction. Cela entraînerait donc une erreur avec l'instruction print. En python-2.xprint était un mot-clé.

Vous pouvez réécrire votre code pour:

a = 5
while True:
    if a > 5:
        print(a)
    else:
        break
    a -= 1

Vous pouvez en savoir plus à ce sujet dans les documentation et PEP-308 .

19
Willem Van Onsem

If est une expression, break similaire à return est une instruction. Vous ne pouvez pas utiliser deux instructions dans une seule phrase (sauf si vous utilisez un point-virgule laid). Je sais que ça aurait été vraiment cool si on pouvait faire ça, mais hélas c'est comme ça.

5
hspandher

Pour le dire en termes légèrement plus simples, vous utilisez abusivement la 'instruction if sur une ligne' ( opérateur ternaire ). Il évalue toujours une expression (c'est-à-dire une valeur). C'est,

<expr1> if <condition> else <expr2>

correspond à <expr1> si <condition> est True, et à <expr2> si <condition> est False. Cette valeur résultante peut ensuite être utilisée comme n'importe quelle valeur Python, par exemple:

y = 0
x = (5 if (y > 0) else 6)
print(x) # 6

Bien sûr, les parenthèses sont complètement inutiles (même découragées), mais nous espérons qu'elles sont utiles pour comprendre le sens de cette ligne.

Par conséquent,

print(a) if a > 0 else break

essaie d'évaluer print(a) (qui, par la définition de print() dans Python 3, renvoie toujours None - parfaitement valide, mais probablement pas ce que vous voulez habituellement) puis break, qui n'évalue rien car il s'agit d'une instruction ( action), pas une expression (valeur) , d'où l'erreur invalid syntax.

Par conséquent, si vous souhaitez exécuter l'une des deux instructions en fonction d'une condition, vous avez vraiment besoin de la solution multi-lignes proposée par Willem Van Onsem. Il peut y avoir des moyens hacky de le faire sur une seule ligne, mais plusieurs lignes sont la solution habituelle pour quelque chose comme ça en Python.

1
orn688