KlarIA
💻 NSI (spécialité)1ereCours

Langages et programmation

📖

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.

ConstructionEn PythonRôle
séquenceinstructions l'une après l'autrefixer l'ordre d'exécution
affectations = s + idonner une valeur à une variable
conditionnelleif … elif … elsechoisir selon une condition
boucle bornéefor i in range(n)répéter un nombre de fois connu à l'avance
boucle non bornéewhile conditionrépéter tant qu'une condition est vraie
appel de fonctiondef 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 00 à nn, dans trois langages.

def somme_pairs(n):
    s = 0
    for i in range(n + 1):
        if i % 2 == 0:
            s = s + i
    return s
Un algorithme, trois langages

1.3 Les styles de programmation

Les langages se distinguent aussi par leur style, qu'on appelle un paradigme.

StyleIdéeExemples
impératifune suite d'instructions qui modifient l'état des variablesC, Python, JavaScript au quotidien
fonctionneldes fonctions sans effet de bord, comme en mathématiquesHaskell, OCaml ; en Python : compréhensions, map
objetdonnées et fonctions regroupées en objets dotés de méthodesJava, C++ ; en Python : "abc".upper(), t.append(3)
événementieldes fonctions déclenchées par des événementsJavaScript dans une page web, Scratch
logiqueon écrit des faits et des règles, le moteur déduitProlog

Python est multi-paradigme : il permet plusieurs styles dans le même programme.

Styles de langages

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 00 au lieu de 1-1.

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 00 à 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 11 et 66 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 11 : elle saute t[0].
moyenne([1, 2, 3]) donnerait 5/31,675/3 \approx 1{,}67 au lieu de 22, et moyenne([4]) donnerait 00.
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