= Erreurs de programmation en Python 3 = Comprendre les erreurs est une étape essentielle de l’apprentissage de la programmation. Par contraste avec la présentation d’un algorithme en langage courant, le fait de fixer un langage de programmation impose des contraintes formelles fortes. Ces contraintes peuvent être perçues comme une gêne, mais on gagne beaucoup à s’appuyer dessus, y compris pour l’enseignement. De plus, le formalisme de la programmation permet souvent au système de signaler des erreurs avant même l’étape du test. Il faut distinguer différents niveaux d’erreur. == Erreur de syntaxe == Le texte source ne respecte pas la forme imposée par le langage de programmation. Ce n’est donc même pas à proprement parler un programme. Analogie en math: une réponse « même pas fausse », par exemple ''Si x<0 donc.'' Ce genre d’erreur est détecté immédiatement par l’interpréteur, qui se plaint de ne pas comprendre ce que vous lui voulez. {{{#!highlight py3 >>> f(x)=1 SyntaxError: can't assign to function call }}} On peut parfois regretter que le langage ne soit pas plus flexible, mais la contrainte est parfois salvatrice. {{{#!highlight py3 >>> def f(sin(x)): return x SyntaxError: invalid syntax }}} Analogie en math: ''On définit la fonction f : sin(x) ↦ x.'' Il faut comprendre la syntaxe comme un contrat, un terrain d’entente minimal: si on le respecte, l’interpréteur s’engage à ''faire'' quelque chose. D’une certaine manière, les erreurs de syntaxe sont donc les plus simples à réparer, parce que le système peut nous indiquer exactement où se trouve le problème: c’est le point où il ne comprend pas ce qu’on lui dit, et c’est en général bien localisé et sans grande complexité. {{{{#!wiki tip Une source très courante d’erreurs en Python est le non respect des [[Initiation à Python 3#Algorithmique_de_base|contraintes d’indentation]]. Par exemple: {{{#!highlight py3 >>> if x==0: print('zero') SyntaxError: expected an indented block }}} ou: {{{#!highlight py3 >>> 3 SyntaxError: unexpected indent }}} }}}} {{{{#!wiki caution Parfois, une ambigüité du langage courant est résolue (d’une manière fixée à l’avance) par le langage de programmation. Comparer: * ''C’est une conséquence de la négation de la continuité et de la monotonie.'' avec: {{{#!highlight py3 >>> not False and True True }}} }}}} == Erreur à l’exécution == Ici c’est plus compliqué : le programme est accepté par l’interpréteur, mais c’est lors de son exécution que ça casse. Les sources sont multiples, et l’interpréteur peut parfois nous aider: {{{#!highlight py3 >>> sqrt(2) Traceback (most recent call last): File "", line 1, in sqrt(2) NameError: name 'sqrt' is not defined }}} {{{#!highlight py3 >>> ch = 'abc' >>> print(ch[1],ch[2],ch[3]) Traceback (most recent call last): File "", line 1, in print(ch[1],ch[2],ch[3]) IndexError: string index out of range }}} {{{#!highlight py3 >>> print('le résultat est'+42) Traceback (most recent call last): File "", line 1, in print('le résultat est'+42) TypeError: Can't convert 'int' object to str implicitly }}} {{{#!highlight py3 >>> sqrt(-2) Traceback (most recent call last): File "", line 1, in math.sqrt(-2) ValueError: math domain error }}} == Erreur d’algorithmique pure et dure == Là, on est seul face à ses responsabilités: {{{#!highlight py3 >>> x=0 >>> n=0 >>> while x<10: n = n+x }}} ou encore: {{{#!highlight py3 def trouve_lettre(ch,x): "Renvoie `True` si la lettre `x` est dans la chaîne `ch`." for y in ch: if x==y: return True else: return False }}} Évidemment, ce sont les erreurs les plus intéressantes, celles sur lesquelles on a envie de travailler. == Florilège == En pièces jointes à cette page, vous trouverez des scripts Python inspirés de contributions d’étudiants (de tous niveaux). <> Essayez de voir ce qui cloche dans chaque cas.