Salut,
Il pourrait effectivement être préférable d’écrire un tutoriel sur une partie que tu connais bien et qui t’intéresse plutôt que de te lancer dans un tuto global. Ce n’est pas qu’avoir deux tutos généraux sur Python soit fondamentalement un problème, c’est surtout que pour que ce soit intéressant (pour les lecteurs, mais aussi pour le rédacteur qui investit du temps dans l’écriture du contenu !), il faut qu’il apporte quelque chose que le premier n’a pas. Par exemple une approche ou une pédagogie différente.
Par ailleurs, et plus embêtant, il y a tout de même de nombreuses approximations/erreurs dans ce qui a été rédigé jusqu’à présent. J’ai l’impression que tu manques un peu de recul sur le fonctionnement de Python et sur la programmation en général. Si ce n’est pas forcément bloquant pour rédiger un tutoriel sur le sujet, ça veut tout de même dire que l’effort de rédaction pour être à la fois clair et exact sera d’autant plus important que tu vas viser large avec le tuto.
Je mets trois exemples de trucs qui m’ont interpellés à la lecture.
Ce que l’on appelle, dans le jargon de l’informatique, une variable, c’est une chambre à laquelle on a donné un nom. Elles portent leur nom du fait que l’occupant de la chambre peut varier.
En réalité, ces "chambres d’hôtel" sont des emplacements de mémoire sur votre mémoire vive (RAM), et les "numéros de chambre" des adresses mémoire en binaire.
La métaphore des chambres d’hôtels avec des noms sur la porte et le contenu qui change pour représenter des emplacements mémoire avec des noms de variable la valeur associée est pas trop mauvaise pour certains langages, mais se casse la gueule en Python. En Python, une variable est plutôt une étiquette faiblement associée à une valeur, et complètement séparée de l’emplacement mémoire d’une part (c’est un truc que Python abstrait), et des changement potentiels de cette valeur (on peut changer la valeur des objets mutables sans déplacer l’étiquette, et on peut aussi déplacer l’étiquette sur un autre objet). Pour reprendre ton analogie, les variables seraient plutôt des petits panneaux qu’on peut déplacer d’une chambre à l’autre à volonté, certains occupants peuvent changer sans toucher à ce panneau et d’autres occupants ne peuvent pas changer sans détruire toute la chambre et en construire une autre (en faisant suivre le panneau ou non). Ah, et les chambres peuvent changer de place toutes seules. Évidemment, ça rend l’analogie beaucoup moins utile, et surtout ce serait rentrer dans un niveau de détail trop grand trop tôt. Éviter les analogies foireuses et se contenter de dire que déclarer une variable en Python veut juste dire mettre une étiquette sur une valeur me parait plus simple, et surtout moins faux.
On peut effectuer trois principales opération avec une variable :
- la déclarer (=la créer)
- lui affecter une valeur (=changer l’occupant de la chambre)
- utiliser sa valeur (=récupérer une copie de l’occupant actuel de la chambre)
Faut faire gaffe avec l’utilisation du mot copie. En Python, les variables sont plutôt des références vers les PyObject
. Selon leur mutabilité et la façon dont ces "références" sont capturées, ça peut conduire à des choses bizarres.
Un itérateur, quand à lui, est une variable dont la valeur change à chaque tour de boucle
Heu non… Un itérateur est un objet qui se charge de traverser un itérable. C’est lui qui s’occupe de se rappeler où on en est dans l’itérable, et de produire les éléments les uns après les autres. Dans la boucle for i in range(5)
, l’itérable est range(5)
, l’itérateur est un objet qu’on ne manipule pas directement mais qu’on pourrait créer avec iter(range(5))
et i
prend les valeurs des éléments "contenus" dans le range
. De manière plus générale, un Iterable
est un objet qui implémente __iter__(self) -> Iterator[T]
, et un Iterator[T]
est un objet qui implémente __next__(self) -> T
(et diverge avec l’exception StopIteration
).
Mais ce que je voulais surtout dire à part ce point de sémantique est que toute cette partie sur les boucles et les itérateurs est beaucoup trop rapide pour être compréhensible par quelqu’un qui découvre la programmation. Tu présentes while
relativement lentement, avec un petit exemple, puis tout le reste est très rapide en comparaison. C’est dommage parce que la notion d’itérable en Python est très souvent utilisée, donc ça vaut le coup de prendre bien le temps de l’expliquer, notamment en insistant sur les contrats qu’elle implique (ce qui nécessite de pas se planter sur ce qu’est un itérateur). Ça peut être plus loin dans le tutoriel bien sûr, mais là en l’état c’est trop tôt et trop court pour être utile au lecteur.
Troisième exemple, toute la partie sur la présentation de ce qu’est la POO et de l’héritage. À ta décharge, c’est un truc qui est très mal expliqué (et probablement encore plus mal compris) un peu partout. Tu tombes dans l’erreur classique de tenter de donner un exemple de la vie de tous les jours (ici Animal > Humain > {Homme, Femme}
) pour expliquer ce que sont des classes et aussi pour expliquer l’héritage. Si ça peut aider à comprendre certaines choses dans certains contextes, ça empêche complètement de comprendre beaucoup de choses plus fondamentales parce que l’exemple est beaucoup trop artificiel :
- à quoi sert concrètement la POO dans un problème de programmation concret (i.e. c’est un moyen d’abstraction) ;
- comment modéliser correctement un problème donné pour ne pas que la complexité du programme et de l’API explose en vol (les principes SOLID et autres considérations de software design en POO) ;
- comment utiliser la composition à bon escient pour bien partager les responsabilités ;
- pourquoi l’héritage est (ironiquement) l’une des pires façon de modéliser un problème du genre
Animal > Humain > {Homme, Femme}
, et de réutiliser du code en général ;
- dans le cadre de Python, comment l’héritage et les ABC d’une part et les protocoles d’autres part permettent d’écrire du code polymorphique sans se perdre dans les différents contrats à respecter.