Lycée   >   Terminale   >   NSI   >   Repérer les bugs : typages, effets de bords, débordements

Repérer les bugs : typages, effets de bords, débordements

  • Fiche de cours
  • Quiz
  • Profs en ligne
Objectifs
  • Repérer les problèmes de typage.
  • Repérer les effets de bord.
  • Repérer les problèmes de débordement de tableau.
Points clés
  • Les opérations classiques et les fonctions ne s’utilisent pas avec tous les types de valeurs ou de données.
  • Les données de type mutable peuvent créer des effets de bord. Il faut être vigilant.
  • Le parcours d’un tableau peut engendrer des problèmes de débordement.
Pour bien comprendre
  • Connaitre les différents types de base. (1re)
  • Prototyper une fonction en Python. (1re)
1. Les bugs
Dans un programme informatique, un bug (ou bogue) est un défaut de conception qui cause un dysfonctionnement.

Un bug peut avoir deux conséquences principales : le programme ne peut pas être exécuté correctement, ou le programme s’exécute mais ne fait pas ce que l’on veut.

2. Les problèmes de typage

Bien programmer, c’est avant tout bien choisir le type des valeurs et des données utilisées et bien en connaitre les caractéristiques.

a. Les opérations et types

En Python, certaines opérations (+, -, /, *, etc.) s’utilisent avec différents types sans pour autant avoir la même signification.

Toutes les opérations ne sont toutefois pas utilisables avec tous les types.
Exemples
En Python, l’opération « + » a une utilisation différente suivant les types de valeurs ou de données utilisées :
  • + est l’addition mathématique pour les valeurs de type int, float.
  • + est la concaténation (mise bout à bout) pour les données de types list, str, tuple.

En revanche, l’opérateur « - » s’utilise sur les valeurs de type int ou float, mais pas sur les données de types list, str, tuple.

Ce code génère une erreur TypeError : unsupported operand type(s) for -.
Cela signifie explicitement (mais en anglais) qu’il y a une erreur de typage dans l’utilisation de l’opérateur « - ».

Méthode
Lorsqu’un code Python génère une erreur, un message d’erreur apparait. Pour le comprendre, il faut le lire de bas en haut.
  1. Repérer en dernière ligne du message quelle sorte d’erreur est générée (TypeError, ValueError, ZeroDivisionError, SyntaxError, NameError, etc.). Le nom de l’erreur est en anglais mais est souvent assez explicite.
  2. Lire la ligne à laquelle l’erreur est repérée. Attention, ce n’est peut-être pas la ligne où l’erreur se situe mais bien la ligne où Python bloque l’exécution du code.
En Python, le typage est fort, c’est-à-dire qu’il n’y a aucune interprétation implicite de typage lorsque l’on fait une opération.
Exemple
Pour écrire la chaine de caractères "Python 3" à partir de "Python " et du nombre entier 3, il faut écrire le code "Python " + str(3). L’opération + est en effet ici la concaténation : il faut concaténer deux chaines de caractères, c’est pourquoi il faut transformer 3 en "3" avec la fonction str().

Le code "Python " + 3 génère une erreur de typage.

b. Fonction et types
En Python, les fonctions ne prennent pas forcément pour paramètres tous les types de valeurs ou de données. Il convient de bien s’informer avant de les utiliser.
Exemple
La fonction len() prend pour arguments des données de types liststrtuple mais pas des entiers.
Ici len(1234) renvoie une erreur puisque 1234 est de type int.
len("1234") renvoie 4 car "1234" est du type str.
3. Les effets de bord
a. Types mutables
Une fonction est à effet de bord si elle modifie une variable en dehors de son environnement local.

En Python, cela se rencontre souvent avec les structures mutables comme les tableaux (de type list) ou les dictionnaires (de type dict).
Exemple
La fonction func() suivante est à effet de bord.
Python Explication
tab = [1, 1, 2, 3, 5, 8, 13] On définit le tableau tab.
def func():
    tab.append(tab[-1]+tab[-2])
On définit la fonction func() qui ajoute à la fin de tab la somme de ses deux derniers éléments.

À chaque appel de func(), la variable tab est modifiée alors qu’elle est extérieure au code qui définit func(). Cela ne génère pas d’erreur mais peut entrainer des erreurs de conceptions plus globales puisqu’il devient difficile de maitriser le contenu de la variable tab.

On peut le voir ci-dessous sur Python Tutor.

b. Mot clé global
Les variables de type immuable (int, float, str, tuple, etc.) ne permettent pas d’utiliser nativement les effets de bord. Cela peut entrainer des erreurs du type UnboundLocalError, qui signifie que l’on veut utiliser une variable globale comme locale.
Le mot clé global permet de pallier cela. Ce n’est cependant pas recommandé.
Exemple
Voici un code dont le but est d'affecter la chaine de caractères "Python 3" à la variable mot.

L’exécution de ce code génère une erreur :
Pour remédier à cela, il est possible de déclarer la variable mot comme globale dans la définition de la fonction.
4. Les débordements de tableaux
a. Erreur d'indexation

En Python, un tableau de taille n est indexé de 0 à n – 1.

Une erreur classique est de vouloir accéder à l’élément d’indice n, élément qui n’existe pas.

Cela génère une erreur IndexError : list index out of range.

Exemple
On considère le tableau tab = [1, 2, 3, 4, 5].
Le tableau tab contient 5 éléments mais tab[5] n’existe pas.
b. Modification de tableau

Il est possible de modifier un tableau pendant son parcours et d’en modifier dynamiquement la taille. Cela peut créer un débordement de tableau. C’est pourquoi il est parfois nécessaire de créer un nouveau tableau plutôt que de modifier le tableau en plein parcours.

Exemple
On considère le tableau tab = [1, 1, 2, 3, 5, 8, 13].
On souhaite retirer les éléments pairs de cette liste avec le code suivant.
Ce code génère une erreur IndexError : list index out of range, puisque la taille de tab diminue dès que l’on retire un élément pair.

Pour éviter cette erreur, il suffit de créer un second tableau.

5. Bilan sur les erreurs rencontrées en Python

En Python, il est important de connaitre le nom des erreurs rencontrées et leurs significations.

Nom d’erreur Signification
TypeError Il y a un problème d’utilisation de variables à cause de leur type.
UnboundLocalError Une variable est utilisée dans une fonction, n’y est pas définie et, a priori, n’existe pas à l’extérieur de la fonction.
IndexError Il y a un problème de débordement.
ZeroDivisionError Un calcul contient une division par 0.
SyntaxError Il y a une erreur de syntaxe.
IndentationError Il y a une erreur d’utilisation des indentations.
NameError Un nom de variable est utilisé mais n’existe pas.

Comment as-tu trouvé ce cours ?

Évalue ce cours !

 

Question 1/5

La médiane de 6 notes est 13. Cela signifie que :

Question 2/5

On a obtenu la série statistique suivante :

Combien vaut la médiane ?

Question 3/5

On a obtenu la série ci-dessous :

Quelle est la médiane de cette série ?

Question 4/5

On a relevé les tailles en cm des élèves d’une classe :

 

Parmi les propositions suivantes, laquelle est vraie ?

Question 5/5

Les notes en français de deux classes littéraires sont données dans le tableau suivant :

Quelle est la note médiane ?

Vous avez obtenu75%de bonnes réponses !

Recevez l'intégralité des bonnes réponses ainsi que les rappels de cours associés :

Votre adresse e-mail sera exclusivement utilisée pour vous envoyer notre newsletter. Vous pourrez vous désinscrire à tout moment, à travers le lien de désinscription présent dans chaque newsletter. Pour en savoir plus sur la gestion de vos données personnelles et pour exercer vos droits, vous pouvez consulter notre charte.

Une erreur s'est produite, veuillez ré-essayer

Consultez votre boite email, vous y trouverez vos résultats de quiz!

Découvrez le soutien scolaire en ligne avec myMaxicours

Le service propose une plateforme de contenus interactifs, ludiques et variés pour les élèves du CP à la Terminale. Nous proposons des univers adaptés aux tranches d'âge afin de favoriser la concentration, encourager et motiver quel que soit le niveau. Nous souhaitons que chacun se sente bien pour apprendre et progresser en toute sérénité ! 

Fiches de cours les plus recherchées

NSI

Repérer les bugs : structures

NSI

Anticiper les erreurs classiques

NSI

Utiliser Python pour déterminer les mesures des arbres binaires

NSI

Utiliser Python dans les arbres binaires de recherche

NSI

Rechercher et insérer une clé dans un arbre binaire de recherche

NSI

Parcourir un arbre binaire

NSI

Se déplacer dans un graphe

NSI

Utiliser la méthode « diviser pour régner »

NSI

Programmer de manière dynamique

NSI

Étudier la complexité mémorielle