Cours Python Complet 🐍
Les 12 chapitres essentiels — des bases aux concepts avancés, avec exemples de code et quiz
7. Les modules et imports
2. Opérateurs et expressions
8. Gestion des fichiers
3. Structures conditionnelles
9. Gestion des erreurs
4. Les boucles
10. Programmation orientée objet
5. Les fonctions
11. Compréhensions et générateurs
6. Les structures de données
12. Bibliothèques essentielles
Variables et types de données
En Python, pas besoin de déclarer le type. L'interpréteur le déduit automatiquement (typage dynamique).
nom = « Alice » # str
age = 25 # int
taille = 1.72 # float
est_etudiant = True # bool
rien = None # NoneType
Convention : Python utilise le snake_case : ma_variable, nombre_total. Pas de camelCase (réservé aux classes : MaClasse).
| Type | Description | Exemple |
|---|---|---|
| int | Entier (taille illimitée) | 42, -7, 1_000_000 |
| float | Nombre décimal | 3.14, -0.5, 2e10 |
| str | Chaîne de caractères | « hello », 'world', « » »multi » » » |
| bool | Booléen | True, False |
| NoneType | Absence de valeur | None |
float(« 3.14 ») # str → float : 3.14
str(42) # int → str : « 42 »
int(3.99) # float → int : 3 (tronque, n'arrondit PAS)
bool(0) # False (0, « », [], None = False)
bool(« hello ») # True (tout le reste)
Piège : int(3.99) → 3 (pas 4). Pour arrondir : round(3.99). Et int(« 3.14 ») → erreur (passer d'abord par float).
age = 25
print(f »Je m'appelle et j'ai ans. »)
print(f »Dans 5 ans : ans. »)
# Formatage de nombres
print(f » ») # « 50.00 »
print(f » ») # « 1,000,000 »
print(f » ») # « 85.6% »
Opérateurs et expressions
| Opérateur | Nom | Exemple | Résultat |
|---|---|---|---|
| + | Addition | 7 + 3 | 10 |
| – | Soustraction | 7 – 3 | 4 |
| * | Multiplication | 7 * 3 | 21 |
| / | Division (toujours float) | 7 / 2 | 3.5 |
| // | Division entière | 7 // 2 | 3 |
| % | Modulo (reste) | 7 % 3 | 1 |
| ** | Puissance | 2 ** 10 | 1024 |
Piège : / retourne toujours un float : 6 / 3 → 2.0. Utilisez // pour un entier.
Comparaison :
== égal, != différent, < > <= >=
Python supporte le chaînage : 1 < x < 10
Logique :
and, or, not
is (identité mémoire), in (appartenance)
== vs is : == compare les valeurs. is compare les objets en mémoire. Utilisez is uniquement avec None : if x is None.
s.upper() # « HELLO, WORLD! »
s.lower() # « hello, world! »
s.strip() # Supprime espaces début/fin
s.replace(« World », « Python ») # « Hello, Python! »
s.split(« , « ) # [« Hello », « World! »]
« -« .join([« a »,« b »,« c »]) # « a-b-c »
len(s) # 13
# Slicing : s[start:stop:step]
s[0] # « H »
s[-1] # « ! »
s[0:5] # « Hello »
s[::-1] # « !dlroW ,olleH » (inversé)
Structures conditionnelles
if age < 13:
print(« Enfant »)
elif age < 18:
print(« Adolescent »)
elif age < 65:
print(« Adulte ») # ← affiché
else:
print(« Senior »)
L'indentation EST la syntaxe. Python utilise 4 espaces pour les blocs. Pas d'accolades . Indentation incorrecte = erreur.
statut = « majeur » if age >= 18 else « mineur »
# match-case (Python 3.10+)
match commande:
case « start »: print(« Démarrage »)
case « stop »: print(« Arrêt »)
case _: print(« Inconnu ») # _ = default
| Falsy (→ False) | Truthy (→ True) |
|---|---|
| False, None, 0, 0.0 | Tout le reste |
| « » (string vide) | « hello », » « (espace) |
| [], (), , set() | [0], (None,), |
if not liste: # ✅ au lieu de: if len(liste) == 0
if nom: # ✅ au lieu de: if nom != « »
Les boucles
for fruit in [« pomme », « banane », « cerise »]:
print(fruit)
# range(start, stop, step) — stop EXCLUS
for i in range(5): # 0,1,2,3,4
for i in range(2,10,3): # 2,5,8
# enumerate — index + valeur
for i, lang in enumerate([« Python »,« Java »,« C++ »]):
print(f »: ») # 0: Python, 1: Java…
# zip — deux listes en parallèle
for nom, age in zip([« Alice »,« Bob »], [25,30]):
print(f » a ans »)
while compteur < 5:
print(compteur)
compteur += 1
# break — sort immédiatement
for i in range(100):
if i == 5: break
# continue — passe à l'itération suivante
for i in range(10):
if i % 2 == 0: continue
print(i) # 1, 3, 5, 7, 9
Les fonctions
return f »Bonjour, ! »
saluer(« Alice ») # « Bonjour, Alice ! »
# Paramètres par défaut
def puissance(base, exp=2):
return base ** exp
puissance(3) # 9
puissance(3, 3) # 27
# Arguments nommés
puissance(exp=3, base=2) # 8
def somme(*args):
return sum(args)
somme(1,2,3) # 6
# **kwargs → dict d'arguments nommés
def profil(**kwargs):
for k, v in kwargs.items():
print(f »: »)
profil(nom=« Alice », age=25)
carre = lambda x: x ** 2
sorted([« Bob »,« Alice »], key=lambda x: len(x))
# Type hints (Python 3.9+)
def moyenne(notes: list[float]) -> float:
return sum(notes) / len(notes)
Type hints = documentation. Ils ne bloquent rien à l'exécution mais aident les IDE et mypy pour la vérification statique.
Les structures de données
fruits[-1] # « cerise »
fruits[1] = « mangue » # Modification
fruits.append(« kiwi ») # Ajoute à la fin
fruits.insert(1, « poire ») # Insère à l'index 1
fruits.remove(« mangue ») # Supprime par valeur
fruits.pop() # Supprime le dernier
fruits.sort() # Trie en place
len(fruits) # Nombre d'éléments
« pomme » in fruits # True
Piège : b = a ne copie PAS la liste. Les deux pointent vers le même objet. Utilisez b = a.copy() ou b = a[:].
| Structure | Syntaxe | Mutable | Ordonné | Doublons |
|---|---|---|---|---|
| list | [« a », »b »] | ✅ | ✅ | ✅ |
| tuple | (« a », »b ») | ❌ | ✅ | ✅ |
| set | ✅ | ❌ | ❌ | |
| dict | ✅ | ✅ (3.7+) | Clés uniques |
x, y = (48.8, 2.3) # Unpacking
# Set (unique)
# →
& # intersection
| # union
# Dict
d =
d[« nom »] # « Alice »
d.get(« ville », « ? ») # « ? » (défaut si absent)
d.keys() d.values() d.items()
Les modules et imports
math.sqrt(16) # 4.0
import datetime as dt # Alias
dt.datetime.now()
from math import sqrt, pi # Import spécifique
sqrt(16) # 4.0
from math import * # ❌ Éviter (pollue le namespace)
| Module | Usage | Exemple |
|---|---|---|
| os | Fichiers, variables d'env. | os.path.exists(« f.txt ») |
| json | Encoder/décoder JSON | json.loads('') |
| datetime | Dates et heures | datetime.now() |
| random | Nombres aléatoires | random.randint(1, 10) |
| re | Expressions régulières | re.findall(r »\d+ », s) |
| collections | Counter, defaultdict, deque | Counter(« abracadabra ») |
| pathlib | Chemins (moderne) | Path(« data ») / « f.csv » |
| itertools | Itérateurs avancés | chain, product, combinations |
| functools | Outils fonctionnels | lru_cache, reduce |
| sys | Config Python, argv | sys.argv |
# (pas quand il est importé par un autre module)
if __name__ == « __main__ »:
print(« Script principal »)
Convention standard pour les scripts Python. Permet de réutiliser les fonctions d'un fichier comme module sans exécuter le code principal.
Gestion des fichiers
# Écrire
with open(« f.txt », « w ») as f:
f.write(« Bonjour !\n »)
# Lire tout
with open(« f.txt ») as f:
contenu = f.read()
# Lire ligne par ligne (économe en RAM)
with open(« f.txt ») as f:
for ligne in f:
print(ligne.strip())
| Mode | Description |
|---|---|
| « r » | Lecture (défaut). Erreur si inexistant. |
| « w » | Écriture. Écrase le contenu ! |
| « a » | Ajout (append) à la fin. |
| « x » | Création exclusive (erreur si existe). |
| « rb »/ »wb » | Mode binaire (images, PDFs). |
# Écrire JSON
with open(« data.json », « w ») as f:
json.dump(, f, indent=2)
# Lire JSON
with open(« data.json ») as f:
data = json.load(f)
import csv
with open(« data.csv ») as f:
for row in csv.DictReader(f):
print(row[« nom »])
Gestion des erreurs (try/except)
resultat = 10 / 0
except ZeroDivisionError:
print(« Division par zéro ! »)
except (TypeError, ValueError) as e:
print(f »Erreur : »)
else:
print(« OK ! ») # Si aucune exception
finally:
print(« Toujours exécuté ») # Dans tous les cas
| Exception | Cause | Exemple |
|---|---|---|
| TypeError | Mauvais type | « 2 » + 2 |
| ValueError | Mauvaise valeur | int(« abc ») |
| IndexError | Index hors limites | [1,2][5] |
| KeyError | Clé absente (dict) | [« x »] |
| FileNotFoundError | Fichier inexistant | open(« ??? ») |
| AttributeError | Attribut inexistant | « hi ».append(« x ») |
| ZeroDivisionError | Division par zéro | 1 / 0 |
| NameError | Variable non définie | print(xyz) |
| ImportError | Module introuvable | import xyz123 |
def diviser(a, b):
if b == 0:
raise ValueError(« Diviseur ne peut pas être 0 »)
return a / b
# Exception personnalisée
class AgeInvalide(Exception):
pass
def set_age(age):
if age < 0:
raise AgeInvalide(f »Âge invalide »)
Programmation Orientée Objet (POO)
espece = « Canis familiaris » # Attribut de classe
def __init__(self, nom, age):
self.nom = nom # Attribut d'instance
self.age = age
def aboyer(self):
return f » : Wouf ! »
def __str__(self): # print(obj)
return f » ( ans) »
def __repr__(self): # repr(obj)
return f »Chien('', ) »
rex = Chien(« Rex », 5)
print(rex.aboyer()) # « Rex : Wouf ! »
print(rex) # « Rex (5 ans) »
self = l'instance elle-même. Premier paramètre de chaque méthode. Python le passe automatiquement.
def __init__(self, nom):
self.nom = nom
def parler(self):
raise NotImplementedError
class Chat(Animal):
def parler(self):
return f » : Miaou ! »
class Chien(Animal):
def parler(self):
return f » : Wouf ! »
# Polymorphisme
for a in [Chat(« Félix »), Chien(« Rex »)]:
print(a.parler())
# super() — appeler le parent
class ChienGuide(Chien):
def __init__(self, nom, maitre):
super().__init__(nom)
self.maitre = maitre
| Méthode | Déclenchée par | Usage |
|---|---|---|
| __init__ | Classe() | Constructeur |
| __str__ | print(obj) | Affichage lisible |
| __repr__ | repr(obj) | Affichage technique |
| __len__ | len(obj) | Longueur |
| __eq__ | obj == other | Égalité |
| __lt__ | obj < other | Comparaison |
| __add__ | obj + other | Addition |
| __getitem__ | obj[key] | Accès par index |
| __iter__ | for x in obj | Rendre itérable |
| __enter__/__exit__ | with obj | Context manager |
class Cercle:
def __init__(self, rayon):
self._rayon = rayon
@property
def aire(self):
return 3.14159 * self._rayon ** 2
c = Cercle(5)
c.aire # 78.54 — accédé comme un attribut, pas une méthode()
# @dataclass (Python 3.7+) — classes simplifiées
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
p = Point(3, 4)
print(p) # Point(x=3, y=4) — __repr__ auto-généré
@dataclass génère automatiquement __init__, __repr__, __eq__. Parfait pour les classes qui stockent principalement des données.
len() utilisable sur vos objets.Compréhensions et générateurs
# [expression for item in iterable if condition]
carres = [x**2 for x in range(10)] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
pairs = [x for x in range(20) if x % 2 == 0] # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Dict comprehension
carre_dict =
#
# Set comprehension
uniques =
#
# Imbriqué
matrice = [[i*j for j in range(3)] for i in range(3)]
Lisibilité d'abord : Si la compréhension devient trop complexe (plus de 2 conditions/boucles), préférez une boucle for classique. Le but est le code lisible, pas le code le plus court.
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for num in fibonacci(10):
print(num) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
# Generator expression (comme list comp, mais avec ())
somme = sum(x**2 for x in range(1000000))
# Pas de liste en mémoire — calcul paresseux (lazy)
Générateur vs Liste : Un générateur ne stocke pas tout en mémoire — il calcule à la demande. Idéal pour les gros volumes de données. [x for x in range(10**9)] → crash mémoire. (x for x in range(10**9)) → OK.
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f »: s »)
return result
return wrapper
@timer
def calcul_lourd():
return sum(range(10_000_000))
calcul_lourd() # « calcul_lourd: 0.2341s »
# Décorateur intégré utile : @functools.lru_cache
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2: return n
return fib(n–1) + fib(n–2)
Bibliothèques essentielles (pip)
pip install requests
# Installer une version spécifique
pip install pandas==2.1.0
# Fichier requirements.txt
pip freeze > requirements.txt
pip install -r requirements.txt
# Environnement virtuel (bonne pratique)
python -m venv .venv
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
Toujours utiliser un environnement virtuel pour isoler les dépendances de chaque projet. Cela évite les conflits de versions.
| Bibliothèque | Domaine | Usage |
|---|---|---|
| requests | Web | Requêtes HTTP simples (GET, POST, API) |
| flask | Web | Micro-framework web léger |
| django | Web | Framework web complet « batteries included » |
| fastapi | Web | API modernes, rapides, avec auto-documentation |
| pandas | Data | Manipulation de données tabulaires (DataFrames) |
| numpy | Data | Calcul numérique, tableaux multidimensionnels |
| matplotlib | Data | Graphiques et visualisation de données |
| scikit-learn | IA/ML | Machine Learning : classification, régression, clustering |
| pytorch | IA/ML | Deep Learning : réseaux de neurones |
| beautifulsoup4 | Scraping | Extraction de données depuis le HTML |
| selenium | Scraping | Automatisation de navigateur web |
| pytest | Test | Framework de tests unitaires |
| black | Qualité | Formatage automatique du code |
| sqlalchemy | BDD | ORM pour bases de données relationnelles |
| pillow | Media | Manipulation d'images |
import requests
r = requests.get(« https://api.github.com/users/python »)
data = r.json()
print(data[« name »]) # « Python »
# pandas — lire un CSV
import pandas as pd
df = pd.read_csv(« data.csv »)
df.head() # 5 premières lignes
df.describe() # Statistiques descriptives
df[df[« age »] > 25] # Filtrer
df.groupby(« ville »).mean() # Agrégation
# pytest — test unitaire
# test_math.py
def test_addition():
assert 1 + 1 == 2
def test_division():
assert 10 / 2 == 5.0
# Lancer : pytest test_math.py
Cours Python Complet — De débutant à avancé
Pour progresser : pratiquez sur des projets concrets et lisez la documentation officielle.

