💻 NSI1rePremièreSans inscription

Python — Programmation orientée objet et récursivité

Programme en vigueur — arrêtés du 17 janvier 2019, applicable en Première depuis la rentrée 2019. Voir le texte

POO : classe, attribut, méthode, encapsulation, héritage. Récursivité : cas de base, appel récursif, pile d'appels. Factorielle, Fibonacci. Gestion des exceptions (try/except). Modules (os, math, csv).

La règle d'or

Affecter une variable ne copie pas l'objet : cela lui donne un second nom, et modifier l'un modifie ce que voit l'autre.

L'erreur que tout le monde fait

Croire qu'affecter une liste à une nouvelle variable en crée une copie indépendante.

Les deux noms désignent le même objet en mémoire : ajouter un élément par l'un le fait apparaître par l'autre. L'effet est le même quand une liste est passée à une fonction, ce qui explique des modifications apparemment inexpliquées de données que la fonction n'était pas censée toucher.

Créer explicitement une copie lorsqu'une indépendance est voulue, et se demander si l'objet manipulé est modifiable.

Notions à maîtriser

  • classe
  • héritage
  • encapsulation
  • récursivité
  • factorielle
  • exception
  • module
1

Réviser

Fiche de révision

POO et récursivité en Python : les bases

Python — Programmation orientée objet et récursivité 1. Programmation Orientée Objet (POO) La POO modélise les données sous forme d'objets (instances de classes) qui encapsulent

Lire la fiche

Affectez une liste à une nouvelle variable, modifiez la seconde, et regardez la première : elle a changé aussi. Ce n'est pas un piège du langage, c'est ce que fait une affectation — elle donne un second nom au même objet. Beaucoup de bugs incompréhensibles tiennent à cette seule phrase.

1Variables, noms et objets

Règle

Affecter une variable ne copie pas l'objet : cela lui donne un second nom, et modifier l'un modifie ce que voit l'autre. Pour les objets immuables — entiers, chaînes, tuples — la question ne se pose pas, puisqu'on ne peut pas les modifier en place. Pour les objets modifiables — listes, dictionnaires — elle se pose à chaque affectation, à chaque passage en argument de fonction et à chaque valeur par défaut.

Piège

Croire qu'affecter une liste à une nouvelle variable en crée une copie indépendante.

Pourquoi — Les deux noms désignent le même objet en mémoire : toute modification faite par l'un est visible par l'autre. L'effet se propage aux arguments de fonction — une fonction qui modifie une liste reçue modifie celle de l'appelant — et il est d'autant plus déroutant qu'il ne se manifeste pas avec des entiers ou des chaînes, sur lesquels les débutants testent d'abord. Pour obtenir une vraie copie, il faut la demander explicitement.

Le réflexe — Objet modifiable : se demander si l'on veut un alias ou une copie.

2La programmation orientée objet

Définition

Classe et instance — Une classe est un modèle : elle décrit les attributs — les données — et les méthodes — les opérations — que partageront ses objets. Une instance est un objet construit à partir de ce modèle. Le constructeur initialise les attributs propres à chaque instance : deux objets d'une même classe partagent leurs méthodes et possèdent chacun ses valeurs d'attributs.

Définition

Encapsulation — L'encapsulation consiste à regrouper dans un même objet les données et les opérations qui les manipulent, et à n'exposer qu'une interface d'usage. Son intérêt n'est pas la dissimulation : c'est de garantir que l'objet reste dans un état cohérent. Si toute modification passe par une méthode, cette méthode peut vérifier ce qu'elle reçoit ; si l'attribut est modifié directement de l'extérieur, aucune vérification n'est possible.

Définition

Héritage — L'héritage permet à une classe de réutiliser les attributs et méthodes d'une autre, en les spécialisant. La classe dérivée peut ajouter des membres et redéfinir une méthode existante. La relation à vérifier est « est un » : un carré est un rectangle, donc l'héritage se discute. En revanche une voiture n'est pas un moteur — elle en possède un, et c'est une composition, non un héritage.

3La récursivité

Règle

Une fonction récursive s'appelle elle-même. Elle exige deux éléments, et l'oubli du premier est l'erreur la plus fréquente : un cas de base, qui renvoie une valeur sans appel récursif, et un appel récursif qui se rapproche strictement de ce cas de base. Sans cette progression, les appels s'empilent jusqu'à saturer la pile d'appels.

Exemple

Écrire la factorielle de façon récursive et vérifier sa terminaison.

  1. Cas de base : la factorielle de 0 vaut 1, sans aucun appel récursif.
  2. Appel récursif : la factorielle de n vaut n multiplié par la factorielle de n − 1.
  3. La progression est stricte — n diminue de 1 à chaque appel — donc le cas de base est atteint. Pour n = 4 :

factorielle(4) = 24

Chaque appel non terminé occupe une place dans la pile d'appels, ce qui limite la profondeur possible. Une récursivité naïve sur la suite de Fibonacci recalcule en outre les mêmes valeurs un nombre considérable de fois : elle est correcte et inutilisable au-delà de quelques dizaines de termes. Correction et efficacité sont deux propriétés distinctes.

4Exceptions et modules

Propriété

Une exception signale une situation qu'une fonction ne peut pas traiter elle-même : fichier absent, division par zéro, conversion impossible. Le bloc try/except permet de la rattraper et de décider quoi faire. Deux règles d'usage : rattraper le type d'exception précis que l'on sait traiter, et ne jamais rattraper toutes les exceptions pour n'en rien faire — un programme qui masque ses erreurs échoue silencieusement, ce qui est pire qu'un arrêt net.

Un module est un fichier de code réutilisable qu'on importe. La bibliothèque standard en fournit pour les mathématiques, l'accès au système de fichiers, la lecture de fichiers tabulaires, les dates. Importer un module existant plutôt que réécrire une fonction n'est pas de la paresse : le code importé est testé par bien plus d'utilisateurs que le vôtre ne le sera.

Écrire une fonction récursive qui se termine

  1. Écrire d'abord le cas de base : quelle est la plus petite entrée, et que renvoie-t-on alors ?
  2. Formuler le cas général en fonction d'un cas plus petit, sans chercher à dérouler les appels.
  3. Vérifier que chaque appel se rapproche strictement du cas de base.n décroît de 1 à chaque appel et atteint 0.
  4. Tester sur la plus petite entrée, puis sur la suivante : les deux premiers cas valident la structure.
  5. Vérifier la profondeur atteinte, et le nombre d'appels répétés avant de conclure à l'efficacité.
  • ▢Ai-je distingué un alias d'une copie pour mes objets modifiables ?
  • ▢Ma fonction modifie-t-elle une liste reçue en argument ? Est-ce voulu ?
  • ▢Ma classe distingue-t-elle attributs et méthodes ?
  • ▢Mon héritage passe-t-il le test « est un » ?
  • ▢Ma fonction récursive a-t-elle un cas de base atteint à coup sûr ?
  • ▢Mes exceptions rattrapées sont-elles précises et effectivement traitées ?

L'essentiel en 11 points

  • ·Une affectation donne un second nom, elle ne copie pas.
  • ·Objets immuables : entiers, chaînes, tuples. Modifiables : listes, dictionnaires.
  • ·Une fonction qui modifie une liste reçue modifie celle de l'appelant.
  • ·Classe : le modèle. Instance : l'objet construit. Attributs et méthodes.
  • ·L'encapsulation garantit un état cohérent, elle ne dissimule pas.
  • ·Héritage : vérifier la relation « est un » — sinon c'est une composition.
  • ·Récursivité : un cas de base et une progression stricte vers lui.
  • ·Sans cas de base, la pile d'appels sature.
  • ·Une récursivité peut être correcte et inutilisable : Fibonacci naïf.
  • ·Rattraper une exception précise et la traiter ; jamais masquer en silence.
  • ·Importer un module éprouvé pour ce qui est difficile à écrire correctement.
2

Imprimer

Fiche PDF — Python — Programmation orientée objet et récursivité

Gratuit · sans compte

Trois documents à imprimer, 6 pages en tout : le cours, les exercices avec la place pour écrire, et le corrigé détaillé avec son barème.

Au sommaire du cours

  1. 1. Variables, noms et objets
  2. 2. La programmation orientée objet
  3. 3. La récursivité
  4. 4. Exceptions et modules

Conforme au programme officiel · version 2026.1.

3

Exercices corrigés

1

Vocabulaire. Répondre en une phrase précise.

Connaître
  1. a.Que fait exactement une affectation de variable ?
  2. b.Différencier une classe et une instance.
  3. c.Qu'est-ce que l'encapsulation ? Quel est son intérêt réel ?
  4. d.Quels sont les deux éléments indispensables d'une fonction récursive ?
  5. e.À quoi sert une exception ?
›Voir le corrigé
  1. a. Elle donne un second nom au même objet ; elle ne le copie pas.
  2. b. La classe est un modèle décrivant attributs et méthodes ; l'instance est un objet construit à partir de ce modèle.
  3. c. Regrouper données et opérations dans un objet et n'exposer qu'une interface. Son intérêt est de garantir un état cohérent, non de dissimuler.
  4. d. Un cas de base sans appel récursif, et un appel récursif qui s'en rapproche strictement.
  5. e. À signaler une situation que la fonction ne peut pas traiter elle-même, pour qu'un appelant décide quoi faire.
2

Une fonction reçoit une liste et y ajoute un élément. L'appelant constate que sa propre liste a changé.

Analyser
  1. a.Pourquoi la liste de l'appelant a-t-elle changé ?
  2. b.Le même phénomène se produirait-il avec un entier ? Pourquoi ?
  3. c.Comment obtenir le comportement inverse, si on ne le voulait pas ?
  4. d.Pourquoi ce comportement surprend-il souvent les débutants ?
›Voir le corrigé
  1. a. Parce que le paramètre et la variable de l'appelant nomment le même objet. La fonction n'a pas reçu une copie : elle a reçu un second nom.
  2. b. Non. Un entier est immuable : on ne peut pas le modifier en place, seulement faire pointer le nom vers un autre entier — ce qui n'affecte pas l'appelant.
  3. c. En copiant explicitement la liste avant de la modifier, et en travaillant sur la copie.
  4. d. Parce qu'ils testent d'abord sur des entiers et des chaînes, qui sont immuables : le phénomène ne s'y manifeste pas. Ils en tirent une règle générale fausse, que les listes viennent contredire plus tard.
3

Récursivité. Raisonner sur la terminaison et le coût.

Raisonner
  1. a.Écrire en français le cas de base et le cas général de la factorielle.
  2. b.Calculer la factorielle de 4 en déroulant.
  3. c.Que se passe-t-il si le cas de base est oublié ?
  4. d.Une récursivité naïve sur Fibonacci est-elle correcte ? Est-elle utilisable ?
  5. e.Que faut-il retenir de la distinction entre ces deux propriétés ?
›Voir le corrigé
  1. a. Cas de base : la factorielle de 0 vaut 1. Cas général : la factorielle de n vaut n multiplié par la factorielle de n − 1.
  2. b. En déroulant :
  3. Soit 24.
  4. c. Les appels s'empilent sans fin jusqu'à saturer la pile d'appels, et le programme s'interrompt sur une erreur de profondeur.
  5. d. Elle est correcte — elle renvoie les bonnes valeurs — et inutilisable au-delà de quelques dizaines de termes, parce qu'elle recalcule les mêmes valeurs un nombre considérable de fois.
  6. e. Que correction et efficacité sont deux propriétés distinctes, et qu'une fonction peut satisfaire la première sans la seconde. Tester qu'un programme donne le bon résultat ne dit rien de sa capacité à le donner sur des entrées réalistes.
4

Objet et exceptions. Analyser.

Argumenter
  1. a.Un carré doit-il hériter de rectangle ? Un moteur et une voiture ?
  2. b.Pourquoi l'encapsulation permet-elle de garantir un état cohérent ?
  3. c.Pourquoi ne faut-il pas rattraper toutes les exceptions sans rien en faire ?
  4. d.Pourquoi importer un module plutôt que réécrire une fonction ?
  5. e.Ce dernier argument vaut-il sans réserve ?
›Voir le corrigé
  1. a. Le test est « est un ». Un carré est un rectangle : l'héritage se discute. Une voiture n'est pas un moteur : elle en possède un, c'est une composition.
  2. b. Parce que si toute modification passe par une méthode, celle-ci peut vérifier ce qu'elle reçoit. Un attribut modifiable de l'extérieur ne permet aucune vérification.
  3. c. Parce que le programme masque ses erreurs et continue dans un état incohérent : il échouera plus tard, ailleurs, de façon incompréhensible. Un arrêt net est préférable à un échec silencieux.
  4. d. Parce que le code importé est testé par bien plus d'utilisateurs que le vôtre ne le sera, et souvent optimisé.
  5. e. Non. Une dépendance ajoute une surface à maintenir, doit être à jour, et peut disparaître ou changer d'interface. Pour une fonction de trois lignes, l'importer coûte plus qu'il ne rapporte. L'argument vaut pour ce qui est difficile à écrire correctement — dates, encodages, calcul numérique —, pas pour tout.

Ce qui rapporte des points, ce qui en coûte

  • Expliquer qu'une affectation crée un alias5 ptsPerdu si : Croire qu'affecter une liste la copie
  • Distinguer classe et instance3 ptsPerdu si : Confondre le modèle et l'objet
  • Justifier un héritage par la relation est un4 ptsPerdu si : Faire hériter une voiture d'un moteur
  • Écrire une récursivité qui se termine5 ptsPerdu si : Omettre le cas de base
  • Distinguer correction et efficacité3 ptsPerdu si : Conclure qu'un résultat juste suffit
4

La méthode

Écrire une fonction récursive qui se termine

  1. 1

    Énoncer le cas de base, celui qui se résout sans appel supplémentaire.

  2. 2

    Exprimer le cas général en fonction d'un cas strictement plus petit.

  3. 3

    Vérifier que chaque appel rapproche du cas de base, sans quoi la pile d'appels déborde.

    Chaque appel en attente occupe de la mémoire jusqu'à ce que le suivant ait répondu.

  4. 4

    Dérouler la fonction à la main sur un petit exemple pour contrôler l'ordre des retours.

  5. 5

    Comparer le coût obtenu à celui d'une version itérative avant de choisir.

5

Se tester

NSIPremière
Question 1
Identifie l'erreur dans le code Python suivant, qui tente de calculer la factorielle d'un entier nn en utilisant une approche récursive, mais plante pour n=0n=0 :

Aucun compte requis — réponds, la correction s'affiche aussitôt.

Signaler une erreur

Se tester en conditions de contrôle

1 contrôle sur ce chapitre, chacun avec sa durée, son barème sur vingt et un corrigé qui explique chaque réponse.

Garder ta progression ?

Tes réponses sont déjà comptées dans ce navigateur. Un compte gratuit les conserve d'un appareil à l'autre et débloque le suivi de tes points faibles.

Questions fréquentes

Python — Programmation orientée objet et récursivité : c'est en quelle classe ?

Ce chapitre est au programme de NSI au lycée, en classe de Première, année du Bac de français. Il est défini par le Bulletin Officiel de l'Éducation nationale, le texte de référence qui fixe ce qui doit être enseigné dans chaque matière.

Que faut-il savoir sur Python — Programmation orientée objet et récursivité ?

POO : classe, attribut, méthode, encapsulation, héritage. Récursivité : cas de base, appel récursif, pile d'appels. Factorielle, Fibonacci. Gestion des exceptions (try/except). Modules (os, math, csv). Les notions à maîtriser sont : classe, héritage, encapsulation, récursivité, factorielle, exception.

Où télécharger la fiche PDF de Python — Programmation orientée objet et récursivité ?

Sur cette page, dans le bloc « Imprimer » : 3 documents à télécharger — le cours, les exercices et le corrigé — soit 6 pages au format A4, prêtes à imprimer. Le téléchargement est gratuit, immédiat, et ne demande ni compte ni adresse e-mail.

Le corrigé de Python — Programmation orientée objet et récursivité est-il fourni ?

Oui, et c'est un document à part : chaque exercice y est repris étape par étape, avec le barème détaillé en fin de fiche — ce qui est attendu, combien de points, et ce qui fait perdre le point. Un parent qui ne se souvient plus du programme peut corriger une copie avec.

Python — Programmation orientée objet et récursivité peut-il tomber au Bac de français ?

Ce chapitre fait partie du programme officiel de Première, il entre donc dans le périmètre du Bac de français. Le sujet exact varie chaque année et aucun chapitre n'est garanti, mais l'ensemble du programme de l'année est susceptible d'être évalué : mieux vaut ne pas parier sur des impasses.

Comment réviser Python — Programmation orientée objet et récursivité efficacement ?

Commence par lire la fiche de révision pour remettre la règle en place, puis enchaîne immédiatement sur le quiz de cette page. Répondre juste après avoir lu ne suffit pas : reviens sur le chapitre deux ou trois jours plus tard. C'est l'espacement des révisions, plus que leur durée, qui fait tenir une notion en mémoire. Une session de quinze minutes répétée vaut mieux qu'une heure unique.

Faut-il un compte pour s'entraîner sur Python — Programmation orientée objet et récursivité ?

Non. Les quiz, les corrections détaillées et les fiches de révision sont accessibles sans créer de compte et sans donner d'adresse e-mail. Le compte gratuit sert uniquement à conserver la progression d'un appareil à l'autre.