Python — les bases
Un langage où l'indentation n'est pas une question de style : c'est la syntaxe elle-même.
Résumé flash
Python est un langage à typage dynamique : on n'y déclare
pas le type, il se devine. Les blocs ne sont pas délimités par des accolades mais par
l'indentation. On y manipule surtout deux structures :
les listes (ordonnées, modifiables) et les
dictionnaires (clé → valeur). input() renvoie
toujours du texte — à convertir avant tout calcul.
🔑
#indentation #typage-dynamique #input
#print #f-string #if-elif-else #for-range
#while #break #liste #append
#dictionnaire #items #def #with-open
#try-except
01Deux modes d'exécution
| Mode | Comment | Pour quoi |
|---|---|---|
| Interactif | on dialogue directement avec Python, ligne par ligne | tester une idée, vérifier une syntaxe — « une calculatrice intelligente » |
| Script | on écrit un fichier .py que l'on exécute |
un vrai programme, réexécutable à volonté |
>>> 2 + 3
5
>>> a = 6
>>> a
6>>> ne se recopient pasDans tous les cours, >>> signale le prompt du mode interactif
et la ligne qui suit sans chevrons est la réponse de Python. Dans un fichier
.py, on n'écrit ni les chevrons ni les réponses.
02L'indentation fait la loi
C'est la particularité de Python, et la première source d'erreurs. Là où JavaScript et PHP utilisent des accolades, Python utilise le décalage pour savoir ce qui appartient à quoi.
if age >= 18:
print("majeur") # ✘ IndentationError: expected an indented block
if age >= 18:
print("majeur")
print("bienvenue") # ✘ IndentationError: unexpected indentNe mélangez jamais espaces et tabulations : visuellement identiques, elles
produisent un TabError incompréhensible. La convention est de
4 espaces, et tout éditeur sérieux les insère à la place de la tabulation.
Et n'oubliez pas les deux-points en fin de ligne : if …:,
for …:, while …:, def …:. C'est eux qui annoncent le
bloc.
03Variables et typage
Les identificateurs
- commencent par une lettre ou
_; - ne contiennent que lettres, chiffres et
_; - ne sont pas un mot réservé de Python ;
- sont sensibles à la casse :
ma_var≠Ma_Var.
valides : toto, proch_val, max1, MA_VALEUR, r2d2, bb8, _mavar
non valides : 2be, C-3PO, ma varConvention : minuscules, mots séparés par _, pas d'accent.
L'affectation
n = 33
a = 42 + 25 # l'expression est évaluée d'abord
ch = "bonjour"
euro = 6.55957La première affectation s'appelle l'initialisation. Une nouvelle affectation écrase la valeur précédente, qui est perdue.
= affecte, == compare>>> a = 6 # j'affecte
>>> b = 9
>>> a == b # je demande : sont-ils égaux ?
FalseC'est le même piège qu'en JavaScript et en
PHP. Bonne nouvelle : Python refuse
if a = 6: avec une SyntaxError. Le langage vous protège d'une
erreur que le C laisse passer silencieusement.
Le typage dynamique
Le type d'une variable n'est pas déclaré : Python le détermine tout seul, à l'exécution.
x = 5 # int — entier
y = 2.5 # float — réel
nom = "Alice" # str — chaîne
ok = True # bool — booléen
type(x) # <class 'int'>Une même variable peut même changer de type en cours de route — souple, mais à manier avec prudence.
04Entrées et sorties
input() — lire au clavier
Le programme s'interrompt, affiche éventuellement un message, et attend une saisie suivie d'Entrée.
input() renvoie TOUJOURS une chaîne>>> age = input("Quel âge as-tu ? ")
Quel âge as-tu ? 66
>>> age
'66' ← des guillemets : c'est du TEXTE
>>> texte = input()
234
>>> texte + 1
TypeError: can only concatenate str (not "int") to str
>>> val = int(texte) ← conversion explicite
>>> val + 1
235D'où l'écriture habituelle, qui convertit au moment même de la saisie :
age = int(input("Quel âge as-tu ? "))
x = float(input("Entrez un nombre : "))C'est exactement le piège de .value en JavaScript et de
$_POST en PHP : tout ce qui vient de l'utilisateur est du texte.
print() — afficher
print("Bonjour", "le", "monde") # Bonjour le monde
print("Bonjour", "le", "monde", sep="-") # Bonjour-le-monde
print("Bonjour", end=" ") # pas de retour à la ligne
print("tout le monde") # Bonjour tout le monde
print("Ligne1\nLigne2\tavec tabulation") # \n saut de ligne, \t tabulation
print() # une ligne videLe polycopié présente l'ancien formatage avec % :
print("Je m'appelle %s et je suis en classe %d de %s" % (prenom, classe, matiere))Python moderne offre les f-strings : un f devant les
guillemets, et les variables s'écrivent directement entre accolades.
print(f"Je m'appelle {prenom} et je suis en classe {classe} de {matiere}")
nom, quantite = "switch", 5
print(f"Matériel : {nom} | Quantité : {quantite}")Plus court, plus lisible, et sans risque de se tromper dans l'ordre des
variables ou dans le code %s/%d. C'est d'ailleurs cette écriture
qu'on rencontre le plus souvent dans du code existant.
Les commentaires
# commentaire sur une ligne
print("Bonjour") # ou en fin de ligne
"""
Commentaire sur plusieurs lignes.
En réalité une chaîne non assignée, que Python ignore.
"""05Opérateurs et priorités
| Priorité | Catégorie | Opérateurs | Exemple |
|---|---|---|---|
| 1 | Parenthèses | () |
(2 + 3) * 4 → 20 |
| 2 | Exponentiation | ** |
2 ** 3 → 8 |
| 3 | Multiplication, division | * / // % |
7 % 3 → 1 |
| 4 | Addition, soustraction | + - |
5 + 3 - 2 → 6 |
| 5 | Comparaisons | == != > <
>= <= |
5 > 3 → True |
| 6 | Logique | not | not True → False |
| 7 | Logique | and | évalué après not |
| 8 | Logique | or | priorité la plus faible |
/ et // ne font pas la même chose7 / 2 # 3.5 ← division réelle, donne TOUJOURS un float
7 // 2 # 3 ← division ENTIÈRE, on garde le quotient
7 % 2 # 1 ← le RESTE
# même quand ça tombe juste :
6 / 2 # 3.0 ← et non 3C'est une différence de Python 3 par rapport à beaucoup d'autres langages : en C ou en Java,
7 / 2 entre deux entiers vaut 3. Ici il faut // pour obtenir un
entier.
and, or, not s'écrivent
en toutes lettres| Python | JavaScript / PHP |
|---|---|
and | && |
or | || |
not | ! |
True · False |
true · false (minuscules !) |
Attention à la majuscule de True et False :
true en minuscules provoque une NameError.
06Les conditions
age = 20
if age < 18:
print("Vous êtes mineur.")
elif age == 18:
print("Vous venez d'atteindre la majorité.")
else:
print("Vous êtes majeur.")age = 20
a_passe_test = True
if age >= 18 and a_passe_test:
print("Accès autorisé")
else:
print("Accès refusé")Else avec une majuscule ne compile pasLe polycopié écrit, dans l'un de ses exemples :
if age >= 18:
print("Vous êtes majeur.")
Else: ← majuscule
print("Vous êtes mineur.")Python est sensible à la casse : Else n'est pas un mot-clé,
c'est un nom de variable inconnu. Le programme s'arrête net sur une
SyntaxError. Tous les mots-clés de Python s'écrivent en
minuscules : if, elif, else,
for, while, def, and, or,
not.
Les seules exceptions à retenir : True, False et
None, qui prennent une majuscule.
elif, et non else ifPython contracte les deux mots. Écrire else if passerait pour un
else contenant un nouveau if — ce qui exigerait une indentation
supplémentaire et rendrait le code illisible dès trois cas.
07Les boucles
forNombre inconnu →
whilefor — parcourir une séquence
La boucle for de Python ne compte pas : elle parcourt. La
variable prend successivement chaque valeur d'une liste, d'une chaîne, d'un tuple, d'un
dictionnaire ou d'un range().
for i in range(1, 11): # i prend les valeurs de 1 à 10
print(i)
for poste in ["PC01", "PC02", "PC03"]: # directement sur une liste
print(poste)
for lettre in "réseau": # même sur une chaîne
print(lettre)range(), ses trois formes
| Écriture | Produit | Exemple |
|---|---|---|
range(stop) | de 0 à stop − 1 |
range(5) → 0 1 2 3 4 |
range(start, stop) | de start à
stop − 1 | range(1, 6) → 1 2 3 4 5 |
range(start, stop, step) | avec un pas | range(10, 0, -2) → 10 8 6 4 2 |
range(1, 11) s'arrête à 10, pas à 11. C'est la source d'erreur
n° 1 des débutants.
range(1, n + 1)Et range(5) commence à 0 — ce qui tombe bien, puisque les
indices de liste commencent aussi à 0.
while — tant que
i = 1
while i <= 5:
print(i)
i += 1 # ← sans cette ligne : boucle infiniebreak et continue
for i in range(1, 11):
if i == 5:
break # sort complètement de la boucle
print(i)
print("Boucle arrêtée.")
# affiche : 1 2 3 4 puis « Boucle arrêtée. »break | quitte la boucle et passe à la suite. Dans des boucles imbriquées, ne sort que de la plus interne |
continue | saute le reste du tour et passe directement à l'itération suivante |
08Listes et ensembles
Une liste est une collection ordonnée et modifiable. Les indices commencent à 0.
postes = ["PC01", "PC02", "PC03", "PC04", "PC05"]
postes[0] # "PC01" ← premier
postes[-1] # "PC05" ← dernier (indice négatif !)
len(postes) # 5
postes.append("PC06") # ajoute à la fin
postes.remove("PC03") # supprime PAR VALEUR
del postes[0] # supprime PAR INDICE
for poste in postes: # parcours
print(poste)postes[-1] donne le dernier élément, postes[-2] l'avant-dernier.
Nul besoin de calculer len(postes) - 1. Peu de langages offrent cela.
Les ensembles — set()
Un ensemble ne contient aucun doublon. C'est la façon la plus courte de dédupliquer une liste.
connexions = ["192.168.0.10", "192.168.0.12", "10.0.0.5", "192.168.0.10"]
uniques = set(connexions)
for ip in uniques:
print("IP :", ip)
# IP : 10.0.0.5
# IP : 192.168.0.12
# IP : 192.168.0.10 ← une seule foisset perd l'ordreRegardez la sortie ci-dessus : les IP ne sortent pas dans l'ordre de la liste d'origine. Un ensemble n'est pas ordonné — c'est le prix de la déduplication.
Si l'ordre compte, on revient à une liste et on la trie :
uniques = sorted(set(connexions)) # dédoublonné ET triéLes tuples
Un tuple ressemble à une liste mais s'écrit avec des parenthèses et ne peut pas être modifié.
coordonnees = (192, 168, 0, 1)
coordonnees[0] = 10 # ✘ TypeError: 'tuple' object does not support item assignmentOn l'emploie pour des données qui ne doivent pas changer — une configuration, un couple de valeurs.
09Les dictionnaires
Un dictionnaire associe une clé à une valeur. Au lieu d'un indice numérique, on accède par un nom — bien plus parlant.
materiel = {
"switch": 5,
"routeur": 2,
"point_acces": 7
}
materiel["switch"] # 5
materiel["firewall"] = 3 # ajoute une entrée
del materiel["routeur"] # supprime une entrée
len(materiel) # nombre d'entréesDeux façons de le parcourir
# 1. avec .items() : la clé ET la valeur — la plus lisible
for nom, quantite in materiel.items():
print(f"Matériel : {nom} | Quantité : {quantite}")
# 2. sur les clés seules, en allant chercher la valeur
for nom in materiel:
print(nom, materiel[nom])| Méthode | Donne |
|---|---|
.keys() | les clés |
.values() | les valeurs |
.items() | les couples (clé, valeur) |
Une liste, c'est une file d'attente : ce qui compte, c'est la position. Un dictionnaire, c'est un annuaire : ce qui compte, c'est le nom.
Pour « les postes du réseau » → une liste. Pour « combien de chaque matériel » → un dictionnaire. Si vous vous surprenez à retenir qu'« à l'indice 3 se trouve le nombre de routeurs », c'est qu'il vous fallait un dictionnaire.
materiel["antenne"] # ✘ KeyError: 'antenne'
materiel.get("antenne") # None ← pas d'erreur
materiel.get("antenne", 0) # 0 ← avec une valeur par défaut
if "antenne" in materiel: # tester avant
print(materiel["antenne"]).get() est l'équivalent Python du ?? de PHP : il évite de planter
sur une clé manquante.
10Fonctions
def addition(a, b):
somme = a + b
return somme
resultat = addition(5, 3)
print(resultat) # 8
def saluer(nom="Invité"): # valeur par défaut
print(f"Bonjour {nom} !")
saluer() # Bonjour Invité !
saluer("Alice") # Bonjour Alice !def | déclare la fonction — suivi de deux-points |
| le corps | indenté de 4 espaces |
return | renvoie une valeur et arrête la fonction |
sans return | la fonction renvoie None |
print() n'est pas returndef carre_affiche(n):
print(n * n) # affiche, mais ne rend rien
def carre(n):
return n * n # rend une valeur exploitable
x = carre_affiche(5) # affiche 25, puis x vaut None
y = carre(5) # y vaut 25 — on peut s'en servir
print(y * 2) # 50Même principe qu'en PHP et en JavaScript : afficher est pour l'humain, retourner est pour le programme.
11Fichiers et exceptions
Ouvrir, lire, écrire
| Mode | Effet |
|---|---|
"r" | lecture seule (défaut). Erreur si le fichier n'existe pas |
"w" | écriture : efface le contenu, ou crée le fichier |
"a" | ajout à la fin, contenu conservé |
"x" | création — échoue si le fichier existe |
"b" · "t" | binaire · texte (défaut) |
with open("data.txt", "r") as f:
contenu = f.read()
# ici, le fichier est AUTOMATIQUEMENT fermé
with open("journal.txt", "a") as f:
f.write("Nouvelle connexion\n")with, jamais open seulLa forme sans with existe, mais impose de penser au close() :
f = open("data.txt", "r")
contenu = f.read()
f.close() # si une erreur survient avant, le fichier reste ouvertwith ferme le fichier même si une erreur se produit. Plus
court, plus sûr : c'est la façon recommandée, et celle qu'on attend de vous.
Les exceptions
Une exception est l'objet que Python crée quand une erreur survient. Sans traitement, elle interrompt le programme.
>>> x = 10 / 0
ZeroDivisionError: division by zerotry:
x = 10 / 0
except ZeroDivisionError:
print("Impossible de diviser par zéro.")
# 1. Python exécute le try
# 2. une erreur survient → il saute au except
# 3. le programme continue normalement| Exception | Quand |
|---|---|
ValueError | conversion impossible —
int("abc") |
TypeError | opération entre types incompatibles —
"abc" + 5 |
ZeroDivisionError | division par zéro |
KeyError | clé absente d'un dictionnaire |
IndexError | indice hors de la liste |
FileNotFoundError | fichier introuvable en lecture |
while True:
try:
age = int(input("Votre âge : "))
break # saisie valide → on sort
except ValueError:
print("Ce n'est pas un nombre entier, réessayez.")Sans try, taper « abc » plante le programme avec une ValueError.
Avec, on redemande poliment. C'est le Répéter…Jusqu'à de l'algorithmique, en
version Python.
Ce programme doit afficher la moyenne de trois notes saisies. Il affiche
TypeError. Pourquoi, et comment le corriger ?
n1 = input("Note 1 : ")
n2 = input("Note 2 : ")
n3 = input("Note 3 : ")
print("Moyenne :", (n1 + n2 + n3) / 3)input() renvoie des chaînes. Le + les
concatène au lieu de les additionner — on obtient par exemple
"121415" — puis diviser un texte par 3 déclenche la
TypeError.
n1 = float(input("Note 1 : "))
n2 = float(input("Note 2 : "))
n3 = float(input("Note 3 : "))
print("Moyenne :", (n1 + n2 + n3) / 3)float plutôt que int : une note peut valoir 12,5.
Et pour être vraiment robuste, on enveloppe le tout dans un try / except
ValueError.