Aller au contenu

Chapitre 1 - Partie 3 : Modularité et paradigmes de programmation


Un programme de grande taille, écrit dans un seul fichier, devient vite illisible et difficile à maintenir. La modularité consiste à découper le code en modules indépendants, chacun responsable d'une fonctionnalité précise.

AvantageDescription
LisibilitéChaque module a un rôle clair et limité
RéutilisabilitéUn module peut être utilisé dans plusieurs projets
MaintenanceOn peut modifier un module sans toucher aux autres
Travail en équipeChaque développeur travaille sur des modules différents
TestsChaque module peut être testé indépendamment

Un module Python est simplement un fichier .py contenant des fonctions, des classes et des variables.

Créer un module geometrie.py :

"""Module de calculs géométriques."""
import math
def aire_cercle(rayon):
"""Calcule l'aire d'un cercle de rayon donné."""
return math.pi * rayon ** 2
def perimetre_cercle(rayon):
"""Calcule le périmètre d'un cercle de rayon donné."""
return 2 * math.pi * rayon
def aire_rectangle(longueur, largeur):
"""Calcule l'aire d'un rectangle."""
return longueur * largeur

Utiliser le module dans un autre fichier :

import geometrie
print(geometrie.aire_cercle(5)) # 78.53981633974483
print(geometrie.perimetre_cercle(5)) # 31.41592653589793

Ou en important des fonctions spécifiques :

from geometrie import aire_cercle, aire_rectangle
print(aire_cercle(5))
print(aire_rectangle(4, 3))

Pour qu'un module puisse être à la fois importé et exécuté directement :

geometrie.py
def aire_cercle(rayon):
import math
return math.pi * rayon ** 2
if __name__ == "__main__":
# Ce code ne s'exécute que si le fichier est lancé directement
print("Test :", aire_cercle(5))

Une API (Application Programming Interface) est un ensemble de fonctions, classes et constantes mises à disposition par une bibliothèque ou un service. L'API définit ce que l'on peut faire (l'interface) sans révéler comment c'est fait (l'implémentation).

Python possède une riche bibliothèque standard (modules inclus par défaut) :

ModuleFonctionnalité
mathFonctions mathématiques (sqrt, cos, pi, etc.)
randomGénération de nombres aléatoires
osInteraction avec le système d'exploitation
csvLecture/écriture de fichiers CSV
sqlite3Interface avec les bases de données SQLite
jsonManipulation de données JSON
datetimeGestion des dates et heures
turtleDessin graphique (tortue Logo)

Pour utiliser une API, on consulte sa documentation :

help(math.sqrt) # aide intégrée
dir(math) # liste des fonctions disponibles
math.sqrt.__doc__ # docstring de la fonction

La documentation en ligne de Python (docs.python.org) est la référence officielle.

Au-delà de la bibliothèque standard, des milliers de bibliothèques sont disponibles via pip :

BibliothèqueUsage
matplotlibGraphiques et visualisation
numpyCalcul numérique
flaskApplications Web
pillowTraitement d'images
requestsRequêtes HTTP

Un paradigme de programmation est une manière de concevoir et d'organiser un programme. C'est un style, une philosophie de programmation. Python est un langage multi-paradigme : il permet d'utiliser différents styles dans un même programme.

Le programme est une séquence d'instructions qui modifient l'état du système (variables, mémoire). On décrit comment faire, étape par étape.

# Calculer la somme des carrés de 1 à n (style impératif)
def somme_carres_imperatif(n):
resultat = 0
for i in range(1, n + 1):
resultat += i ** 2
return resultat

Caractéristiques :

  • Variables qui changent de valeur (affectation) ;
  • Structures de contrôle (if, for, while) ;
  • Instructions exécutées dans l'ordre.

Le programme est une composition de fonctions pures, sans effet de bord. On décrit quoi calculer plutôt que comment.

# Calculer la somme des carrés de 1 à n (style fonctionnel)
def somme_carres_fonctionnel(n):
return sum(map(lambda x: x ** 2, range(1, n + 1)))

Ou avec une compréhension :

def somme_carres_fonctionnel(n):
return sum(x ** 2 for x in range(1, n + 1))

Caractéristiques :

  • Fonctions pures : le résultat ne dépend que des arguments, pas d'état extérieur ;
  • Pas d'effets de bord : la fonction ne modifie rien en dehors d'elle ;
  • Fonctions d'ordre supérieur : map, filter, reduce, fonctions en arguments ;
  • Immutabilité : on évite de modifier les variables.

Outils fonctionnels en Python :

FonctionDescriptionExemple
map(f, iterable)Applique f à chaque élémentlist(map(str, [1, 2, 3])) → ['1', '2', '3']
filter(f, iterable)Garde les éléments où f renvoie Truelist(filter(lambda x: x > 0, [-1, 2, -3, 4])) → [2, 4]
lambdaFonction anonymecarre = lambda x: x ** 2

Le programme est organisé en objets qui encapsulent des données (attributs) et des comportements (méthodes). On modélise le monde réel.

# Calculer avec des objets (style objet)
class Statistiques:
def __init__(self, donnees):
self.donnees = donnees
def somme_carres(self):
return sum(x ** 2 for x in self.donnees)
def moyenne(self):
return sum(self.donnees) / len(self.donnees)
stats = Statistiques([1, 2, 3, 4, 5])
print(stats.somme_carres()) # 55
print(stats.moyenne()) # 3.0

Caractéristiques :

  • Encapsulation : données et traitements regroupés dans des objets ;
  • Abstraction : l'utilisateur n'a pas besoin de connaître le fonctionnement interne ;
  • Classes et instances : la classe est le modèle, l'objet est l'exemplaire.

Le même problème (filtrer les nombres pairs et les mettre au carré) résolu dans les trois styles :

def carres_pairs_imperatif(nombres):
resultat = []
for n in nombres:
if n % 2 == 0:
resultat.append(n ** 2)
return resultat
ParadigmeAdapté à
ImpératifScripts simples, automatisation, calcul séquentiel
FonctionnelTraitement de données, transformations, calcul scientifique
ObjetApplications complexes, modélisation du monde réel, interfaces graphiques

ConceptDescription
ModuleFichier Python contenant des fonctions/classes réutilisables
APIInterface publique d'une bibliothèque (fonctions, classes disponibles)
__name__Vaut "__main__" si le fichier est exécuté directement
ImpératifSéquence d'instructions modifiant l'état (for, while, affectation)
FonctionnelComposition de fonctions pures, sans effet de bord (map, filter, lambda)
ObjetObjets encapsulant données et comportements (classes, méthodes)
Multi-paradigmePython permet de mélanger les paradigmes dans un même programme