Semaine 2 - Jour 1 - 420-SN1

LES FONCTIONS

Ecris une fois, reutilise partout

D'abord, le code recopie

# Calcul 1 - rectangle de 3 x 4 largeurUn = 3 hauteurUn = 4 aireUn = largeurUn * hauteurUn print(aireUn) # Calcul 2 - rectangle de 5 x 2 largeurDeux = 5 hauteurDeux = 2 aireDeux = largeurDeux * hauteurDeux print(aireDeux) # Calcul 3 - rectangle de 7 x 1 largeurTrois = 7 hauteurTrois = 1 aireTrois = largeurTrois * hauteurTrois print(aireTrois)

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.

Une fonction, c'est une machine

def saluerLaForet(): print("Bonjour la foret !") # Pour declencher la machine, on l'APPELLE : saluerLaForet()

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.

Trois paliers, du plus simple au complet

1
def saluer(): print("Bonjour !") # pas d'entree, pas de sortie
2
def saluer(nom): print("Bonjour", nom) # une entree, pas de sortie
3
def calculerAireRectangle(largeur, hauteur): return largeur * hauteur # une entree ET une sortie

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 plus simple : une machine sans entree

def saluer(): print("Bonjour la classe !") # Les parentheses restent vides saluer() saluer() # on peut la rappeler autant de fois qu'on veut

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.

Une entree, mais rien ne sort

def saluer(nom): print("Bonjour", nom) saluer("Maya") # Bonjour Maya saluer("Liam") # Bonjour Liam

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.

Donner des ingredients : les parametres

def calculerAireRectangle(largeur, hauteur): return largeur * hauteur print(calculerAireRectangle(3, 4)) # 12 print(calculerAireRectangle(5, 2)) # 10 print(calculerAireRectangle(7, 1)) # 7

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 !

Recuperer le produit : return

# print = affiche a l'ecran, mais la valeur disparait print(calculerAireRectangle(5, 2)) # return = la valeur sort de la machine et on peut la garder superficieJardin = calculerAireRectangle(5, 2) print("Surface :", superficieJardin) # On peut ensuite reutiliser superficieJardin dans d'autres calculs coutEngrais = superficieJardin * 3.50

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.

Procedure ou fonction ?

PROCEDURE - fait une action

  • dessine quelque chose
  • affiche un message
  • ne retourne rien
def saluerLaForet():
    print("Bonjour !")

FONCTION - calcule et retourne

  • fait un calcul ou une transformation
  • produit une valeur
  • return en obligatoire
def calculerAireRectangle(l, h):
    return l * h

En pratique on dit "fonction" pour les deux - mais connaitre la distinction aide a concevoir du code clair et reutilisable.

Recevoir, ce n'est pas retourner

afficherTruc(truc)

  • reçoit un truc (parametre)
  • fait une action : montre, dessine, ecrit
  • ne retourne rien
def afficherMoyenne(donnees):
    print("Moyenne :", ...)

calculerChoseAvecTruc(truc)

  • reçoit un truc (parametre)
  • fait un calcul ou une transformation
  • retourne un resultat
def calculerMoyenne(donnees):
    return somme / nombre

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.

Les prototypes types de fonctions

Le verbeReçoitRetourneExemple
afficher / imprimerdes donneesrien (montre a l'ecran
ou ecrit un fichier)
afficherRapport(donnees)
calculerdes donneesun nombrecalculerMoyenne(donnees)
lire / chargerrien (va chercher)une liste / un tableaulireExoplanetes()
filtrer / trierune listeune listefiltrerRocheuses(planetes)
preparer / construiredes valeursdu texte (une chaine)preparerRapport(donnees)
verifier (est...)un elementTrue ou FalseestRocheuse(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.

Composer : une machine en actionne une autre

def dessinerCercles(tortue, taille, nombreCercles, decrement): for cercle in range(nombreCercles): tortue.circle(taille) taille = taille - decrement def dessinerMandala(tortue, taille, nombreCercles, decrement, repetitions): for tour in range(repetitions): dessinerCercles(tortue, taille, nombreCercles, decrement) tortue.right(360 / repetitions)
V

dessinerMandala appelle dessinerCercles a chaque tour. On construit un dessin complexe en empilant de petites machines bien nommees.

Expliquer son code : les commentaires

# BON commentaire : il explique le POURQUOI hauteurMinimale = 5 # seuil reglementaire Natura 2000 # MAUVAIS commentaire : il repete l'evident compteur = 0 # on met compteur a zero

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.

Coller la notice : la docstring

def calculerAireRectangle(largeur, hauteur): """Renvoie l'aire d'un rectangle (largeur x hauteur).""" return largeur * hauteur # La notice est lisible par tout le monde : help(calculerAireRectangle)

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.

Verifier sa machine : les jeux d'essais

def calculerAireRectangle(largeur, hauteur): return largeur * hauteur # Jeux d'essais : la machine donne-t-elle le bon produit ? assert calculerAireRectangle(3, 4) == 12 assert calculerAireRectangle(0, 5) == 0 assert calculerAireRectangle(2, 2) == 4

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.

Et si demain je veux…

def compterArbres(foret): # ... on compte ... return f"{compteurBouleau} bouleaux, {compteurSapin} sapins"

Ca marche ! Mais cette machine fait deux choses : elle compte et elle redige la phrase.

  • … les memes chiffres dans un graphique a barres ?
  • … la phrase en anglais ?
  • additionner les sapins de deux forets ?

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.

Une mission par fonction

def compterArbres(foret): # MISSION : compter # ... on compte ... return compteurBouleau, compteurSapin, compteurEpinette def decrireForet(bouleau, sapin, epinette): # MISSION : mettre en mots return f"{bouleau} bouleaux, {sapin} sapins et {epinette} epinettes" # Le programme principal orchestre les deux machines : bouleau, sapin, epinette = compterArbres(maForet) print(decrireForet(bouleau, sapin, epinette))

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.

La regle d'or

QUI CALCULE

  • fait un calcul
  • return obligatoire
  • jamais de print
def compterArbres(foret):
    return total

QUI AFFICHE

  • montre a l'ecran
  • print seulement
  • jamais de calcul
def afficherForet(texte):
    print(texte)

Une fonction qui calcule retourne et n'affiche jamais. Une fonction qui affiche ne calcule jamais. Chaque machine, une seule mission.

A TOI DE JOUER

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.

code.experimentations.xyz/fun/jardin/

AU TRAVAIL !

Seance 2-1 : transforme ton code repete en fonctions, ecris tes assert
⤺ Refermer le diaporama