Malheureusement, ce tutoriel qui était en bêta a été supprimé par son auteur.
[Petite erreur, j'ai supprimé l'ancienne version et je n'ai pas l'URL de la nouvelle. ICI peut-être.]
Merci de vos relectures.
J'ai effectué un certain nombre de reprises. La plus importante concerne les parcours de listes. J'ai créé une sous-section
Boucle for : parcours d'une liste sans utiliser d'indices
et chaque fois que c'était possible (finalement assez souvent), j'ai utilisé cet idiome de parcours qui allège le code.
Toutefois ce procédé ne règle pas tous les problèmes. Je n'ai pas voulu utiliser l'idiome
for i, elt in enumerate(L, start)
car il donne une impression de complexité au débutant et m'entraînerait trop loin dans des explications. Mais surtout, je me suis rendu compte en récrivant certains codes que cet idiome ne règle pas certaines situations. Par exemple, j'avais le code suivant :
1 2 3 4 5 6 7 8 9 | L = [10, 3, 12, 5] maxi = L[0] n = len(L) for i, x in range(1, n): if L[i] > maxi: maxi = L[i] print(maxi) |
Le parcours n'a pas besoin de commencer à l'indice 0, il peut commencer à l'indice 1 puisque maxi réfère l'élément d'indice 0 que je ne vais bien entendu pas comparer à lui-même !!! Et c'est là que enumerate
ne va pas suffire tel quel puisque enumerate(L)
itère sur toute ma liste L. Bien sûr, je pourrais écrire une affreuseté comme :
1 2 3 | for i, elt in enumerate(): if i>0: # ETC |
mais c'est un code complètement absurde : si vous avez une liste de 1 million d'éléments, vous allez tester que vous n'êtes pas au début de la liste une fois ce début passé (donc 999999 tests inutiles) ? (même un slice serait absurde car un slice ferait 999999 copies de références).
Chaque fois qu'un parcours d'une liste L
va faire intervenir des conditions portant sur les indices (comme 3 indices après la position courante ou juste avant et juste après la position courante) utiliser enumerate
est inapproprié.
Enfin, on trouve dans le code officiel Python de très nombreux usages de for i in range(len(L))
, juste deux exemples sous Python3.4, dans mimetype.py :
1 2 3 4 | for i in range(len(words)): if words[i][0] == '#': del words[i:] break |
ou dans copy.py
1 2 3 4 5 6 | for i in range(len(x)): if x[i] is not y[i]: y = tuple(y) break else: y = x |
ça relativise
J'envoie le tuto à la validation d'ici la fin de la journée.