Exemple_CP

Une page du cours Python

Branchements conditionnels if….

Pour dévier le flot des instructions en fonction de la valeur (vraie/fausse, non_nulle/nulle, non_vide/vide) d’une expression (appelée ici condition), Python met à notre disposition les clauses ifelif et else.

La clause if simple permet d’exécuter un bloc d’instructions si la condition est vraie :

if condition:                # si condition est vraie
    bloc_si_condition_vraie  # alors on parcourt ce bloc

On peut rajouter une clause else (facultative, donc) pour exécuter un autre bloc si la condition est fausse :

if condition:                   # si condition est vraie
     bloc_si_condition_vraie    # on parcourt ce premier bloc
else:                           # sinon
     bloc_si_condition_fausse   # on parcourt ce second bloc

Plutôt que d’emboîter des clauses if, on peut utiliser une clause if suivie par une (des) clause(s) elif :

if condition1:             # si condition1 est vraie
    bloc1_si_C1_vraie      # alors on exécute ce bloc1
elif condition2:           # sinon si condition2 est vraie
    bloc1_si_C1_fausse_et_C2_vraie
elif condition3:           # sinon si condition3 est vraie
    bloc3_si_C1C2_fausses_mais_C3_vraie
...
elif conditionN:           # sinon si conditionN est vraie
    blocN_si_CN_première_à_être_vraie
else:                # (facultatif) conditions toutes fausses
    bloc_else              # alors on exécute ce bloc

Remarques :

  • Dans toutes les constructions ci-dessus, au plus un bloc est parcouru;
  • Ne pas oublier le caractère « deux points » qui termine chacune des lignes d’en-tête !!! ;
  • Se souvenir que si un bloc se réduit à une instruction, on peut le placer directement après le « deux points ».
if x % 2:          # comprendre "si x est non nul modulo 2"
    print("x est impair")
    elif x % 4:    # x est pair, et on teste son reste modulo 4
        print("x est pair, mais pas multiple de 4")
    elif x % 8:    # x multiple de 4, on teste son reste modulo 8
        print("x multiple de 4, mais pas de 8")
    else:           # si on est là, x est multiple de 8
        print("x est multiple de 8")

Complément : expressions conditionnelles

Python offre la possibilité de former des expressions dont l’évaluation est soumise à une condition.
La syntaxe est la suivante : expression1 if condition else expression2
Le résultat est bien sûr l’évaluation de expression1 si la condition est vraie, et sinon c’est celle de expression2.

On voit sur le deuxième exemple ci-dessous comment emboîter deux expressions conditionnelles.

>>> x = -1; print("x > 0" if x>0 else "x ≤ 0")
x ≤ 0
>>> x = 0; print("x > 0" if x>0 else "x < 0" if x<0 else "x = 0")
x = 0

Les répétitions inconditionnelles (for…)

Pour répéter un certain nombre de fois un bloc d’instructions, on utilisera la construction suivante :

for element in objet:   # pour chaque élément de objet
    bloc_d’instructions # on parcourt ce bloc

En fait, objet est ici est toute construction susceptible d’être parcourue : on pense bien sûr aux intervalles (range), mais aussi aux chaînes (parcourues caractère par caractère), aux listes, aux tuples, aux dictionnaires….

for k in range(10):       # pour k=0, puis k=1, etc., k=9
     bloc_d_instructions  # on parcourt ce bloc
for x in 'abcdef':        # pour x = 'a', x = 'b', etc., x = 'f'
     bloc_d_instructions  # on parcourt ce bloc
for x in [7, 1, 8, 3, 4]: # pour x = 7, x = 1, etc., x = 4
     bloc_d_instructions  # on parcourt ce bloc

Le bloc qui fait suite à l’instruction for peut contenir deux instructions particulières, souvent attachées à un test if :

  • break provoque la sortie immédiate de la clause for.
  • continue passe directement à l’étape suivante de la boucle (ce qui reste du bloc après continue est donc ignoré).

Les répétitions conditionnelles (while…)

Pour répéter un bloc d’instructions tant qu’une condition est réalisée, Python nous propose la clause while :

while condition:            # tant que la condition est vraie
    bloc_si_condition_vraie # alors on parcourt ce bloc

Quelques remarques classiques sur ce genre de construction :

  • Si condition est fausse dès le départ, le bloc qui suit n’est jamais parcouru.
  • Dans la plupart des cas, le bloc qui suit l’instruction d’en-tête while agit sur la condition, de sorte que celle-ci, vraie au départ, devient fausse et provoque la sortie de la clause.
  • On peut écrire une clause while avec une condition toujours vraie (par exemple while 1: ou while True:) à condition (pour éviter une boucle infinie) de sortir par un autre moyen (notamment par break ou return).

Dans l’exemple ci-dessous, on illustre la clause while avec l’exemple classique de la suite dite de Syracuse.

Celle-ci est définie par une valeur initiale x0 et la règle suivante : si xn est pair alors xn+1 = xn/2 sinon xn+1 = 3xn + 1.

Une conjecture célèbre dit que l’un des xn vaut 1 (et la suite boucle alors sur les valeurs 1 → 4 → 2 → 1). On étudie ici le comportement très intéressant obtenu pour la valeur initiale x0 = 27 :

x = 27                # on part de la valeur 27
while x != 1:         # tant que x est différent de 1
    if x % 2 == 1 :   # si x est impair,
       x = 3*x+1      # on le remplace par 3x+1
    else:
       x = x // 2     # sinon, on le divise par 2
    print(x, end=' ') # affiche x (sans passer à la ligne)

82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182
91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790
395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132
566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619
4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232
4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61
184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1

Le bloc qui fait suite à l’instruction while peut contenir deux instructions particulières, souvent attachées à un test if :

  • break provoque la sortie immédiate de la clause while;
  • continue ramène à l’évaluation de la condition (ce qui restait du bloc après continue est donc ignoré).

Fonctions récursives

Une fonction récursive est une fonction qui s’appelle elle-même, dans sa propre définition. Les deux exemples les plus simples sont l’algorithme d’Euclide et la fonction factorielle :

def pgcd(a,b):  # algorithme d'Euclide
    if b > 0: return pgcd(b, a % b)
    else: return a

>>> pgcd(14814, 28440)
18

def fact(n):  # calcule n!
    if n <= 1: return 1
    else: return n*fact(n-1)

>>> fact(10) # 10x9x8...x2x1
3628800