Python & IA : Premier Contact

Cours 1 — Initiation à l'informatique pour futurs ingénieurs
🧪 Python 3 · Fondamentaux · IA & Culture

§1 Mais en fait, c'est quoi l'informatique ?

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.

Un informaticien, c'est quelqu'un qui passe plus de temps à expliquer qu'il n'est pas le service IT qu'à coder. Mais rassurez-vous : ici, on code.

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.

Alan Turing (1912–1954) — mathématicien britannique, père de l'informatique théorique. En 1936, il inventa la « machine de Turing », un modèle abstrait qui formalise ce qu'est un calcul. Il a aussi cassé le code Enigma pendant la Seconde Guerre mondiale, sauvé des millions de vies... et a été persécuté pour son homosexualité. Une injustice que l'informatique n'oublie pas. 🏳️‍🌈
Ada Lovelace (1815–1852) — première programmeuse de l'histoire. En 1843, elle écrit le premier algorithme destiné à être exécuté par une machine (la machine analytique de Babbage). Sans elle, vous ne liriez pas cette page. Elle avait compris que les nombres pouvaient représenter autre chose que des quantités — de la musique, des lettres, des images. Visionnaire.

L'informatique repose sur trois piliers fondamentaux :

  1. L'information — comment la représenter (nombres, textes, images, sons)
  2. L'algorithme — une suite finie d'instructions qui résout un problème
  3. La machine — qui exécute les algorithmes (ordinateur, smartphone, microcontrôleur)
Un algorithme, c'est comme une recette de cuisine : « éplucher les carottes, les couper, les faire cuire 20 minutes ». Sauf que vous avez le droit de dire « répéter 3 fois » ou « si la casserole déborde, baisser le feu ». Ça vous rappelle quelque chose ? (spoiler : 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.


§2 Python : le serpent qui parle

Python n'a pas été nommé d'après le serpent (bien que le logo en soit un), mais d'après les Monty Python, cette troupe d'humoristes britanniques complètement absurdes. Son créateur, Guido van Rossum, lisait les scripts des Monty Python pendant qu'il développait le langage. Résultat : la documentation fourmille de références à Monty Python and the Holy Grail. Si vous ne l'avez pas vu, faites-le. C'est une formation obligatoire.

Quelques raisons d'utiliser Python (en vrac) :

Le Zen de Python (PEP 20) : un ensemble de 19 aphorismes qui dictent la philosophie du langage. Les plus célèbres : Tapez 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.

§3 Comment utiliser ce cours : code source, fichiers, REPL

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 code source, c'est comme une liste de courses. Vous écrivez ce que vous voulez que l'ordinateur fasse, et il le fait. Sauf que si vous écrivez « acheter du lait » en Python, l'ordinateur va planter. Les ordinateurs prennent tout au pied de la lettre. Ils n'ont aucun humour. (C'est pour ça que vous êtes là.)

3.1 Méthode 1 — Le REPL : le terrain de jeu interactif

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.

Le REPL est l'héritier direct des premiers ordinateurs des années 1960, où l'on interagissait avec la machine via un téléscripteur : on tapait une commande, la machine répondait sur le papier. Le LISP (1958) fut l'un des premiers langages à proposer une boucle interactive. Encore aujourd'hui, un bon REPL est le signe d'un langage bien conçu.

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 :

Python 3.12.2 (main, Feb 12 2026, 10:23:55)
[GCC 14.1.1 20250314] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

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
Petit secret : le REPL garde en mémoire le dernier résultat dans une variable spéciale appelée _ (tiret du bas). Essayez :
>>> 12 + 30
42
>>> _ * 2
84
Pas besoin de retaper. La flemme est une vertu en programmation.
Le REPL, c'est le « bac à sable » du programmeur. Vous pouvez essayer n'importe quoi, casser des trucs, personne ne vous en voudra. Contrairement à la production. (En production, on ne fait que des trucs sérieux avec des cravates.)

3.2 Méthode 2 — Les fichiers .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.

  1. Créez un fichier 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).
  2. Écrivez-y du code Python.
  3. Dans un terminal, exécutez : python3 mon_programme.py

Exemple 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 ESPACES COMPTENT. En Python, l'indentation n'est pas décorative. Si vous mélangez tabulations et espaces, ou si vous n'indentez pas correctement, Python refusera d'exécuter votre code. Et il aura raison. Utilisez 4 espaces (ou une tabulation, mais soyez cohérent). Les bons éditeurs le font automatiquement.

3.3 Comment utiliser les exemples de ce cours

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.

Un conseil d'ami : ne copiez pas les blocs « Sortie » dans votre code. Ça paraît évident. Pourtant, des générations d'étudiants l'ont fait. Ne soyez pas cette génération. Vous êtes mieux que ça. (Enfin, on l'espère.)

§4 Les variables : des boîtes avec des noms débiles

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".

En Python, on n'a pas besoin de déclarer le type de la variable. On met juste une valeur dedans, et Python devine tout seul. C'est comme un colocataire qui range vos affaires « approximativement au bon endroit ». Génial, jusqu'à ce que ça foire.

4.1 Les entiers (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
20
6.283185307
42 — référence à H2G2 : Le Guide du voyageur galactique de Douglas Adams. Un super-ordinateur nommé « Pensées profondes » calcule pendant 7,5 millions d'années la réponse à « la question fondamentale de la vie, de l'univers et de tout ». Réponse : 42. Seulement, personne ne connaît la question. C'est une métaphore parfaite de l'informatique.

4.2 Opérations de base

OpérationSymboleExempleRésultat
Addition+10 + 313
Soustraction-10 - 37
Multiplication*10 * 330
Division/10 / 33.3333...
Division entière//10 // 33
Reste (modulo)%10 % 31
Puissance**10 ** 31000
// 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")
Total : 36 euros
Nouveau total : 63 euros

4.3 Le problème des flottants

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.
En informatique, il y a deux types de personnes : ceux qui comprennent le binaire, et ceux qui ne le comprennent pas. — 10 types de personnes, en fait. (Si vous n'avez pas ri, relisez en binaire.)

§5 L'instruction 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é. 😢")
Vous avez validé ! 🎉
Notez bien les deux-points (:) à 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é. ✨

5.1 Conditions à plusieurs branches : elif

note = 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.")
Très bien ! Vous avez le droit d'être fier.

5.2 Opérateurs de comparaison

OpérateurSignification
==é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.

Variation : la machine à café

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.")
⚠️ Pas assez d'argent. Il manque 0.4 €. 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 ?


§6 Les fonctions : pourquoi réécrire ce qu'on peut réutiliser ?

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).

La fonction, c'est l'ami qui fait le travail à votre place. Vous lui donnez des nombres, il vous rend des résultats. Pas de remerciements, pas de café à payer. Le meilleur collègue, en somme.
def carré(x):
    """Retourne le carré de x."""
    return x ** 2

print(carré(5))   # 25
print(carré(12))  # 144
25
144

6.1 Fonction avec plusieurs paramètres

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."
13.0
Calcule la moyenne de deux nombres.

6.2 Fonction conditionnelle : mention ou pas ?

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é
Très Bien
Ajourné
Les fonctions sont un concept mathématique ancien. Le premier à avoir formalisé l'idée d'une « fonction » est Gottfried Wilhelm Leibniz (oui, le même qui a inventé le calcul différentiel en même temps que Newton, mais sans écraser personne — enfin presque). Aujourd'hui, les fonctions sont au cœur de tous les langages de programmation fonctionnelle comme Haskell, OCaml, et même Python quand on le force un peu.

§7 La récursivité : un serpent qui se mange la queue

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.

Pour comprendre la récursivité, il faut d'abord comprendre la récursivité. — C'est drôle parce que c'est vrai. Et aussi parce que ça boucle à l'infini si on oublie le cas de base. N'oubliez jamais le cas de base.

7.1 La factorielle — l'exemple classique

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)
120
1

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
La récursivité, c'est élégant. Mais ce n'est pas toujours efficace. Chaque appel consomme de la mémoire (la pile d'appels). Pour la factorielle, une boucle 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é.

7.2 La suite de Fibonacci — le lapin qui se reproduit

Leonardo Fibonacci (1170–1250), mathématicien italien, a introduit cette suite en étudiant... la reproduction des lapins. Vraiment. Chaque paire de lapins devient fertile à 2 mois et donne naissance à une nouvelle paire chaque mois. Si on commence avec une paire de bébés lapins, combien de paires a-t-on après n mois ? Réponse : Fibonacci(n). F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2).
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
55
6765
ATTENTION : cette version récursive de Fibonacci est exponentielle — chaque appel en déclenche deux, qui en déclenchent deux, etc. Fib(40) nécessite ~330 millions d'appels. Fib(100) mettrait plus de temps que l'âge de l'univers. Ne faites pas ça chez vous. (Ou utilisez la mémoïsation ou une version itérative — mais ça, c'est pour le cours 2.)

§8 Fonctions d'ordre supérieur : quand les fonctions cuisinent d'autres fonctions

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.

Une fonction d'ordre supérieur, c'est une fonction qui prend une autre fonction en paramètre. Comme un chef cuisinier qui embauche un sous-chef. « Tiens, prends cette recette et cuisine-la avec cette technique. » C'est méta. C'est beau. C'est la classe.

8.1 Dérivée numérique — la fonction qui dérive les fonctions

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
6.000000496442246
20.00000098378033
Regardez bien : 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.

8.2 Fonction anonyme : le 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
14
12.000000189550557
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.

8.3 Dichotomie — la méthode du « couper au milieu »

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.

C'est comme chercher une date dans un dictionnaire : vous ouvrez au milieu, vous regardez si votre mot est avant ou après, vous jetez la moitié du livre, et vous recommencez. C'est la méthode préférée des informaticiens paresseux (c'est-à-dire tous les informaticiens).
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)
√2 ≈ 1.414213562373095
Vérification : 1.9999999999999996
La dichotomie est un algorithme robuste (il fonctionne toujours sur une fonction continue) mais lent (linéaire en nombre de décimales). Chaque itération gagne environ 1 bit de précision. Pour 16 décimales, il faut environ 54 itérations. D'autres méthodes comme Newton convergent bien plus vite — mais nécessitent la dérivée. Un bel exemple de trade-off en algorithmique.

Variations possibles

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))
1.414213562373095

§9 Pour aller plus loin : les questions qui fâchent

9.1 Récursif vs itératif ?

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é.

9.2 float vs int : pourquoi tant de haine ?

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.

9.3 Et les boucles ?

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.


§10 Le mot de la fin

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.

Rappelez-vous : en informatique, tout est une question de couches d'abstraction. Votre code utilise Python, qui utilise du C, qui utilise de l'assembleur, qui utilise des transistors, qui utilisent des atomes... et au bout du compte, 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. 🎉
Pour terminer, une citation de Grace Hopper (1906–1992), informaticienne pionnière, inventrice du compilateur et amirale de la US Navy :
« It's easier to ask forgiveness than it is to get permission. »
(Il est plus facile de demander pardon que de demander la permission.) — Un mantra pour tous les innovateurs. Et pour les développeurs qui push en production le vendredi soir.
© 2026 — laurent.thiry@uha.fr