Avant d'écrire une ligne de code, posons-nous la question qui fâche : qu'est-ce que l'informatique ? Si vous répondez « réparer des imprimantes », ce cours va vous faire mal. Asseyez-vous.
Le mot « informatique » vient de la contraction d'information et d'automatique. L'informatique, ce n'est pas la science des ordinateurs (les ordinateurs ne sont que l'outil) — c'est la science du traitement automatique de l'information.
L'informatique repose sur trois piliers fondamentaux :
for et if arrivent).
Aujourd'hui, nous allons apprendre à parler à une machine en utilisant Python, un langage créé pour être lu par des humains. Et c'est déjà une révolution.
Quelques raisons d'utiliser Python (en vrac) :
import this dans un interpréteur Python pour les voir tous. Allez-y,
on attend. — Vous l'avez fait ? Bien. Vous êtes officiellement un Pythoniste.
Tout ce que vous voyez dans ce cours — les bouts de code en couleur, les exemples — est conçu pour que vous puissiez les taper vous-même et les exécuter. Un programme informatique, c'est juste un fichier texte qui contient des instructions. Ce fichier s'appelle le code source. Python le lit, le comprend, et l'exécute. Magie. ✨
Le REPL (Read-Eval-Print Loop) est un mode interactif de Python : vous tapez une instruction, Python l'exécute immédiatement et affiche le résultat. C'est parfait pour expérimenter, tester une idée, ou vérifier qu'une fonction marche.
Pour lancer le REPL, ouvrez un terminal et tapez :
# Sur Windows, Mac ou Linux, dans un terminal :
$ python3
Vous verrez apparaître quelque chose comme :
Les trois chevrons >>> sont le prompt du REPL.
Python attend vos instructions. Tapez une expression et validez avec
Entrée — le résultat s'affiche immédiatement.
>>> 42 + 8
50
>>> print("Hello, IA!")
Hello, IA!
>>> 3.1415 * 2 ** 2
12.566
_ (tiret du bas). Essayez :
>>> 12 + 30
42
>>> _ * 2
84
Pas besoin de retaper. La flemme est une vertu en programmation.
.py : le vrai code
Le REPL, c'est bien pour tester. Mais pour écrire un vrai programme, on crée un
fichier avec l'extension .py. Par exemple mon_programme.py.
mon_programme.py dans votre éditeur de texte
(VS Code, PyCharm, Sublime Text, ou même le bloc-notes — oui, le bloc-notes,
on ne juge pas).python3 mon_programme.pyExemple concret :
# Ceci est le contenu de mon_programme.py
print("Quel est le meilleur langage pour l'IA ?")
reponse = "Python, évidemment."
print(reponse)
Dans le terminal :
$ python3 mon_programme.py
Quel est le meilleur langage pour l'IA ?
Python, évidemment.
Les blocs de code colorisés que vous voyez dans ce cours sont prêts à être
copiés dans un fichier .py ou tapés dans le REPL.
exemple.py, puis lancez python3 exemple.py.Une variable, c'est une boîte dans la mémoire de l'ordinateur, à laquelle on colle une étiquette (un nom). On peut y mettre un nombre, du texte, ou n'importe quoi d'autre. Et on peut changer le contenu plus tard. D'où le nom "variable".
int) et les réels (float)# Ceci est un commentaire — Python l'ignore, pas vous.
# Les commentaires commencent par #. Ils sont vos meilleurs amis.
age = 20 # un entier (int)
pi = 3.1415926535 # un réel, ou plutôt un flottant (float)
reponse = 42 # la réponse à l'univers, merci Douglas Adams 📚
print(age) # affiche 20
print(pi * 2) # affiche 6.283185307
| Opération | Symbole | Exemple | Résultat |
|---|---|---|---|
| Addition | + | 10 + 3 | 13 |
| Soustraction | - | 10 - 3 | 7 |
| Multiplication | * | 10 * 3 | 30 |
| Division | / | 10 / 3 | 3.3333... |
| Division entière | // | 10 // 3 | 3 |
| Reste (modulo) | % | 10 % 3 | 1 |
| Puissance | ** | 10 ** 3 | 1000 |
// et % sont les meilleurs amis du informaticien. La division
entière permet de partager équitablement (mais sans les centimes), et le modulo permet
de savoir s'il reste quelque chose — par exemple si un nombre est pair :
n % 2 == 0.
prix_unitaire = 9
quantite = 4
total = prix_unitaire * quantite
print("Total :", total, "euros")
# Et pour 7 articles ? On change juste la variable !
quantite = 7
total = prix_unitaire * quantite
print("Nouveau total :", total, "euros")
0.1 + 0.2 == 0.3 ? En Python (et dans presque tous les langages) :
Faux. Essayez : print(0.1 + 0.2) et vous verrez
0.30000000000000004. Les nombres à virgule flottante sont une
approximation. Ne les utilisez jamais pour de l'argent. Jamaiiiiis.
if : prendre des décisions (comme un adulte)
Un programme sans condition, c'est une recette de cuisine où on fait exactement la même
chose quels que soient les ingrédients. Pas très utile. L'instruction if
permet d'exécuter du code uniquement si une condition est vraie.
note = 14
if note >= 10:
print("Vous avez validé ! 🎉")
else:
print("Pas de chance. Raté. 😢")
:) à la fin du if et du
else, et l'indentation (4 espaces). En Python,
l'indentation n'est pas optionnelle — c'est elle qui délimite les blocs de code.
Dans d'autres langages, on utilise des accolades {}. En Python, on utilise
la beauté. ✨
elifnote = 16
if note >= 18:
print("Excellent ! Vous êtes un génie (ou un tricheur).")
elif note >= 14:
print("Très bien ! Vous avez le droit d'être fier.")
elif note >= 10:
print("Passable. Ça passe, mais ça ne casse pas des briques.")
else:
print("Ajourné. Les rattrapages sont dans 2 semaines.")
| Opérateur | Signification |
|---|---|
== | égal à (ATTENTION : deux fois le signe =) |
!= | différent de |
< | strictement inférieur à |
> | strictement supérieur à |
<= | inférieur ou égal à |
>= | supérieur ou égal à |
= (un seul) affecte une valeur. == (deux) teste l'égalité.
Les confondre est l'erreur la plus fréquente chez les débutants. Et aussi chez les
experts, quand ils sont fatigués. Et le vendredi après-midi.
Un classique de l'ingénieur : simuler une machine à café qui refuse de servir si vous n'avez pas assez de monnaie.
argent = 0.80
prix_cafe = 1.20
if argent >= prix_cafe:
monnaie = argent - prix_cafe
print("☕ Votre café. Monnaie :", monnaie, "€")
else:
manque = prix_cafe - argent
print("⚠️ Pas assez d'argent. Il manque", manque, "€. Va voir tes parents.")
Pour aller plus loin : et si on ajoutait un compteur de cafés bus dans la journée ? Et une limite de 5 pour éviter les crises d'angoisse ?
Une fonction, c'est une petite machine qui prend des ingrédients en entrée, fait un calcul, et retourne un résultat. En cuisine, on dirait une recette. En programmation, on appelle ça ne pas se répéter (principe DRY : Don't Repeat Yourself).
def carré(x):
"""Retourne le carré de x."""
return x ** 2
print(carré(5)) # 25
print(carré(12)) # 144
def moyenne(a, b):
"""Calcule la moyenne de deux nombres."""
return (a + b) / 2
print(moyenne(10, 16)) # 13.0
# On peut aussi "documenter" une fonction avec une docstring (le texte entre """ """)
print(moyenne.__doc__) # Affiche la docstring : "Calcule la moyenne de deux nombres."
def mention(note):
"""Retourne la mention correspondant à une note sur 20."""
if note >= 18:
return "Excellent"
elif note >= 14:
return "Très Bien"
elif note >= 10:
return "Passable"
else:
return "Ajourné"
print(mention(15)) # Très Bien
print(mention(6)) # Ajourné
Une fonction est dite récursive quand elle s'appelle elle-même. C'est une technique puissante pour résoudre des problèmes qui peuvent être décomposés en sous-problèmes identiques mais plus petits.
La factorielle d'un entier n (notée n!) est le produit de tous les entiers de 1 à n. Par convention, 0! = 1.
def factorielle(n):
"""Calcule n! (n factorielle) de façon récursive.
Cas de base : si n <= 1, retourne 1.
Sinon : n * factorielle(n-1)
"""
if n <= 1:
return 1
else:
return n * factorielle(n - 1)
print(factorielle(5)) # 5! = 5 × 4 × 3 × 2 × 1 = 120
print(factorielle(0)) # 0! = 1 (par convention, et par élégance)
Voici ce qui se passe quand on appelle factorielle(5) :
# L'appel factorielle(5) déclenche :
factorielle(5) = 5 * factorielle(4)
= 5 * (4 * factorielle(3))
= 5 * (4 * (3 * factorielle(2)))
= 5 * (4 * (3 * (2 * factorielle(1))))
= 5 * (4 * (3 * (2 * 1))) # cas de base atteint !
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120
for ferait le même travail sans gaspiller de mémoire. La récursivité
brille vraiment sur des problèmes comme le parcours d'arbres, les fractales, ou
certains algorithmes de tri (rapide, fusion). Choisissez l'outil adapté.
def fibonacci(n):
"""Retourne le n-ième terme de la suite de Fibonacci."""
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 55
print(fibonacci(20)) # 6765
En Python, les fonctions sont des objets de première classe. Ça signifie qu'on peut les passer en argument à d'autres fonctions, les retourner, les mettre dans des listes. C'est terriblement puissant.
Souvenez-vous de la définition de la dérivée :
f'(x) ≈ (f(x+h) - f(x)) / h quand h est très petit. En Python, on peut écrire
une fonction derive qui prend n'importe quelle fonction
f et retourne une nouvelle fonction qui est sa dérivée approchée.
def derive(f, h=1e-7):
"""Retourne une fonction qui calcule la dérivée approchée de f."""
def derivée(x):
return (f(x + h) - f(x)) / h
return derivée
# Testons sur f(x) = x², dont la dérivée est f'(x) = 2x
def carré(x):
return x ** 2
derive_carré = derive(carré)
print(derive_carré(3)) # devrait être proche de 6
print(derive_carré(10)) # devrait être proche de 20
derive(carré) retourne une fonction.
On peut ensuite l'appeler comme n'importe quelle fonction. Python nous permet de
fabriquer des fonctions à la volée, comme un atelier de mécanique programmable.
Les matheux pleurent de joie. Les informaticiens sourient, sachant qu'ils viennent
de réinventer le calcul différentiel en trois lignes.
lambda
Quand une fonction est si triviale qu'elle ne mérite même pas de nom, on utilise
lambda — une fonction expression sans nom, écrit en une ligne.
# Les deux lignes ci-dessous sont équivalentes :
def double(x): return x * 2
double = lambda x: x * 2
print(double(7)) # 14
# Le vrai intérêt de lambda : l'utiliser directement dans une fonction d'ordre supérieur
derive_cube = derive(lambda x: x ** 3)
print(derive_cube(2)) # f(x)=x³ → f'(x)=3x² → f'(2)=12, résultat approché : ~12
lambda vient du lambda-calcul d'Alonzo Church (années 1930),
un modèle de calcul aussi puissant que la machine de Turing. Church et Turing étaient
étudiants du même directeur de thèse (Alonzo Church était le directeur de Turing !).
L'un a inventé les machines, l'autre le calcul fonctionnel. En 2026, on utilise
toujours les deux. Chapeau, messieurs.
La dichotomie (ou méthode de bissection) permet de trouver une racine d'une fonction continue f sur un intervalle [a, b] où f(a) et f(b) sont de signes opposés. On coupe l'intervalle en deux, on regarde de quel côté se trouve le zéro, et on recommence jusqu'à être assez précis.
def dichotomie(f, a, b, epsilon=1e-10):
"""Trouve une racine de f sur [a, b] par dichotomie.
f(a) et f(b) doivent être de signes opposés.
"""
while b - a > epsilon:
m = (a + b) / 2
if f(m) == 0:
return m
elif f(a) * f(m) < 0:
b = m
else:
a = m
return (a + b) / 2
# Trouvons √2 en résolvant f(x) = x² - 2 = 0
racine_de_2 = dichotomie(lambda x: x**2 - 2, 0, 2)
print("√2 ≈", racine_de_2)
print("Vérification :", racine_de_2**2)
1. Convergence variable : modifiez epsilon pour voir
combien d'itérations sont nécessaires. Avec epsilon=1, une seule
décimale est correcte — laissez l'étudiant observer.
2. Équations non polynomiales : testez
dichotomie(lambda x: x - cos(x), 0, 1) pour résoudre l'équation
x = cos(x) (solution dite « point fixe de Dottie »).
3. Version récursive : la dichotomie peut aussi s'écrire récursivement ! Essayez.
def dichotomie_rec(f, a, b, epsilon=1e-10):
if b - a < epsilon:
return (a + b) / 2
m = (a + b) / 2
if f(m) == 0:
return m
elif f(a) * f(m) < 0:
return dichotomie_rec(f, a, m, epsilon)
else:
return dichotomie_rec(f, m, b, epsilon)
print(dichotomie_rec(lambda x: x**2 - 2, 0, 2))
La récursivité est élégante, l'itération est efficace. En IA, on utilise les deux. Le parcours d'arbre de décision ? Récursif. La descente de gradient ? Itératif. Savoir passer de l'un à l'autre est un signe de maturité.
Python gère les entiers de taille arbitraire (vous pouvez calculer 10**1000 sans
sourciller). Mais les flottants sont limités à ~15 chiffres décimaux significatifs
et peuvent valoir inf ou nan (Not a Number).
En IA, on utilise massivement des flottants — mais en 32 bits,
pas en 64, pour économiser la mémoire GPU. Ça s'appelle le mixed precision
training.
On ne les a pas vues dans ce cours ? C'est normal. Elles seront l'objet du cours 2,
avec for, while, les listes et les dictionnaires.
La récursivité peut remplacer les boucles... mais ce n'est pas toujours une bonne idée.
Vous avez survécu à votre premier cours d'informatique. Vous avez manipulé des variables, écrit des conditions, créé des fonctions, fait de la récursivité, et même implémenté une dérivée numérique et un solveur par dichotomie. Pas mal pour une première fois.
print("Hello World") provoque une tempête d'électrons dans du silicium.
C'est beau, non ? Et puis surtout : ça marchait quand vous avez testé
la dernière fois, et ça ne marche plus maintenant. Personne ne sait pourquoi.
Bienvenue en informatique. 🎉