Infoforall

Python-Physique 08 : While et Try Except

Cette très courte activité présente deux tests que nous allons utiliser lorsque nous allons lire les données depuis des fichiers.

1 - La boucle WHILE - TANT QUE

Bien, passons maintenant aux boucles WHILE : on peut demander au programme de faire plusieurs fois la même chose tant qu’une condition précise est respectée.

Tant que la condition donnée est vraie, le programme va lancer les instructions à l’intérieur de la structure. Il est donc possible que cette instruction ne se fasse jamais si la condition n’est pas vérifiée initialement.

Cette boucle s'utilise comme ceci :

while condition :

    Instruction 1 à répéter

    Instruction 2 à répéter

Tout ce qui est tabulé sera répété tant que la condition est vérifiée (True). Attention donc au copier-coller : si l’une des tabulations est mal encodée, ça peut modifier tout le programme…

Voilà un premier exemple qui vous montre comment demander une note tant que la note est supérieure à 20.

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Acquisition des donnees note 1

note1 = 21

while (note1>20) :

    note1 = input("Quelle est votre note (entière) ? ")

    note1 = int(note1)


print("Votre note est ", note1)

input("pause")

CLIQUEZ SUR LE PREMIER BOUTON :

Réponse Tapée >>>

note1 :

01° Pourquoi rentre-t-on forcément au moins une fois dans la boucle ? Quelle est la fonction qui transforme la chaîne de caractères en integer ? Modifier le programme pour qu’il vérifie en plus que la note soit bien supérieure à 0 : il faut rajouter une condition dans la condition du while en utilisant or).

...CORRECTION...

On rentre dans la boucle puisqu'on place arbitrairement 21 dans la variable note1. La condition du WHILE est donc vraie : 21 est bien strictement supérieur à 20.

La fonction int() permet de transformer le string de la réponse en entier.

Pour la condition double :

while (note1>20 or note1<0) :

Une autre façon de faire : on part d’un test True et on le rend False lorsqu’on estime qu’on peut sortir :

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Acquisition des donnees note 1

test = True

while test :

    note1 = input("Quelle est votre note (entière) ? ")

    note1 = int(note1)

    test = (note1<0 or note1>20) # Boolean


print("Votre note est ", note1)

input("pause")

Et si on veut vérifier que la chaîne tapée par l’utilisateur est bien un chiffre ?

Il faudrait utiliser la méthode isnumeric() : note1.isnumeric() renvoie True si tous les caractères de la chaîne note1 correspondent à des chiffres. Sinon (c’est à dire si au moins un caractère n’est pas un chiffre), elle renvoie False.

02° Utiliser le code donné juste au dessus en tapant n’importe quoi comme A ou b. Le Modifier en utilisant la méthode isnumeric pour éviter les erreurs et recommencer la saisie. Il faudra modifier test par exemple.

C’est bien beau mais les notes ne sont pas nécessairement des entiers. Nous aimerions savoir gérer les notes à virgules. Ah mais je sais : nous allons remplacer la fonction int par la fonction float dans le code de la question 01 : facile !

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Acquisition des donnees note 1

test = True

while test :

    note1 = input("Quelle est votre note (même pas entière !) ? ")

    if note1.isnumeric() :

        note1 = float(note1)

        if (note1>=0 and note1<=20) :

            test = False


print("Votre note est ", note1)

input("pause")

03° Essayons le code donné ci-dessus : Tapez donc une note de 4. Ca fonctionne. Bien, tentons 14.5. Et non. Normal, le point n’est pas un caractère numérique. On ne rentre donc jamais dans le if. Et on ne sort jamais de la boucle du coup…

Là, c’est un peu compliqué, donc je vous donne une solution avec des commentaires.

Le plus simple est de faire un code qui fonctionne très bien si l’utilisateur rentre bien une note (un truc comme 14 ou 12.72 par exemple).

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Acquisition des donnees note 1

test = True

while test :

    note1 = input("Quelle est votre note (même pas entière !) ? ")

    note1 = float(note1)

    if (note1>=0 and note1<=20) :

        test = False


print("Votre note est ", note1)

input("pause")

04° Essayons le code donné ci-dessus dans IDLE (cela nous permettra de voir le type d’erreur créée : Tapez donc une note de 4. Ca fonctionne. Bien, tentons 14.5. Bien. 14,5 ? Et non. Normal, la virgule ne permet pas de créer un float en informatique. C’est le point qu’il faut utiliser. Recommencez avec a ? Et oui, encore une erreur : une ValueError.

En gros, on ne peut pas s’en sortir très facilement :

2 - Le test TRY et l'EXCEPT en cas d'échec

La manière la plus courte de régler le problème est d’attraper l’exception (l’erreur) et de lui dire ce qu’il doit faire si ça n’a pas marché.

La codification n’est pas compliquée mais nous ne l’avons pas vu.

Nous allons tenter de faire une action. Voir la ligne avec try :.

Si l’action échoue en provoquant une exception ValueError (voir la ligne avec except ValueError :), on lui dit comment réagir : ici, je ne complique pas : je lui dis juste de mettre note1 à la valeur –1 si l’entrée clavier était illisible avec float.

#!/usr/bin/env python

# -*-coding:Utf-8 -*


# Acquisition des donnees note 1

test = True

while test :

    note1 = input("Quelle est votre note (même pas entière !) ? ")


    try:

        note1 = float(note1)

    except ValueError:

        note1 = -1


    if (note1>=0 and note1<=20) :

        test = False


print("Votre note est ", note1)

input("pause")

05° Si on ne peut pas convertir la note en float (nombre à virgules), que place-t-on dans note1 ? Cela permet-il de recommencer la boucle ?

Quelques exemples et types d'erreur

>>> 5+"e"

TypeError: unsupported operand type(s) for +: 'int' and 'str'


>>> type(a)

NameError: name 'a' is not defined


>>> monDictionnaire = { 'a' : 'voici le contenu disponible pour la lettre a', 'b' : 'voici le contenu disponible pour la lettre b'}

'voici le contenu disponible pour la lettre a'

>>> monDictionnaire['toto le taureau']

KeyError: 'c' not found'