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
.
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 .
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.
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.