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 if, elif 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