Cours Python Complet 🐍

Les 12 chapitres essentiels — des bases aux concepts avancés, avec exemples de code et quiz

12
Chapitres
100+
Exemples de code
v3.12+
Version
A1→C2
Niveaux

CHAPITRE 01

Variables et types de données

📦 Déclarer une variable

En Python, pas besoin de déclarer le type. L'interpréteur le déduit automatiquement (typage dynamique).

# Python devine le type tout seul
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).

🔢 Les types fondamentaux
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
🔄 Conversion de types (casting)
int(« 42 ») # str → int : 42
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).

📝 Les f-strings (formatage)
nom = « Alice »
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% »

🧠 Quiz
Quel est le résultat de type(3.0) ?
— La présence du point décimal en fait un float, même si la valeur est « entière ».
Que donne bool([]) ?
False — Tout conteneur vide ([], , «  », set(), 0, None) est « falsy » en Python.

CHAPITRE 02

Opérateurs et expressions

➕ Opérateurs arithmétiques
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 / 32.0. Utilisez // pour un entier.

⚖️ Comparaison et logique

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.

🔗 Opérations sur les strings
s = « Hello, World! »
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é)

🧠 Quiz
Que donne « Python »[1:4] ?
« yth » — Slicing de l'index 1 (inclus) à 4 (exclus). P=0, y=1, t=2, h=3.

CHAPITRE 03

Structures conditionnelles

🔀 if / elif / else
age = 18

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.

⚡ Ternaire et match-case
# Ternaire
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

🔍 Valeurs truthy et falsy
Falsy (→ False) Truthy (→ True)
False, None, 0, 0.0 Tout le reste
«  » (string vide) « hello »,  » «  (espace)
[], (), , set() [0], (None,),
# Style pythonique
if not liste: # ✅ au lieu de: if len(liste) == 0
if nom: # ✅ au lieu de: if nom != «  »

CHAPITRE 04

Les boucles

🔁 Boucle for
# Itérer sur une liste
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 + break / continue
compteur = 0
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

🧠 Quiz
Que donne list(range(1, 10, 2)) ?
[1, 3, 5, 7, 9] — start=1, stop=10 (exclus), step=2.

CHAPITRE 05

Les fonctions

🔧 Définir et appeler
def saluer(nom):
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

📦 *args et **kwargs
# *args → tuple d'arguments positionnels
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)

⚡ Lambda + Type hints
# Lambda — fonction anonyme sur une ligne
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.

🧠 Quiz
Différence entre *args et **kwargs ?
*args = arguments positionnels → tuple. **kwargs = arguments nommés → dict.

CHAPITRE 06

Les structures de données

📋 Les listes
fruits = [« pomme », « banane », « cerise »] fruits[0] # « pomme »
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[:].

📚 Tuple, Set, Dict
Structure Syntaxe Mutable Ordonné Doublons
list [« a », »b »]
tuple (« a », »b »)
set
dict ✅ (3.7+) Clés uniques
# Tuple (immuable)
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()

🧠 Quiz
Que donne .get(« c », 0) ?
0 — Clé « c » absente → retourne la valeur par défaut.

CHAPITRE 07

Les modules et imports

📦 Syntaxe des imports
import math # Import complet
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)

📚 Bibliothèque standard essentielle
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
📁 if __name__ == « __main__ »
# Ce bloc ne s'exécute que si le fichier est lancé directement
# (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.

CHAPITRE 08

Gestion des fichiers

📄 Lire et écrire
# Toujours utiliser « with » — ferme auto le fichier

# É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).
📊 JSON et CSV
import json
# É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 »])

CHAPITRE 09

Gestion des erreurs (try/except)

🛡️ try / except / else / finally
try:
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
🔥 Exceptions courantes
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
🏗️ Lever et créer des exceptions
# Lever une exception
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 »)

🧠 Quiz
Quelle exception pour int(« hello ») ?
ValueError — Le type est bon (str), mais la valeur « hello » n'est pas convertible en int.

CHAPITRE 10

Programmation Orientée Objet (POO)

🏛️ Classes et objets
class Chien:
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.

🔗 Héritage
class Animal:
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éthodes spéciales (dunder)
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
🔒 @property et @dataclass
# @property — getter/setter propres
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.

🧠 Quiz
À quoi sert super().__init__() ?
Appelle le constructeur de la classe parente pour initialiser les attributs hérités.
Quelle dunder method est appelée par len(obj) ?
__len__ — Définissez-la dans votre classe pour rendre len() utilisable sur vos objets.

CHAPITRE 11

Compréhensions et générateurs

⚡ List / Dict / Set comprehensions
# List comprehension
# [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.

🔄 Générateurs (yield)
# yield = retourne la valeur et met en pause
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.

🧰 Décorateurs (bonus)
# Un décorateur enveloppe une fonction
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(n1) + fib(n2)

🧠 Quiz
Quelle est la différence entre [x for x in range(10)] et (x for x in range(10)) ?
Le premier crée une liste en mémoire. Le second crée un générateur (lazy) — les valeurs sont calculées une par une à la demande, sans tout stocker.

CHAPITRE 12

Bibliothèques essentielles (pip)

📦 pip — le gestionnaire de paquets
# Installer un paquet
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.

🌐 Les bibliothèques incontournables
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
⚡ Exemples rapides
# requests — appel API
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

🧠 Quiz
À quoi sert un environnement virtuel (venv) ?
Isoler les dépendances de chaque projet pour éviter les conflits de versions entre les bibliothèques installées.
Quelle bibliothèque utiliser pour créer une API REST moderne avec auto-documentation ?
FastAPI — Génère automatiquement la documentation Swagger/OpenAPI et utilise les type hints Python pour la validation.

Cours Python Complet — De débutant à avancé

Pour progresser : pratiquez sur des projets concrets et lisez la documentation officielle.