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

ModeCommentPour 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é
mode interactif
>>> 2 + 3
5
>>> a = 6
>>> a
6
🧰 Les chevrons >>> ne se recopient pas

Dans 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.

PHP / JavaScript — accolades if ($age >= 18) { echo "majeur"; echo "bienvenue"; } echo "suite"; Python — indentation if age >= 18: print("majeur") print("bienvenue") print("suite")
Le bloc, c'est ce qui est décalé. Revenir à gauche, c'est sortir du bloc.
⚠️ Les deux erreurs d'indentation
python
if age >= 18:
print("majeur")            # ✘ IndentationError: expected an indented block

if age >= 18:
    print("majeur")
        print("bienvenue")  # ✘ IndentationError: unexpected indent

Ne 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.
python
valides    : toto, proch_val, max1, MA_VALEUR, r2d2, bb8, _mavar
non valides : 2be, C-3PO, ma var

Convention : minuscules, mots séparés par _, pas d'accent.

L'affectation

python
n    = 33
a    = 42 + 25          # l'expression est évaluée d'abord
ch   = "bonjour"
euro = 6.55957

La première affectation s'appelle l'initialisation. Une nouvelle affectation écrase la valeur précédente, qui est perdue.

⚠️ = affecte, == compare
python
>>> a = 6          # j'affecte
>>> b = 9
>>> a == b        # je demande : sont-ils égaux ?
False

C'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.

python
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
python
>>> 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
235

D'où l'écriture habituelle, qui convertit au moment même de la saisie :

python
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

python
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 vide
🧰 Les f-strings, à préférer

Le polycopié présente l'ancien formatage avec % :

python — ancienne écriture
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.

python — à préférer
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

python
# 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égorieOpérateursExemple
1Parenthèses() (2 + 3) * 4 → 20
2Exponentiation** 2 ** 3 → 8
3Multiplication, division * / // % 7 % 3 → 1
4Addition, soustraction+ - 5 + 3 - 2 → 6
5Comparaisons == != > < >= <= 5 > 3 → True
6Logiquenotnot True → False
7Logiqueandévalué après not
8Logiqueorpriorité la plus faible
⚠️ / et // ne font pas la même chose
python
7 / 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 3

C'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.

🧰 En Python, and, or, not s'écrivent en toutes lettres
PythonJavaScript / PHP
and&&
or||
not!
True · False true · false (minuscules !)

Attention à la majuscule de True et False : true en minuscules provoque une NameError.

06Les conditions

python
age = 20

if age < 18:
    print("Vous êtes mineur.")
elif age == 18:
    print("Vous venez d'atteindre la majorité.")
else:
    print("Vous êtes majeur.")
python — conditions combinées
age = 20
a_passe_test = True

if age >= 18 and a_passe_test:
    print("Accès autorisé")
else:
    print("Accès refusé")
🔧 Corrigé — Else avec une majuscule ne compile pas

Le polycopié écrit, dans l'un de ses exemples :

erreur de syntaxe
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 if

Python 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

Nombre d'itérations connu → for
Nombre inconnu → while

for — 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().

python
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

ÉcritureProduitExemple
range(stop)de 0 à stop − 1 range(5) → 0 1 2 3 4
range(start, stop)de start à stop − 1range(1, 6) → 1 2 3 4 5
range(start, stop, step)avec un pas range(10, 0, -2) → 10 8 6 4 2
⚠️ La borne de fin est TOUJOURS exclue

range(1, 11) s'arrête à 10, pas à 11. C'est la source d'erreur n° 1 des débutants.

Pour aller de 1 à n : range(1, n + 1)

Et range(5) commence à 0 — ce qui tombe bien, puisque les indices de liste commencent aussi à 0.

while — tant que

python
i = 1
while i <= 5:
    print(i)
    i += 1          # ← sans cette ligne : boucle infinie

break et continue

python
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. »
breakquitte la boucle et passe à la suite. Dans des boucles imbriquées, ne sort que de la plus interne
continuesaute 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.

python
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)
🧰 Les indices négatifs, une commodité de Python

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.

python
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 fois
⚠️ Un set perd l'ordre

Regardez 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 :

python
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é.

python
coordonnees = (192, 168, 0, 1)
coordonnees[0] = 10      # ✘ TypeError: 'tuple' object does not support item assignment

On 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.

python
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ées

Deux façons de le parcourir

python
# 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éthodeDonne
.keys()les clés
.values()les valeurs
.items()les couples (clé, valeur)
💡 Liste ou dictionnaire ?

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.

⚠️ Une clé absente lève une erreur
python
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

python
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 !
defdéclare la fonction — suivi de deux-points
le corpsindenté de 4 espaces
returnrenvoie une valeur et arrête la fonction
sans returnla fonction renvoie None
⚠️ print() n'est pas return
python
def 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)              # 50

Même principe qu'en PHP et en JavaScript : afficher est pour l'humain, retourner est pour le programme.

11Fichiers et exceptions

Ouvrir, lire, écrire

ModeEffet
"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)
python — la forme à retenir
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")
🧰 Toujours with, jamais open seul

La forme sans with existe, mais impose de penser au close() :

python — à éviter
f = open("data.txt", "r")
contenu = f.read()
f.close()             # si une erreur survient avant, le fichier reste ouvert

with 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.

python
>>> x = 10 / 0
ZeroDivisionError: division by zero
python — try / except
try:
    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
ExceptionQuand
ValueErrorconversion impossible — int("abc")
TypeErroropération entre types incompatibles — "abc" + 5
ZeroDivisionErrordivision par zéro
KeyErrorclé absente d'un dictionnaire
IndexErrorindice hors de la liste
FileNotFoundErrorfichier introuvable en lecture
🧰 L'usage le plus utile : sécuriser une saisie
python
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.

🧠 Auto-évaluation

Ce programme doit afficher la moyenne de trois notes saisies. Il affiche TypeError. Pourquoi, et comment le corriger ?

python
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.

python — corrigé
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.

⚡ Récap 2 minutes

  • L'indentation est la syntaxe : 4 espaces, jamais de tabulations mêlées, et les deux-points en fin de ligne.
  • Typage dynamique : pas de déclaration. type(x) pour vérifier.
  • input() rend du texte → int() ou float() avant tout calcul.
  • f-strings : f"Bonjour {nom}".
  • Mots-clés en minuscules (else, and…) sauf True, False, None.
  • elif, pas else if.
  • range(1, 11) s'arrête à 10 : la borne est exclue.
  • / donne un float, // l'entier, % le reste.
  • Liste = position, append/remove. Dictionnaire = nom, .items(), .get(). set() déduplique mais perd l'ordre.
  • with open(…) ferme tout seul. try/except pour survivre aux erreurs.

Sources exploitées

  • Cours « Programmation en Python » (le professeur, BTS CIEL 2025-2026) — séances du 19/12, 09/01, 23/01, 06/02 et 20/02
  • Support d'exercices Python
  • comptes rendus d'élève (TP3 listes et dictionnaires, TP6 fonctions)