Cours Algo Python
Cours Algo Python
Initiation à l’algorithmique et à la
programmation en Python
(UNSTIM)
1 Introduction générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.3 Le langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2.1 Le programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2.2 Le problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2.3 L’algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.2 Exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.2 L’écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.3 La lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.4 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.2 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.2.1 Définir une fonction en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
L’ordinateur est un appareil très puissant permettant de traiter les informations (données) sous
forme binaire avec une très grande vitesse, une précision élevée et a la faculté de stocker toutes
ces informations. Il est divisé en deux (02) parties : la partie matérielle (hardware) et la partie
logicielle (software).
La partie matérielle de l’ordinateur est composée de circuit électronique (processeur, interface,
8 Chapitre 1. Introduction générale
support de stockage, périphérique, etc. . .) permettant de stocker des données sous forme binaire ;
c’est-à-diresous forme de bits.
La partie logicielle est celle à laquelle les instructions sont données pour exécuter des actions bien
précises : on parle de programme informatique.
Les programmes interagissent avec l’environnement ou les utilisateurs grâce aux périphériques
d’entrée et de sortie. Leur mise en œuvre est assurée par la partie matérielle au cœur de laquelle se
trouve le processeur.
Ordinateur de bureau Un ordinateur de bureau est conçu pour être toujours au même endroit,
généralement sur un bureau. Il se compose :
1. d’une unité centrale : qui contient les principaux composants de l’ordinateur. C’est également
sur celle-ci que vous trouverez le bouton pour allumer l’ordinateur ;
À ces ordinateurs, il faut ajouter un clavier et une souris pour pouvoir les utiliser.
Ordinateurs portables Les ordinateurs portables sont conçus pour être compacts et mobiles.
Ainsi, ils ne disposent pas d’une unité centrale, tous les composants se situent sous le clavier.
Sur ce type d’ordinateur, brancher une souris n’est pas obligatoire, car il y a un touchpad : une
surface sensible au toucher qui permet de déplacer le pointeur à l’écran.
Comme pour les ordinateurs de bureau, d’autres périphériques peuvent être ajoutés.
Tablettes Il existe aussi des tablettes, ce sont des ordinateurs mobiles à la taille réduite. Les écrans
sont tactiles et affichent un clavier virtuel. Tous les composants sont situés derrière l’écran. Ainsi,
les tablettes n’ont pas besoin d’unité centrale, ni de clavier ou de souris. Sur certains modèles, il est
toutefois possible d’y connecter un clavier et/ou une souris.
10 Chapitre 1. Introduction générale
Il existe différents modèles de processeurs et cette technologie évolue rapidement. Les processeurs
des marques AMD et Intel sont les plus fréquemment rencontrés.
• Intel Core i3 qui correspond à l’entrée de gamme des processeurs Intel Core,
• Intel Core i5 qui constitue le milieu de gamme,
• Intel Core i7 et Intel Core i9 qui sont de la gamme supérieure.
La mémoire vive ou RAM (Random Access Memory) C’est la mémoire temporaire de l’ordina-
teur, c’est là où sont stockés tous les fichiers sur lesquels l’utilisateur est en train de travailler. Cette
mémoire est temporaire, car les informations sont supprimées lors de l’arrêt de l’ordinateur.
1.1 Introduction à l’informatique 11
Plus cette mémoire est importante, plus l’ordinateur travaille facilement et rapidement et plus il
peut gérer des tâches différentes.
La capacité de cette mémoire s’exprime en Gigaoctets (Go). La mémoire vive se présente sous
forme de petites barrettes que l’on insère dans la carte mère. Un ordinateur peut ainsi comporter
plusieurs barrettes pour avoir au total (cela dépend des ordinateurs) 4 - 8 - 16 ou 32 Go de RAM.
Le disque dur (mémoire morte) C’est le support sur lequel on peut stocker des informations. Les
capacités de stockage ne cessent d’augmenter et permettent donc d’enregistrer un grand nombre de
données : documents, photos, films...
Il y a actuellement deux types de disques durs : SSD et HDD. Les SSD ont l’avantage d’être
extrêmement rapides, mais ils sont plus chers et de capacité limitée.
La carte graphique ou vidéo Elle permet de produire une image affichable sur un écran d’or-
dinateur. La carte graphique peut être intégrée à la carte mère ou dédiée, c’est-à-dire qu’elle est
séparée et qu’elle dispose de sa propre mémoire vive. Une carte graphique dédiée est plus puissante,
mais coûte plus cher. Elle permet de faire fonctionner correctement des jeux en 3D, des logiciels de
retouche vidéo/photo par exemple.
12 Chapitre 1. Introduction générale
AMD et NVIDIA sont les marques de cartes graphiques les plus courantes
Le ventilateur Le ventilateur est utilisé pour réduire la température souvent élevée du processeur
et réduire les risques de surchauffe.
La carte mère (motherboard) Elle se trouve au centre de l’ordinateur et connecte tous les
composants de l’ordinateur. La carte mère contient les connexions pour le processeur, la mémoire,
les unités de stockage. . .Elle intègre une carte son et une carte graphique.
1.1 Introduction à l’informatique 13
R Pour un ordinateur de bureau, ces différents composants se retrouvent dans l’unité centrale.
Pour les ordinateurs all in one, ils se retrouvent derrière l’écran et pour les ordinateurs
14 Chapitre 1. Introduction générale
1.1.3 Le langage
Le langage informatique est un langage dans lequel il est aisé de communiquer avec l’ordinateur.
Il est composé de mots clés, de fonctions prédéfinies qui sont utilisées dans le but de donner des
instructions à une machine. On distingue deux (02) types de langages en informatique : le langage
machine et le langage évolué.
Le langage machine est un langage plus proche de celui de la machine.
■ Exemple 1.1 Langage assembleur. ■
Le langage évolué ou langage haut niveau est un langage qui utilise les mots-clés du langage
naturel. Leur utilisation est plus facile pour les programmeurs. Parmi ces langages, on distingue les
langages compilés et les langages interprétés.
1.2.1 Le programme
1.2.2 Le problème
Un problème est un ensemble de données et de traitements décrivant une situation que l’on cherche
à résoudre. Le but visé à travers la résolution du problème peut être :
1.2.3 L’algorithme
Un algorithme est l’enchaînement des actions ou instructions élémentaires nécessaires pour faire
exécuter une tâche à un ordinateur ; c’est-à-dire pour résoudre un problème.
L’algorithme est écrit dans un pseudo-langage de programmation appelé langage algorithmique.
Il a l’avantage d’être facilement traductible dans tous les langages de programmation.
L’algorithmique est donc l’art d’écrire des algorithmes. Il permet de se focaliser sur la procédure
de résolution du problème sans avoir à se soucier des spécificités d’un langage particulier.
Réflexion Codes
P ROBLÈME A LGORITHME P ROGRAMME
Lang. de Prog.
La mise en œuvre d’un programme commence par la réflexion sur le problème posé. Ensuite, la
procédure identifiée pour la résolution est décrite dans un algorithme. Ce dernier peut alors être
traduit en programme dans un langage de programmation.
1.3.2 Exécution
Après que le programme est édité, il est enregistré sous la bonne extension dans un emplacement
précis sur l’ordinateur. Ensuite, il est traduit en code binaire (0 et 1) grâce à un compilateur. La
compilation produit donc un exécutable (.exe) que le processeur exécute en respectant l’ordre des
instructions.
1.4.1 Introduction
Compte tenu de la multiplicité des applications et des situations qui incluent l’utilisation d’un
ordinateur ou d’un automate, on est en droit de se poser la question sur la meilleure manière
d’aborder leur résolution. À ce propos, une démarche générale de résolution des problèmes algorith-
miques peut être suivie. Elle inclut un certain nombre d’étapes qui, si elles sont suivies, aboutissent
irrémédiablement à un résultat, fût-il différent de la solution voulue.
A cette étape, on pense à reformuler le problème en utilisant des termes et des concepts complète-
ment différents de ceux utilisés dans le domaine d’application. Il s’agit ici de penser aux données
du problème qui peuvent être utilisées par l’ordinateur ou l’automate pour résoudre ledit problème.
16 Chapitre 1. Introduction générale
Cette étape fait suite à l’étape précédente. Ainsi, après avoir essayé de se focaliser sur les données
probables du problème, on cherche à identifier les variables d’entrée, les variables intermédiaires
et les variables de sortie.
Le second volet de cette étape inclut les différentes opérations ou les différents traitements que l’on
doit opérer sur ou avec les variables.
A cette étape, il est question de concevoir un enchaînement séquentiel censé aboutir au résultat
souhaité. Cette étape n’inclut pas encore l’écriture de l’algorithme lui-même. On pourra toutefois
écrire au brouillon, les étapes suivant lesquelles le programme pourra se dérouler.
Il s’agit ici d’écrire la solution en respectant la syntaxe et en faisant usage des structures et outils
prévus par la science algorithmique.
On simule le déroulement du programme en choisissant des cas pratiques ou des exemples avec des
données réelles. Ce faisant, on vérifie l’exactitude de la solution proposée.
R La dernière étape peut amener à se rendre compte que l’on a mal traité le problème ou que
l’on n’a pas tenu compte de tous les cas de figure possibles. Cela peut donc amener à redéfinir
le problème.
R L’étape écriture de l’algorithme peut être remplacée selon le cas par dessin d’un algori-
gramme ou ordinogramme ou diagramme algorithmique.
2. Notion de variable et structure d’un
programme
2.1.1 Définition
Une variable est un symbole qui associe un nom (l’identificateur) à une valeur. Elle est représentée
par (ou correspond à) une case-mémoire qui contient la valeur de la variable et à laquelle on fait
appel lorsqu’on veut manipuler la valeur.
On attribue un nom unique appelé identificateur à la variable. C’est à travers cet identificateur
qu’on peut recueillir ou modifier la valeur de la variable. Les valeurs que peut prendre une variable
sont également précisées à travers les types.
Pour qu’un programme puisse utiliser une variable, il faut au préalable réserver la case-mémoire à
laquelle elle doit correspondre. Pour ce faire, il faut procéder à la déclaration des variables qui est
une instruction spécifique.
La déclaration d’une variable consiste à indiquer deux choses : son identificateur et son type.
2.1.2.1 Identificateur
L’identificateur peut être composé de lettres et de chiffres. Il ne peut pas commencer par un chiffre
et ne peut comporter d’espace. Il doit être suffisamment significatif pour qu’on y reconnaisse la
chose représentée.
2.1.2.2 Type
• Les entiers (int) : Ce sont les nombres sans virgule signés ou non (tout nombre appartenant
à Z).
• Les réels (float) : Les nombres à virgule.
18 Chapitre 2. Notion de variable et structure d’un programme
• Les caractères (str) : Lettres, chiffres, ponctuations, code des opérateurs, espace ; plus
généralement toutes les touches du clavier.
• Les chaînes de caractères (str) : C’est une suite de caractères.
• Les booléens (bool) : Type logique avec deux (02) valeurs possibles : Vrai ou Faux. En
Python, ces types de variables sont représentés par True ou False, ou encore 1 (True)
ou 0 (False).
Le nom des variables en peut être constitué de lettres minuscules (a à z), de lettres majuscules (A
à Z), de nombres (0 à 9) ou du caractère souligné (_). Vous ne pouvez pas utiliser d’espace dans
un nom de variable. Par ailleurs, un nom de variable ne doit pas débuter par un chiffre et il n’est
pas recommandé de le faire débuter par le caractère _ (sauf cas très particuliers). Il est conseillé de
mettre des noms de variables explicites, de manière à exprimer clairement ce que la variable est
censée contenir.
En Python, la casse est significative, c’est-à-dire que les caractères majuscules et minuscules sont
distingués. Cela signifie que les variables TesT, test et TEST sont différentes.
OU
1 VARIABLE : <identificateur1>, ... , <identificateurm> : <type1>
2 <identificateur1>, ... , <identificateurn> : <type2>
3 ...
4 <identificateur1>, ... , <identificateurp> : <typeN>
1 VARIABLE : a, b : REEL
2 Ent1, Ent2, Ent3 : ENTIER
3 lettre : CHAR // ou lettre : CARACTERE
4 prenom : CHAINE // ou prenom : VARCHAR
■
R En Python, les variables ne sont pas explicitement déclarées. Et le type d’une variable est
automatiquement détecté par Python lors de l’affectation (voir section 2.2.1). On dit que
Python est typé dynamiquement ou est un langage au typage dynamique.
2.2.1 L’affectation
L’affectation consiste à donner à une variable déclarée une valeur appartenant à son type. Elle
permet de donner une première valeur à la variable ou de changer sa valeur courante.
2.2 Les instructions élémentaires 19
■ Syntaxe 2.2
1 <identificateur> ←− <expression> ;
1 a ←− 12 ;
2 a ←− 4 * 2.5 ;
3 a ←− 0.0 ;
4 b ←− 5 * a + 2.5 ;
5 a ←− b ;
■
1 a = 12
2 a = 4 * 2.5
3 a = 0.0
4 b = 5 * a + 2.5
5 a = b
R On remarque que les instructions en Python ne se terminent pas par un point-virgule, ce qui
n’est pas le cas en algorithmique.
2.2.2 L’écriture
C’est une instruction qui permet au programme de fournir des informations ou de retourner
des résultats sous forme compréhensible pour l’utilisateur à travers l’écran. Plus simplement,
l’instruction d’écriture permet d’afficher du contenu à l’écran.
■ Syntaxe 2.3
OU
1 ECRIRE("Bonjour M. Justin.") ;
2 age ←− 18 ;
3 ECRIRE("M. Justin, vous avez : ", age, "ans.") ;
■
1 print("Bonjour M. Justin")
2 age = 18
3 print("M. Justin, vous avez : ", age, "ans.")
20 Chapitre 2. Notion de variable et structure d’un programme
2.2.3 La lecture
C’est une instruction qui permet de récupérer des données à partir du périphérique d’entrée
(généralement le clavier). La valeur récupérée est rangée dans une variable.
■ Syntaxe 2.4
1 LIRE(<variable1>, <variable2>, ...) ;
OU
1 SAISIR(<variable1>, <variable2>, ...) ;
En Python, on utilise le mot-clé input pour récupérer des données entrées par l’utilisateur :
1 print("Bonjour M. Justin. Quel est votre âge ?")
2 age = input() # Lire l'âge à l'écran
3 print("Mr Justin, vous avez", Justin, "ans.")
R En Python, le contenu récupéré avec la fonction input() est une chaîne de caractères. Ainsi,
l’âge qui est lu à l’écran est de type str et non un nombre entier (int). Pour obtenir la
variable sous forme d’entier, il faut la convertir. Cette opération de conversion est appelée
casting.
On souhaite, par exemple, récupérer un nombre, lui ajouter 1 puis afficher le résultat.
2.2.4 Commentaires
Les commentaires permettent d’expliquer le code dans un langage humain. Ils fournissent des
explications sur l’utilité du code et permettent de comprendre son fonctionnement. En Python,
les commentaires débutent toujours par le symbole #. Tout ce qui suit ce caractère est ignoré par
Python jusqu’à la fin de la ligne. Voici un exemple :
1 # Ceci est un commentaire.
2 print("Bonjour !") # Je salue l'utilisateur.
3 # Un autre commentaire.
1 PROGRAMME <NomProgramme>
2 VARIABLE : <var11>, <var12>, \dots\ , <var1n> : <type1>
3 <var21>, <var22>, \dots\ , <var2m> : <type2>
4 ...
5 <varN1>, <varN2>, \dots\ , <varNp> : <typeN>
6 DEBUT
7 <instruction1> ;
8 <instruction2> ;
9 ...
10 <instructionn> ;
11 FIN
Addition Elle permet d’additionner deux variables de type entier ou réel. Son symbole est (+).
Soustraction Elle permet de calculer la différence entre deux variables de type entier ou réel. Son
symbole est (-).
Multiplication Elle permet de faire le produit de deux variables de type entier ou réel. Son symbole
est (*).
Division Elle permet de faire le quotient de deux variables de type entier ou réel. Son symbole est
(/).
Division entière Cet opérateur permet d’obtenir la partie entière du quotient de deux variables de
type entier ou réel. Son symbole est DIV.
Partie entière Cet opérateur retourne la partie entière d’une variable réelle. Son symbole est ENT.
Exposant Cet opérateur permet d’élever un nombre à une puissance donnée. Son symbole est (ˆ).
Reste de la division entière Il retourne le reste de la division de deux variables de type entier. Son
symbole est MOD. Il ne s’applique pas aux nombres réels.
1 a = 7
2 b = 3
3 somme = a + b # 10
4 difference = a - b # 4
5 produit = a * b # 21
6 divsion = a / b # 2.3333333333333335
7 puissance = a ** b # 343
8 div_entiere = a // b # 2
9 modulo = a % b # 1
22 Chapitre 2. Notion de variable et structure d’un programme
Comparaison Les opérateurs de cette catégorie permettent de comparer les contenus de deux
variables ou de deux expressions. Les symboles ci-après sont utilisés :
1. < : infériorité ;
2. > : supériorité ;
3. ≤ : infériorité ou égalité ;
4. ≥ : supériorité ou égalité ;
5. = : égalité ;
6. ̸= : différence ;
La négation Elle permet de faire un NON logique sur une expression. Son symbole est NON.
La conjonction Elle permet de faire un ET logique sur deux expressions. Son symbole est ET.
La disjonction Elle permet de faire un OU logique sur deux expressions. Son symbole est OU.
3.1 Introduction
La résolution d’un problème par un algorithme peut faire ressortir un certain nombre de cas ou
de situations qui nécessitent que l’on dise à l’ordinateur comment réagir. Il peut s’agir de choix
à opérer ou de comportement récurrent à gérer. En algorithmique, les structures de contrôle sont
prévues pour faire face à ce genre de situation.
On distingue deux grandes familles de structures de contrôle :
— Les structures conditionnelles.
— Les structures répétitives ou itératives.
1. La structure if (si)
2. La structure if-else (si-sinon)
3. La structure if-elif-else (si-sinon si-sinon)
La structure if est la plus simple des structures conditionnelles. Elle permet d’exécuter un bloc de
code uniquement si une condition est vraie. Si la condition est fausse, le bloc de code est ignoré.
24 Chapitre 3. Les structures de contrôle
Syntaxe en algorithmique
1 SI (<condition>) ALORS
2 {
3 <instruction1> ;
4 <instruction2> ;
5 ...
6 <instructionn> ;
7 }
8 FINSI
Syntaxe en Python
1 if condition:
2 # Bloc de code à exécuter si la condition est vraie.
3 <instruction1>
4 <instruction2>
5 ...
6 <instructionn>
■ Exemple 3.1
1 age = 18
2 if age >= 18:
3 print("Vous êtes majeur.")
Dans cet exemple, la condition age >= 18 est évaluée. Si elle est vraie (c’est-à-dire si age est
supérieur ou égal à 18), le message "Vous êtes majeur." est affiché. Sinon, rien ne se passe.
■
La structure if-else permet d’exécuter un bloc de code si une condition est vraie et un autre
bloc de code si la condition est fausse. C’est utile lorsqu’on veut gérer deux scénarios possibles.
Syntaxe en algorithmique
1 SI (<condition>) ALORS
2 {
3 <instruction1> ;
4 <instruction2> ;
5 ...
6 <instructionn> ;
7 }
8 SINON
9 {
10 <instruction1> ;
11 <instruction2> ;
12 ...
13 <instructionn> ;
14 }
15 FINSI
3.2 Les structures conditionnelles 25
Syntaxe en Python
1 if condition:
2 # Bloc de code à exécuter si la condition est vraie.
3 <instruction1>
4 <instruction2>
5 ...
6 <instructionn>
7 else:
8 # Bloc de code à exécuter si la condition est fausse.
9 <instruction1>
10 <instruction2>
11 ...
12 <instructionn>
■ Exemple 3.2
1 age = 16
2 if age >= 18:
3 print("Vous êtes majeur.")
4 else:
5 print("Vous êtes mineur.")
Ici, si age est supérieur ou égal à 18, le programme affiche "Vous êtes majeur.". Sinon, il
affiche "Vous êtes mineur.".
■
La structure if-elif-else est utilisée lorsqu’il y a plusieurs conditions à vérifier. Elle permet
de tester plusieurs cas et d’exécuter le bloc de code correspondant à la première condition vraie. Si
aucune condition n’est vraie, le bloc else est exécuté (s’il est présent).
Syntaxe en Python
1 if condition1:
2 # Bloc de code à exécuter si condition1 est vraie.
3 <instruction1>
4 <instruction2>
5 ...
6 <instructionn>
7 elif condition2:
8 # Bloc de code à exécuter si condition2 est vraie.
9 <instruction1>
10 <instruction2>
11 ...
12 <instructionn>
13 elif condition3:
14 # Bloc de code à exécuter si condition3 est vraie.
15 <instruction1>
16 <instruction2>
17 ...
18 <instructionn>
19 else:
26 Chapitre 3. Les structures de contrôle
■ Exemple 3.3 On suppose qu’on veut créer un programme qui détermine le jour de la semaine en
fonction d’un nombre entier (1 pour lundi, 2 pour mardi, etc.). Avec la structure if-elif-else,
on peut procéder comme suit :
R On peut mettre autant de elif que l’on veut après une condition en if. Tout comme le
else, ce bloc d’instructions est facultatif. Par ailleurs, le bloc else, lorsqu’il est présent,
ne peut figurer qu’une seule fois après le dernier elif, clôturant le bloc de la condition.
La boucle while est utilisée lorsqu’on ne connaît pas à l’avance le nombre d’itérations, mais
qu’on souhaite répéter un bloc de code tant qu’une condition est vraie. La boucle s’arrête dès que
la condition devient fausse.
3.3 Les structures itératives ou répétitives 27
Syntaxe en algorithmique
Syntaxe en Python
1 while condition:
2 # Bloc de code à répéter.
3 <instruction1>
4 <instruction2>
5 ...
6 <instructionn>
■ Exemple 3.4
La variable i est initialisée à 1. La boucle while continue tant que i est inférieur ou égal à 5. À
chaque itération, la valeur de i est affichée et incrémentée de 1.
Incrémenter i signifie ajouter 1 à la valeur de i, on parle d’incrémentation. L’opération inverse est
la décrémentation, enlever 1 de la valeur de i (i = i - 1). ■
Boucle infinie
Une boucle infinie est une boucle qui ne se termine jamais, car sa condition de sortie n’est jamais
remplie, ce qui entraîne l’exécution répétée du bloc de code de la boucle sans fin. Cela peut entraîner
le blocage du programme ou l’utilisation excessive de ressources.
Dans l’exemple précédent, si l’on oublie par exemple d’incrémenter la variable i, on obtiendra une
boucle infinie.
■ Exemple 3.5
La condition i <= 5 sera toujours vraie (car i est toujours égal à 1) et la boucle ne s’arrête jamais.
■
28 Chapitre 3. Les structures de contrôle
R Pour éviter les boucles infinies, il faut s’assurer que la condition de sortie deviendra fausse
à un moment donné. Il faut donc vérifier que les variables utilisées dans la condition sont
modifiées correctement à l’intérieur de la boucle.
Il est fréquent que l’on connaisse à l’avance le nombre de fois qu’on veut répéter un bloc d’instruc-
tions. Dans ce cas, il apparaît plus simple d’utiliser une structure itérative qui permet de répéter
exactement le nombre de fois que l’on désire. Cette structure est la boucle for. Cette boucle
permet de parcourir un intervalle en répétant un bloc d’instructions pour chacune des valeurs de cet
intervalle en respectant un pas donné. En Python, la boucle for est souvent utilisée avec la fonction
range() qui génère une séquence de nombres.
Syntaxe en algorithmique
Syntaxe en algorithmique
Syntaxe en Python
■ Exemple 3.6
Points importants
— On peut utiliser range() sans spécifier le pas. Dans ce cas, le pas par défaut est 1.
— range(début, fin) génère une séquence de nombres allant de début (inclus) à fin
(exclu). Ainsi, range(0, 5) génère 0, 1, 2, 3, 4.
— range(1, 10, 2) génère 1, 3, 5, 7, 9, puisqu’on a précisé que le pas est égal à 2.
— début, fin et pas sont des entiers ou des variables de type entier.
3.3 Les structures itératives ou répétitives 29
Exercices d’application
Il existe d’autres types de séquences comme les tuples et les ranges (qu’on a déjà vues précédem-
ment).
Les séquences partagent des opérations communes.
Cependant, ces deux types de séquences diffèrent également par leur mutabilité : les chaînes de
caractères sont immuables (on ne peut pas les modifier après leur création), tandis que les listes
sont mutables (on peut les modifier).
Les chaînes de caractères sont créées en entourant du texte de guillemets simples (' ') ou doubles
(" "). Les deux formes sont équivalentes.
1 chaine1 = 'Bonjour le monde !'
32 Chapitre 4. Les séquences en Python : chaînes de caractères et listes
Pour inclure des caractères spéciaux dans une chaîne (comme un guillemet ou une nouvelle ligne),
on utilise des caractères d’échappement qui commencent par un antislash (\).
Les caractères d’échappement courants sont :
— \' : Guillemet simple
— \" : Guillemet double
— \\ : Antislash
— \n : Nouvelle ligne
— \t : Tabulation
1 chaine = "Il a dit : \"Bonjour !\""
2 print(chaine) # Affiche : Il a dit : "Bonjour !"
3
4 chaine = "Ligne 1\nLigne 2"
5 print(chaine)
6 # Affiche :
7 # Ligne 1
8 # Ligne 2
Pour créer des chaînes qui s’étendent sur plusieurs lignes, on utilise des triples guillemets (''' '''
ou """ """).
1 chaine = """Ceci est une chaîne
2 qui s'étend sur
3 plusieurs lignes."""
4 print(chaine)
Les chaînes de caractères sont des séquences, ce qui signifie que vous pouvez accéder à chaque
caractère individuellement en utilisant son indice. Les indices commencent à 0 pour le premier
caractère.
1 chaine = "Python"
2 print(chaine[0]) # Affiche : P
3 print(chaine[3]) # Affiche : h
On peut également utiliser des indices négatifs pour accéder aux caractères en partant de la fin de la
chaîne :
1 print(chaine[-1]) # Affiche : n
2 print(chaine[-2]) # Affiche : o
4.2 Les chaînes de caractères 33
Le slicing permet d’extraire une sous-chaîne à partir d’une chaîne, c’est-à-dire une partie d’une
chaîne de caractères. Pour le faire, on a les différentes syntaxes suivantes :
• chaine[début:fin] : Extrait les caractères de l’indice début (inclus) à l’indice fin
(exclu).
• chaine[:fin] : Extrait les caractères du début jusqu’à l’indice fin (exclu).
• chaine[début:] : Extrait les caractères de l’indice début (inclus) jusqu’à la fin.
• chaine[début:fin:pas] : Extrait les caractères de l’indice début à l’indice fin avec
un pas spécifié.
1 chaine = "Programmation"
2 print(chaine[0:7]) # Affiche : Program
3 print(chaine[7:]) # Affiche : mation
4 print(chaine[:7]) # Affiche : Program
5 print(chaine[::2]) # Affiche : Pormain
6 print(chaine[::-1]) # Affiche : noitammargorP # Ici, la chaîne est inversée.
1 chaine1 = "Bonjour"
2 chaine2 = "à tous"
3 print(chaine1 + " " + chaine2) # Affiche : Bonjour à tous
4
5 chaine = "Python"
6 print(chaine * 3) # Affiche : PythonPythonPython
Python propose de nombreuses méthodes pour manipuler les chaînes de caractères. Voici quelques-
unes des plus courantes :
1 chaine1 = "Programmation"
2 chaine2 = " Python "
3 chaine3 = "Je suis John"
4 chaine4 = "Je-suis-en-retard"
5 print(len(chaine1)) # Affiche : 13
6 print(chaine1.lower()) # Affiche : programmation
7 print(chaine1.upper()) # Affiche : PROGRAMMATION
34 Chapitre 4. Les séquences en Python : chaînes de caractères et listes
Les f-strings (formatted strings) permettent d’insérer directement des expressions ou des variables
dans une chaîne en utilisant la syntaxe "...".
1 nom = "Alice"
2 age = 25
3 print(f"Bonjour, je m'appelle {nom} et j'ai {age} ans.")
4 # Affiche : Bonjour, je m'appelle Alice et j'ai 25 ans.
5
6 # Calcul dans une f-string
7 print(f"Dans 5 ans, j'aurai {age + 5} ans.")
8 # Affiche : Dans 5 ans, j'aurai 30 ans.
Les f-strings sont très pratiques pour formater des chaînes de caractères de manière lisible et
concise.
Une liste est créée en entourant une séquence d’éléments de crochets [] séparés par des virgules.
Une liste peut contenir des éléments de différents types, y compris d’autres listes.
Comme pour les chaînes de caractères, les éléments d’une liste sont accessibles par leur indice. Les
indices commencent à 0 pour le premier élément.
Les indices négatifs permettent d’accéder aux éléments en partant de la fin de la liste :
Le slicing permet d’extraire une sous-liste à partir d’une liste. Cela fonctionne de la même manière
que le slicing des chaînes de caractères, en utilisant les mêmes syntaxes.
1 liste = [1, 2, 3, 4, 5]
2 print(liste[1:4]) # Affiche : [2, 3, 4]
3 print(liste[2:]) # Affiche : [3, 4, 5]
4 print(liste[:3]) # Affiche : [1, 2, 3]
5 print(liste[::2]) # Affiche : [1, 3, 5]
6 print(liste[::-1]) # Affiche : [5, 4, 3, 2, 1]
À l’instar des chaînes de caractères, on peut effectuer les opérations de concaténation et de répétition
sur les listes.
1 liste1 = [1, 2, 3]
2 liste2 = [4, 5, 6]
3 print(liste1 + liste2) # Affiche [1, 2, 3, 4, 5, 6]
4
5 liste4 = [1, 2]
6 print(liste4 * 3) # Affiche [1, 2, 1, 2, 1, 2]
Les listes sont mutables, ce qui signifie que leurs éléments peuvent être modifiés, ajoutés ou
supprimés.
Modifier un élément :
1 liste = ["pomme", "banane", "orange"]
2 liste[1] = "mangue"
3 print(liste) # Affiche : ['pomme', 'mangue', 'orange']
2 liste.remove("banane")
3 print(liste) # Affiche : ['pomme', 'orange']
4
5 element = liste.pop(1)
6 print(element) # Affiche : orange
7 print(liste) # Affiche : ['pomme']
8
9 del liste[0]
10 print(liste) # Affiche : []
Python propose de nombreuses méthodes pour manipuler les listes. Voici quelques-unes des plus
courantes :
1 liste = [3, 1, 4, 1, 5, 9]
2 print(len(liste)) # Affiche : 6
3
4 liste.sort()
5 print(liste) # Affiche : [1, 1, 3, 4, 5, 9]
6
7 liste.reverse()
8 print(liste) # Affiche : [9, 5, 4, 3, 1, 1]
9
10 print(liste.count(1)) # Affiche : 2
11 print(liste.index(4)) # Affiche : 2
12
13 liste.clear()
14 print(liste) # Affiche : []
Il en est de même pour les chaînes de caractères. Elles peuvent être parcourues à l’aide d’une boucle
for.
4.3 Les listes 37
1 chaine = "Python"
2 for lettre in chaine:
3 print(lettre)
4 # Affiche :
5 # P
6 # y
7 # t
8 # h
9 # o
10 # n
Les listes peuvent contenir d’autres listes, ce qui permet de créer des structures de données
complexes, comme des matrices.
1 matrice = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2 print(matrice[0]) # Affiche : [1, 2, 3]
3 print(matrice[0][1]) # Affiche : 2
Il est important de noter que l’affectation d’une liste à une nouvelle variable ne crée pas une copie
indépendante, mais une référence vers la même liste. Pour créer une copie indépendante, on utilise
la méthode copy() ou le slicing [:].
1 liste1 = [1, 2, 3]
2 liste2 = liste1 # Référence vers la même liste
3 liste2[0] = 99
4 print(liste1) # Affiche : [99, 2, 3]
5 print(liste2) # Affiche : [99, 2, 3]
6
7 liste3 = liste1.copy() # Copie indépendante
8 liste3[0] = 100
9 print(liste1) # Affiche : [99, 2, 3]
10 print(liste3) # Affiche : [100, 2, 3]
Exercices d’application
1. Manipulation de chaînes.
(a) Créez une chaîne de caractères contenant votre prénom.
(b) Affichez la longueur de la chaîne.
(c) Affichez la première lettre de la chaîne.
(d) Affichez la chaîne en majuscules.
(e) Remplacez la deuxième lettre par le caractère "h" et affichez le résultat.
2. Manipulation de listes.
(a) Créez une liste contenant les nombres de 1 à 5.
(b) Ajoutez le nombre 6 à la fin de la liste.
38 Chapitre 4. Les séquences en Python : chaînes de caractères et listes
1 print("Bonjour Alice.")
2 print("Bonjour Bob.")
3 print("Bonjour Charlie.")
Chaque ligne répète la même idée, ce qui devient vite répétitif et difficile à modifier. Avec une
fonction, le même résultat s’obtient ainsi :
1 def saluer(nom):
2 print(f"Bonjour {nom}.")
3
4 saluer("Alice")
5 saluer("Bob")
6 saluer("Charlie")
Ici, une seule fonction, appelée saluer, est définie pour afficher un message personnalisé. Elle est
40 Chapitre 5. Fonctions et programmation impérative procédurale
ensuite utilisée avec différents noms. Le code est plus court, plus clair et plus facile à adapter. Par
exemple, si le message de salutation devait changer pour devenir "Bonjour {nom}. Comment
allez-vous ?", on appliquera la modification une seule fois, à la fonction, alors que sans
l’utilisation d’une fonction, on sera obligé de modifier chaque ligne.
Dans la suite, nous aborderons comment créer et utiliser des fonctions en Python, avant de mon-
trer comment elles s’intègrent dans une approche de programmation appelée programmation
impérative procédurale.
5.2 Fonctions
Une fois l’idée générale des fonctions comprise, il est temps d’explorer comment elles fonctionnent
en Python. Cette section détaille les étapes pour définir une fonction, lui passer des données,
récupérer ses résultats et gérer les variables qu’elle utilise.
En Python, une fonction se crée avec le mot-clé def, suivi du nom de la fonction et de parenthèses.
Ces parenthèses peuvent rester vides si la fonction n’a pas besoin de données spécifiques pour
fonctionner. Après les parenthèses, un deux-points (:) indique le début du bloc de code de la
fonction. Ce bloc doit être indenté (comme les structures de contrôle), c’est-à-dire décalé vers la
droite (généralement de 4 espaces ou une tabulation), pour montrer qu’il appartient à la fonction.
Voici un exemple simple :
1 def dire_bonjour():
2 print("Bonjour à tous !")
3
4 dire_bonjour()
Dans cet exemple, la fonction dire_bonjour est définie pour afficher un message. Elle est
ensuite appelée en écrivant son nom suivi de parenthèses : dire_bonjour(). Sans cet appel, la
fonction reste inutilisée.
Une fonction peut aussi contenir plusieurs lignes de code. Par exemple :
1 def presenter():
2 print("Ce cours est sur Python.")
3 print("Il est conçu pour les débutants.")
4
5 presenter()
L’indentation est essentielle : toutes les lignes qui doivent être exécutées par la fonction doivent
être alignées sous le def. Si une ligne n’est pas indentée, elle est considérée comme extérieure à la
fonction.
Les fonctions deviennent encore plus puissantes lorsqu’elles peuvent travailler avec des données
différentes à chaque appel. Ces données sont transmises via des paramètres qui sont des variables
définies dans les parenthèses de la fonction. Lors de l’appel, les valeurs fournies sont appelées
arguments.
5.2 Fonctions 41
Voici un exemple :
Dans ce code, nombre1 et nombre2 sont les paramètres. Quand la fonction est appelée avec
multiplier(4, 5), les arguments 4 et 5 sont assignés à ces paramètres et le calcul s’effectue.
La fonction peut ainsi multiplier n’importe quelle paire de nombres.
Il est aussi possible de définir des paramètres avec des valeurs par défaut. Si un argument n’est
pas fourni lors de l’appel, la valeur par défaut est utilisée :
Ici, message a une valeur par défaut de "Bonjour". Si aucun second argument n’est donné,
cette valeur est utilisée. Sinon, elle est remplacée par l’argument fourni.
Jusqu’à présent, les fonctions présentées affichent des messages avec print. Mais une fonction
peut aussi renvoyer une valeur pour que le programme puisse l’utiliser ensuite. Cela se fait avec le
mot-clé return.
Prenons un exemple :
Ici, return s renvoie le résultat de l’addition. Ce résultat est stocké dans la variable somme, qui
peut ensuite être utilisé. Sans return, la fonction ne produirait rien d’utilisable :
Une fonction sans return renvoie automatiquement None, une valeur spéciale en Python qui
signifie "rien". Il est donc important de distinguer print (qui affiche quelque chose à l’écran) de
return (qui transmet une valeur au programme).
42 Chapitre 5. Fonctions et programmation impérative procédurale
Quand une fonction utilise des variables, il faut comprendre où elles "vivent". Une variable définie à
l’intérieur d’une fonction est locale, c’est-à-dire qu’elle n’existe que dans cette fonction. À l’inverse,
une variable définie en dehors est globale et accessible partout dans le programme.
Voici une illustration :
1 nombre_global = 100
2
3 def doubler():
4 nombre_local = 5
5 print(f"Dans la fonction : {nombre_local * 2}")
6 print(f"Nombre global : {nombre_global}")
7
8 doubler()
9 print(f"En dehors : {nombre_global}")
10 # Affiche :
11 # Dans la fonction : 10
12 # Nombre global : 100
13 # En dehors : 100
Dans cet exemple, nombre_local n’existe qu’à l’intérieur de doubler(). Si on essayait d’y
accéder en dehors, Python signalerait une erreur. De son côté, nombre_global reste accessible
partout, même à l’intérieur de la fonction.
Mais que se passe-t-il si une fonction veut modifier une variable globale ? Par défaut, une fonction
ne peut pas changer une variable globale sans une instruction spéciale. Observons cela :
1 compteur = 0
2
3 def incrementer():
4 compteur = compteur + 1 # Erreur, car Python ne sait pas qu'il s'agit de
la variable globale.
5
6 incrementer()
Ce code provoque une erreur, car Python traite compteur comme une nouvelle variable locale.
Pour modifier une variable globale, il faut utiliser le mot-clé global :
1 compteur = 0
2
3 def incrementer():
4 global compteur
5 compteur = compteur + 1
6
7 incrementer()
8 print(compteur) # Affiche : 1
Cependant, modifier des variables globales est rarement une bonne idée, car cela rend le programme
plus difficile à suivre. Il est souvent préférable de passer les données nécessaires en paramètres et
de renvoyer les résultats avec return.
5.3 Programmation impérative procédurale 43
1 prix1 = 10
2 prix2 = 15
3 total = prix1 + prix2
4 print("Le prix total est :", total)
Ce code fonctionne, mais si plusieurs calculs de ce type étaient nécessaires, il faudrait répéter ces
lignes à chaque fois. Le code manquera donc de clarté et de flexibilité. Voici maintenant une version
procédurale avec des fonctions :
Dans cette version, le programme est divisé en deux fonctions : une pour calculer le total
(calculer_total) et une pour afficher le résultat (afficher_resultat). Chaque fonction
a une tâche unique, ce qui rend le code plus facile à lire et à modifier. Par exemple, si la manière
d’afficher le résultat devait changer, il suffirait de modifier afficher_resultat sans toucher
au reste.
Un autre avantage apparaît quand les tâches deviennent plus complexes. Imaginons une calculatrice
basique qui peut additionner ou soustraire selon une opération choisie :
11 return soustraction(x, y)
12
13 resultat1 = calculer("+", 5, 3)
14 resultat2 = calculer("-", 10, 4)
15 print(resultat1) # Affiche : 8
16 print(resultat2) # Affiche : 6
Ici, trois fonctions collaborent : addition et soustraction réalisent des calculs spécifiques,
tandis que calculer décide quelle opération appliquer en fonction d’un paramètre. Cette structure
montre comment la programmation procédurale organise le travail en étapes logiques, rendant le
programme plus clair et réutilisable.
Prenons un autre exemple d’un programme qui calcule la moyenne des notes d’un étudiant et
détermine si l’étudiant a réussi ou échoué.
Exercices d’application