Structures de contrôle : conditions et boucles
Cours · Python (école d'ingénieur), chapitre 2 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
2.1 Introduction et Motivation
Un programme informatique ne se limite pas à exécuter des instructions séquentiellement de haut en bas. Pour résoudre des problèmes complexes, il doit être capable de prendre des décisions en évaluant des conditions logiques, et de répéter des séquences d'opérations. En Python, la structuration logique du code repose entièrement sur un concept fort : l'indentation. Contrairement à d'autres langages qui utilisent des délimiteurs (accolades \{\} en C/Java, mots-clés begin/end en Pascal), Python utilise l'alignement des lignes pour délimiter les blocs de code. Ce choix de conception impose une lisibilité maximale et une écriture propre.
2.2 Structuration des Blocs et Définition de Fonctions
Le début d'un bloc d'instructions est matérialisé par le caractère deux-points :. Toutes les instructions appartenant à ce même bloc doivent posséder le même niveau d'indentation (généralement 4 espaces). Le retour à l'indentation du niveau parent marque la fin du bloc.
2.2.1 Définition des Fonctions et Routines
On définit une fonction à l'aide du mot-clé def.
- Une fonction prend des paramètres, réalise des calculs et renvoie un résultat au programme appelant à l'aide de l'instruction
return. - Une procédure est une fonction particulière qui ne contient pas d'instruction
return. Elle se contente d'exécuter des actions ayant un effet sur l'environnement et renvoie implicitement la valeurNone.
Considérons le calcul de la norme d'un vecteur , définie mathématiquement par .
def norme_lk(x, y, k):
return (abs(x)**k + abs(y)**k)**(1/k)
2.2.2 Paramètres Optionnels et Nommés
Il est possible d'attribuer des valeurs par défaut à certains paramètres d'une fonction, les rendant optionnels lors de l'appel.
Dans la signature d'une fonction, les paramètres optionnels doivent impérativement suivre les paramètres obligatoires. Lors de l'appel, il est fortement conseillé de nommer les paramètres optionnels pour lever toute ambiguïté (ex. norme_lk(3, 4, k=3)).
def norme_lk(x, y, k=2): # Par défaut, k=2 calcule la norme euclidienne
return (abs(x)**k + abs(y)**k)**(1/k)
2.2.3 Portée des Variables (Scope)
Chaque fonction possède son propre espace de noms local (sa table de référencement).
- Une variable définie dans une fonction est dite locale : elle est inaccessible de l'extérieur.
- Si une variable du même nom existe globalement, l'affectation à l'intérieur d'une fonction crée par défaut une variable locale, masquant la variable globale sans la modifier.
- Pour modifier une variable globale dans le corps d'une fonction, on doit la déclarer explicitement à l'aide du mot-clé
global.
L'usage de variables globales modifiables (global) est fortement déconseillé en programmation. Il rend le flux logique opaque, empêche le test unitaire isolé et favorise la création de "code spaghetti" (où une modification à un endroit a des effets imprévisibles ailleurs).
2.3 Instructions Conditionnelles
Les structures conditionnelles permettent d'orienter le flux d'exécution du programme en fonction de la valeur de vérité de prédicats logiques.
La syntaxe générale d'une alternative multiple est :
if condition_1:
# bloc exécuté si condition_1 est True
elif condition_2:
# bloc exécuté si condition_1 est False et condition_2 est True
else:
# bloc exécuté si toutes les conditions précédentes sont False
Les prédicats comparent des nombres ou des chaînes de caractères (comparaison lexicographique) à l'aide des opérateurs de comparaison (==, !=, <, <=, >, >=).
2.4 Instructions Itératives (Boucles)
Python propose deux types fondamentaux de boucles : la boucle bornée (for) et la boucle conditionnelle (while).
2.4.1 Boucles Énumérées et Indexées (for)
La boucle for permet de parcourir les éléments d'un objet itérable. La fonction range(a, b, c) génère une progression arithmétique d'entiers allant de a (inclus) à b (exclus) avec un pas de c.
for x in range(2, 10, 3):
print(x, x**2)
Ce code affiche les couples 2 4, 5 25 et 8 64.
2.4.2 Parcours de Séquences, Enumerate et Zip
Python permet de parcourir directement les caractères d'une chaîne ou les éléments d'une liste sans passer par leurs indices. Si l'on a besoin des indices, on utilise enumerate(). Si l'on souhaite parcourir deux séquences en parallèle, on utilise zip().
# Utilisation de enumerate
for idx, char in enumerate("Python"):
print(f"Index {idx} -> {char}")
# Utilisation de zip
for i, char in zip(range(1, 4), "abcde"):
print(f"{i} -> {char}") # S'arrête dès que la plus petite séquence est épuisée
2.4.3 Boucles Conditionnelles (while)
La boucle while répète un bloc d'instructions tant qu'une condition logique est vérifiée.
Puisqu'une boucle while n'est pas bornée a priori, il faut veiller à ce que la condition finisse par devenir fausse pour éviter une exécution infinie. La preuve de terminaison repose sur la recherche d'un variant de boucle : une quantité entière, strictement décroissante à chaque itération et minorée.
2.4.4 Contrôle de Sortie : break, continue, return
breakinterrompt immédiatement et définitivement la boucle la plus interne.continueabandonne l'itération en cours et passe directement à l'évaluation de l'itération suivante.returnquitte immédiatement la fonction contenant la boucle, renvoyant la valeur spécifiée.
2.5 Théorie des Invariants de Boucle
Un outil fondamental pour prouver la correction logique d'un algorithme itératif est la notion d'invariant.
Un invariant de boucle est une assertion logique concernant les variables du programme qui vérifie les trois propriétés suivantes :
- Initialisation : L'assertion est vraie juste avant la première itération de la boucle.
- Conservation : Si l'assertion est vraie au début d'une itération, elle reste vraie à la fin de cette itération (avant l'évaluation de l'itération suivante).
- Terminaison : Quand la boucle se termine, l'invariant combiné avec la condition d'arrêt de la boucle fournit une propriété utile pour prouver la validité de l'algorithme.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.