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
TypeDescriptionExemple
intEntier (taille illimitée)42, -7, 1_000_000
floatNombre décimal3.14, -0.5, 2e10
strChaîne de caractères« hello », 'world', «  » »multi » » »
boolBooléenTrue, False
NoneTypeAbsence de valeurNone
🔄 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érateurNomExempleRésultat
+Addition7 + 310
Soustraction7 – 34
*Multiplication7 * 321
/Division (toujours float)7 / 23.5
//Division entière7 // 23
%Modulo (reste)7 % 31
**Puissance2 ** 101024

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.0Tout 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
StructureSyntaxeMutableOrdonné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
ModuleUsageExemple
osFichiers, variables d'env.os.path.exists(« f.txt »)
jsonEncoder/décoder JSONjson.loads('')
datetimeDates et heuresdatetime.now()
randomNombres aléatoiresrandom.randint(1, 10)
reExpressions régulièresre.findall(r »\d+ », s)
collectionsCounter, defaultdict, dequeCounter(« abracadabra »)
pathlibChemins (moderne)Path(« data ») / « f.csv »
itertoolsItérateurs avancéschain, product, combinations
functoolsOutils fonctionnelslru_cache, reduce
sysConfig Python, argvsys.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())

ModeDescription
« 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
ExceptionCauseExemple
TypeErrorMauvais type« 2 » + 2
ValueErrorMauvaise valeurint(« abc »)
IndexErrorIndex hors limites[1,2][5]
KeyErrorClé absente (dict)[« x »]
FileNotFoundErrorFichier inexistantopen(« ??? »)
AttributeErrorAttribut inexistant« hi ».append(« x »)
ZeroDivisionErrorDivision par zéro1 / 0
NameErrorVariable non définieprint(xyz)
ImportErrorModule introuvableimport 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éthodeDéclenchée parUsage
__init__Classe()Constructeur
__str__print(obj)Affichage lisible
__repr__repr(obj)Affichage technique
__len__len(obj)Longueur
__eq__obj == otherÉgalité
__lt__obj < otherComparaison
__add__obj + otherAddition
__getitem__obj[key]Accès par index
__iter__for x in objRendre itérable
__enter__/__exit__with objContext 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èqueDomaineUsage
requestsWebRequêtes HTTP simples (GET, POST, API)
flaskWebMicro-framework web léger
djangoWebFramework web complet « batteries included »
fastapiWebAPI modernes, rapides, avec auto-documentation
pandasDataManipulation de données tabulaires (DataFrames)
numpyDataCalcul numérique, tableaux multidimensionnels
matplotlibDataGraphiques et visualisation de données
scikit-learnIA/MLMachine Learning : classification, régression, clustering
pytorchIA/MLDeep Learning : réseaux de neurones
beautifulsoup4ScrapingExtraction de données depuis le HTML
seleniumScrapingAutomatisation de navigateur web
pytestTestFramework de tests unitaires
blackQualitéFormatage automatique du code
sqlalchemyBDDORM pour bases de données relationnelles
pillowMediaManipulation 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.