Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

Complément - niveau basique

Nous présentons rapidement dans ce notebook comment construire la condition qui contrôle l’exécution d’un if.

Tests considérés comme vrai

Lorsqu’on écrit une instruction comme

if <expression>:
   <do_something>

le résultat de l’expression peut ne pas être un booléen.

Par exemple, pour n’importe quel type numérique, la valeur 0 est considérée comme fausse. Cela signifie que :

# ici la condition s'évalue à 0, donc on ne fait rien
if 3 - 3:
    print("ne passera pas par là")
# par contre si vous vous souvenez de notre cours sur les flottants
# ici la condition donne un tout petit réel mais pas 0.
if 0.1 + 0.2 - 0.3:
    print("par contre on passe ici")
par contre on passe ici

De même, une chaîne vide, une liste vide, un tuple vide, sont considérés comme faux. Bref, vous voyez l’idée générale.

if "": 
    print("ne passera pas par là")
if []: 
    print("ne passera pas par là")
if ():
    print("ne passera pas par là")
# assez logiquement, None aussi
# est considéré comme faux
if None:
    print("ne passe toujours pas par ici")

Égalité

Les tests les plus simples se font à l’aide des opérateurs d’égalité, qui fonctionnent sur presque tous les objets. L’opérateur == vérifie si deux objets ont la même valeur :

bas = 12
haut = 25.82

# égalité ?
if bas == haut:
    print('==')
# non égalité ?
if bas != haut:
    print('!=')
!=

En général, deux objets de types différents ne peuvent pas être égaux.

# ces deux objets se ressemblent 
# mais ils ne sont pas du même type !
if [1, 2] != (1, 2):
    print('!=')
!=

Par contre, des float, des int et des complex peuvent être égaux entre eux :

bas_reel = 12.
print(bas, bas_reel)
12 12.0
# le réel 12 et 
# l'entier 12 sont égaux
if bas == bas_reel:
    print('int == float')
int == float
# ditto pour int et complex
if (12 + 0j) == 12:
    print('int == complex')
int == complex

Signalons à titre un peu anecdotique une syntaxe ancienne : historiquement et seulement en Python 2 on pouvait aussi noter <> le test de non égalité. On trouve ceci dans du code ancien mais il faut éviter de l’utiliser :

# l'ancienne forme de != en python2 s'écrivait
if 12 <> 25:
    print("<> est obsolete et ne fonctionne qu'en python2")

Les opérateurs de comparaison

Sans grande surprise on peut aussi écrire

if bas <= haut:
    print('<=')
if bas < haut:
    print('<')
<=
<
if haut >= bas:
    print('>=')
if haut > bas:
    print('>')
>=
>

À titre de curiosité, on peut même écrire en un seul test une appartenance à un intervalle, ce qui donne un code plus lisible

x = (bas + haut) / 2
print(x)
18.91
# deux tests en une expression
if bas <= x <= haut:
    print("dans l'intervalle")
dans l'intervalle

On peut utiliser les comparaisons sur une palette assez large de types, comme par exemple avec les listes

# on peut comparer deux listes, mais ATTENTION
[1, 2] <= [2, 3]
True

Il est parfois utile de vérifier le sens qui est donné à ces opérateurs selon le type ; ainsi par exemple sur les ensembles ils se réfèrent à l’inclusion.

Il faut aussi se méfier avec les types numériques, si un complexe est impliqué, comme dans l’exemple suivant :

# on ne peut pas par contre comparer deux nombres complexes
try:
    2j <= 3j
except Exception as e:
    print("OOPS", type(e), e)
OOPS <class 'TypeError'> '<=' not supported between instances of 'complex' and 'complex'

Connecteurs logiques et / ou / non

On peut bien sûr combiner facilement plusieurs expressions entre elles, grâce aux opérateurs and, or et not

# il ne faut pas faire ceci, mettez des parenthèses
if 12 <= 25. or [1, 2] <= [2, 3] and not 12 <= 32:
    print("OK mais pourrait être mieux")
OK mais pourrait être mieux

En matière de priorités : le plus simple si vous avez une expression compliquée reste de mettre les parenthèses qui rendent son évaluation claire et lisible pour tous. Aussi on préfèrera de beaucoup la formulation équivalente :

# c'est mieux avec un parenthésage
if 12 <= 25. or ([1, 2] <= [2, 3] and not 12 <= 32):
    print("OK, c'est équivalent et plus clair")
OK, c'est équivalent et plus clair
# attention, si on fait un autre parenthésage, on change le sens
if (12 <= 25. or [1, 2] <= [2, 3]) and not 12 <= 32 :
    print("ce n'est pas équivalent, ne passera pas par là")

Pour en savoir plus

Reportez-vous à la section sur les opérateurs booléens dans la documentation python.