Aller au contenu
Sommaire

Fiche mémo Python

Fiche mémo · environ 8 min de lecture

Validé

Validé. Ce site n’exécute aucune commande. Sources

Modèle de données

Trois noms : a et b désignent la même liste, c désigne une autre liste de même valeurnomsobjetsabcliste[1, 2]un seul objetliste[1, 2]a is b : True (même objet)a == c : True, a is c : False
Noms et objets : une affectation ajoute un nom, elle ne copie pas.
NotionRègle
variableun nom qui référence un objet
b = amême objet, deux noms (alias)
== / isvaleur / identité ; is seulement pour None
immuablesint, float, bool, str, tuple, frozenset, None
mutableslist, dict, set, instances de classes ordinaires
tuple avec liste dedanssa valeur change si la liste change
libérationCPython compte les références ; ne pas compter dessus pour fermer un fichier : with

Types et opérateurs

BesoinSyntaxe
/ / // / % / **division vraie (float) / entière (vers le bas : -7 // 2 = -4) / reste / puissance
booléenTrue, False ; sous-classe de int (True + 1 = 2)
fauxNone, False, 0, 0.0, '', (), [], {}, set(), range(0)
logiqueand, or (court-circuit, renvoient un opérande), not
chaînera < b == c
appartenancex in c, x not in c
affecter dans une expression:=
floatjamais == sur un calcul ; 0.1 + 0.2 == 0.3 est faux

Chaînes

BesoinSyntaxe
tranches[1:4], s[-1], s[::2] (borne haute exclue)
formaterf"{x:>10}", f"{x:6.2f}", f"{x=}", !r
découper / assemblers.split(","), ",".join(liste), s.partition("-")
nettoyers.strip(), s.replace("a", "b"), s.lower(), s.casefold()
tester / cherchers.startswith("x"), s.find("x") (-1) contre s.index("x") (ValueError)
str / reprlisible / proche d'une expression Python

Une chaîne est immuable : chaque méthode renvoie une nouvelle chaîne.

Conteneurs

TypeCréationNotes
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
dequecollections.dequefile : 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

Python
[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édiaire

Contrôle de flux

Python
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

Python
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ègleDétail
défautévalué une fois : L=None, puis if L is None: L = []
retoursans return : None ; plusieurs valeurs : tuple
portéeLocal, Englobant, Global, Built-ins ; nonlocal, global pour réaffecter
lambdaéviter de l'affecter à un nom (PEP 8) : écrire un def

Exceptions

Python
try:
    ...
except (KeyError, ValueError) as e:
    raise MonErreur("contexte") from e  # enchaîner ; `from None` supprime
else:
    ...  # si aucune exception
finally:
    ...  # toujours
RègleDétail
attraperdes types précis ; jamais except: nu
relancerraise seul
personnaliséeclass MonErreur(Exception): pass
groupesExceptionGroup, except* : 3.11+
courantesValueError, TypeError, KeyError, IndexError, OSError, ZeroDivisionError

Fichiers et contextes

Python
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"))
ModeEffet
"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

BesoinSyntaxe
importerimport m, from m import a, b, import m as x ; éviter from m import *
script et moduleif __name__ == "__main__":
packagedossier avec __init__.py ; from pkg.sous import mod
import relatiffrom . import frere, from .. import parent
chemin de recherchedossier du script, PYTHONPATH, installation (site-packages)
lancer un modulepython3 -m nom
cache__pycache__/ : sans danger, à ne pas versionner

Classes et dataclasses

Python
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ègleDétail
attribut de classe mutablepartagé par toutes les instances : créer dans __init__
_nom / __nomdétail interne (convention) / altération du nom
méthodes spéciales__repr__, __str__, __eq__, __hash__, __len__, __iter__, __enter__, __exit__
tests de typeisinstance(o, C), issubclass(A, B)
dataclassgénère __init__, __repr__, __eq__ ; asdict, replace, __post_init__

Itérateurs, générateurs, décorateurs

Python
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 enveloppe

Itérateur : __iter__ renvoie un itérateur, __next__ fournit la suite et lève StopIteration. functools.cache (3.9+), lru_cache, partial.

Typage

BesoinSyntaxe
fonctiondef f(x: int, y: str = "a") -> bool:
conteneurslist[int], dict[str, int], tuple[int, str] (3.9+)
unionint | None (3.10+) ; Optional[X] équivaut à X | None
alias / génériquetype V = list[float], def f[T](x: T) -> T (3.12+)
autresAny, Callable, Protocol, TypedDict
vérifiermypy 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

BesoinCommande ou méthode
tout lancerpython3 -m unittest (ou discover) ; -v détail, -k motif, -f stop au 1er échec
un testpython3 -m unittest test_x.Classe.test_y
assertionsassertEqual, assertTrue, assertIn, assertIsNone, assertRaises (aussi en with)
préparationsetUp, tearDown ; subTest ; skip, skipIf, expectedFailure

pytest : alternative tierce citée par la documentation de unittest ; non consultée.

Environnement et async

BesoinSyntaxe
venvpython3 -m venv .venv, source .venv/bin/activate (détail : fiche Scripting)
dépendancespython3 -m pip install nom==1.0.0, pip freeze > requirements.txt ; .venv jamais versionné
coroutineasync def f(): await g() ; lancer : asyncio.run(main())
concurrenceasync with asyncio.TaskGroup() as tg: tg.create_task(...) (3.11+)
bloquantawait 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ègeCorrection
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 contenuscopy.deepcopy(a)
[[0] * 2] * 2 : listes liées[[0] * 2 for _ in range(2)]
x = liste.sort() donne Nonesorted(liste)
== entre floatmath.isclose (non relu)
fichier sans withwith open(...)
except: nutype précis
coroutine non attendueawait 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 ; un try court.
  • 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.