Vous êtes sur la page 1sur 88

Classes Préparatoires d’entrée dans

les Grandes Ecoles (CPGE)

Algorithmique et Programmation en
Python II

Dr Sibiri TIEMOUNOU

Année académique 2020-2021

1
Plan du cours

1. Retour sur les structures de données et les fonctions

2. Modularité en Python

3. Gestion des erreurs

4. Algorithme de recherche et de tri

5. Récursivité

6. Manipulation des fichiers

2
09/06/2021
Sommaire

 Objectifs de ce cours

 Savoir écrire et traduire des algorithmes complexes en Python

 Maîtriser l’utilisation de l’environnement de développement Python

 Comprendre et savoir utiliser la programmation modulaire

 Evaluation
 Rapport de TP
 Mini projet (en Python)

3
1. Retour sur les structures de données et fonctions

4
09/06/2021
1.1 Retour sur les structures de données

 Rappel

 Une structure de données et une variable permettant de stocker plusieurs valeurs

 Nous avons déjà vu les listes

 Un objet est une variable, pouvant elle-même contenir d’autres variables et fonctions

 La plupart des structures de données à manipuler sont en réalité des objets

 Les tuples sont comme des liste, sauf qu'on utilise comme délimiteur des parenthèses au
lieu des crochets
 Ce sont des listes immuables, i.e. qu’on ne peut modifier

 Ils sont très utiles lorsqu’une fonction doit renvoyer plusieurs variables

 Certains modules de python contiennent des fonctions renvoyant des tuples

 Exemple:
tuple_vide = ()
tuple_non_vide = (1,)
tuple_non_vide = (1, 3, 5) 5
1.1 Retour sur les structures de données

 Rappel

 Nous verrons dans ce chapitre 2 autres types de structures de données:

 Les chaines de caractères

 Les dictionnaires

6
1.2 Les chaines de caractères (Python)

 En python, les chaines de caractères sont gérés par un objet (ou classe) appelé « str »
 Prenons un exemple:
 Ecrire une fonction prenant en paramètre un chaine de caractère et renvoyant cette
chaîne en minuscule
 On s’attendrait à un code de la sorte :

>>> chaine = « N’TOH ! Humm…, J’adore les DONUTS!"


>>> mettre_en_minuscule(chaine)
‘n’toh!, humm …, j’adore les donuts'

 Toutefois jusqu’ici, nous ne savons pas comment gérer ce type de problème

 C’est tout là, l’importance des objets : l’objet « str » contient des méthodes prédéfinies
permettant de manipuler les chaines de caractères.

 Pour notre exercice, l’objet « str » contient la méthode « lower() » permettant de


convertir les chaines de caractères en minuscule
7
1.2 Les chaines de caractères (Python)

 Création d’une chaine de caractères


 2 méthodes possibles :
 Par initialisation directe :

ma_chaine = "N’TOH ! Humm…, J’adore les DONUTS!"

 Appel de la méthode « str() »

ma_chaine = str("N’TOH ! Humm…, J’adore les DONUTS!« )

8
1.2 Les chaines de caractères (Python)

 Mise en forme d’une chaine de caractères


 L’objet « str » dispose des méthodes suivantes:
 lower(): convertit la chaine en minuscule
 upper() : transforme une chaine en majuscule
 capitalize() : convertit le premier caractère de la chaine en majuscule
 strip() : retire des espaces en début et fin de la chaine de caractère
 center() : centre la chaine
 Exemple:

>>> minuscules = "une chaine en minuscules"


>>> minuscules.upper() # Mettre en majuscules
'UNE CHAINE EN MINUSCULES'
>>> minuscule.capitalize() # La première lettre en majuscule
'Une chaine en minuscules'
>>> espaces = " une chaine avec des espaces "
>>> espaces.strip() # On retire les espaces au début et à la fin de
la chaîne
'une chaine avec des espaces'
>>> titre = "introduction"
>>> titre.upper().center(20)
' INT
9
1.2 Les chaines de caractères (Python)

 Formatage et affichage d’une chaine de caractères


 Affichage simple : utilisation de la fonction « print »
chaine = "Bonjour tout le monde !"
print(chaine)

print( "le message à afficher sur l’écran est : ", chaine)

 Méthode « format(…) »
>>> prenom = "Paul"
>>> nom = "Dupont"
>>> age = 21
>>> print( "Je m'appelle {0} {1} et j'ai {2} ans.".format(prenom, nom, age) )
Je m'appelle Paul Dupont et j'ai 21 ans.

 Le message contient des accolades entourant des nombres 0, 1, 2 ;

 La méthode « format » prend en paramètres les variables à afficher, dans un ordre bien précis ;

 quand Python exécute cette méthode, il remplace dans notre chaîne {0} par la première variable
passée à la méthode format (soit le prénom), {1} par la deuxième variable… et ainsi de suite.

10
1.2 Les chaines de caractères (Python)

 Formatage et affichage d’une chaine de caractères


 Concaténation des chaines
 Elle consiste à regrouper les chaines de caractères en une seule une chaine
 On utilise pour cela le caractère « + »

 Exemple

>>> prenom = "Paul"


>>> message = "Bonjour"
>>> chaine_complete = message + prenom # On utilise le symbole '+‘ pour concaténer deux
chaînes

... print(chaine_complete) # Résultat :


BonjourPaul

>>> # Pas encore parfait, il manque un espace


... # Qu'à cela ne tienne !
... chaine_complete = message + " " + prenom
>>> print(chaine_complete) # Résultat :
Bonjour Paul
>>>

11
1.2 Les chaines de caractères (Python)

 Formatage et affichage d’une chaine de caractères


 Concaténation des chaines
 Attention : la concaténation n’accepte que les chaines de caractère

 Exemple
>>> age = 21
>>> message = "J'ai " + age + " ans."

Traceback (most recent call last):


File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>>

 On réalise une concaténation de chaine et de nombre

 On constate qu’il ya une erreur de conversion

 Solution : tout convertir en chaine de caractère avec la méthode « str »

>>> age = 21
>>> message = "J'ai " + str(age) + " ans."
>>> print(message)
J'ai 21 ans.
>>> 12
1.2 Les chaines de caractères (Python)

 Parcours et sélection de chaines


 Sélection de chaînes
 En python, il est possible de sélectionner ou d’extraire une partie de la chaine à partir
des indices

ma_chaine[indice_debut : indice_fin]

 Exemple
>>> presentation = "salut"
>>> presentation[0:2] # On sélectionne les deux premières lettres
'sa'
>>> presentation[2:len(presentation)] # On sélectionne la chaîne sauf les deux premières lettres
'lut‘

>>> presentation[:2] # Du début jusqu'à la troisième lettre non comprise


'sa'
>>> presentation[2:] # De la troisième lettre (comprise) à la fin
'lut'
>>>

13
1.2 Les chaines de caractères (Python)

 Parcours et sélection de chaines


 Remarque
 Il est souvent utile de pouvoir désigner l’emplacement d’un caractère par rapport à la
fin de la chaîne. Pour ce faire, il suffit d’utiliser des indices négatifs :
 « -1 » désignera le dernier caractère,
 « -2 » l’avant-dernier, etc.

 L’opérateur * permet de répéter une chaine de caractères

 Exemple

>>> nom = « Cédric"


>>> print(nom[-1], nom[-2], nom[-4], nom[-6])
cidC
>>> m = 'zut ! ' * 4 # répétition
zut ! zut ! zut ! zut !

14
1.3 Les dictionnaires

 Rappel sur les listes


 Une liste est une structure de données pouvant contenir plusieurs type de données
différentes

 Chaque élément d’une liste est rangé dans un ordre bien précis
 Pour accéder à un élément, on passe toujours par son indice (entier naturel)

 Il existe une autre structure de données plus élaborée n’utilisant pas la notion d’indice mais
plutôt de clé

 Il s’agit des dictionnaires

 Les dictionnaires est l’une des structures de données les plus utilisées en Python

15
1.3 Les dictionnaires

 Définition
 Un dictionnaire est un objet pouvant en contenir d'autres, à l'instar des listes

 Chaque élément du dictionnaire est associé à une clé

 Ces clés peuvent être des chaines de caractères (c’est le cas la plupart du temps) ou des objets
 Dans les listes, la clé est l’indice de l’élément

 Les données d’un dictionnaire ne sont pas ordonnées contrairement aux listes

 Par exemple, un dictionnaire peut contenir un carnet d'adresses et on accède à chaque


contact en précisant son nom.

16
1.3 Les dictionnaires

 Création d’un dictionnaire


 2 méthodes de création d’un dictionnaire
 En utilisant la méthode « dict() » ou simplement les accolades « {} »

>>> mon_dictionnaire = dict()


>>> type(mon_dictionnaire)
<class 'dict'>
>>> mon_dictionnaire
{}
>>> # Du coup, vous devriez trouver la deuxième manière de créer un dictionnaire vide
... mon_dictionnaire = {}
>>> mon_dictionnaire
{}
>>>

17
1.3 Les dictionnaires

 Ajout d’un élément dans un dictionnaire

>>> mon_dictionnaire = {}
>>> mon_dictionnaire["pseudo"] = "Prolixe"
>>> mon_dictionnaire["mot de passe"] = "*"
>>> mon_dictionnaire
{'mot de passe': '*', 'pseudo': 'Prolixe'}
>>>

 Procédure
 On spécifie la clé entre crochets

 Si la clé n'existe pas dans le dictionnaire, elle y est ajoutée avec la valeur spécifiée
après le signe =

 Sinon, l'ancienne valeur à l'emplacement indiqué est remplacée par la nouvelle :

18
1.3 Les dictionnaires

 Ajout d’un élément dans un dictionnaire


 Exemple
>>> mon_dictionnaire = {}
>>> mon_dictionnaire[0] = "a"
>>> mon_dictionnaire[1] = "e"
>>> mon_dictionnaire[2] = "i"
>>> mon_dictionnaire[3] = "o"
>>> mon_dictionnaire[4] = "u"
>>> mon_dictionnaire[5] = "y"
>>> mon_dictionnaire
{0: 'a', 1: 'e', 2: 'i', 3: 'o', 4: 'u', 5: 'y'}
>>

 Remarques
 Un dictionnaire ne peut naturellement pas contenir deux clés identiques
 La seconde valeur écrase la première

 Il est possible d'avoir deux valeurs identiques dans le dictionnaire

 Les clés peuvent être de tout type (cependant le type doit être unique)

19
1.3 Les dictionnaires

 Ajout d’un élément dans un dictionnaire


 Exemple
 On souhaite représenter un plateau d'échecs. Généralement, une case de l’échequier
est représentée par une lettre (de A à H) suivie d'un chiffre (de 1 à 8). La lettre définit
la colonne et le chiffre définit la ligne. La valeur contenu dans la case correspond au
nom de la pièce

 Créer un dictionnaire permettant de gérer l’échiquier


20
1.3 Les dictionnaires

 Ajout d’un élément dans un dictionnaire


 Exemple
 Solution

echiquier = {}
echiquier['a', 1] = "tour blanche" # En bas à gauche de l'échiquier
echiquier['b', 1] = "cavalier blanc" # À droite de la tour
echiquier['c', 1] = "fou blanc" # À droite du cavalier
echiquier['d', 1] = "reine blanche" # À droite du fou
# ... Première ligne des blancs
echiquier['a', 2] = "pion blanc" # Devant la tour
echiquier['b', 2] = "pion blanc" # Devant le cavalier, à droite du
pion
# ... Seconde ligne des blancs

21
1.3 Les dictionnaires

 Suppression des clés d’un dictionnaire


 Deux possiblités:
 Mot clé « del »

placard = {"chemise":3, "pantalon":6, "tee shirt":7}


del placard["chemise« ]

 Méthode de dictionnaire « pop »

>>> placard = {"chemise":3, "pantalon":6, "tee shirt":7}


>>> placard.pop("chemise")
3
>>>

 Cette méthode supprime non seulement la clé mais aussi la valeur associée. Elle
retourne cette valeur.

22
1.3 Les dictionnaires

 Parcours d’un dictionnaire


 le parcours d'un dictionnaire ne s'effectue pas tout à fait comme celui d'une liste car il n’est
pas une structure ordonnée

 On utilise généralement des méthodes de l’objet « dict »

 2 méthodes de parcours:
 Parcours des clés

 Parcours des valeurs

 Parcours des deux simultanément

23
1.3 Les dictionnaires

 Parcours d’un dictionnaire


 Parcours des clés

>>> fruits = {"pommes":21, "melons":3, "poires":31}


>>> for cle in fruits:
... print(cle)
...
melons
poires
pommes
>>>

 En parcourant « simplement » un dictionnaire, on parcourt en réalité la liste des clés


contenues dans le dictionnaire

 Remarque :
 L’ordre d’apparition des clés ne suit pas l’ordre de l’initialisation

 Normal car un dictionnaire n’est pas une structure ordonnée

24
1.3 Les dictionnaires

 Parcours d’un dictionnaire


 Parcours des clés
 La méthode « keys() » de l’objet « dict » permet d’obtenir les mêmes résultats

>>> fruits = {"pommes":21, "melons":3, "poires":31}


>>> for cle in fruits.keys():
... print(cle)
...
melons
poires
pommes
>>>

25
1.3 Les dictionnaires

 Parcours d’un dictionnaire


 Parcours des valeurs
 La méthode « values() » renvoie la liste des valeurs du dictionnaire

 Exemple

>>> fruits = {"pommes":21, "melons":3, "poires":31}


>>> for valeur in fruits.values():
... print(valeur)
...
3
31
21
>>>

26
1.3 Les dictionnaires

 Parcours d’un dictionnaire


 Parcours simultané des clés et valeurs
 On utilise la méthode « items() »
 Elle renvoie une liste, contenant les couples (clé : valeur), sous la forme d'un tuple

 Exemple

>>> fruits = {"pommes":21, "melons":3, "poires":31}


>>> for cle, valeur in fruits.items():
... print("La clé {} contient la valeur {}.".format(cle,
valeur))
...
La clé melons contient la valeur 3.
La clé poires contient la valeur 31.
La clé pommes contient la valeur 21.
>>>

27
1.4 Retour sur les fonctions et procédures

 Rappel
 Les procédures et fonctions permettent de décomposer un programme complexe en
plusieurs parties plus simple et relativement indépendantes (aussi appelées sous-
programmes)

 Il est possible d’avoir des fonctions et procédures ne prenant aucun paramètres

 Déclaration d’une procédure et d’une fonction (en LDA)


Procédure Fonction

28
1.4 Retour sur les fonctions et procédures

 Rappel
 Déclaration d’une fonction (ou procédure) en Python

def nom_del_la_fonction(param1, param2, paramN):


# Instructions 1
# instruction 2
# ….
# instruction N

 Exemple : Ecrire la fonction de Minac et Willans définit dans le TP2 sur les fonctions et
procédures du semestre I.

29
1.4 Retour sur les fonctions et procédures

 Rappel
 La définition d’une procédure et d’une fonction en Python est la même. Toutefois les
fonctions doivent obligatoirement retourner une ou plusieurs valeurs (avec l’instruction
« return »)

 L’appel d’une fonction (ou d’une procédure) se fait en lui passant des expressions
correspondant aux paramètres dont elle a besoin.

nomFonction( param1, param2, …, paramk) ;

 Exemple :
Procédure Age (Donnees annee_naissance : entier)
Appel de la fonction
Variables :
entier age
Début : Age( 1901)
age  2020 – annee_naissance
afficher (‘vous avez ’, age, ‘ ans’)
FinProcedure
30
1.4 Retour sur les fonctions et procédures

 Fonctions retournant plusieurs valeurs


 Jusqu’ici nous n’avons vu que des procédures et fonctions retournant une valeur unique

 En réalité, en Python (en particulier), il est possible de définir une fonction retournant
plusieurs valeurs (séparées par une virgule)

 Les valeurs retournées peuvent être de type différent

 Pour utiliser les valeurs retournées, il faudra soit :

 Définir autant de variables que des valeurs retournées

 Définir une seule variable : dans ce cas, il s’agit d’un tuple. L’accès aux valeurs se fait
comme s’il s’agissait d’un tableau.

31
1.4 Retour sur les fonctions et procédures

 Fonctions retournant plusieurs valeurs


 Exemple : Ecrire la fonction « MinMax » prenant en paramètre un tableau de taille « n » puis
retournant les valeurs minimale, maximale et moyenne du tableau. Dans le programme principal,
demander à l’utilisateur de spécifier la taille du tableau de le remplir. Ensuite on affichera les
valeurs minimale, maximale et moyenne du tableau (en Python)

32
1.4 Retour sur les fonctions et procédures

 Valeurs par défaut des paramètres


 Il est possible d’initialiser certains paramètres lors de la création de la fonction

 C’est le cas pour la majeure partie des fonctions et procédures de la librairie Python

 Exemple

def afficherMax(a, b = 10):


if a > b :
print( ”le maximum de ", a, ”et", b, ”est", a )
else
print( ”le maximum de ", a, ”et", b, ”est", b )

 Lors de l’appel de la fonction, il n’est pas nécessaire de préciser la valeur de b


 Appel de la fonction

>>> afficherMax(45)
Le maximum de 45 et 10 est 45
>>> 33
1.4 Retour sur les fonctions et procédures

 Portée des variables


 Une fonction est caractérisée par trois types de variables :
 Les variables locales : Elles sont définies à l’intérieur du sous-programme et ne sont
pas accessible en dehors du sous-programme. Leur portée est locale

def table_par_7():
nb = 7 # variable locale
i = 0 # variable locale
while i < 10: # Tant que i est strictement inférieure à 10,
print(i + 1, "*", nb, "=", (i + 1) * nb)
i += 1 # On incrémente i de 1 à chaque tour de boucle.

 Les variables formels : Il s’agit des variables d’entrées servant d’échanges entre les
programmes appelant et appelé

34
1.4 Retour sur les fonctions et procédures

 Portée des variables


 Une fonction est caractérisée par trois types de variables :
 Les variables globales : elles sont définies dans le programme appelant et ont donc
une portée globale. Dans une fonction, une variable globale ne peut être utilisé qu’en
mode lecture uniquement

a = 42
def change(valeur):
a = valeur
print(a) # Affiche `42`
change(10)
print(a) # Affiche ... `42` encore ? C'est universel ?

 pour modifier la valeur d’une variable globale à l’intérieur d’une fonction, il suffit
d’utiliser le mot clé « global »
a = 42
def change(valeur):
global a
a = valeur
print(a) # Affiche `42`
change(10)
print(a) # Affiche `10` 35
2. Modularité en Python

09/06/2021
36
2.1 Généralités

 Pourquoi créer des fonctions ?


 Meilleure organisation du programme (regrouper les tâches par blocs : lisibilité → maintenance)

 Eviter la redondance (pas de copier/coller → maintenance, meilleure réutilisation du code)

 Possibilité de partager les fonctions (via des modules)

 Le programme principal doit être le plus simple possible

 Qu’est-ce qu’un module en Python ?


 Un module est un fichier « script python » (d’extension « .py ») contenant un ensemble de variables,
fonctions et classes que l’on peut importer et utiliser dans le programme principal (ou dans d’autre
modules).

 On peut regrouper dans un module les fonctions traitant des problèmes de même nature ou
manipulant le même type d’objet

 Dans ce chapitre, nous allons apprendre à utiliser les modules déjà existant en Python et d’en créer
2.2 Les modules standards de Python

 Comment importer un module ?


 Des modules standards prêts à l’emploi sont livrés avec la distribution Python (Ex.
random, math, os, hashlib, etc.). La liste complète des modules est disponible ici

 Pour importer un module, il suffit d’utiliser le mot clé « import » suivi du nom du module
 Exemple :

38
2.2 Les modules standards de Python

 Comment importer un module ?


 Pour connaître les fonctions disponibles dans le module « math », il suffit d’utiliser la
fonction « help »

>>> help("math")
Help on built-in module math:
NAME
math
FILE
(built-in)
DESCRIPTION
This module is always available. It provides access to the
mathematical functions defined by the C standard.
FUNCTIONS
acos(...)
acos(x)
Return the arc cosine (measured in radians) of x.
acosh(...)
acosh(x)
Return the hyperbolic arc cosine (measured in radians) of x.
asin(...)
-- Suite --

39
2.2 Les modules standards de Python

 Autres utilisations possibles

#définition d'alias
import math as m, random as r
L’alias permet d’utiliser des noms
#utilisation de l'alias plus courts dans le programme.
r.seed(None) value
= r.random()
logv = m.log(value)
abslog = m.pow(logv,2.0)

#importer le contenu Cette écriture permet de désigner


#des modules nommément les fonctions à importer.
from math import log, pow
from random import seed, random Elle nous épargne le préfixe lors de
l’appel des fonctions. Mais est-ce
#utilisation directe vraiment une bonne idée ?
seed(None) value
= random() N.B.: Avec « * », nous les importons toutes
logv = log(value)
abslog = pow(logv,2.0) (ex. from math import *). Là non plus pas
besoin de préfixe par la suite.
40
2.2 Les modules standards de Python

 Création d’un module personnalisé


 Il suffit de créer un fichier « nom_module.py » et d’y implémenter les fonctions à partager

 L’appel du modèle et de ses fonctions se fait de la même façon que vu précédemment

41
3. Gestion des erreurs

09/06/2021
42
3.1 Introduction

 Que savons-nous jusqu’à présent?


 Nous avons toujours supposer que tout se déroulait bien dans nos programmes
 Cependant, les problèmes peuvent survenir
 Un fichier qui ne peut être ouvert

 Une mémoire saturée

 Accès à une mémoire déjà libérée

 Comment gérer efficacement les erreurs?

 Comment prévenir les erreurs ?

43
3.1 Introduction

 Quels sont les types d’erreurs possibles ?


 Erreurs de syntaxe
 Oublie du « point-virgule » à la fin d’une ligne de code
 Ecrire d’une boucle dont la syntaxe n’est pas respectée, …
 Faciles à corriger car le compilateur peut les signaler

 Erreurs d’implémentation
 Le programme est syntaxiquement correct mais exécute une action interdite
 Accès à la 10ème case d’un tableau de 8 éléments
 Accès aux données d’un pointeur NULL
 Racine carré d’un nombre négatif

 Comment éviter ces types d’erreurs ?

44
3.2 Erreurs et exceptions

 Cas réels d’erreurs


 Prenons un fichier « script.py » contenant le code Python suivant:

def une_ f onct i on ( a) :


return 1 / a

def une_ aut r e_ f onct i on ( ) :


une_fonction (0)

une_ aut r e_ f onct i on ( )

 L’exécution de ce code provoque l’erreur suivante :

Astuces : Comment lire les erreurs ?


Un message d'erreur se lit de bas en
haut ! Ainsi on peut remonter la pile
des appels.

45
3.2 Erreurs et exceptions

 Cas réels d’erreurs


 Sous l'erreur ci dessus, se cache en réalité une exception de type ZeroDivisionError.

 Qu’est ce qu’une exception ?


 C’est un Mécanisme pour gérer des erreurs survenues lors de l'exécution d'un programme.

 Pourquoi faut-il gérer certaines exceptions ?


 Apporter une solution à un problème bloquant
 Eviter d'interrompre le programme

46
3.2 Erreurs et exceptions

 Comment gérer les exceptions ?


 En Python, on utilise l’ensemble des instructions « try – except » permettent d’intercepter
une erreur et d’exécuter une portion de script spécifique de cette erreur

Try :
#code d’instructions
Except :
#code permettant de gérer
l’exception

 Le bloc d’instructions qui suit directement une instruction « try » est exécuté par Python
sous réserve.
 Si une erreur survient pendant l’exécution de l’une de ces instructions, alors Python annule
cette instruction fautive et exécute à sa place le code inclus dans le bloc qui suit
l’instruction « except »
 Si aucune erreur ne s’est produite dans les instructions qui suivent try, alors tout va bien!

47
3.2 Erreurs et exceptions

 Comment gérer les exceptions ?


 Exemple :

 Considérons par exemple un script qui demande à l’utilisateur d’entrer un nom de


fichier, lequel fichier étant destiné à être ouvert en lecture. Si le fichier n’existe pas,
nous ne voulons pas que le programme se « plante ». Nous voulons qu’un
avertissement soit affiché, et éventuellement que l’utilisateur puisse essayer d’entrer
un autre nom.
filename = input("Veuillez entrer un nom de
fichier : ")
try:
f = open(filename, "r")
except:
print("Le fichier", filename, "est
introuvable")
48
3.2 Erreurs et exceptions

 Types usuels d’exceptions


 Il en existe plusieurs
 « ArithmeticError » : Exception relative à des erreurs diverses d’erreurs arithmétiques.
Elle comprend entre autres:
« ZeroDivisionError » : erreur de division par 0
« FloatingPointError » : Erreur resultant d’opération sur les nombres réels
…
 « OSError » : Exception relative aux erreurs liées à la gestion des fichiers. Elle
regroupe les types d’exceptions suivants:
« FileExistError » : Erreur liée à l’existance d’un fichier ou d’un repertoire
 « PermissionError » : Erreur liée à la permission d’accès au contenu d’un
fichier.

49
3.2 Erreurs et exceptions

 Exercices

 1. Ecrire un programme demandant à l’utilisateur de son saisir son age. En utilisant le


mécanisme de gestion des exceptions, assurer que l’element saisir par l’utilisateur est bien
un entier. Sinon, le tenir informer!

 Ecrire une fonction « sinc » qui prend en entrée un nombre x et renvoie la valeur sin(x)/x
si x # 0 et 1 sinon. Le programme doit gérer une exception. La fonction « sin » est
disponible dans le module math de Python.

50
4. Algorithmes de tri

09/06/2021
51
4.1 Introduction

 Définition:
 Un tableau T est dit « trié en ordre croissant » si tous les éléments consécutifs du tableau
vérifient :

 Il est admis qu’un :

 tableau vide est trié

 tableau ne contenant qu’un seul élément est trié

 D’où la définition:

 Un tableau vide (n=0) est ordonné (trié)

 Un tableau contenant un seul élément (n=1) est ordonné

 Un tableau T[1,…n], (n > 1) est ordonné si

52
4.2 Tri d’un tableau

 Principe:
 Soit un vecteur (tableau à une dimension) T[1..n] à valeurs dans un ensemble E de valeurs
muni d’une relation d’ordre notée <

 Trier le vecteur T consiste à construire un vecteur T‘[1..n] tel que :

 T‘ soit trié,

 T‘ et T contiennent les mêmes éléments.

 Le plus souvent T et T‘ sont le même vecteur ; T‘ est construit en permutant entre eux les
éléments de T

 Les méthodes de tri les plus populaires sont:

 Le tri par remplacement

 Le tri par insertion

 Le tri par sélection

 Le tri à bulles 53
4.2 Tri d’un tableau

 Tri par remplacement:


 Cette méthode simple et intuitive est malheureusement très peu performante.

 Elle consiste à construire un tableau Ttrié[1..n] à partir de T[1..n] tel que :

 Principe :

 Identifier le maximum du tableau T

 Rechercher le minimum du tableau T

 Recopier ce minimum dans Ttrié à la position i

 Remplacer le minimum du tableau T par le maximum

 Recommencer pour i+1

54
4.2 Tri d’un tableau

 Tri par remplacement:

55
4.2 Tri d’un tableau

 Tri par remplacement


 Inconvénients:

 Pour chaque élément rangé dans le tableau Ttrié, il faut parcourir tout le tableau T et
non une partie du tableau T

 Nécessite un 2ème tableau, or si le nombre d’éléments à trier est important, cet


algorithme requiert donc un espace mémoire double.

56
4.2 Tri d’un tableau

 Tri par insertion


 Cette méthode de tri insère (au ième passage) le ième élément T[i] à la bonne place parmi
T[1],T[2]...T[i-1].

 Après l'étape i, tous les éléments entre la première et la ième position sont triés.

 Il existe plusieurs méthode de tri par insertion selon le principe qui est utilisé pour
rechercher le rang de l’élément à insérer parmi les éléments du début de la liste déjà triés

57
4.2 Tri d’un tableau

 Tri par insertion

58
4.2 Tri d’un tableau

 Tri par sélection


 Le principe du tri par sélection d'un vecteur est d'aller chercher le plus petit élément du
vecteur pour le mettre en premier, puis de repartir du second, d'aller chercher le plus petit
élément pour le mettre en second etc.

 Au ième passage, on sélectionne l’élément ayant la plus petite valeur parmi les positions i..n
et on l'échange avec T[i].

59
4.2 Tri d’un tableau

 Tri par sélection

60
4.2 Tri d’un tableau

 Tri à bulles
 Le principe du tri à bulles (bubble sort) est de :

 comparer deux à deux les éléments e1 et e2 consécutifs d'un tableau ;

 et d'effecteur une permutation si e1 > e2 . On

 continue de trier jusqu'à ce qu'il n'y ait plus de permutation.

61
4.2 Tri d’un tableau

 Tri à bulles

62
5. Récursivité

09/06/2021
63
5.1 Généralités

 Définition
 La récursivité est très souvent oubliée lors de l'apprentissage d'un langage de
programmation, non pas parce qu'elle est difficile à comprendre et à apprendre, mais parce
qu'elle est peu connue. Pourtant, celle-ci peut se révéler d'une extrême importance

 Un algorithme est dit récursif si, à un moment, il s'appelle lui-même.

 Elle permet de coder des fonctions (mathématiques) définie à partir de relation de


récurrence

 Exemple : calcul du factoriel d’un nombre entier


o 1ère définition

• n! = 1 * 2 * 3 * 4 * … * n

• Traduction par une boucle :

o 2ème définition:
64
5.2 Cas pratique

 Exemple
 calcul du factoriel d’un nombre entier

65
5.2 Cas pratique

 Définition
 Dérouler cet algorithme pour factoriel(5)

66
5.3 Avantages et Inconvénients

 Avantages
 Elle permet de résoudre des problèmes, d'habitude irrésolvables avec l'utilisation de
simples boucles pour ou tant que.

 Elle peut aussi rendre un algorithme plus lisible et plus court

 elle permet, dans certains cas, un gain colossal de temps (cas des algorithmes de tri)

 Exemple : Algorithme de tri rapide (ou Quick sort)

 A l’image des algorithmes de tri vu dans le chapitre précédent, l’algorithme de tri


rapide est basé sur la récursivité

67
5.3 Avantages et Inconvénients

 Avantages
 Principe de l’algorithme de tri rapide:
 On choisir un nombre de la liste au hasard, que l'on appelle nombre pivot, et auquel on compare
les autres valeurs de la liste.

 Si la valeur comparée est inférieure au nombre pivot, on la place dans une liste que l'on nomme
"inferieure" sinon on la place dans une liste "superieur".

 Une fois toutes les valeurs comparées, on obtient normalement 2 listes : la liste "inferieur"
contenant toutes les valeurs inférieurs au pivot et la liste "supérieur" contenant toutes celles
supérieures.

 Il ne reste plus qu'à répéter cette méthode pour les 2 listes, jusqu'à ce que celles-ci ne
contiennent plus qu'une seule valeur

68
5.3 Avantages et Inconvénients

 Avantages
 Principe de l’algorithme de tri rapide:

 Comparaison de performance

69
5.3 Avantages et Inconvénients

 Inconvénients
 Si les fonctions récursives sont très pratiques pour trier des données, ce n'est pas toujours
le cas dans d'autres programmes

 Comparons les performances de la fonction factoriel

 La fonction « recursive » est relativement lente

70
6. Gestion de fichiers

09/06/2021
71
6.1. Introduction

 Que savons-nous faire jusqu’à présent?


 Au moment de l’exécution
 Pour pouvoir utiliser une application (console), l’utilisateur doit saisir des données au
clavier
 Ces données sont traitées au moment de l’exécution et conservées en mémoire

 Inconvénients
 L’information n’y est conservée que sous réserve d’une alimentation électrique
permanente
 Sinon perte totale des résultats obtenus
 La mémoire n’est accessible que par l’ordinateur auquel elle appartient
 La communication entre 2 machines suppose qu’à un moment donné, les données
soient représentées ailleurs qu’en mémoire

72
6.1. Introduction

 Comment sauvegarder les données?


 2 principales solutions existent:
 L’utilisation de fichiers (plus simple)
 L’utilisation de base de données (plus complexe)

 Ce cours concerne uniquement l’utilisation de fichiers

 Qu’est-ce qu’un fichier?


 Représentation du contenu d’un fragment de la mémoire, stocké sur un périphérique et
permettant au système d’exploitation d’utiliser un nom pour désigner cette représentation
 Exemple de fichier : fichier texte, excel, …

 Notion d’entrée/sortie
 Mécanisme de sauvegarde (Machine  Fichiers) et d’importation de données (Fichiers 
Machine)

73
6.1. Introduction

 Type de fichiers
 Fichier texte
 fichier contenant des caractères imprimables (et lisible) et des espaces organisés en
lignes successives, ces lignes étant séparées les unes des autres par un caractère spécial
non-imprimable appelé « marqueur de fin de ligne » (ou retour chariot « \n »)

74
6.1. Introduction

 Type de fichiers
 Fichier binaire
 le contenu est – au moins en partie – inintelligible pour un lecteur humain, et qui ne
prend son sens que lorsqu’il est décodé par un logiciel spécifique
 Par exemple, les fichiers contenant des images, des sons, des vidéos, etc. sont presque
toujours des fichiers binaires

75
6.1. Introduction

 Type de fichiers
 Fichier tabulé (Excel, CSV)
 Ces fichiers sont similaires au fichier texte. A la différence que chaque élément d’une
ligne est soit
 Tabulé : utilisation d’un caractère spécial « \t » (non visible)
 Séparé par une virgule « , » ou un point virgule « ; » : il s’agit des fichier de
type CSV (Comma Separated Values)
 L’extension de ces fichiers peut être « .xls », « .csv » et « .txt »

 Et bien d’autres types de fichiers (JSON, …)

 Dans ce cours, on s’intéressera particulièrement au fichier Texte (incluant les fichiers


tabulés)

76
6.1. Introduction

 Notion de chemin absolu et relatif


 Dans l’arborescence d’un système, il existe deux possibilités d’accès à un fichier
 le chemin absolu (= chemin complet)
 Chemin partant de la racine du disque
 Exemple : "C:/Documents and Settings/login/Bureau/fichier.txt"

 le chemin relatif
 Chemin à partir de là où l’on se trouve actuellement
 Exemple : si on se trouve dans le dossier « C:\TP_Python » et que l'on souhaite
accéder au fichier « TP1.py », le chemin relatif menant à ce fichier sera tout
simplement fic.txt.

 Remarque : quand on décrit un chemin relatif, on utilise parfois le symbole


« … » désignant le répertoire parent

77
6.2. Lecture et écriture dans un fichier

 Ouverture de fichier
 Avant d’écrire ou de lire dans un fichier, il est nécessaire de l’ouvrir
 Syntaxe:

fid = open(chemin_fichier, mode_ouverture)

 « fid » : variable permettant de manipuler le fichier (objet de type TextIoWrapper )


 « chemin_fichier » : chemin d’accès au fichier
 « mode_ouverture » : mode d’ouverture du fichier. Il est fourni sous forme de chaine de
caractère
Mode Description
d’ouverture
‘r ’ Ouverture en lecture (READ)

‘w’ Ouverture en écriture (WRITE). Le contenu du fichier est écrasé. Si le fichier


n'existe pas, il est créé.
‘a’ Ouverture en écriture en mode ajout. On écrit à la fin du fichier sans écraser
l'ancien contenu du fichier. Si le fichier n'existe pas, il est créé.
‘b’ Ouverture en mode binaire
78
6.2. Lecture et écriture dans un fichier

 Ouverture de fichier
 Exemple

# coding: utf-8
fichier = open("data.txt", "r")
print fichier.read()
fichier.close()

 Attention : pour ouvrir un fichier en mode lecture, ledit fichier doit exister. Sinon on
obtiendra le message d’erreur suivant :
fichier = open(‘data.txt','r')
IOError: [Errno 2] No such file or directory: ‘data.txt'
 Remarque : il est tout à fait possible de combiner certains mode.
 Exemple : Ouverture d’un fichier en lecture en mode binaire

# coding: utf-8
fichier = open("data.txt", "wb")
print fichier.read()
fichier.close()
79
6.2. Lecture et écriture dans un fichier

 Fermeture de fichier
 On utilise la fonction « close » de l’objet « fichier »
 Exemple:

# coding: utf-8
fichier.close()

80
6.2. Lecture et écriture dans un fichier

 Lecture intégrale de fichier


 On utilise la méthode « read » de l’objet fichier et le mode d’ouverture de fichier DOIT
ETRE ‘r’

 Elle renvoie l’intégralité du fichier sous forme de chaine de caractères

 Exemple :
>>> mon_fichier = open("fichier.txt", "r")
>>> contenu = mon_fichier.read()
>>> print(contenu)
C'est le contenu du fichier. Spectaculaire non ?
>>> mon_fichier.close()
>>>

 Etant donné que le contenu est une chaine de caractères, on peut naturellement tout faire :
 Conversion d’une partie ou l’intégralité du texte
 Possibilité de parcourir le texte ligne par ligne et de les traiter
 Le symbole « \n » traduit les sauts de lignes
 …
81
6.2. Lecture et écriture dans un fichier

 Lecture séquentielle de fichier


 La méthode « readline() », permet de lire une seule ligne à la fois (en incluant le caractère
de fin de ligne)

>>> mon_fichier = open("fichier.txt", "r")


>>> ligne = mon_fichier.readline()
>>> print(ligne)
C'est le contenu du fichier. Spectaculaire non ?
>>> mon_fichier.close()
>>>

 La méthode « readlines() » permet de lire toutes les lignes et les retourne sous forme de
liste

82
6.2. Lecture et écriture dans un fichier

 Ecriture dans un fichier


 On utilise la méthode « write(…)»
 Elle ne prend en paramètre que des chaine de caractère à écrire dans le fichier
 Elle renvoie le nombre total de caractères qui ont été écrit

 Mode d’ouverture de fichier : ‘a’, ‘w’

 Exemple:

>>> mon_fichier = open("fichier.txt", "w") # Argh j'ai tout écrasé !


>>> mon_fichier.write("Premier test d'écriture dans un fichier via Python")
50
>>> mon_fichier.close()
>>>

83
6.2. Lecture et écriture dans un fichier

 Remarque :
 Pour manipuler le contenu d’un fichier, il doit être ouvert
 Cependant il était déjà ouvert, ce qui peut engendrer des bugs

 Une fois des opérations sont terminées sur un fichier, il faut TOUJOURS LE FERMER !!!

 Le mot clé « with »


 Il existe une autre syntaxe plus courte qui permet de s‘émanciper du problème de
fermeture du fichier: le mot clé « with »

with open("data.txt",, "r“)) as fichier :


print(fichier.read()()

84
6.3. Enregistrement et restitution de variables diverses

 Enregistrement des variables :


 Les données à enregistrer avec la méthode « write » doit être une chaine de caractère.
 Nécessité de convertir les données en utilisant « str(variable) » ou la méthode
« format(…) »

>>> x = 52
>>> f.write(str(x))

 Restitution des variables :


 Lors du chargement des données à partir d’un fichier, elles sont sous forme de chaine de
caractère. Il est donc nécessaire de convertir les données si besoin est

>>> x = f.read()
>>> x = int(x)

85
6.3. Exercices d’application

 Exercice 1 :
 On souhaiterait enregistrer les notes des étudiants dans un fichier texte. Chaque ligne
correspond à une note. Ecrire un programme demandant à l’utilisateur de spécifier le
nombre d’étudiants puis de saisir leur note que l’on enregistrera dans une liste notée
« notes ». Ensuite créer un fichier portant le nom de « notes.txt » dans lequel vous devez
enregistrer les notes.
 Exercice 2 :
 On considère les notes qui ont été enregistrer dans l’exercice précédent. Ecrire un
programme qui lit le contenu du fichier puis les transfert dans une liste. Enfin on affichera
la meilleure et la pire note.

86
6.3. Exercices d’application

 Exercice 3 :
 Cette fois ci il s’agira d’enregistres les informations sur les étudiants. Pour chaque étudiant,
on aura les informations suivantes:
 Le nom et prénom

 L’age

 Un indicateur « ajour » permettant de savoir s’il a payé ou non sa scolarité

 Sa moyenne générale

 Ecrire un programme demandant à l’utilisateur de spécifier le nombre d’étudiants puis de


spécifier les informations de chaque étudiant. Ces informations devront être sauvegarder
dans un fichier « etudiants.txt », chaque ligne correspondant aux informations d’un
étudiant. Attention: pour un « étudiant », chaque information sera délimité par une
tabulation « \t »

87
Fin

2019/2020 L1/ESI 88

Vous aimerez peut-être aussi