Inititation à la programmation avec Python (niveau 2nde)

Épisode n°3 : les booléens, les structures conditionnelles et la boucle non bornée (Tant que)

Les booléens

Les booléens sont un type de variables très courantes en informatique : ce sont des variables logiques qui ne peuvent prendre que deux valeurs : Vrai ou Faux (True , False).

Observez les retours pour chaque exécution des cellules suivantes, dans lesquelles on présente au passage tous les opérateurs de comparaison :

In [1]:
# infériorité ?
5 < 7
Out[1]:
True
In [2]:
# supériorité ?
5 > 7
Out[2]:
False
In [3]:
# inférieur ou égal ?
5 <= 7
Out[3]:
True
In [4]:
# supérieur ou égal ?
5 >= 7
Out[4]:
False
In [5]:
mligne# différence ?
5 != 7
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-4b7035ef0f01> in <module>
----> 1 mligne# différence ?
      2 5 != 7

NameError: name 'mligne' is not defined
In [ ]:
# égalité ?
5 == 7

Remarquez en particulier l'expression pour tester l'égalité avec le double signe égal (pour ne pas le confondre avec l'opérateur d'affectation de valeur à une variable).

On peut directement affecter les valeurs True ou False à des variables :

In [ ]:
a = True
b = False
c = 5 == 7         # rappel 5 == 7 vaut False (car 5 n'est pas égal à 7)
print(a, b, c)

Instructions conditionnelles : si ... sinon si ... sinon ...

De nombreux algorithmes proposent d'effectuer certaines tâches sous certaines conditions : un bloc de code ne sera exécuté que si une condition est remplie ; dans le cas où la condition ne serait pas remplie, l'algorithme pourra prendre une autre voie et exécuter un autre bloc de code.

Exemple 1 : si le temps est clément, je vais à la plage, sinon je vais au cinéma.

Exemple 2 : si le soleil brille, je vais à la plage, sinon si le temps est quand même correct, je vais faire un pique-nique, sinon (dans tous les autres cas), je vais au cinéma.

Python propose cette structure avec les mots clefs if ... elif ... else (elif est la contraction de else if).

À la fin de chacune de ces instructions, il y a un symbole deux points (:) et le bloc de code qui doit être exécuté si la condition est satisfaite doit être indenté.

Les conditions prennent la forme d'une variable booléenne qui en général est le résultat d'une test de comparaison (comme ceux vus dans la 1ere partie de ce notebook).

Exercice : analyser le code ci-dessous et modifier la valeur de la variable météo pour faire afficher chacune des possibillités.

In [ ]:
# voici une écriture en Python qui traduit l'exemple ci-dessus :
meteo = "soleil brille"  # changez librement cette valeur pour faire des tests

if meteo == "soleil brille":
    print("Je vais à la plage car le soleil brille.")
elif meteo == "temps correct":
    print("Je vais faire un pique-nique car le soleil ne brille pas mais le temps est correct.")
else:
    print("Le soleil ne brille pas et le temps n'est pas correct, alors je vais au cinéma !")

Exercice : Écrire une fonction acces qui prend un nombre comme paramètre d'entrée (correspondant à un âge) et qui renvoie un code d'accès (0, 1, 2, ou 3) en fonction de l'âge :

 - code 0 : accès aux majeurs uniquement
 - code 1 : accès aux ados de 15 à 17 ans
 - code 2 : accès aux enfants de 10 à 14 ans
 - code 3 : accès à tous
In [ ]:
# à vous de jouer ci-dessous :
def acces(age):
    if age >= 18:
        return 0
    elif age >= 15:
        return 1
    elif age >= 10:
        return 2
    else:
        return 3        

Si votre fonction est correctement écrite, vous devez pouvoir exécuter la cellule ci-dessous et ne voir aucun message d'erreur apparaître. Si vous avez commis une erreur, un message vous signalera la ligne qui pose un problème...

In [ ]:
# cellule de tests (s'il n'apparait rien lors de son exécution, c'est bon signe !)
assert acces(20) == 0
assert acces(18) == 0
assert acces(17) == 1
assert acces(15) == 1
assert acces(12) == 2
assert acces(10) == 2
assert acces(8) == 3

Exercice : Écrire une fonction qui renvoie "l'écart" entre deux nombres (la valeur absolue de la différence entre ces deux nombres).

Exemples :

>>> ecart(7, 5)
2
>>> ecart(5, 7)
2
>>> ecart(-7, 5)
12
>>> ecart(-7, -5)
2
>>> ecart(-5, 7)
12
In [ ]:
# à vous de jouer
def ecart(a, b):
    dif = a - b
    if dif < 0:
        return -dif
    else:
        return dif

Vous pouvez exécuter la cellule suivante pour voir si votre fonction semble correcte :

In [ ]:
# cellule pour faire des tests :
assert ecart(7, 5) == 2
assert ecart(5, 7) == 2
assert ecart(-7, 5) == 12
assert ecart(-7, -5) == 2
assert ecart(-5, 7) == 12
assert ecart(7, -5) == 12
assert ecart(-5, 5) == 10
assert ecart(5, 5) == 0

Exercice : Analyser le code suivant et indiquer si le message "Tout va bien" s'affiche toujours, jamais ou de façon incertaine.

In [ ]:
a = True

if a:
    print("Tout va bien")
else:
    print("Tout va mal !")

Boucle non bornée : Tant que ...

Les informaticiens ont horreur (à raison) de se répéter ! De ce point de vue, la paresse est bien perçue...

Les boucles permettent de répéter une action plusieurs fois. Les boucles non bornées répètent l'action (le bloc de code) tant qu'une condition reste satisfaite (on ne connaît pas à l'avance le nombre de fois que le bloc de code va se répéter, c'est en ce sens que la boucle est non bornée).

En Python, la condition à tester pour savoir si le bloc de code doit être répété est introduite par le mot clef while, et se termine par un deux-points.

Comme nous en avons maintenant l'habitude, le bloc de code à répéter doit être indenté.

Voyez l'exemple suivant qui multiplie un nombre par 2 tant que celui-ci reste inférieur à 150. On a ajouté un système pour compter les itérations (c'est à dire les passages dans le corps de la boucle).

In [ ]:
n = 4         # définition de la valeur initiale du nombre
compteur = 1  # cette variable compteur permet de compter le nombre d'itérations de la boucle

while n < 150:
    print("Itération n°", compteur, end=" ")
    print("=> En entrant dans ce 'tour de boucle' n =", n)
    n = 2 * n
    compteur = compteur + 1  # on augmente la valeur du compteur pour comptabiliser cette itération
    
print("\nAprès avoir quitté la boucle, n =", n)

Exercice : Analyse de programme :

On a écrit une fonction mystere. Analyser le code de cette fonction et proposer un nom pertinent pour cette fonction.

In [ ]:
def mystere(x, n):
    """ 
    x est un nombre quelconque
    n est un entier positif 
    """
    i = 0
    total = 0
    while i != n:
        total = total + x
        i = i + 1
    return total
In [ ]:
# vous pouvez utiliser cette cellule pour faire des appels à la fonction mystère :
mystere(-3.7, 2)

Exercice : Division euclidienne (problème un peu difficile) :

Écrire une fonction reste qui renvoie le reste r de la division euclidienne d'un nombre a par un nombre b.

Écrire une fonction quotient qui renvoie le quotient q de la division euclidienne d'un nombre a par un nombre b.

Dans les 2 cas, on cherchera à soustraire le nombre b du nombre a tant que le reste de cette soustraction est strictement positif.

Exemple : 17 = 5 x 3 + 2

reste(17, 5) vaut 2
quotient(17, 5) vaut 3
In [ ]:
# à vous de jouer
def reste(a, b):
    while a >= b:
        a = a - b
    return a

def quotient(a, b):
    n = 0
    while a >= b:
        a = a - b
        n = n + 1
    return n
In [ ]:
print(quotient(17, 5), reste(17, 5))
In [ ]:
# cellule de test des 2 fonctions reste et quotient
assert quotient(7968118, 16462) == 7968118 // 16462
assert reste(7968118, 16462) == 7968118 % 16462

Remarque : On peut regrouper ces 2 fonctions en une seule. En effet une fonction peut renvoyer 2 valeurs en une seule fois.

In [ ]:
def division(a, b):
    n = 0
    while a >= b:
        a = a - b
        n = n + 1
    return (n, a)

division(17, 5)

Danger ! Boucle non bornée qui ne s'arrête jamais...

Si la condition de sortie de boucle n'est jamais satisfaite, alors la boucle ne s'arrête jamais !!!

Imaginez le programme suivant :

while True:
    print("J'y suis, j'y reste !")

Les répétitions vont durer un moment... Une seule solution, mettre fin violemment au programme. Ceci peut se faire en cliquant dans le menu Kernel -> Interrupt (En Français : Noyau -> Interrompre).

In [ ]:
# cellule idiote...
# exécutez la cellule et quand vous en avez marre (rapidement sans doute...),
# cliquez dans le menu Noyau et Interrompre.
while True:
    print("J'y suis, j'y reste !")

Cas particulier :

Pourtant, vous rencontrerez ce genre d'écriture lors de l'étude des microcontrôleurs ! En effet si l'on veut qu'un programme soit continuellement "à l'écoute" d'une action de l'utilisateur, on écrit tout son code à l'interieur d'une telle boucle infinie.

Ce programme pourra par exemple réagir à des événements comme l'appui d'une touche sur le clavier ou un clic de souris... Cela s'appelle la programmation évènementielle. Ceci n'est pas du tout exceptionnel, le système d'exploitation de votre ordinateur est constamment à votre écoute et prêt à réagir à vos actions.

Il faudra cependant prévoir un événement particulier qui mettra fin au programme (le clic sur une croix par exemple).

To be continued... Pour la suite, ouvrez le notebook n°4.

In [ ]: