- on change les noms des variables ?
- on essaye de programmer la fonction autrement ?
- on échange des lignes au hasard ?
- on jette tout son code à la poubelle ?
- on jette l'ordinateur à la poubelle ?
Non ...¶
On applique une démarche systématique ...
Quelle "sorte" de bug ?¶
selon la "sorte" de bug, les remèdes diffèrent ...
Est-ce une erreur de syntaxe ?¶
Syntax error
: l'interpréteur Python n'arrive pas à comprendre ce que vous avez écrit
bien examiner la ligne indiquée, ou la précédente
- "étourderie" : erreur d'indentation, parenthèse oubliée, oubli d'un
:
- ou bien : on révise la façon de s'exprimer en Python (cf Mémo Python)
NB : en cas d'erreur de syntaxe ... inutile d'ajouter des print
s
Est-ce une erreur d'exécution ?¶
l'interpréteur Python a compris ce que vous avez écrit, et commencé l'exécution du programme, mais réalise une opération invalide
Par exemple : accéder à l'indice 7 d'une liste de 3 éléments
on identifie l'opération qui déclenche l'erreur (pile des appels en cours)
on comprend la nature de l'erreur
NB : en Python, on sait facilement ce qui pose problème exactement
Est-ce que le programme a un comportement inattendu ?¶
affichage d'une information incohérente ...
Il faut remonter à la source ... essayer d'isoler le problème et d'écrire un test qui échoue
En cas d'échec d'un test ?¶
On suit l'exécution pas à pas jusqu'à trouver le problème ...
- si tout ne s'exécute pas comme prévu : (exemple : croire qu'on fait une copie de liste, alors que ce n'est pas le cas)
c'est erreur de compréhension du modèle d'exécution (Diapo 3)
- si tout s'exécute comme vous l'aviez prévu ... :
c'est que l'algorithme incorrect ...
"Traquer le bug" en MP2I/MPI¶
cf synthèse de cours
Objectif de la séance¶
Comprendre parfaitement :
le flot d'exécution du programme
la représentation en mémoire des objets manipulés par l'exécutant
L'exécutant fait ce que le programmeur lui dit de faire ...¶
Comment l'exécutant procède-t-il ?¶
Comprendre l'exécution d'un programme dans les détails¶
obéir à des instructions à réaliser en tenant compte des variables en mémoire ?
ça semble facile ...
ce n'est pas forcément le cas !
Python Tutor https://pythontutor.com/
A retenir - manipulations de liste en Python :
- La variable ne contient pas la liste, mais une référence vers la liste (l'adresse de la liste)
- une affectation de liste ne réalise pas une copie
- la concaténation crée une nouvelle liste
L.append(x)
modifie la liste L- ...
Que dire du code suivant ?¶
Créer une liste de zéros : mauvais exemple
- Très coûteux : nombreuses créations de listes (nb : les listes non utilisées disparaissent automatiquement)
On privilégiera bon exemple qui ne crée qu'une seule liste
A retenir - appel de fonction :
- la définition d'une fonction crée une variable globale
- lors de l'appel, les paramètres formels (ici
a
etb
) sont des variables qui contiennent les valeurs passées en argument. - la variables
a
b
ety
n'existent que pendant l'exécution du corps de la fonction : ce sont des variables locales - l'exécutant garde en mémoire l'endroit où l'appel a été réalisé
Et avec les listes ...
A retenir - appel de fonction + liste :
- une fonction est susceptible de modifier une liste passée en argument
- c'est la référence vers la liste qui est passée à la fonction
Remarque importante¶
- Les noms des paramètres et des variables locales à une fonction sont "internes" à la fonction.
- On peut les renommer sans changer ce que fait la fonction (ce ne sont que des symboles).
def f(x,y):
z = x-y
return z**2
def f(mozart, bach):
vivaldi = mozart - bach
return vivaldi**2
Dans les deux cas, f(3,5)
produira exactement le même calcul
- exemple 7
- ici, les appels sont imbriqués :
- l'appel à
f
déclenche l'appel àf1
... - ... qui déclenche l'appel à
f2
(alors que l'appel àf
est toujours en cours
- l'appel à
- L'exécutant garde trace de tout cela dans la pile d'appels en cours
- ici, les appels sont imbriqués :
Complément : Le Débogueur¶
Hors-programme
Outil du programmeur qui permet de suivre pas à pas l'exécution du programme,
on peut définir des points d'arrêts
exécuter le code jusqu'à atteindre un point d'arrêt,
reprendre l'exécution
connaître le contenu des variables.
...
A essayer en TP (pour les plus à l'aise)