Modèle de données
| Notion | Règle |
|---|---|
| variable | un nom qui référence un objet |
b = a | même objet, deux noms (alias) |
== / is | valeur / identité ; is seulement pour None |
| immuables | int, float, bool, str, tuple, frozenset, None |
| mutables | list, dict, set, instances de classes ordinaires |
| tuple avec liste dedans | sa valeur change si la liste change |
| libération | CPython compte les références ; ne pas compter dessus pour fermer un fichier : with |
Types et opérateurs
| Besoin | Syntaxe |
|---|---|
/ / // / % / ** | division vraie (float) / entière (vers le bas : -7 // 2 = -4) / reste / puissance |
| booléen | True, False ; sous-classe de int (True + 1 = 2) |
| faux | None, False, 0, 0.0, '', (), [], {}, set(), range(0) |
| logique | and, or (court-circuit, renvoient un opérande), not |
| chaîner | a < b == c |
| appartenance | x in c, x not in c |
| affecter dans une expression | := |
float | jamais == sur un calcul ; 0.1 + 0.2 == 0.3 est faux |
Chaînes
| Besoin | Syntaxe |
|---|---|
| tranche | s[1:4], s[-1], s[::2] (borne haute exclue) |
| formater | f"{x:>10}", f"{x:6.2f}", f"{x=}", !r |
| découper / assembler | s.split(","), ",".join(liste), s.partition("-") |
| nettoyer | s.strip(), s.replace("a", "b"), s.lower(), s.casefold() |
| tester / chercher | s.startswith("x"), s.find("x") (-1) contre s.index("x") (ValueError) |
str / repr | lisible / proche d'une expression Python |
Une chaîne est immuable : chaque méthode renvoie une nouvelle chaîne.
Conteneurs
| Type | Création | Notes |
|---|---|---|
list | [1, 2] | append, extend, insert, remove, pop, sort, reverse, copy ; ces méthodes renvoient None |
tuple | (1, 2), (1,) | immuable ; déballage x, y = t, a, *reste = t |
dict | {"a": 1} | ordre d'insertion (3.7+) ; d.get(k, defaut), setdefault, update, pop, items() ; fusion {**a, **b} |
set | {1, 2}, set() | a | b union, a & b, a - b, a ^ b ; {} est un dict vide |
deque | collections.deque | file : append, popleft rapides |
Parcours : for i, v in enumerate(s), for a, b in zip(x, y), for k, v in d.items(), reversed(s), sorted(set(s)).
Compréhensions
[n * n for n in range(6) if n % 2 == 0] # liste : [0, 4, 16]
{a["nom"]: a["prix"] for a in stock} # dictionnaire
{a["categorie"] for a in stock} # ensemble
sum(a["prix"] * a["quantite"] for a in stock) # expression génératrice, sans liste intermédiaireContrôle de flux
for n in range(2, 8):
for d in range(2, n):
if n % d == 0:
break
else: # exécuté si aucun break
print(n, "premier")
match code: # 3.10+
case 200:
...
case (0, y):
...
case _:
...break sort, continue saute, pass ne fait rien ; range(a, b, pas) exclut b.
Fonctions
def f(pos, /, norm, *, kw, defaut=None): # / : positionnels seuls ; * : mots-clés seuls
"""Docstring."""
return pos
def g(*args, **kwargs): ... # tuple, dict
f(*liste)
f(**dico) # déballage à l'appel
tri = sorted(paires, key=lambda p: p[1]) # lambda : une expression| Règle | Détail |
|---|---|
| défaut | évalué une fois : L=None, puis if L is None: L = [] |
| retour | sans return : None ; plusieurs valeurs : tuple |
| portée | Local, Englobant, Global, Built-ins ; nonlocal, global pour réaffecter |
lambda | éviter de l'affecter à un nom (PEP 8) : écrire un def |
Exceptions
try:
...
except (KeyError, ValueError) as e:
raise MonErreur("contexte") from e # enchaîner ; `from None` supprime
else:
... # si aucune exception
finally:
... # toujours| Règle | Détail |
|---|---|
| attraper | des types précis ; jamais except: nu |
| relancer | raise seul |
| personnalisée | class MonErreur(Exception): pass |
| groupes | ExceptionGroup, except* : 3.11+ |
| courantes | ValueError, TypeError, KeyError, IndexError, OSError, ZeroDivisionError |
Fichiers et contextes
with open("a.txt", "w", encoding="utf-8") as f: # "w" ÉCRASE
f.write("ligne\n")
with open("a.txt", encoding="utf-8") as f:
for ligne in f: # ligne à ligne, sans tout charger
print(ligne.rstrip("\n"))| Mode | Effet |
|---|---|
"r" (défaut) / "w" / "a" / "r+" | lecture / écriture qui écrase / ajout / lecture-écriture |
suffixe "b" | binaire (octets) |
with ferme le fichier même en cas d'exception. Toujours encoding= en mode texte. Un contexte maison définit __enter__ et __exit__.
Attention : ne jamais passer une donnée non fiable à eval() ni à exec(), ni la désérialiser avec pickle (exécution de code possible) ; utiliser json et valider.
Modules et packages
| Besoin | Syntaxe |
|---|---|
| importer | import m, from m import a, b, import m as x ; éviter from m import * |
| script et module | if __name__ == "__main__": |
| package | dossier avec __init__.py ; from pkg.sous import mod |
| import relatif | from . import frere, from .. import parent |
| chemin de recherche | dossier du script, PYTHONPATH, installation (site-packages) |
| lancer un module | python3 -m nom |
| cache | __pycache__/ : sans danger, à ne pas versionner |
Classes et dataclasses
class Article:
def __init__(self, nom, prix):
self.nom = nom # attribut d'instance
self.prix = prix
def __repr__(self):
return f"Article({self.nom!r}, {self.prix})"
class Special(Article): # héritage
def valeur(self):
return super().valeur()
from dataclasses import dataclass, field
@dataclass(frozen=True) # 3.7+ ; kw_only, slots : 3.10+
class Point:
x: int
y: int = 0
@dataclass
class Commande:
lignes: list[str] = field(default_factory=list) # jamais lignes: list = []| Règle | Détail |
|---|---|
| attribut de classe mutable | partagé par toutes les instances : créer dans __init__ |
_nom / __nom | détail interne (convention) / altération du nom |
| méthodes spéciales | __repr__, __str__, __eq__, __hash__, __len__, __iter__, __enter__, __exit__ |
| tests de type | isinstance(o, C), issubclass(A, B) |
| dataclass | génère __init__, __repr__, __eq__ ; asdict, replace, __post_init__ |
Itérateurs, générateurs, décorateurs
def decompte(n):
while n > 0:
yield n # générateur : paresseux, parcourable UNE fois
n -= 1
from functools import wraps
def tracer(f):
@wraps(f) # conserve __name__ et __doc__
def enveloppe(*a, **k):
return f(*a, **k)
return enveloppeItérateur : __iter__ renvoie un itérateur, __next__ fournit la suite et lève StopIteration. functools.cache (3.9+), lru_cache, partial.
Typage
| Besoin | Syntaxe |
|---|---|
| fonction | def f(x: int, y: str = "a") -> bool: |
| conteneurs | list[int], dict[str, int], tuple[int, str] (3.9+) |
| union | int | None (3.10+) ; Optional[X] équivaut à X | None |
| alias / générique | type V = list[float], def f[T](x: T) -> T (3.12+) |
| autres | Any, Callable, Protocol, TypedDict |
| vérifier | mypy fichier.py (outil tiers, statique) ; --strict pour plus de contrôles |
Le runtime n'impose pas les annotations. Par défaut, mypy ignore les fonctions non annotées.
Tests unittest
| Besoin | Commande ou méthode |
|---|---|
| tout lancer | python3 -m unittest (ou discover) ; -v détail, -k motif, -f stop au 1er échec |
| un test | python3 -m unittest test_x.Classe.test_y |
| assertions | assertEqual, assertTrue, assertIn, assertIsNone, assertRaises (aussi en with) |
| préparation | setUp, tearDown ; subTest ; skip, skipIf, expectedFailure |
pytest : alternative tierce citée par la documentation de unittest ; non consultée.
Environnement et async
| Besoin | Syntaxe |
|---|---|
| venv | python3 -m venv .venv, source .venv/bin/activate (détail : fiche Scripting) |
| dépendances | python3 -m pip install nom==1.0.0, pip freeze > requirements.txt ; .venv jamais versionné |
| coroutine | async def f(): await g() ; lancer : asyncio.run(main()) |
| concurrence | async with asyncio.TaskGroup() as tg: tg.create_task(...) (3.11+) |
| bloquant | await asyncio.to_thread(fonction) (3.9+) |
pip install télécharge du code tiers : à décider, hors de la machine de production, jamais en aveugle.
Pièges
| Piège | Correction |
|---|---|
def f(x, L=[]) | L=None |
| attribut de classe mutable partagé | créer dans __init__ |
b = a, list(a), a[:], a.copy() ne copient pas les contenus | copy.deepcopy(a) |
[[0] * 2] * 2 : listes liées | [[0] * 2 for _ in range(2)] |
x = liste.sort() donne None | sorted(liste) |
== entre float | math.isclose (non relu) |
fichier sans with | with open(...) |
except: nu | type précis |
| coroutine non attendue | await ou asyncio.run |
Pythonic (PEP 8, PEP 20)
- 4 espaces ; 79 caractères (72 en docstring et commentaire) ; deux lignes vides entre fonctions et classes de premier niveau.
- Imports : standard, tiers, local, séparés par une ligne vide.
- Noms :
module_et_fonction,Classe,CONSTANTE,_interne. is None;isinstance;if not seq:;startswith; untrycourt.- Zen : « Explicit is better than implicit », « Simple is better than complex », « Flat is better than nested », « Readability counts », « Errors should never pass silently », « Namespaces are one honking great idea ».
- Une cohérence aveugle n'est pas un but (PEP 8) : on s'écarte d'une règle quand la lisibilité y gagne.
Sources
Consultées le 17 octobre 2026 (Python : documentation affichée comme 3.15.0 ; versions de Stéphane inconnues). Les dates de version « 3.x+ » viennent des pages citées ; les comportements non relus sont listés dans « Points non vérifiés » du cours.
- Tutoriel Python (s’ouvre dans un nouvel onglet) : contrôle de flux, structures de données, erreurs, classes, modules, entrées/sorties, environnements virtuels.
- Référence, modèle de données (s’ouvre dans un nouvel onglet)
- Bibliothèque, types natifs (s’ouvre dans un nouvel onglet), dataclasses (s’ouvre dans un nouvel onglet), typing (s’ouvre dans un nouvel onglet), unittest (s’ouvre dans un nouvel onglet), asyncio (s’ouvre dans un nouvel onglet), copy (s’ouvre dans un nouvel onglet), functools (s’ouvre dans un nouvel onglet)
- PEP 8 (s’ouvre dans un nouvel onglet) (Active, modifiée le 2025-04-04), PEP 20 (s’ouvre dans un nouvel onglet) (Active)
- mypy, prise en main (s’ouvre dans un nouvel onglet) (2.4.0)