Apprendre Python de zéro jusqu'au niveau expert : syntaxe, structures de données, POO, générateurs, décorateurs, typage, tests, async et internals du langage.
Une variable en Python n'est pas une boîte qui contient une valeur. C'est une étiquette collée sur un objet. Cette nuance paraît académique ; elle explique pourtant la moitié des bugs de débutant qu'on verra plus loin.
a = [1, 2, 3]
b = a # b est une deuxième étiquette sur la même liste
b.append(4)
print(a) # [1, 2, 3, 4]| Type | Exemple | Mutable |
|---|---|---|
int | 42, -7, 1_000_000 | non |
float | 3.14, 1e-3 | non |
bool | True, False | non |
str | "texte", 'texte' | non |
None | None | non |
list | [1, 2] | oui |
dict | {"a": 1} | oui |
type() renvoie le type d'une valeur, isinstance() teste l'appartenance :
type(42) # <class 'int'>
isinstance(3.0, float) # True
isinstance(True, int) # True — bool hérite de intLes entiers Python n'ont pas de limite de taille. 2 ** 1000 fonctionne sans overflow.
10 / 3 # 3.3333333333333335 — division réelle, toujours float
10 // 3 # 3 — division entière
10 % 3 # 1 — modulo
2 ** 10 # 1024 — puissance
-7 // 2 # -4 — arrondi vers moins l'infini, pas vers zéroLes flottants suivent IEEE 754, avec ses pièges :
0.1 + 0.2 == 0.3 # False
0.1 + 0.2 # 0.30000000000000004Pour de l'argent, utilisez decimal.Decimal :
from decimal import Decimal
Decimal("0.1") + Decimal("0.2") == Decimal("0.3") # TrueLes str sont des séquences Unicode immuables. Guillemets simples ou doubles, c'est équivalent. Triple guillemets pour du multiligne.
nom = "Ada"
msg = f"Bonjour {nom}, tu as {36 + 1} ans"
multi = """Ligne 1
Ligne 2"""
nom[0] # 'A'
nom[-1] # 'a' — index négatif = depuis la fin
nom[0:2] # 'Ad' — slicing, fin exclue
len(nom) # 3Les méthodes les plus utiles :
s = " Python est Génial "
s.strip() # 'Python est Génial'
s.lower() # ' python est génial '
s.split() # ['Python', 'est', 'Génial']
"-".join(["a", "b"]) # 'a-b'
s.replace("Génial", "top")
"py" in s.lower() # True
s.startswith(" Py") # TrueUne chaîne est immuable : nom[0] = "E" lève TypeError. Toute « modification » crée une nouvelle chaîne.
Les f-strings acceptent des spécificateurs de format :
prix = 1234.5678
f"{prix:.2f}" # '1234.57'
f"{prix:,.2f}" # '1,234.57'
f"{42:05d}" # '00042'
f"{prix=}" # 'prix=1234.5678' — pratique pour déboguerTout objet a une valeur de vérité. Sont considérés comme faux : False, None, 0, 0.0, "", [], {}, set(). Le reste est vrai.
panier = []
if not panier:
print("Panier vide")Les opérateurs and et or ne renvoient pas forcément un booléen : ils renvoient l'un des deux opérandes.
nom = "" or "Anonyme" # 'Anonyme'
0 and 5 # 0None représente l'absence de valeur. On le compare avec is, jamais == :
resultat = None
if resultat is None:
print("Pas encore calculé")is teste l'identité (même objet en mémoire), == teste l'égalité de valeur. None est un singleton, is est donc à la fois correct et plus rapide.
int("42") # 42
int("3.5") # ValueError
int(float("3.5"))# 3
float("3.5") # 3.5
str(42) # '42'
bool("False") # True — chaîne non vide !
list("abc") # ['a', 'b', 'c']Le piège bool("False") revient souvent quand on lit des variables d'environnement. Comparez explicitement : os.environ.get("DEBUG") == "1".
x, y = 1, 2 # affectation multiple
x, y = y, x # échange sans variable temporaire
a = b = 0 # même objet pour les deux
compteur += 1 # pas de ++ en Python
premier, *reste = [1, 2, 3, 4] # premier=1, reste=[2, 3, 4]snake_case pour variables et fonctionsPascalCase pour les classesMAJUSCULES pour les constantes (convention, rien n'empêche la réassignation)_prefixe pour signaler « interne, ne pas toucher »Écrire un convertisseur Celsius → Fahrenheit qui affiche le résultat avec une décimale.
celsius = float(input("Température en °C : "))
fahrenheit = celsius * 9 / 5 + 32
print(f"{celsius:.1f} °C = {fahrenheit:.1f} °F")Retenez surtout l'idée d'étiquette : une variable pointe vers un objet, et deux variables peuvent pointer vers le même. Cette mécanique devient critique dès qu'on manipule des listes et des dictionnaires.