Cours
Langages et programmation
Python n'est qu'un langage parmi des centaines.
Ce chapitre prend du recul : quelles constructions élémentaires tous les langages partagent-ils, et en quoi diffèrent-ils ?
Il montre ensuite comment écrire un programme fiable : spécifier une fonction, la mettre au point avec des jeux de tests, et réutiliser du code grâce aux bibliothèques.
1. Les constructions élémentaires
1.1 Un corpus commun
Tout programme, quel que soit le langage, est bâti avec un petit nombre de constructions.
| Construction | En Python | Rôle |
|---|---|---|
| séquence | instructions l'une après l'autre | fixer l'ordre d'exécution |
| affectation | s = s + i | donner une valeur à une variable |
| conditionnelle | if … elif … else | choisir selon une condition |
| boucle bornée | for i in range(n) | répéter un nombre de fois connu à l'avance |
| boucle non bornée | while condition | répéter tant qu'une condition est vraie |
| appel de fonction | def f(x): … puis f(3) | nommer un traitement et le réutiliser |
Les six constructions sont toutes présentes dans ce petit programme. Repère-les, puis exécute-le.
1.2 Unité et diversité
Le même algorithme s'écrit de façon voisine dans des langages différents.
Voici la somme des entiers pairs de à , dans trois langages.
def somme_pairs(n):
s = 0
for i in range(n + 1):
if i % 2 == 0:
s = s + i
return sfunction sommePairs(n) {
let s = 0;
for (let i = 0; i <= n; i++) {
if (i % 2 === 0) {
s = s + i;
}
}
return s;
}int somme_pairs(int n) {
int s = 0;
for (int i = 0; i <= n; i++) {
if (i % 2 == 0) {
s = s + i;
}
}
return s;
}1.3 Les styles de programmation
Les langages se distinguent aussi par leur style, qu'on appelle un paradigme.
| Style | Idée | Exemples |
|---|---|---|
| impératif | une suite d'instructions qui modifient l'état des variables | C, Python, JavaScript au quotidien |
| fonctionnel | des fonctions sans effet de bord, comme en mathématiques | Haskell, OCaml ; en Python : compréhensions, map |
| objet | données et fonctions regroupées en objets dotés de méthodes | Java, C++ ; en Python : "abc".upper(), t.append(3) |
| événementiel | des fonctions déclenchées par des événements | JavaScript dans une page web, Scratch |
| logique | on écrit des faits et des règles, le moteur déduit | Prolog |
Python est multi-paradigme : il permet plusieurs styles dans le même programme.
2. Spécifier une fonction
2.1 Prototype et documentation
Avant d'écrire le corps d'une fonction, on écrit son prototype : son nom, ses paramètres avec leur type attendu, et le type du résultat.
On écrit ensuite sa documentation (la docstring) : ce que la fonction calcule, en une phrase précise.
def racine_entiere(n):
"""Renvoie le plus grand entier r tel que r * r <= n.
n : entier positif ou nul (précondition).
Résultat : entier r vérifiant r*r <= n < (r+1)*(r+1) (postcondition)."""2.2 Préconditions et postconditions
La spécification est un contrat entre celui qui écrit la fonction et ceux qui l'utilisent.
Grâce à elle, on peut programmer et tester chaque fonction indépendamment des autres.
2.3 Les assertions
On s'en sert pour garantir les préconditions et les postconditions.
Ajoute une dernière ligne print(racine_entiere(-4)) et relance : la précondition est violée, l'assertion arrête le programme et affiche son message.
3. Mettre au point avec des jeux de tests
3.1 Le jeu de tests
Remplace <= par < dans la boucle while, puis relance : quel test échoue en premier, et pourquoi ?
3.2 Le succès des tests ne prouve pas la correction
Voici une fonction maximum et trois tests. Exécute le programme.
Les trois tests passent, et pourtant le dernier affichage est faux : on obtient au lieu de .
Aucun des tests ne contenait de nombres négatifs.
3.3 Méthode de mise au point
Entraîne-toi : ce programme s'arrête sur une erreur. Lis le message, trouve la ligne, corrige.
Correction · La réponse
Le message est IndexError: list index out of range, à la ligne return t[len(t)].
Les index vont de à len(t) - 1 : il faut écrire return t[len(t) - 1].
4. Utiliser des bibliothèques
4.1 Réutiliser
Python en fournit des centaines (math, random, csv, time, turtle), et des milliers d'autres sont disponibles : matplotlib pour tracer, pygame pour les jeux, requests pour le Web.
On importe une bibliothèque avant de l'utiliser.
Relance plusieurs fois : randint(1, 6) renvoie un entier au hasard entre et inclus, comme un dé.
Modulariser son propre code (une fonction par tâche, un fichier par thème) permet de le réutiliser de la même façon : from outils import moyenne.
4.2 Lire une documentation
On ne retient pas une bibliothèque par cœur : on consulte sa documentation.
Elle donne pour chaque fonction son prototype, ses paramètres (obligatoires, ou optionnels avec une valeur par défaut), sa valeur de retour et des exemples.
Dans l'interpréteur, help(f) affiche la docstring d'une fonction, et dir(module) liste le contenu d'un module.
5. Exemple résolu pas à pas
Correction · Question a
Prototype : moyenne(t), avec t un tableau de nombres ; le résultat est un flottant.
Précondition : t n'est pas vide.
Postcondition : le résultat vaut la somme divisée par la longueur ; il est compris entre le minimum et le maximum de t.
Correction · Question b
def moyenne(t):
"""Renvoie la moyenne des éléments de t (t : tableau non vide de nombres)."""
assert len(t) > 0, "le tableau ne doit pas être vide"
total = 0
for x in t:
total = total + x
return total / len(t)Correction · Question c
moyenne([4]) == 4 : un seul élément.
moyenne([1, 2, 3]) == 2 : cas ordinaire.
moyenne([0, 0]) == 0 : des zéros.
moyenne([-2, 2]) == 0 : des négatifs.
moyenne([1, 2]) == 1.5 : résultat non entier.
On vérifie aussi qu'un tableau vide déclenche bien l'assertion.
Correction · Question d
La boucle commence à l'index : elle saute t[0].
moyenne([1, 2, 3]) donnerait au lieu de , et moyenne([4]) donnerait .
Le test à un seul élément est le plus parlant.
À toi de réparer le code du camarade.
À retenir
Révise ce chapitre avec KlarIA
Tuteur qui t'explique pas à pas, quiz pour t'entraîner, flashcards pour mémoriser. Gratuit.
Créer mon compte gratuitement→