1. Qu’est-ce qu’un paradigme ?

Un paradigme de programmation est une manière d’organiser et de structurer un programme. Il définit comment on écrit les instructions et comment on manipule les données.

Un même langage peut permettre plusieurs paradigmes. C’est le développeur qui choisit la manière d’organiser son programme.

2. Le paradigme impératif

Le programme est vu comme une suite d’instructions exécutées dans l’ordre. Les variables sont modifiées au cours du temps.


def somme(liste):
    total = 0
    for nbre in liste:
        total = total + nbre
    return total
On décrit comment effectuer les étapes.

3. Le paradigme fonctionnel

Le programme est vu comme une composition de fonctions. Chaque fonction transforme des données et renvoie un résultat.


def ajouter(stock, produit, quantite):
    nouveau = stock.copy()
    nouveau[produit] = nouveau.get(produit, 0) + quantite
    return nouveau
On décrit ce que l’on veut obtenir.

4. Effets de bord et paramètres par défaut

En Python, certains effets de bord peuvent être invisibles. Un cas classique concerne les paramètres ayant une valeur par défaut modifiable (liste, dictionnaire…).

Exemple problématique


def ajouter(valeur, liste=[]):
    liste.append(valeur)
    return liste

print(ajouter(1))
print(ajouter(2))
print(ajouter(3))

Résultat obtenu :


[1]
[1, 2]
[1, 2, 3]
La liste par défaut [] est créée une seule fois lors de la définition de la fonction. Elle est ensuite réutilisée à chaque appel.

La fonction modifie donc toujours la même liste. Il s’agit d’un effet de bord caché.

Version correcte


def ajouter(valeur, liste=None):
    if liste is None:
        liste = []
    liste.append(valeur)
    return liste

print(ajouter(1))
print(ajouter(2))
print(ajouter(3))

Résultat :


[1]
[2]
[3]
Bonne pratique : Ne jamais utiliser une liste ou un dictionnaire comme valeur par défaut. Utiliser None et créer la structure à l’intérieur de la fonction.

4. Le paradigme orienté objet

Le programme est organisé autour d’objets qui regroupent des données et des méthodes.


class Stock:

    def __init__(self):
        self.produits = {}

    def ajouter(self, produit, quantite):
        self.produits[produit] = self.produits.get(produit, 0) + quantite
On structure le programme autour d’entités et d’interactions.

5. Comment choisir ?

En pratique, les logiciels modernes utilisent souvent plusieurs paradigmes dans un même programme.

6. Un même problème, trois paradigmes

Problème : on dispose d’une liste de notes.
On veut ajouter 1 point à chaque note sans dépasser 20.

Exemple : [12, 18, 9] devient [13, 19, 10].

6.1. Version impérative (modification en place)

On décrit les étapes et on modifie directement la liste.

def bonus(notes):
    for i in range(len(notes)):
        notes[i] = min(notes[i] + 1, 20)

notes = [12, 18, 9]
bonus(notes)
print(notes)  # [13, 19, 10]

6.2. Version fonctionnelle (transformation)

On produit une nouvelle liste sans modifier l’originale.

def bonus(notes):
    return [min(note + 1, 20) for note in notes]

notes = [12, 18, 9]
nouvelles_notes = bonus(notes)

print(notes)           # [12, 18, 9]
print(nouvelles_notes) # [13, 19, 10]

6.3. Version orientée objet (modélisation)

On regroupe les données et les actions dans une classe.

class Classe:

    def __init__(self, notes):
        self.notes = notes

    def ajouter_bonus(self):
        for i in range(len(self.notes)):
            self.notes[i] = min(self.notes[i] + 1, 20)

    def afficher(self):
        return self.notes

classe = Classe([12, 18, 9])
classe.ajouter_bonus()
print(classe.afficher())  # [13, 19, 10]
À retenir : le résultat est le même, mais l’organisation du programme change : impératif (étapes), fonctionnel (transformation), objet (modélisation).