La structure d'un programme Python

Le langage Python est un langage impératif et de ce fait, il utilise des structures de contrôle telles que les branchements conditionnels (if ... else ...) des itérations (for) et des boucles (while).

Les particularités de la syntaxe du langage sont que :

  • les conditions de branchement, itération ou de boucle sont terminées par :
  • les blocs de code ne sont pas identifiés par des séparateurs de début et de fin particuliers comme {...}, par exemple, mais sont identifiés par leur niveau d'indentation. Un changement d'indentation indique un debut ou fin de bloc.
  • les niveaux d'indentation doivent obligatoirement être écrits avec des et non pas avec des <tab>. Par ailleurs, les indentations doivent nécessairement être un multiple du même nombre. Par convention, ce nombre est égal à 4, mais il peut prendre n'importe quelle valeur.

Exemples

Voici un exemple un peu arbitraire illustrant les points précédents.

a = 1
while a < 10:
    b = a % 3
    a = a + b
    if a % 2 == b:
        a = a % 10
    else:
        a = a + 1

Est-ce que ce code termine ? Quelles sont les valeurs des variables a et b au fur et à mesure de l'exécution du code ?

Les structures de contrôle

Les structures de contrôle sont des instructions conditionnelles qui permettent de modifier le flot d'exécution d'un programme. En d'autres termes, elles permettent d'exécuter une partie bien définie du code si des conditions spécifiques sont réunies, ou d'exécuter une autre partie du code si ce n'est pas le cas.

In distingue habituellement les branchements et les boucles. Python, contrairement à beaucoup d'autres langages impératifs, n'offre qu'un nombre limité de structures de contrôle. Il n'y a notamment pas d'instruction switch ni de do ... while, par exemple.

Le branchement conditionnel - if ... [elif ...] [else ...]

Python permet une seule structure de branchement : l'instrucion if. Elle se décline de trois façons différentes.

if simple

La structure de l'instruction `if est simple :

if C:
    bloc_instructions

suite

C est une expression qui puisse s'évaluer comme un booléen et le corps de l'instruction est formé par un bloc d'instructions. Le bloc d'instructions n'est exécuté que si l'expression C s'évalue à True.

La suite des instructions est ensuite exécutée indépendamment de la valeur de C. Par conséquent, si Cs'évalue à Truele programme exécute bloc_instructionspuis suite. En revanche si Cvaut Falsele programme exécute seulement suite.

if ... else ...

La structure de contrôle ìf peut être complétée par une clause else qui sera exécutée si la condition C s'évalue à False.

if C:
    bloc_instructions_1
else:
    bloc_instructions_2

suite

Par conséquent, le code précédent donne lieu à l'exécution bloc_instructions_1 suivi de suite si C s'évalue à True et, au contraire, donne lieu à l'exécution de bloc_instructions_2 suivi de suitesi Cs'évalue à False.

if ... elif ... [else ...]

Python propose une seconde extension à la structure de contrôle qui n'a pas d'autre utilité que de rendre le code plus lisible. En effet, si le code comporte plusieurs branchements conditionnels mutuellement exclusifs, le code peut vite devenir difficile à lire du fait des indentations obligatoires imposées par le langage. Un exemple est fourni ci-dessous.

if C_1:
    bloc_instructions_1
else:
    if C_2:
        bloc_instructions_2
    ... else:
            if C_n:
                bloc_instructions_n
            else:
                bloc_instructions_autre

suite

Pour faciliter la lecture du code, Python offre une façon plus synthétique d'êcrire le même code en utilisant les enchaînements if ... elif ... else comme illustré ci-dessous. Le code reproduit ici est à tout égard identique à celui représenté au-dessus.

if C_1:
    bloc_instructions_1
elif C_2:
    bloc_instructions_2
...
elif C_n:
    bloc_instructions_n
else:
    bloc_instructions_autre

suite

La boucle conditionnelle - while

Les boucles conditionnelles répètent les mêmes instructions jusqu'à ce qu'une condition soit vérifiée. Python, contrairement à certains autres langages, offre une seule structure de contrôle pour faire des boucles conditionnelles, sachant qu'elles peuvent toutes se réduire les unes aux autres.

La boucle conditionnelle s'écrit comme suit :

while C:
    bloc_instructions

suite

C est une expression qui s'évalue en un booléen.

Si C s'évalue à False au départ, les instructions dans bloc_instructions ne seront pas exécutées et seule suite sera exécuté. Si C s'évalue à True au départ, les instructions dans bloc_instructions seront exécutées une première fois, puis l'expression C sera ensuite réévaluée. Si elle vaut False la boucle se termine et suite est exécuté, sinon on exécute de nouveau bloc_instruction autant de fois que nécessaire, jusqu'à ce que C s'évalue enfin à False.

Conceptuellement on peut associer une boucle conditionnelle à une infinité de branchements conditionnels imbriqués comme illustré ci-dessous :

if C:
    bloc_instructions
    if C:
        bloc_instructions
        if C:
            bloc_instructions
            if C:
                bloc_instructions
                ...

suite

Il est important de noter que l'expression C doit dépendre d'un variant de boucle et que celui-ci soit modifié par bloc_instructions pour avoir une chance que la boucle se termine. Dans le cas contraire on peut fabriquer des boucles dites infinies qui ne terminent jamais.

Le cas le plus simple d'une boucle infinie est :

while True:
    bloc_instructions

Il est égalment important de noter que la présence d'un variant de boucle ainsi que sa modification ne sont que des conditions nécessaires, mais pas suffisantes, comme le montre le code ci-dessous :

i = 1
while i > 0:
    i += 1

La boucle itérative - for ... in ...

A venir

  • structures de contrôle
  • limites des int, float, str
  • du bon usage des strings
  • les listes
    • compréhensions [ <expr> for i in L if C]
    • slices, et notamment l[a:b] = [x,y,z] et l[len(l):] = [x,y,z]
  • les constantes
  • fonctions
  • portée des variables (+ global)
  • la mutabilité
  • is, == et la non-existence de ===
  • opérateurs ternaires A if C else B