Il est recommandé de placer des commentaires dans les fonctions qu’on écrit, et d’éviter un code trop dense.
Prenons un exemple. La fonction suivante trie une liste par la méthode d’insertion :
|
1 2 3 4 5 |
def tri_insertion(L): for i in range(1,len(L)): v=L[i]; j=i while j>0 and L[j-1]>v: L[j]=L[j-1]; j-=1 L[j]=v |
Le code précédent est trop dense, et non commenté, ce qui ne favorise pas sa relecture. Il est recommandé d’utiliser plutôt le style suivant (même si, pour ce qui est des commentaires, on force peut-être ici un peu le trait) :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
def tri_insertion(L): # trier une liste par insertion for i in range(1,len(L)): # pré-condition de ce passage dans la boucle for: L[0],...,L[i-1] sont triés v = L[i] # il s'agit d'insérer v = L[i] parmi L[0],...,L[i-1] j = i; # soit j la position d'insertion de v (par défaut j = i) # tant qu'on n'est pas arrivé au début de la liste # et tant que l'élément à gauche de L[j] est encore supérieur à la valeur v while j > 0 and L[j-1] > v: L[j] = L[j-1] # alors on le décale à droite pour faire de la place j -= 1 # et on décrémente la (future) position d'insertion de v L[j] = v # on insère la valeur v à la position j # post-condition de ce passage dans la boucle for: L[0],...,L[i] sont triés |
Voici un exemple d’utilisation de cette fonction tri_insertion (on importe la fonction sample du module random, pour créer ici une liste d’entiers différents d’un intervalle donné).
|
1 2 3 4 5 6 7 8 9 10 |
>>> from random import sample # importe la fonction sample du module random >>> seq = sample(range(10,101), 15) # liste de 15 entiers différents dans [10,100] >>> seq_backup = seq[:] # copie de sauvegarde >>> seq # voici la liste qu'on va trier [82, 93, 28, 36, 22, 34, 24, 46, 73, 10, 35, 95, 83, 59, 30] >>> tri_insertion(seq) # on appelle la fonction tri_insertion sur cette liste >>> seq # la liste a été triée 'sur place' [10, 22, 24, 28, 30, 34, 35, 36, 46, 59, 73, 82, 83, 93, 95] >>> seq_backup # mais on a conservé l'original [82, 93, 28, 36, 22, 34, 24, 46, 73, 10, 35, 95, 83, 59, 30] |
La fonction help de Python permet d’afficher une aide succinte sur les fonctions intégrées.
Voici par exemple l’aide associée à la fonction divmod :
|
1 2 3 4 5 |
>>> help(divmod) Help on built-in function divmod in module builtins: divmod(...) divmod(x, y) -> (div, mod) Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x. |
Incorporer des commentaires à une fonction, c’est très bien si on souhaite relire le code de celle-ci. Mais si on est seulement intéressé par l’utilisation de cette fonction, il est intéressant de pouvoir disposer d’une aide sur les arguments qu’elle attend, et sur la nature du résultat qu’elle renvoie.
La solution est d’utiliser une “chaîne de documentation” (docstring en anglais) placée juste après la ligne de définition, et délimitée par une paire de triples guillemets (ou de triples apostrophes). L’utilisation de ces délimiteurs triples permet de faire courir la chaîne de documentation sur plusieurs lignes.
À titre d’exemple, nous allons modifier la fonction tri_insertion en lui ajoutant un nouveau paramètre formel sous la forme d’une fonction pour personnaliser la façon dont la liste est triée.
|
1 2 3 4 5 6 7 8 |
def tri_insertion(L, f = lambda x: x): '''tri_insertion(L,f) trie la liste L dans l'ordre croissant des valeurs de la fonction f (par défaut, f est l'identité).''' for i in range(1,len(L)): j = i; v = L[i] while j > 0 and f(L[j-1]) > f(v): L[j] = L[j-1]; j -= 1 L[j] = v |
Une fois validée cette nouvelle définition, la docstring est affichée en tapant help(tri_insertion) :
|
1 2 3 4 5 |
>>> help(tri_insertion) Help on function tri_insertion in module __main__: tri_insertion(L, f=<function <lambda>>) tri_insertion(L,f) trie la liste L dans l'ordre croissant des valeurs de la fonction f (par défaut, f est l'identité). |
Voici comment trier une liste d’entiers relatifs selon leurs valeurs absolues, ou par ordre décroissant. Cette nouvelle définition de tri_insertion et l’exemple du tri décroissant illustrent une utilisation commode des fonctions lambda :
|
1 2 3 4 5 6 7 8 9 |
>>> from random import sample # importe la fonction sample du module random >>> seq = sample(range(-99,100),10) # liste de 10 entiers différents dans [-99,99] >>> seq_backup = seq[:]; seq # copie de sauvegarde, contenu initial de seq [13, -5, -79, 68, -95, -59, 36, -14, -91, 30] >>> tri_insertion(seq,abs); seq # tri par valeurs absolues, et nouveau contenu de seq [-5, 13, -14, 30, 36, -59, 68, -79, -91, -95] >>> seq = seq_backup[:] # récupération de la sauvegarde >>> tri_insertion(seq,lambda x: -x); seq # tri décroissant, et nouveau contenu [68, 36, 30, 13, -5, -14, -59, -79, -91, -95] |