Recopier le meme bloc a la main, c'est long et source d'erreurs. Si on doit corriger la formule un jour, il faut la corriger PARTOUT - et on en oublie toujours une.
def cree la machine et lui donne un nom. Tant qu'on ne l'appelle pas (saluerLaForet()), rien ne se passe - la machine attend dans l'atelier.
On monte une marche a la fois : d'abord une simple action, puis une entree (un parametre dans la tremie), puis une sortie (un return au bec de la machine).
Le palier le plus simple : aucun parametre. Rien a verser dans la tremie, les parentheses restent vides : saluer(). On l'appelle, la machine fait son action - ici, afficher un message.
On verse un ingredient dans la tremie (le parametre nom) et la machine s'en sert. Mais rien ne sort au bec : pas de return. La machine agit (elle affiche), elle ne rend aucune valeur.
Les parametres sont les ingredients qu'on verse dans la tremie de la machine. On peut rappeler la meme machine avec des valeurs differentes - c'est toute la puissance !
print affiche une valeur a l'ecran - elle est perdue ensuite.
return fait sortir la valeur du bec de la machine - on peut la ranger dans une variable et la reutiliser.
En pratique on dit "fonction" pour les deux - mais connaitre la distinction aide a concevoir du code clair et reutilisable.
Les deux reçoivent quelque chose entre parentheses. La difference est a la sortie : afficherTruc agit puis s'arrete (pas de return) ; calculerChoseAvecTruc renvoie une valeur qu'on pourra reutiliser. Recevoir un parametre n'oblige jamais a retourner quelque chose.
| Le verbe | Reçoit | Retourne | Exemple |
|---|---|---|---|
| afficher / imprimer | des donnees | rien (montre a l'ecran ou ecrit un fichier) | afficherRapport(donnees) |
| calculer | des donnees | un nombre | calculerMoyenne(donnees) |
| lire / charger | rien (va chercher) | une liste / un tableau | lireExoplanetes() |
| filtrer / trier | une liste | une liste | filtrerRocheuses(planetes) |
| preparer / construire | des valeurs | du texte (une chaine) | preparerRapport(donnees) |
| verifier (est...) | un element | True ou False | estRocheuse(planete) |
Le verbe du nom annonce le contrat : afficher/imprimer agissent sans rien rendre ; calculer, lire, filtrer, preparer, verifier retournent un resultat qu'on reutilise. Bien nommer une fonction, c'est deja dire ce qui entre et ce qui sort.
dessinerMandala appelle dessinerCercles a chaque tour. On construit un dessin complexe en empilant de petites machines bien nommees.
Le caractere # commence un commentaire : Python l'ignore completement.
On commente le pourquoi, pas le quoi. Le code dit ce qu'il fait ; le commentaire dit pourquoi on le fait.
Toi dans 3 mois te remerciera.
La docstring, c'est la notice collee sur la machine : une phrase entre triples guillemets """…""", juste sous le def.
Elle dit ce que la machine fait. help(calculerAireRectangle) l'affiche - on comprend la machine sans ouvrir le capot.
assert verifie qu'une fonction donne le bon resultat. Si la condition est fausse, le programme s'arrete et signale le bug.
Tester sa machine avant de s'en servir, c'est l'habitude des bons programmeurs.
Ca marche ! Mais cette machine fait deux choses : elle compte et elle redige la phrase.
Avec une phrase toute faite, impossible : il faut tout reecrire. Le probleme n'est pas la f-string - elle est parfaite. C'est qu'elle est collee au comptage.
La f-string d'Adem a sa place - mais dans decrireForet, pas dans le comptage. Besoin d'un graphique demain ? Je garde compterArbres tel quel et j'ajoute dessinerForet. La machine qui compte ne change jamais.
Une fonction qui calcule retourne et n'affiche jamais. Une fonction qui affiche ne calcule jamais. Chaque machine, une seule mission.
Ouvre le jardin de mandalas. Repere les blocs de code repetes. Cree tes propres fonctions pour factoriser le dessin - et ecris tes assert pour verifier chaque machine avant de l'utiliser.