Aller au contenu principal

Python : boucles et conditions

CCNA — Automation and Programmability

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

  1. Mélanger Tab et espaces : l'indentation devient incohérente, IndentationError ou logique fausse.
  2. = au lieu de == dans une condition, ou l'inverse dans une affectation.
  3. Oublier les deux-points après if, for, while, elif, else.
  4. Modifier une liste pendant qu'on la parcourt avec for : parcourir une copie, ou construire une liste neuve.