Outils pour utilisateurs

Outils du site


cours:informatique:fun_mooc:python3_uca_inria:420_tests_et_operateurs_booleens

Python: test if et opérateurs booléens

Syntaxe

if test_1:
  print( "bloc d'instructions 1" )
elif test_2:
  print( "bloc d'instructions 2" )
elif test_n:
  print( "bloc d'instructions n" )
else:
  print( "bloc d'instructions n+1" )
  • Le mot clé if est suivi d'un test (une expression). Le contenu du test est abordé par la suite. Le caractère ':' après le test signifie qu'on va avoir un bloc d'instructions. Ce bloc d'instructions ne sera exécuté que si le test est vrai.
  • Ensuite, on peut avoir de manière optionnelle un *elif* avec un bloc d'instructions ou même plusieurs *elif* chacun avec son bloc d'instructions. L'intérêt de ces *elif* c'est de faire des tests supplémentaires*;
  • Enfin il peut y avoir de manière optionnelle le mot clé else avec le bloc d'instruction à exécuter si aucun des tests précédent n'était vrai.

L'évaluation des test est faite ainsi:

  • On commence avec le premier *if*, si le premier test est vrai, on exécute le bloc d'instructions et on sort de votre structure *if/elif/else* .
  • Si le test 1 est faux, on passe au deuxième test introduit par le mot clé *elif*. S'il est vrai, on exécute le bloc d'instructions correspondant et on sort de la structure. sinon, on passe au troisième test et on continue, de manière identique et successive, jusqu'au dernier test.
  • Si l'intégralité des tests sont faux, on peut utiliser le mot clé optionnel *else*, pour introduire un bloc d'instruction à exécuter lorsque tous les tests précédents ont échoué.

En fait, dans une structure if, elif, else, un seul bloc d'instructions sera exécuté. Regardons maintenant ce que nous pouvons avoir dans un test.

Le test ou l' expression

Dans un test d'un *if* ou d'un *elif*, vous pouvez avoir absolument n'importe quelle expression. L'expression est passée en argument de la fonction built-in bool qui retournera vrai ou faux. Vous avez une expression, cette expression va être exécutée, elle va produire un objet et python va appeler *bool(objet)*. Que va faire *bool* sur cet objet?

  • Il va appeler soit la méthode *objet.__bool__()* et cette méthode *bool* va retourner vrai ou faux, qui sera pris en compte par le test;
  • Ou alors, s'il n'y a pas de méthode bool, il va appeler la méthode *len*. Si la méthode *len* retourne 0, ce sera faux ; si la méthode *len* retourne quelque chose d'autre, ce sera vrai.

L'intuition derrière ça, c'est que un objet vide, de longueur nulle, est considéré comme faux, un objet qui n'est pas vide est considéré comme vrai.

Exemples d'expressions

  • Un type built-in, s'il est False, 0, None, ou n'importe quel type liste, set, dictionnaire, chaîne de caractères, tuple, vide, sera considéré comme faux.
  • Tout le reste est vrai.
# si d est vide il ne sera pas affiché
if d:
  print(d)
 
# la syntaxe est proche du langage naturel
if 'a' in 'marc':
  print('lettre présente')
 
 
s = '123'
 
# on définit l'entier et on l'affiche
# que si la chaîne de caractère représente un nombre
if s.isdecimal():
  print( int(s) )

Opérateurs booléens

Lorsque vous avez plusieurs conditions, vous pouvez les combiner avec les opérateurs de tests booléens.

  • not A qui permet de retourner vrai si A est faux.
  • A and B est vraie si A et B sont vraies;
  • A or B est vraie si soit A, soit B est vraie.

Il est d'ailleurs intéressant de remarquer que ces deux derniers opérateurs sont ce qu'on appelle short-circuit. Cela veut dire que A et B est vraie si les deux sont vraies. Donc si on évalue A à faux, on sait que le A and B sera faux donc on n'évaluera pas le B. De même, A or B est vraie si A est vraie, donc si jamais A est vraie, dans le A ou B, on n'évaluera pas le B. C'est ce qu'on appelle short-circuit, court-circuit, on va court-circuiter l'évaluation si on sait que le test est de toute façon déjà validé.

Expression conditionnelle

On distingue:

  • les expressions qui sont des fragments de code retournant une valeur;
  • les instructions permettent de faire une action mais ne retournent rien (l'affectation, *if*, *import*, etc)

La forme du if présentée précédemment ne peut pas servir à renvoyer une valeur, c'est donc une instruction.

Le code suivant présente un cas usuel:

#affectation d'une valeur selon une condition
 
# une expression x est évaluée, 
# pour l'exemple on la fixe a vrai
x = True
 
if x:
  y = 12
else:
  = 35
 
print(y)

Il existe en Python une expression qui fait le même genre de test: c'est la forme dite d'expression conditionnelle, qui est une expression à part entière (elle retourne une valeur). Elle utilise la syntaxe suivante:

y = 12 if x else 35

Cette expression conditionnelle rend le cas usuel présenté avant plus concis et peut dans certains cas rendre le code plus fonctionnel et plus fluide.

Imbrication

Comme cette forme est une expression, on peut l'utiliser dans une autre expression conditionnelle:

# on veut calculer en fonction d'une entrée x
# une sortie qui vaudra
# -1 si x < -10
# 0 si -10 <= x <= 10
# 1 si x > 10
 
x = 5 # ou quoi que ce soit d'autre
 
valeur = -1 if x < -10 else (0 if x <= 10 else 1)
 
print(valeur)

Compréhensions

Un objet non vide conduit à une expression vraie, on peut tout à fait mettre une compréhension comme condition, ce qui peut être utile pour savoir si au moins un élément remplit une condition, comme par exemple:

inputs = [23, 65, 24]
 
# y a-t-il dans inputs au moins un nombre 
# dont le carré est de la forme 10*n+5
def condition(n):
    return (n * n) % 10 == 5
 
if [value for value in inputs if condition(value)]:
    print("au moins une entrée convient")
cours/informatique/fun_mooc/python3_uca_inria/420_tests_et_operateurs_booleens.txt · Dernière modification : 2021/04/29 20:56 de 93.28.24.141