Académique Documents
Professionnel Documents
Culture Documents
1 Introduction
L’exécution de la plupart des programmes est liée à des conditions. Ces conditions permettent
d’exécuter une ou plusieurs instructions dans un cas, d’autres instructions dans un autre cas.
Par conséquent, Python dispose des instructions de contrôle (conditions) de flux classiques que
l’on trouve dans d’autres langages de programmation, mais toujours avec ses propres tournures.
Pour les boucles, elles vont nous permettre de répéter une certaine opération autant de fois que
nécessaire.
En programmation, la résolution de problèmes complexes demande l’utilisation d’un nombre im-
portant d’instructions. Dans ce cas, on est toujours amené à utiliser plusieurs fois des groupes
d’instructions dans un but très précis. De ce fait, les fonctions permettent de regrouper plusieurs
instructions dans un bloc qui sera appelé grâce à un nom. Quant aux modules, ils permettent de
regrouper plusieurs fonctions selon le même principe.
1
Licence 1 Université Amadou Mahtar MBOW
NB : Pour rendre les programmes beaucoup plus explicites, il est conseillé d’insérer des commen-
taires. Les commentaires sont des messages qui sont ignorés par l’interpréteur et qui permettent
de donner des indications sur le code. En Python, un commentaire débute par un dièse (« # ») et
se termine par un saut de ligne. Tout ce qui est compris entre ce # et ce saut de ligne est ignoré.
else:
print("Vous êtes majeur")
Opérateur Description
== Égal à
!= Différent de
> Strictement supérieur à
< Strictement inférieur à
>= Supérieur ou égal à
<= Inférieur ou égal à
NB : L’égalité de deux valeurs est comparée avec l’opérateur « == » et non « = ». Ce dernier est en
effet l’opérateur d’affectation et ne doit pas être utilisé dans une condition.
Entrez un entier : 2
2 n'est pas dans l'intervalle [3 15].
Cela marche mais c’est assez lourd, d’autant que, pour être sûr qu’un message soit affiché à chaque
fois, il faut fermer chacune des deux conditions (if) à l’aide d’un else.
Cependant, les opérateurs logiques peuvent nous rendre un fier service. Pour cet exemple,
l’opérateur and peut être utilisé afin de réduire les conditions imbriquées. Nous avons alors :
Entrez un entier : 2
2 n'est pas dans l'intervalle [3 15].
Dans le même registre, on peut utiliser l’opérateur logique or pour faire le même test.
Entrez un entier : 2
2 n'est pas dans l'intervalle [3 15].
Exercice d’application :
Écrire un programme qui détermine si une année, saisie par un utilisateur, est bissextile ou non.
Une année bissextile est une année de 366 jours (au lieu de 365) dont le mois de février comporte
29 jours (au lieu de 28), qui revient tous les 4 ans. Depuis l’ajustement du calendrier grégorien,
l’année n’est bissextile que dans l’un des deux cas suivants :
• Si l’année est divisible par 4 et non divisible par 100 ;
• Si l’année est divisible par 400.
Le code Python est le suivant :
[9]: # Programme testant si une année, saisie par l'utilisateur, est bissextile ou non
Attention!
Vous pouvez tomber sur une boucle infinie, s’il n’y a pas d’instructions qui peuvent rendre la
condition fausse (False). De ce fait, une boucle infinie, également appelée boucle sans fin, est une
séquence d’instructions dans un programme qui se répète indéfiniment (boucle sans fin).
Voici un exemple de boucle qui ne parvient pas à terminer son exécution :
while True:
print("Je suis coincé dans une boucle")
Si vous voulez obtenir la meilleure expérience d’apprentissage en voyant comment se comporte
une boucle infinie, lancez IDLE (ou éditeur Python). Tapez ces deux lignes de code en respectant
l’indentation.
Ce que vous verrez est la séquence interminable de « Je suis coincé dans une boucle ». Pour quitter
le programme, appuyez simplement sur Ctrl+C.
Exercice d’application :
Écrire un programme qui demande à l’utilisateur de saisir une valeur entière positive. Le pro-
gramme affiche tous les nombres pairs compris entre 1 et la valeur saisie.
Le code Python est le suivant :
if nombre % 2 == 1:
# On augmente le compteur cpt_impair
cpt_impair += 1
else:
# On augmente le compteur cpt_pair
cpt_pair += 1
# Lecture du nombre suivant
nombre = int(input("Entrez un nombre ou tapez 0 pour arrêter : "))
# Affichage des résultats
print("Les nombres impairs comptent :", cpt_impair)
print("Les nombres pairs comptent : ", cpt_pair)
5 x 9 = 45
5 x 10 = 50
3. Troisième syntaxe
for element in sequence:
« Traitement »
Cette syntaxe est très utilisée quand on veut parcourir une chaine de caractères et d’y faire des
traitements.
On souhaite par exemple rechercher et afficher toutes les voyelles d’une chaine de caractères.
Le code Python est le suivant :
print("*")
*
e
*
*
i
*
*
o
*
*
a
*
i
L'instruction break :
À l'intérieur de la boucle. 1
À l'intérieur de la boucle. 2
À l'intérieur de la boucle. 3
En dehors de la boucle.
• L’instruction (mot - clé) continue permet de continuer une boucle, en repartant directement
à la ligne du while ou for. Elle se comporte comme si le programme avait soudainement
atteint le bout du corps ; le tour suivant est démarré et l’expression de condition est testée
immédiatement.
[17]: i = 1
while i < 20: # Tant que i est inférieure à 20
if i % 3 == 0:
i += 4 # On ajoute 4 à i
print("On incrémente i de 4. i est maintenant égale à", i)
continue # On retourne au while sans exécuter les autres lignes
print("La variable i =", i)
i += 1 # Dans le cas classique on ajoute juste 1 à i
La variable i = 1
La variable i = 2
On incrémente i de 4. i est maintenant égale à 7
La variable i = 7
La variable i = 8
On incrémente i de 4. i est maintenant égale à 13
La variable i = 13
La variable i = 14
On incrémente i de 4. i est maintenant égale à 19
La variable i = 19
5 La programmation modulaire
Vous avez rencontré des fonctions à plusieurs reprises jusqu’à présent. Vous n’avez appelé les
fonctions qu’en les utilisant comme des outils pour vous faciliter la vie et simplifier les tâches
fastidieuses. D’ailleurs, vous avez déjà vu des fonctions : print(), input(), int() et float() en font
partie par exemple.
Vous allez maintenant apprendre à écrire vos propres fonctions et à les utiliser. Nous allons écrire
plusieurs fonctions ensemble, de la plus simple à la plus complexe, ce qui nécessitera votre con-
centration et votre attention. C’est le premier pas que vous ferez vers la modularité.
def Nom_de_la_fonction():
« corps de la fonction »
Pour la ligne de la définition de la fonction, nous avons :
• Il commence toujours par le mot-clé def, qui est l’abréviation de « define » (définir, en
anglais) ;
• Le nom de la fonction, qui se nomme exactement comme une variable. N’utilisez pas un
nom de variable déjà instanciée pour nommer une fonction ;
• Après le nom de la fonction, il y a une place pour une paire de parenthèses (elles ne contien-
nent rien ici, mais cela changera bientôt) ;
• Les deux points, encore et toujours, qui clôturent la ligne.
La ligne juste après def commence le corps de la fonction. Un couple (au moins un) d’instructions
nécessairement imbriquées, qui seront exécutées à chaque fois que la fonction est appelée. On
note que la fonction se termine là où se termine l’imbrication, il faut donc faire attention.
Déterminons par exemple une fonction qui permet d’afficher la table de multiplication d’un entier
demandé en entrée. On peut même utiliser la boucle while à la place de for.
Quand vous exécutez ce code à l’écran, il ne se passe rien. Vous devez faire appel à la fonction
pour avoir un résultat.
[19]: table_multiplication()
NB : Si vous utilisez un éditeur ou bien vous travaillez avec des fichiers, l’appel de la fonction se
fait dans le fichier après le corps de la fonction. Le code suivant nous le montre.
Formule :
n ! = n x (n – 1) x (n – 2) x ... x 2 x 1
= 1 x 2 x ... x (n – 2) x (n – 1) x n
0 !=1 !=1
[21]: def factoriel(n):
fact = 1
for i in range(1,n+1):
fact *=i # On effectue le produit entre i et fact
# à chaque tour de boucle.
print("La factorielle de", n, "est :", fact)
# Fin de la fonction
a = int(input("Entrez un entier positif : ")) # On demande à l'utilisateur
# de donner un entier.
# On fait appel à la fonction
factoriel(a) # a est la valeur saisie (argument),
# qui remplace la valeur n dans la définition de la fonction.
Testportee()
print(x)
---------------------------------------------------------------------------
<ipython-input-25-70aa9e92a6ae> in <module>
3
4 Testportee()
----> 5 print(x)
On constate que le programme a échoué lors de son exécution et un message d’erreur est généré.
Cela veut dire que la variable « x » dans le print() est en dehors de la fonction et elle n’est pas
définie.
Regardons le deux cas où la variable sera définie après le corps de la fonction et avant son appel.
an = 2020
annee_academique() # Appel de la fonction
print("C'est effectivement",an,". Merci.")
5.3 La récursivité
La récursivité est généralement utilisée en mathématiques et dont l’application est possible en
informatique. Elle consiste à remplacer une boucle par un appel à la fonction elle-même.
Ces deux cas semblent être les meilleurs pour illustrer la récusivité : la factorielle et le nombres
de Fibonacci. Surtout ce dernier.
• La factorielle
La factorielle a également un deuxième côté récursif. Regardez :
n! = 1 × 2 × 3 × ... × n-1 × n
Il est évident que :
1 × 2 × 3 × ... × n-1 = (n-1)!
Donc, finalement, le résultat est :
n! = (n-1)! × n
Le code Python est le suivant :
Cependant, Python possède un grand nombre de modules dont leur utilisation ne demande pas
d’installer des bibliothèques supplémentaires.
On peut citer par exemple le module math qui contient, comme son nom l’indique, des fonctions
mathématiques.
Il existe plusieurs techniques d’importation des fonctions mathématiques dans le module math.
Le module math est déjà importé grâce à la ligne précédente. Maintenant, il reste qu’à utiliser les
fonctions ou constante de ce module.
Pour appeler une fonction ou une constante ou une variable du module, il faut taper le nom du
module suivi d’un point « . » puis du nom de la fonction.
[31]: math.pi
[31]: 3.141592653589793
[32]: math.sqrt(9)
[32]: 3.0
Remarque : Il est impossible de lister toutes les fonctionnalités d’un module comme math. Pour
avoir des détails concenant un module, il est recommandé d’utiliser la fonction help() (aide, en
anglais).
[33]: help("math")
Saisissez la commande help(“math”) dans votre interpréteur Python et vous obtenez la liste de
toutes les fonctions et variables dans le module math.
Prenons le cas de l’exemple du module math dont son espace de noms est du même nom. Dans
l’espace de noms math, on touve la constante (variable) pi, la fonction sqrt, etc.
On peut créer un espace de noms dans lequel Python héberge le module principale.
Prenons par exemple le module math qui sera hébergé par l’espace de noms « mathematiques ».
Nous obtenons le code suivant :
[34]: import math as mathematiques
mathematiques.sqrt(64)
[34]: 8.0
[35]: 5.0
[36]: 4.0
L’analyseur indique la ligne incriminée et affiche une petite « flèche » pointant vers le premier
endroit de la ligne où l’erreur a été détectée. L’erreur est causée (ou, au moins, a été détectée
comme telle) par le symbole placé avant la flèche. Dans cet exemple la flèche est sur la fonction
print() car il manque deux points (‘:’) juste avant. Le nom du fichier et le numéro de ligne sont
affichés pour vous permettre de localiser facilement l’erreur lorsque le code provient d’un script.
---------------------------------------------------------------------------
<ipython-input-38-d135fc405675> in <module>
1 # Exemple classique : test d'une division par zéro
----> 2 variable = 5/0
[39]: 2 + x*10
---------------------------------------------------------------------------
<ipython-input-39-a3868e39253b> in <module>
----> 1 2 + x*10
• TypeError : l’une des variables numerateur ou denominateur ne peut diviser ou être divisée
(les chaînes de caractères ne peuvent être divisées, ni diviser d’autres types, par exemple) ;
• ZeroDivisionError : Si denominateur vaut 0, cette exception sera levée.
La liste d’exceptions qui peuvent être levées à l’exécution de ce code n’est pas exhaustive.
[43]: try:
resultat = 2 / "b"
except NameError:
print("La variable numerateur ou denominateur n'a pas été définie.")
except TypeError:
print("La variable numerateur ou ", end="")
print("denominateur possède un type incompatible avec la division.")
except ZeroDivisionError:
print("La variable denominateur est égale à 0.")
[44]: try:
resultat = 2 / 0
except NameError:
print("La variable numerateur ou denominateur n'a pas été définie.")
except TypeError:
print("La variable numerateur ou ", end="")
print("denominateur possède un type incompatible avec la division.")
except ZeroDivisionError:
print("La variable denominateur est égale à 0.")
[45]: try:
resultat = 10/4
except NameError:
print("La variable numerateur ou denominateur n'a pas été définie.")
except TypeError:
print("La variable numerateur ou ", end="")
print("denominateur possède un type incompatible avec la division.")
except ZeroDivisionError:
print("La variable denominateur est égale à 0.")
else:
print("Le résultat obtenu est", resultat)
---------------------------------------------------------------------------
<ipython-input-48-58fa0f2a0cf3> in <module>
----> 1 division(30,"4") # Appel de la fonction division
<ipython-input-46-d5ad6f1e5291> in division(x, y)
1 def division(x, y):
2 try:
----> 3 result = x / y
4 except ZeroDivisionError:
5 print("La variable denominateur est égale à 0.")
Comme vous pouvez le voir, la clause finally est exécutée dans tous les cas. L’exception de type
TypeError déclenchée en divisant un entier par une chaîne de caractères n’est pas prise en charge
par la clause except et est donc re-déclenchée après que la clause finally ait été exécutée.
[49]: # Programme testant si une année, saisie par l'utilisateur, est bissextile ou non
def bissextile(annee):
try:
annee = int(annee) # Conversion de l'année
assert annee > 0
if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 != 0):
print("L'année",annee, "est bissextile.")
else:
print("L'année",annee, "n'est pas bissextile.")
except ValueError:
print("Vous n'avez pas saisi un nombre.")
except AssertionError:
print("L'année saisie est inférieure ou égale à 0.")
---------------------------------------------------------------------------
<ipython-input-53-eaa616e4f679> in <module>
----> 1 raise NameError("La variable n'est pas définie")
[54]: # Programme testant si une année, saisie par l'utilisateur, est bissextile ou non
def bissextile(annee):
try:
annee = int(annee) # Conversion de l'année
if annee<=0:
raise ValueError("l'année saisie est négative ou nulle")
except ValueError:
print("La valeur saisie est invalide (l'année est peut-être négative).")
[55]: bissextile(-2000)
[56]: # Programme testant si une année, saisie par l'utilisateur, est bissextile ou non
def bissextile(annee):
try:
annee = int(annee) # Conversion de l'année
if annee<=0:
raise ValueError("l'année saisie est négative ou nulle")
except ValueError:
print("La valeur saisie est invalide (l'année est peut-être négative).")
raise # On n'a pas l'intention de gérer l'exception
[57]: bissextile(-2020)
---------------------------------------------------------------------------
<ipython-input-57-d015fb96faea> in <module>
----> 1 bissextile(-2020)
<ipython-input-56-e16dfc648eb3> in bissextile(annee)
4 annee = int(annee) # Conversion de l'année
5 if annee<=0:
----> 6 raise ValueError("l'année saisie est négative ou nulle")
7 except ValueError:
8 print("La valeur saisie est invalide (l'année est peut-être␣
,→négative).")
NB : Il n’est pas demandé de connaître toutes les exceptions que Python utilise. Par contre, vous
devez être en mesure, grâce à l’interpréteur, de déterminer les types d’exceptions que peuvent
lever Python devant une situation donnée.
Fin*****du*****chapitre