mercredi 6 avril 2011

Notation abrégée du IF-ELSE (IFF) en Python

Description
La plupart des langages ont une notation abrégée permettant de combiner une affectation et un test en une seule instruction.
Par exemple, en C#, il est possible d'écrire
// exemple en C#
X=testValue>5?1:2;
Ainsi, la valeur assignée à X dépendra de la valeur contenu dans testValue.
Si testValue est supérieur à 5, X contiendra la valeur 1 sinon X contiendra la valeur 2.

Notation équivalente en Python
# Exemple en Python 
X = testValue>5 and 1 or 2
Si testValue est supérieur à 5, X contiendra la valeur 1 sinon x contiendra la valeur 2.

Comment cela fonctionne t'il?
Quand Python rencontre une expression testValue>5 and 1 or 2, il essaye d'évaluer le premier argument (testValue>5) pour obtenir le résultat boolean.
Ensuite, l'interpréteur vérifie s'il se trouve dans une instruction "if".
Si c'est le cas, et en fonction du résultat de la première évaluation, Python passera à l'évaluation du and ou du or.
Si l'interpréteur est dans une opération d'assignation, Python extraira la valeur après le and si le test est positif ou bien la valeur après le or si le test est négatif. 

>>> #---- Exemple IF-ELSE condensé ------ >>> testValue = 1
>>> X = testValue > 5 and 1 or 2
>>> X
2
>>> testValue = 6
>>> X = testValue > 5 and 1 or 2
>>> X
1

>>> #---- Exemple TEST  ------ 
>>> testValue = 1
>>> if testValue > 5 and False or True:
...     print "OK"
... else:
...     print "!"
... 
OK
>>> if testValue > 5 and False or False:
...     print "OK"
... else:
...     print "!"
... 
!
>>> if testValue > 5 and True or False:
...     print "OK"
... else:
...     print "!"
... 
!
>>> testValue = 10
>>> if testValue > 5 and True or False:
...     print "OK"
... else:
...     print "!"
... 
OK

1 commentaire:

Anonyme a dit…

La forme présentée en Python ne marche pas dans tous les cas !

condition and result1 or result2

renverra result2 au lieu de result1 si la condition est vrai mais que result1 est faux (False, 0, '', None, etc).

>>> 6>5 and 1 or 2
1
>>> 6>5 and 0 or 2
2

Par contre il existe bel et bien un if fonctionnel en Python : res1 if condition else res2 :

>>> 1 if 6>5 else 2
1
>>> 0 if 6>5 else 2
0