Apprendre à programmer avec Python 3

a marqué ce sujet comme résolu.

Bonsoir,

Encore merci pour cet impressionnant travail de relecture. Il me semblait avoir ctrl+f toutes les chaines, visiblement certaines étaient bien cachées. Je ferais une mise à jour probablement mardi, je passe juste en coup de vent ce soir.

Encore merci et bonne fin de week-end.

Bonjour les agrumes !

La bêta tutoriel « Apprendre à programmer avec Python 3 » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Plusieurs points :

  • Le chapitre sur les chaînes retourne dans les cartons pour le moment, il reviendra après la première validation.
  • Les corrections de Smokiev sont appliquées.
  • Un schéma a fait son apparition ici. Il s'agit d'un premier jet, il est prévu que la taille soit légèrement réduite et le fond blanc supprimé. Avant que d'autres n'arrivent, j'aimerais déjà avoir un premier ressenti sur celui-ci.

Merci à vous et bonne soirée.

Bonjour,

J'ai lu hier l'ensemble de la version la plus à jour du tutoriel, et j'ai ensuite survolé ce topic, donc certaines remarques que je vais faire ont déjà pu être relevées. Je vas essayer d'être exhaustif et de présenter tous les points qui m'ont irrité lors de la lecture, certains peuvent être un poil excessifs, mais au moins tout est là.

  • Beaucoup de fautes d'orthographe, de conjugaison et d'accords. J'avais commencé à les lister puis je me suis découragé. Beaucoup de é/er par exemple, j'ai aussi vu un « modifions » à la place de « modifier », voir/voire, etc. ;
  • Tu dis « Ainsi, un code fonctionnant sur Python 2 ne marchera pas forcément sur Python 3 et réciproquement. », « réciproquement » ne me semble pas être le mot adapté, peut-être voulais-tu dire « et inversement » ?
  • Tu considères Python comme installé par défaut sur GNU/Linux, c'est en partie faux. Il est très souvent installé car de nombreux programmes en dépendent, mais ça n'est pas obligatoire ;
  • Le lien vers Sympy est mal formaté ;
  • Tu indiques qu'il ne peut pas y avoir deux étiquettes avec un même nom correspondant à deux valeurs différentes. C'est faux quand on introduit les scopes, donc je ne vois pas l'intérêt de cette phrase ;
  • Les caractères accentués sont autorisés dans les noms de variables/fonctions depuis Python 3. Déconseillés, mais autorisés ;
  • Le lecteur est vouvoyé dans l'ensemble du tutoriel, mais parfois il est considéré au singulier, et d'autres au pluriel : revois l'utilisation de tes « vous » pour éviter de te mélanger ;
  • Au moment d'introduire les variables, tu indiques au lecteur qu'il a déjà manipulé des variables de deux types. C'est faux, il y a entre autres les tuples (lors de l'assignation multiple), et les fonctions ;
  • Il n'existe pas seulement ', " et """ pour les chaînes de caractères en Python, il y a aussi ''' ;
  • Le backslash ne sert pas à échapper le caractère qui le précède, mais celui qui le suit ;
  • La présentation des variables manque d'une introduction expliquant leur utilité. En l'état, je ne vois pas quel intérêt j'aurais à utiliser a plutôt que 5 ;
  • Tu parles de l'indentation, mais tu ne dis pas clairement que l'indentation de 4 espaces est celle préconisée par l'écosystème Python ;
  • « sinon si age est strictement plus petit » : strictement plus petit que 0 ;
  • Tu parles de condition qui renvoie True. Une condition ne renvoie rien, elle s'évalue ;
  • Je trouve maladroit le passage sur if a == True. a est déjà un booléen dans ton cas, a == True en est un autre, pourquoi pas tester a == (a == True) == True ?
  • Dans tes tables de vérité, pourquoi utiliser 1 et 0 plutôt que True et False ?
  • Tu commences par « illustrer l'utilité des boucles » sans expliquer de quoi il s'agit ;
  • Ton calcul du PGCD est faux, le plus grand diviseur commun de 6 et 12 est 6, puisque 12 = 2 × 6 ;
  • Tu préconises d'utiliser des noms anglais pour les variables, et tu les nommes en français tout le long du tutoriel ;
  • Tu donnes des conventions sur le nom des variables, mais pas sur celui des fonctions ;
  • Ta fonction affiche_menu interroge l'utilisateur. Étrange pour une fonction dont le nom indique qu'elle affiche quelque chose ;
  • Tu utilises print('# ' + texte) sans avoir présenté la concaténation de chaînes, et là où un print('#', texte) serait plus judicieux ;
  • Tu parles de retourner une erreur, encore une fois le terme est inexact, une erreur est levée/lancée, pas retournée ;
  • Tes explications sur la portée des variables locales sont assez confuses, voire fausses. Il ne s'agit pas de droit de lecture/écriture, juste que quand Python voit a = ... dans le corps de la fonction, il considère que la variable a est locale au scope. Donc une lecture avant l'assignation lève une erreur, car la variable locale n'existe pas encore ;
  • Tu montres global, ce qui me semble précipité, tu pourrais l'introduire beaucoup plus loin dans le tutoriel, et en profiter pour parler de nonlocal ;
  • Tu dis « le résultat de la dernière instruction de la fonction sera automatiquement renvoyé », mais la lambda ne contient pas d'instructions. La lambda est une instruction, dont le corps est composé d'une unique expression (qui peut elle-même se décomposer en sous-expressions, etc.) ;
  • Toutes les lambdas que tu utilises sont nommées, alors que tu les introduis comme fonctions anonymes. En tant que débutant je n'y verrais pas tellement d'intérêt pour les lambdas ;
  • Il n'est peut-être pas pertinent de parler des lambdas aussi tôt dans le tutoriel ;
  • Tu commences ton chapitre sur le découpage par « je vous annonce tout de suite qu'un module n'est rien d'autre qu'un fichier. », comme si le lecteur avait déjà entendu parler de la notion de module ;
  • Plutôt qu'insister sur la présence de l'entête précisant l'encodage, il me paraîtrait plus judicieux de l'omettre et d'insister pour que le développeur configure son éditeur de texte en UTF-8 ;
  • Tu dis que __name__ contient le nom du module qui a importé le module courant (tu parles d'ailleurs de fichier au lieu de module), c'est faux, il contient le nom du module courant ;
  • Dans les exemples d'import depuis les packages, tu ne parles pas de from package import module ;
  • À aucun moment dans le tutoriel tu ne parles de help, ça me semble important de le présenter quand l'utilisateur en est encore à la console interactive. De même, il serait intéressant de tout de suite montrer comment exécuter la console interactive avec un fichier en paramètre.

Désolé pour cette réponse tardive. Les points qui ne figurent pas dans ce message ont été pris en compte.

Tu considères Python comme installé par défaut sur GNU/Linux, c'est en partie faux.

C’est pour ça que j’ai mis « généralement ». En plus, j’ai plus souvent rencontré Python 2 par défaut. C’est pourquoi j’ai donné l’exemple pour une installation sous Debian et ses dérivées mais, tout comme pour la partie Mac, l’aide d’un utilisateur plus régulier est la bienvenue.

Le lecteur est vouvoyé dans l'ensemble du tutoriel, mais parfois il est considéré au singulier, et d'autres au pluriel.

Je reprendrai les chapitres pour les mettre au pluriel.

Au moment d'introduire les variables, tu indiques au lecteur qu'il a déjà manipulé des variables de deux types. C'est faux, il y a entre autres les tuples (lors de l'assignation multiple), et les fonctions ;

J’ai pris la décision de ne pas mentionner les tuples tout de suite pour ne pas submerger le lecteur. Je ne pense pas que de l’apprendre quelques chapitres plus loin porte préjudice, au contraire. De même pour les fonctions, je ne sais pas si introduire si tôt le fait qu’une fonction est une variable est nécessaire pour un débutant. Je reste néanmoins ouvert sur la question.

Tu parles de condition qui renvoie True. Une condition ne renvoie rien, elle s'évalue ;

Abus de langage, je vais corriger.

Je trouve maladroit le passage sur if a == True. a est déjà un booléen dans ton cas, a == True en est un autre, pourquoi pas tester a == (a == True) == True ?

Le but est d’essayer de faire comprendre que par exemple, après avoir écrit une fonction divisible7 qui renvoie un booléen, il n’est pas nécessaire d’écrire if divisible7(123456) == True : mais juste if divisible7(123456) :. Je vais essayer de clarifier l’idée, et si je n’y arrive pas, j’essayerais de placer ceci comme une remarque plus loin.

Tu commences par « illustrer l'utilité des boucles » sans expliquer de quoi il s'agit ;

L’idée est de poser le problème, et ensuite de présenter les boucles comme une solution à ce problème.

Tu préconises d'utiliser des noms anglais pour les variables, et tu les nommes en français tout le long du tutoriel ;

Il me semble que la philosophie de ZDS est d’être le plus francophone possible. Le tuto est donc facilement compréhensible par des personnes ne parlant pas l’anglais en l’état actuel. Si le lecteur possède des notions d’anglais, libre à lui de les utiliser : il ne s’agit que d’une recommandation.

Tu donnes des conventions sur le nom des variables, mais pas sur celui des fonctions ;

J’utilise « Les noms des fonctions suivent les mêmes règles que les noms des variables » pour éviter de faire un copier/coller de la liste. Je vais rajouter que les conventions sont aussi les mêmes

Tu parles de retourner une erreur, encore une fois le terme est inexact, une erreur est levée/lancée, pas retournée ;

Un autre abus de langage, en effet. Mauvaise habitude, quand tu nous tiens…

Tes explications sur la portée des variables locales sont assez confuses, voire fausses. Il ne s'agit pas de droit de lecture/écriture, juste que quand Python voit a = … dans le corps de la fonction, il considère que la variable a est locale au scope. Donc une lecture avant l'assignation lève une erreur, car la variable locale n'existe pas encore ;

Les droits étaient une idée pour tenter de mettre en évidence la différence entre les différents cas. Je vais voir comment mieux tourner l’idée.

Tu montres global, ce qui me semble précipité, tu pourrais l'introduire beaucoup plus loin dans le tutoriel, et en profiter pour parler de nonlocal ;

J’ai placé global assez tôt dans le tutoriel dans le cas où cette solution apparaitrait dans un forum. Le but est ici de prévenir que l’utilisation de global peut à long terme poser des problèmes si elle est mal maitrisée, même si sur le coup ça marche. Je laisse pour l’instant cette partie où elle est, mais si je lui trouve une place dans la suite du cours, elle sera reculée.

Il n'est peut-être pas pertinent de parler des lambdas aussi tôt dans le tutoriel ;

En effet, je vais les stocker dans un coin en attendant un moment plus opportun.

Plutôt qu'insister sur la présence de l'entête précisant l'encodage, il me paraîtrait plus judicieux de l'omettre et d'insister pour que le développeur configure son éditeur de texte en UTF-8 ;

Cette solution me parait plus souple. Si pour une raison quelconque le lecteur ne veut ou ne peut pas utiliser UTF-8, il pourra spécifier son encodage.

À aucun moment dans le tutoriel tu ne parles de help, ça me semble important de le présenter quand l'utilisateur en est encore à la console interactive. De même, il serait intéressant de tout de suite montrer comment exécuter la console interactive avec un fichier en paramètre.

Je vais trouver un endroit où présenter help. Je n’ai pas compris ce que tu entends par « exécuter la console interactive avec un fichier en paramètre ».

Concernant l’avancement, la beta sera mise à jour quand le chapitre sur les listes sera un peu plus étoffé. Suite à certains retours, le premier TP sera réécrit avec un exercice moins orienté mathématiques. Le changement sera fait en même temps que l’écriture du deuxième TP, dans le but d’essayer de lier les deux exercices.

Il me semble que la philosophie de ZDS est d’être le plus francophone possible. Le tuto est donc facilement compréhensible par des personnes ne parlant pas l’anglais en l’état actuel. Si le lecteur possède des notions d’anglais, libre à lui de les utiliser : il ne s’agit que d’une recommandation.

Mais le problèmes est que tes exemples sont en contradiction avec ces règles simples. En tant que lecteur, je vois mal le principe d'une recommandation si elle n'est pas respectée par l'auteur.

Cette solution me parait plus souple. Si pour une raison quelconque le lecteur ne veut ou ne peut pas utiliser UTF-8, il pourra spécifier son encodage.

Je pense qu'il serait préférable de montrer comment il est possible de préciser l'encodage, mais de ne pas insister dessus, et ne pas l'inclure dans tous les exemples de code.

Je vais trouver un endroit où présenter help. Je n’ai pas compris ce que tu entends par « exécuter la console interactive avec un fichier en paramètre ».

martinqt

python -i filename.py

tout comme pour la partie Mac, l’aide d’un utilisateur plus régulier est la bienvenue.

Je ne fais que passer, mais pour OS X, python 2 est installé avec le système, et il y a moyen d'installer python 3 soit avec le paquet officiel de python.org (je peut faire quelques screenshots au besoin), soit avec brew brew install python3.

+0 -0

Il me semble que la philosophie de ZDS est d’être le plus francophone possible. Le tuto est donc facilement compréhensible par des personnes ne parlant pas l’anglais en l’état actuel. Si le lecteur possède des notions d’anglais, libre à lui de les utiliser : il ne s’agit que d’une recommandation.

Mais le problèmes est que tes exemples sont en contradiction avec ces règles simples. En tant que lecteur, je vois mal le principe d'une recommandation si elle n'est pas respectée par l'auteur.

entwanne

Du coup, le plus simple est encore de ne pas faire cette recommandation, puisqu’il n’y a après tout aucune raison objective de coder en anglais un projet qui n’a pas de portée internationale, a fortiori dans un langage qui autorise les noms de variables/fonctions en UTF-8. :)

+2 -2

Bonjour les agrumes !

La bêta de votre tutoriel « Apprendre à programmer avec Python 3 » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


J’update la beta pour avoir un retour principalement sur les deux nouveaux chapitres, je suis conscient que certains points mentionnés sur la partie existante ne sont pas encore mis à jour. D'autres notions sur les listes arrivent.

Il me semble que la philosophie de ZDS est d’être le plus francophone possible. Le tuto est donc facilement compréhensible par des personnes ne parlant pas l’anglais en l’état actuel. Si le lecteur possède des notions d’anglais, libre à lui de les utiliser : il ne s’agit que d’une recommandation.

Mais le problèmes est que tes exemples sont en contradiction avec ces règles simples. En tant que lecteur, je vois mal le principe d'une recommandation si elle n'est pas respectée par l'auteur.

entwanne

Du coup, le plus simple est encore de ne pas faire cette recommandation, puisqu’il n’y a après tout aucune raison objective de coder en anglais un projet qui n’a pas de portée internationale, a fortiori dans un langage qui autorise les noms de variables/fonctions en UTF-8. :)

Dominus Carnufex

Le respect de la PEP-08 est une raison objective nécessaire et suffisante. A fortiori dans un langage qui encourage la distribution du code en open source.

À partir du moment où :

  • il est souvent impossible de prévoir si un code finira par être diffusé ou non,
  • la règle la plus importante est qu'un programme soit cohérent avec les bibliothèques qu'il utilise,
  • le langage a été pensé pour que certaines constructions se lisent de façon intuitive en anglais,

Il n'y a aucune raison objective de coder en français en Python sauf dans le cas d'exemples à vocation pédagogique.

+7 -1

Bonjour :)

Les chaines de caractères

chaînes // harmonisation

l'objet considéré, ici, notre chaîne de caractères et effectuent des actions sur celui-ci

l'objet considéré, notre chaîne de caractères ici, et effectuent des actions sur celui-ci

la conversion automatique en chaîne de caractère

caractères

des paramètres de format

format

Les listes : première approche

ce nouveau type de variable?

variable ?

vous êtes obligés

obligé // vu que vous utilisez le vous de politesse dans le reste du cours

celles-ci sont elle-même

elles-mêmes

1
clem = ['Clem', 'Savoir', 2, True] # Une liste contenant quatre éléments de types différents

je chipote mais 'Clem' et 'Savoir' sont du même type :D

deux chaines de caractères

chaînes // dans un soucis d'harmonisation

Nous n'avons néanmoins pas changer

changé

le nombre d'éléments présent

présents

[information] |

bloc d'information qui n'est pas passé

si vous avez définit

défini

La deuxième méthode utilise la méthode

La deuxième façon de faire est d'utiliser // pour éviter la répétition


Remarques générales :

  • Le fond me semble bon
  • Peut-être pourriez-vous rajouter un exercice à chaque fois pour utiliser et s'approprier les notions abordées (voire en profiter pour présenter une autre méthode) :)

À bientôt !

+0 -0

Après première lecture :

  • Chaînes de caractères
    • J'ai tiqué devant « Dans notre exemple, il est donc inutile pour replace d'avoir un troisième paramètre correspondant à la variable à modifier. », puisqu'il n'est pas question de modifier la chaîne ;
    • De manière générale, je trouve confuse l'explication des méthodes ;
    • "Bienvenu {}, cette page a été vue {} fois".format('Visiteur', 2) → « Bienvenue » ;) ;
    • Le type string/String n'existe pas ;
    • Tu « rappelles » comment concaténer des chaînes, mais il ne semble pas que ce soit introduit plus tôt ;
  • Listes
    • J'ai du mal à suivre le fil des premiers exemples : on veut faire une liste pour faciliter la vérification d'un anniversaire (un dictionnaire ne serait-il pas plus adapté ?), puis on perd la trace de ces anniversaires ;
    • « De façon générale, vous pouvez utiliser del pour supprimer une variable donnée », mouais, parler de suppression de variable n'a pas vraiment de sens en Python : del sert à déréférencer un objet en supprimant une étiquette. L'interpréteur se charge de libérer l'espace des variables non référencées quand bon lui semble ;

C'est corrigé, merci :)

Dr@zielux

De rien, j'ai vu dans la nouvelle bêta qu'il restait quelques points soulevés non corrigés comme :

ce nouveau type de variable?

variable ?

Tu « rappelles » comment concaténer des chaînes, mais il ne semble pas que ce soit introduit plus tôt ;

entwanne

Si, il me semble qu'ils en parlent brièvement dans la première partie

Hum oui je ne corrige que ce qui concerne le français sur le fond comme pour là les variables je laisse la main à martinqt :) Pareil pour l'exemple des 4 types différents je ne sais pas si il préfère en mettre un autre, ou en laisser que 3.

J'ai corrigé le bienvenue.

Bonjour les agrumes !

La bêta de votre tutoriel « Apprendre à programmer avec Python 3 » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Suite au message de Nohar et au vu de la répartition des votes, la recommandation reste pour l’instant.

Pour les 4/3 types de l’exemple, problème contourné : la fin du commentaire est supprimée et l’explication détaillée reste dans le paragraphe.

Je n’avais pas employé le terme de concaténation, mais la notion est présentée dans le TP. Le terme est maintenant introduit en même temps.

Il est prévu que le boucle for apparaisse dans le chapitre. L’exemple de l’anniversaire reviendra alors. Pour le dictionnaire, il sera introduit dans le chapitre suivant avec d’autres notions.

Je compte parler de référence dans le chapitre suivant avec les implications que cela pose sur la copie de listes. J’ai donc décidé d’utiliser « supprimer » à ce moment du cours.

PS : Smokiev, j’ai fait de mon mieux pour écrire « chaîne » à chaque fois, et je rate le plus gros ><

Je suppose qu'après les listes vous allez introduire les dictionnaires.

L'exemple donné : anniversaires

serait alors bien plus simple à traiter…

Ce n'est pas forcément simple de présenter les méthodes avant les classes et les objets.

Bravo pour ce travail !

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte