Python : boucles et conditions
Définition
Les boucles et les conditions sont les deux briques de contrôle de flux de Python : if/elif/else execute un bloc selon une condition booléenne, for parcourt une séquence élément par élément, while répète un bloc tant que la condition reste vraie. Le langage n'utilise ni accolades ni point-virgules : le bloc se définit uniquement par l'indentation, quatre espaces par niveau dans les conventions officielles (PEP 8).
Contexte
Le blueprint 200-301, thème 6, demande de lire et modifier des scripts Python existants : comprendre des boucles, des conditions et des opérateurs, pas d'écrire un programme complet de mémoire. À l'examen : lire un extrait de code du type « que affiche ce script sur cette sortie de commande ? », donc savoir lire une indentation, une boucle for sur une liste de chaînes et un if avec in, and, or.
La syntaxe du bloc
Un en-tête se termine par deux-points, le corps est indenté, et le retour à une indentation moindre ferme le bloc :
interface = "GigabitEthernet0/1"
status = "up"
if status == "up" and interface.startswith("Gi"):
print(f"{interface}: actif et à haut débit")
elif status == "up":
print(f"{interface}: actif mais pas Gigabit")
else:
print(f"{interface}: problème de lien")
Trois points durs : les deux-points de l'en-tête sont obligatoires, l'indentation doit être cohérente dans tout le bloc, et == compare là où = affecte. Écrire if status = "up" leve une SyntaxError immédiate, mais compteur = compteur + 1 dans une condition est une erreur classique quand la syntaxe autorise l'affectation ailleurs.
Les conditions et leurs opérateurs
| Opérateur | Sens | Exemple réseau |
|---|---|---|
== / != |
égal / différent | state == "down/down" |
in |
appartenance à une séquence | "up" in ligne |
not in |
non-appartenance | vlan not in vlans_autorises |
and / or / not |
ET / OU / NON logiques | protocole == "http" and port == 80 |
< > <= >= |
comparaison ordonnée | cpu_percent > 85 |
Parcourir des listes : for et range
for itère directement sur les éléments, sans index manuel :
switchs = ["SW-ATELIER", "SW-CAMP", "SW-POMPE"]
for nom in switchs:
print(f"ping de {nom}")
range(n) produit la suite 0, 1, ..., n-1, utile quand l'index compte, et enumerate donne les deux à la fois :
for i, nom in enumerate(switchs):
print(i, nom) # 0 SW-ATELIER, 1 SW-CAMP, 2 SW-POMPE
while sert aux répétitions sans borne connue : réessayer une connexion jusqu'à succès ou épuisement des tentatives.
tentatives = 0
connecte = False
while tentatives < 3 and not connecte:
tentatives += 1
connecte = teste_ssh("10.10.20.1")
Cas concret : filtrer une config IOS
Une sortie de commande arrive souvent sous forme de texte, donc de liste de lignes. Le pattern idiomatique est splitlines() puis un filtre par ligne :
output = """
Interface IP-Address OK? Method Status Protocol
Gi0/0 unassigned YES unset up up
Gi0/1 10.10.10.1 YES manual up down
Te1/0/1 unassigned YES unset administratively down down
"""
lignes = output.splitlines()
for ligne in lignes:
champs = ligne.split()
if len(champs) < 6 or champs[0] == "Interface":
continue
nom = champs[0]
statut = champs[-2]
proto = champs[-1]
if statut != "up" or proto != "up":
print(f"alerte: {nom} statut={statut} protocole={proto}")
continue saute l'itération courante : ici la ligne vide du début et l'en-tête, dont le premier mot est exactement Interface. Le découpage par split() absorbe les espaces multiples, et les deux derniers champs (champs[-2], champs[-1]) restent Status et Protocol même quand le statut contient deux mots comme administratively down. Sans ce contrôle de longueur, le script tenterait de parser le titre et afficherait une fausse alerte.
Exemple concret
Un script de collecte itère sur 48 ports d'un switch : 1 requête API de 120 ms par port, soit 5,8 secondes en boucle séquentielle (for port in range(1, 49)). Le blueprint n'attend pas l'optimisation, mais notez que la même boucle avec une liste en compréhension [port for port in ports if port["status"] == "down"] remplace cinq lignes de filtre par une ligne lisible.
Pièges fréquents
- Mélanger Tab et espaces : l'indentation devient incohérente, IndentationError ou logique fausse.
=au lieu de==dans une condition, ou l'inverse dans une affectation.- Oublier les deux-points après
if,for,while,elif,else. - Modifier une liste pendant qu'on la parcourt avec
for: parcourir une copie, ou construire une liste neuve.