Niveau 04 — Fonctions
Objectif du niveau
À la fin de ce niveau, tu sais écrire tes propres fonctions : les définir avec def, leur passer des paramètres, récupérer leur résultat avec return, et leur donner des valeurs par défaut. Tu sais décomposer un problème en plusieurs petites fonctions au lieu d'écrire un seul gros script, et tester chaque fonction à la main avant de l'assembler. Tu comprends aussi la portée des variables (scope) : pourquoi une variable créée dans une fonction n'existe pas dehors, et pourquoi c'est une bonne chose.
Prérequis
- Niveau 03 — structures de données : listes et dicts (on écrira des fonctions qui les reçoivent et les renvoient), mutabilité (indispensable pour comprendre ce qui se passe quand on passe une liste à une fonction).
- Niveau 02 — conditions et boucles, utilisées dans le corps de chaque fonction.
- Notions clés : mutabilité et références partagées (niveau 03-4), lire un traceback,
input()renvoie une chaîne.
Durée indicative et avertissement honnête
2 à 3 semaines à raison de 30–60 min par jour.
Deux choses vont résister, autant le savoir. D'abord return vs print : la moitié des débutants écrit des fonctions qui affichent au lieu de renvoyer, et ne comprend pas pourquoi resultat = ma_fonction() vaut None. Ensuite le scope (leçon 04-4) : c'est un des trois concepts vraiment difficiles de Python. Pourquoi cette variable est NameError ici mais pas là ? Pourquoi UnboundLocalError ? Prévois plus de temps et plus d'exercices sur cette leçon — c'est prévu dans son plan, ce n'est pas toi le problème. En revanche, la récompense est énorme : après ce niveau, ton code devient dix fois plus lisible et réutilisable.
Leçons prévues
Chaque leçon suivra le template 17 sections (lessons/TEMPLATE_LECON.md).
| N° | Titre | Notions couvertes | Statut |
|---|---|---|---|
| 04-1 | Pourquoi des fonctions, def et l'appel | Le problème du code dupliqué, définir vs appeler, paramètres et arguments, l'ordre d'exécution (définition ≠ exécution), nommer une fonction (verbe, anglais) | ✅ |
| 04-2 | return — renvoyer un résultat (≠ print !) | return vs print, une fonction sans return renvoie None, return stoppe la fonction, renvoyer plusieurs valeurs (tuple), chaîner des appels | ✅ |
| 04-3 | Paramètres avancés | Valeurs par défaut, arguments nommés (keyword), ordre des paramètres, le piège de la valeur par défaut mutable (def f(lst=[])), passer une liste : mutation visible dehors | ✅ |
| 04-4 | Scope — portée des variables ⚠️ difficile | Variables locales vs globales, NameError et UnboundLocalError, lecture vs affectation d'une globale, pourquoi éviter global, le scope comme protection | ✅ |
| 04-5 | Décomposer un problème et tester à la main | Découper un programme en fonctions (une fonction = une responsabilité), esquisser les signatures avant le code, tester chaque fonction dans le REPL ou avec des appels d'essai, assembler dans un main() | ✅ |
Pièges et erreurs emblématiques du niveau
- Confondre
printetreturn: la fonction affiche le bon résultat maisx = f()vautNone. L'erreur n°1 du niveau, de très loin. - Oublier les parenthèses à l'appel :
resultat = ma_fonction(sans()) ne plante pas —resultatcontient la fonction elle-même. Bug silencieux. - Code après
return: jamais exécuté, sans message d'erreur. - Valeur par défaut mutable :
def f(items=[])— la liste est partagée entre TOUS les appels. Piège célèbre, découle direct de la mutabilité (03-4). UnboundLocalError: affecter dans la fonction une variable qu'on voulait juste lire depuis l'extérieur — Python la considère locale partout.- Fonction fourre-tout : une fonction de 60 lignes qui fait tout. Pas une erreur Python, mais l'erreur de conception que la leçon 04-5 corrige.
Mini-projets du niveau
Fiches détaillées dans /projects.
- Refactoring du jeu de devinette — reprendre le projet du niveau 02 et le redécouper en fonctions (
ask_guess,check_guess,play_round,main). - Calculatrice à fonctions — une fonction par opération, une fonction de menu, une fonction de validation ; assemblage dans
main(). - Boîte à outils texte — petites fonctions réutilisables (compter les voyelles, inverser, capitaliser proprement…), testées une par une.
Critères de sortie
- Je sais définir une fonction avec paramètres et l'appeler avec des arguments, sans modèle.
- Je sais expliquer la différence entre
returnetprint, et dire ce que vautx = f()sifne renvoie rien. - Je sais écrire une fonction avec valeurs par défaut et l'appeler avec des arguments nommés.
- Je sais expliquer le piège de la valeur par défaut mutable et comment l'éviter (
=None). - Je sais prédire si une variable est locale ou globale, et diagnostiquer un
NameError/UnboundLocalError. - Je sais dire ce qui se passe quand on passe une liste à une fonction qui la modifie.
- Devant un problème, je sais proposer un découpage en 3–5 fonctions avec leurs signatures AVANT d'écrire le corps.
- Je sais tester une fonction à la main avec des appels d'essai, y compris les cas limites.
Commit de fin de niveau
git add lessons/level-04-fonctions
git commit -m "exercises: complete level 04 (functions)"