Académique Documents
Professionnel Documents
Culture Documents
Elaboré par :
-- Avril 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année BG des Instituts Préparatoires
aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Le document présent comporte un rappel sur les notions de base associées à Python comme
la manipulation des itérables, les structures de contrôle et les fichiers.
I Introduction
II Variable et affectation
Une variable est une référence associée à un objet déjà créé en mémoire. Elle n'a pas de type et n'est pas déclarée.
Toute variable doit être affectée avant son utilisation. L'identificateur (nom) de la variable ne peut contenir que des
caractères alphanumériques et le caractère '_' et ne débutant pas par un chiffre.
On obtient le type d'un objet à l'aide de la fonction type(objet) et son adresse mémoire désignant son identité à
l'aide de id(objet).
III Opérateurs
Affectation v = valeur x = 5
v1=v2=v3= valeur x = y= z = t = 5
v1,v2,v3=valeur1,valeur2,valeur3 x, y, z = 1, '2', 5
Parenthèses () (x+y)*2 #donne 6
Opérations arithmétiques
Puissance x**y # ou pow(x,y) 1j**2 #donne -1+0j
Signes +;-
Opérateurs relationnels
Comparaison d’identité is
is not
Opérateurs logiques
Produisent un booléen and ; or ; not
(bool)
Opérateurs avec assignation
Produisent le même x += y # x = x + y
résultat que l'affectation x -= y # x = x y
du résultat de l'opération x *= y # x = x * y
effectuée
x /= y # x = x / y
x //= y # x = x // y
x %= y # x = x % y
x **= y # x = x ** y
IV Types élémentaires
Les types élémentaires sont immuables (non modifiables). Les opérations appliquées aux objets de ces types
génèrent de nouveaux objets comme le montre l'exemple suivant :
>>> x=5
>>> id(x)
2053437424
>>> x+=1 # x référence un nouvel objet
>>> id(x)
2053437440
Remarque
bool (x) # retourne False si l'évaluation de x est nulle et True autrement
int(x) # retourne un entier si x est un nombre ou une chaine de caractère contenant
un nombre entier.
float(x) # retourne un réel si x est un nombre ou une chaine de caractère contenant
un nombre réel.
V Opérations d'entrée/sortie
VI Structures de contrôle
Un bloc de code est un groupe d’instructions Python indentées précédées par le caractère ":". Un bloc peut en
inclure d'autres.
Un intervalle défini par range, également considéré comme une séquence, est un itérable ou conteneur formé
par une succession d’entiers.
range(debut, fin, pas) génère l’intervalle [debut, fin [ par pas entier relatif égal à pas.
Une chaîne est une séquence non modifiable et ordonnée de caractères. Le tableau suivant résume les
principales opérations applicables aux chaînes.
Une liste est une séquence, ordonnée et modifiable, d’éléments éventuellement hétérogènes séparés par une
virgule et délimitée par une paire de crochets.
Le tableau suivant résume les principales fonctions applicables aux listes.
Un tuple est une séquence, ordonnée et non modifiable, d’éléments éventuellement hétérogènes séparés par
une virgule. Le tableau suivant résume les principales fonctions applicables aux tuples :
Un ensemble est une collection d'éléments distincts non ordonnés et encadrés par des accolades. Le type set
représente la notion d’ensemble en mathématique. Un ensemble doit impérativement comporter des éléments
non modifiables. La création d'ensembles de listes, de dictionnaires ou d'ensembles déclenche une erreur.
Le tableau suivant résume les principales fonctions/méthodes applicables aux ensembles.
Un dictionnaire est une structure modifiable et non ordonnée d'associations (clé : valeur). Les clés sont
impérativement des objets non modifiables. L'utilisation de listes, de dictionnaires ou d'ensembles comme
clé déclenche une erreur. Les valeurs sont des objets quelconques.
Exemple
Exemple
2ème manière :
Notions de base : Rappel
Révision Informatique, Concours BG 2020 13
X Les sous-programmes
Une fonction est un bloc d’instructions indentées (corps de la fonction) destiné à réaliser une opération. Elle peut
recevoir des paramètres et renvoie éventuellement un résultat. L’appel d’une fonction Python retourne toujours un
objet, par défaut None. Dans le corps de la fonction ce retour est spécifié à l’aide de l’instruction return.
Le tableau suivant résume les concepts de base associés aux fonctions Python.
Les exceptions sont des objets spéciaux permettant de représenter une erreur d’exécution dans un script Python. Il
existe plusieurs types d’erreurs : TypeError, ValueError, IndexError. La table suivante résume les
opérations de gestion d’erreur.
Un fichier est une collection d’informations, généralement structurées d’une manière ou d’une autre, placées sur
une mémoire de masse.
Un fichier texte contient une succession de caractères séquentiels. Lors de l’ouverture d’un fichier texte, un
encodeur assure la conversion des octets lus/écris en lettres UNICODE. Voici les principales fonctions/méthodes
pour le traitement des fichiers.
Bibliographie et Netographie
Ouvrages :
Learning Python, Mark Lutz, Edition O’Reilly, Juin 2013, ISBN: 9781449355722.
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack & al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de H.Filali et H.Bouzidi, Rappel, pour 2ème année préparatoire des sections MP-PC-T, IPEIM,
Année universitaire 2019-2020.
Support de Cours de Laila Hammami pour 1ère année préparatoire des sections MP-PC-T, IPEIN, Année
universitaire 2019-2020.
Support de Cours de W.Meftah, pour 1ère année préparatoire de la section BG, IPEIS, Année universitaire 2019-
2020.
Sites Web :
https://www.python-course.eu/
https://www.ics.uci.edu/~brgallar/index.html
Elaboré par :
-- Mai 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
I I NTRODUCTION
En programmation procédurale, on s'intéresse aux étapes nécessaires pour résoudre un problème donné. Ces étapes
sont modélisées par des tâches plus ou moins complexes, appelées procédures/fonctions qui manipulent les données
du problème sans beaucoup de contrôle pour aboutir au résultat final. Le programme est donc un enchainement de
ces tâches.
En programmation OO, on modélise le problème par un ensemble d'objets du monde réel qui interagissent entre eux
à travers des messages. L'objet est donc l'entité principale.
L'objet encapsule ses propres données et les traitements relatifs à ses données dans une même entité. Le programme
est un ensemble d'objets et des interactions entre ces objets.
II C LASSE ET O BJET
II.1 Définitions
Concrètement un objet est une entité du monde réel. Une personne, une voiture, une forme géométrique, une
image, une feuille, etc.
En python, toutes les entités manipulées sont des objets (entier, fichier, module, etc)
Une feuille de papier par exemple, possède une couleur, une longueur et une largeur et on peut la plier, la
déchirer, la couper, etc.
Un exemplaire d'un objet s'appelle une instance. Une feuille de papier de couleur rouge de longueur 21 cm et de
largeur 17 cm est une instance de l'objet.
Deux instances possèdent chacune des valeurs d'attributs différentes mais se partagent les mêmes méthodes de
l'objet. Il n'y a aucune interférence entre les objets d'une même classe.
Une classe est une entité qui permet la création des objets (instances) ayant les mêmes propriétés.
Pour pouvoir manipuler un objet (accéder à ses propriétés ou invoquer l'une de ses méthodes), on utilise
l’opérateur point.
Un attribut d’objet est défini au niveau de la méthode constructeur. La valeur d’un attribut d’objet est
propre à chaque objet. L’accès à l’attribut est donné par : nom_Objet.nom_attribut
Le constructeur d’objet
Le constructeur est une méthode particulière appelée lors de la création d'un nouvel objet permettant
d’initialiser ses attributs.
Le constructeur se définit dans une classe comme une fonction avec deux particularités :
o le nom de la méthode doit être __init__ ;
o la méthode doit accepter au moins un paramètre de nom self qui apparaît en premier.
Le paramètre self
Le paramètre self représente en fait l'objet cible, c'est-à-dire que c'est une variable qui référence l'objet
en cours de création et permettant d’accéder à ses attributs et fonctionnalités.
Les méthodes
Une méthode est une fonction qui agit principalement sur une instance de la classe. Elle doit accepter au
moins le paramètre self figurant en première position.
L’appel d’une méthode se fait par : nom_Objet.nom_méthode (autres paramètres)
Syntaxe de la création :
class nom_classe:
#définition des attributs de classe
(attribut de valeur commune pour toutes les instances)
nom_attr = valeur
Exemple
Soit la classe Compte_bancaire définie par:
◦ Les attributs:
◦ Attributs de classe : nombank
◦ Attributs d’objet : NumeroCompte, NomProprietaire, solde
◦ Les méthodes: AfficherSolde, Retrait, Dépôt
Elle est créée ainsi :
# création de la classe Compte_Bancaire CompteBc
class compteBc:
nombank= 'amenbank '
def __init__(self, N, A, S) #le paramètre self désigne l’objet lui-même
self.num=N
self.nom=A
self.sold=S
def retrait(self,x):
if self.sold>=x:
self.sold= self.sold-x
else:
raise Exception('retrait impossible')
def depot(self,x):
self.sold+=x
def AfficherSolde (self):
print('compte au nom de ', self.nom, 'a pour solde',self.sold)
Exemple
Soit compte1 une instance de la classe Compte_bancaire dont les données sont les suivantes :
◦ NumeroCompte : 512017
◦ NomProprietaire : mohamed
◦ solde : 1500
III.1 Définition
C’est le mécanisme qui permet de construire une classe « fille », ou sous-classe, à partir d’une classe « mère ». La
classe fille ainsi obtenue hérite toutes les propriétés et toutes les fonctionnalités de son ancêtre. La classe « fille »
peut éventuellement ajouter des méthodes/attributs propres à elle et redéfinir les méthodes qui ont été héritées de
sa classe mère. La classe fille est une spécialisation de la classe mère.
L’héritage se fait ainsi selon la syntaxe suivante :
class nom_sous_classe(nom_classe_mère):
#définir les attributs et les méthodes de la sous_classe
III.2 Exemple 1
Nous proposons ci-après un exemple d’héritage entre la classe mère Point et la classe fille PointColoré :
class Point:
def __init__(self,a,b):
self.x=a
self.y=b
def Affiche(self):
print('Point',(self.x, self.y))
def deplacer(self, dx, dy) :
self.x += dx
self.y += dy
class PointColoré(Point):
def __init__(self,a,b,col):
Point.__init__(self,a,b) # ou bien super().__init__(a,b)
self.couleur = col
def Affiche(self):
print('PointColoré',(self.x, self.y,self.couleur))
III.3 Exemple 2
Comme exemple d’héritage à partir d’une classe native Python, nous proposons de définir une classe nommée
ListOfStr permettant de stocker dans une liste uniquement des valeurs de type str. La classe doit déclencher
une exception pour toute tentative d’insertion/substitution d'un élément par une valeur qui n’est pas un str.
class ListOfStr(list):
def __repr__(self):
return "ListOfStr(({}))".format(super().__repr__())
IV P OLYMORPHISME ET SURCHARGE
Quand ce concept est appliqué aux méthodes spéciales, on l’appelle surcharge. Une méthode spéciale est en fait
une méthode dont le nom est donné par __nom__, exécutée sans appel explicite. Elle a un comportement par
défaut. On peut citer comme exemples :
__init__ : appelée lors de la création d’une instance de classe par nom_obj=nomClasse(paramètres)
__str__ : appelée par print(obj)
__add__ : appelée par obj1 + obj2
Exemple 1
La classe Etudiant hérite de la classe Personne.
class Personne:
def __init__ (self,nom):
self.nom=nom
def affiche(self):
print("je suis une personne")
class Etudiant(Personne):
def __init__(self,nom,cne):
super().__init__(nom)
self.cne=cne
def affiche(self):
print("je suis un étudiant")
Exemple 2 :
Il s’agit des méthodes calcul du périmètre et de l’aire dans les classes Carré et Disque.
class Carre :
” ” ” Un carré est modélisé par son coin supérieur gauche et une arête ” ” ”
def __init__ ( self, P, a ) :
self. coin = P
self.arete=a
def perimetre ( self ) :
return 4 * self.arete
def aire ( self ) :
return self.arete** 2
class Disque :
” ” ” Un disque est modélisé par son centre et son rayon ” ” ”
def __init__(self, c, r ) :
self.centre = c
self.rayon = r
def perimetre ( self ) :
return 2 * pi * self.rayon
def aire ( self ) :
return pi * self.rayon **2
Exemple 3
La méthode spéciale __add__ (l’opérateur +) est surchargée dans des différentes classes (float, complex, str,..) :
>>> x1 = 3 ; x2 = 5.1 ; x2 + x1 #float.__add__(x2, x1)
8.1
>>>z1 = 3+4j; z2 = 2-3j; z2 + z1 #complex.__add__(z2,z1)
5+1j
>>> s1 = « ali » ; s2 = « med » ; s2 + s1 #str.__add__(s2, s1)
“medali”
>>> t1 = (5,2); t2 = (3,); t2 +t1 #tuple.__add__(t2, t1)
(3, 5, 2)
Pour afficher les informations relatives à un objet, en utilisant le nom de l’objet (représentation sur le shell) ou
en utilisant la commande print(), il faut surcharger la méthode spéciale __repr__ :
def __repr__(self):
return #la chaine qu’on veut afficher
Exemple
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __repr__(self):
return (str((self.x , self.y)))
>>>p=point(2,3)
>>>p # l’exécution de l’évaluation de p fait appel à __repr__
(2,3)
>>>print(p) # l’exécution de print fait appel à la méthode __repr__
(2,3)
Pour donner une représentation textuelle informelle à un objet, il suffit de surcharger la méthode spéciale
__str__ :
def __str__(self):
return #la chaine qu’on veut afficher
Exemple1 :
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __str__(self):
return 'point'+str((self.x , self.y))
>>>p=point(2,3)
>>>p #sans redéfinir __repr__ l’exécution renvoie la référence de l’objet
<__main__.point object at 0x033DAB10>
>>>print(p) # l’exécution de print fait appel à la méthode __str__
point(2,3)
Exemple2 :
class point:
def __init__(self,a,b):
self.x=a
self.y=b
def __repr__(self):
return ( str((self.x , self.y)))
def __str__(self):
return 'point'+str((self.x , self.y))
>>>p=point(2,3)
>>>p # l’exécution de l’évaluation de p fait appel à __repr__
(2,3)
>>>print(p) # l’exécution de print fait appel à la méthode __str__
point(2,3)
La surcharge d’opérateurs permet la redéfinition et l’utilisation des opérateurs en fonction de la classe. Par
exemple, l’utilisation de l’opérateur + pour additionner deux objets de même type.
Python associe à chaque opérateur une méthode spéciale qu’on peut surcharger, on cite dans la suite quelques
exemples :
On rappelle qu’une pile est une structure de données qui suit le principe d’une pile d’assiettes, ˝ le dernier
arrivé est le premier servi˝, on parle du mode LIFO (Last In First Out). L’insertion ou la suppression d’un
élément ne peut se faire qu’à une seule extrémité, appelée sommet de la pile.
Une pile est définie par les opérations suivantes :
Empiler: permet l’ajout d’un élément au sommet de la pile ;
Dépiler: permet la suppression de l’élément au sommet de la pile si elle n’est pas vide ;
Vérifier si une pile est vide ou non.
V.1.2 Implémentation d’une classe Pile
On rappelle qu’une file est une structure de données qui suit le principe d’une file d’attente, ˝ le premier arrivé
est le premier servi˝, on parle du mode FIFO (First In First Out).
class File :
def __init__(self) :
self.liste=[ ]
def enfiler (self, v) :
self.liste.append(v)
def defiler(self) :
if not self.est_vide( ):
return self.liste.pop(0 )
def est_vide( self) :
return self.liste ==[ ]
#en utilisant une file intermédiaire #sans utiliser une file intermédiaire
def Inverser(p) : def Inverser(p) :
f1=file() p1=pile( )
while not p.est_vide( ): p2=pile( )
f1.enfier (p.depiler( )) while not p.est_vide( ):
while not f1.est_vide( ) : p1.empiler (p.depiler( ))
p.empiler( f1.defiler()) while not p1.est_vide( ) :
p2.empiler(p1.depiler())
while not p2.est_vide( ) :
p.empiler(p2.depiler())
VI E XERCICES D ’ APPLICATION
VI.1 Exercice 1
On s’intéresse à ordonner les éléments d’une file d’entiers dans l’ordre croissant. On suppose définie la classe
file, définir les méthodes suivantes :
4. Une méthode prix_vente qui permet de calculer et retourner le prix de vente d’un article. Ce prix est calculé
à partir du prix d’achat de l’article et d’un pourcentage P en appliquant la formule suivante :
prix de vente= prix d’achat + prix d’achat × P.
Le pourcentage P est un paramètre de la méthode et admet par défaut la valeur 20%.
B- Classe ArticleEnPromo :
Définir la classe ArticleEnPromo qui hérite de la classe Article en écrivant :
1. Une méthode constructeur __init__ qui permet de définir les mêmes attributs de la classe Article et
d’initialiser l’attribut remise qui représente le taux de la remise accordée. Cette méthode prend en paramètre
self, un article et le taux de remise.
2. Une méthode prix_ventePromo qui permet de retourner le prix de vente après la promotion.
C- Classe Stock :
Définir la classe Stock sachant que cette classe admet un attribut LS de type liste. Chaque élément de LS est une
sous-liste qui comprend un article et la quantité en stock correspondante.
Pour cela, écrire:
1. Une méthode constructeur __init__ qui permet d’initialiser l’attribut LS par une liste vide.
2. Une méthode de représentation __repr__ qui permet d’afficher le contenu du stock. L’affichage sera fait
ligne par ligne où chaque ligne est de la forme suivante :
(référence,désignation,prix_achat) : quantité en stock.
3. Une méthode rechercher_article qui permet, à partir de la référence, de chercher un article dans le stock.
Elle retourne la désignation, le prix de vente et la quantité en stock de cet article s’il existe et None sinon.
4. Une méthode ajouter_article qui permet d’ajouter un nouvel article en stock.
5. Une méthode maj_qtstock qui permet, à partir de la référence d’un article et d’une quantité qt, de mettre à
jour la quantité en stock d’un article existant. Cette méthode prend de plus un paramètre type_maj de type
entier, il est égal à 1 dans le cas d’un ajout et -1 dans le cas d’une réduction.
6. Une méthode supprimer_article qui, à partir de la référence d’un article, permet de le supprimer.
7. Une méthode articles_prix qui permet de retourner la liste des articles dont le prix de vente est compris
entre prix1 et prix2.
8. Une méthode articles_promo_qt qui permet de créer et retourner une liste de tuples où chaque tuple
comprend l’article qui sera en promotion ainsi que son prix de vente initial et son prix de vente après
promotion.
Les articles qui seront en promotion sont ceux dont la quantité en stock est inférieure à une valeur qt_min.
Le taux de remise et la valeur qt_min sont donnés en paramètres.
9. Soit StockE un dictionnaire qui contient les stocks de n magasins d’une enseigne. Les clés de StockE sont
représentées par des entiers identifiant les différents magasins et les valeurs sont les stocks correspondants.
10.Ecrire un programme python qui permet de :
saisir une référence ref d’un article.
pour chaque magasin, afficher la quantité en stock de l’article identifié par la référence ref.
déterminer et afficher la quantité totale en stock de cet article.
# Question 2
def permutation_circulaire(f,n):
if not f.est_vide():
for i in range(n):
f.enfiler(f.defiler())
# Question 3
def Inserer_Elt(F,elt):
if F.est_vide():
F.enfiler(elt)
else:
n=Taille(F)
ne=0
for i in range(n):
x=F.defiler()
ne+=1
if x<elt:
F.enfiler(x)
else:
break
F.enfiler(elt)
if x>elt:
F.enfiler(x)
if n-ne>0:
permutation_circulaire(F,n-ne)
# Question 4
def Ordonner_file(F):
FO=file()
while not F.est_vide():
e=F.defiler()
Inserer_Elt(FO,e)
return FO
class Article:
def __init__(self,ref,dsg,prix_a):
self.ref=ref
self.dsg=dsg
self.prix_a=prix_a
def __repr__(self):
return'('+str(self.ref)+','+self.dsg+','+str(self.prix_a)+')'
def set_article(self,type_modif,modif,):
if type_modif==1:
if type(modif)!=int:
raise ValueError('erreur de type')
self.ref=modif
elif type_modif==2:
if type(modif)!=str:
raise ValueError('erreur de type')
self.dsg=modif
elif type_modif==3:
if type(modif)!=float:
raise ValueError('erreur de type')
self.prix_a=modif
def prix_vente(self,pourcentage=20):
return self.prix_a*(1+pourcentage/100)
class ArticleEnPromo(Article):
def __init__(self,A,remise):
Article.__init__(self,A.ref,A.dsg,A.prix_a)
self.remise=remise
def prix_ventePromo(self):
return self.prix_vente()*(1-self.remise/100)
class Stock:
def __init__(self):
self.LS=[]
def __repr__(self):
ch=''
for i in self.LS:
ch=ch+str(i[0])+':'+str(i[1])+'\n'
return ch
def recherche_article(self,ref):
for i in self.LS:
if i[0].ref==ref:
return i[0].dsg,i[0].prix_vente(),i[1]
return None
def ajouter_article(self,A,qt):
self.LS.append([A,qt])
def maj_qtstock(self,ref,qt,type_maj):
for i in self.LS:
if i[0].ref==ref:
if type_maj==1:
i[1]+=qt
else:
i[1]-=qt
break
def supprimer_Articles(self,ref):
for i in range(len(self.LS)):
if self.LS[i][0].ref==ref:
self.LS.pop(i)
def articles_prix(self,p1,p2):
L=[]
for i in self.LS:
pv=i[0].prix_vente()
Ouvrages :
INFORMATIQUE Programmation et calcul scientifique en Python et Scilab, Thierry,Audibert & Amar Oussalah,
Edition ellipses,2014, ISBN:978-2-7298-84710
Apprendre à programmer avec Python , Gérard Swinnen, Edition Eyrolles, ISBN :978-2-212-13434-6
Supports de Cours
Support de Cours de H.Latrach POO, pour 2ème année préparatoire MP-PC, IPEIT, Année universitaire 2019-
2020.
Sites Web :
https://courspython.com/classes-et-objets.html
https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python
https://developpement-informatique.com/article/152/polymorphisme-en-python
Elaboré par :
-- Mai 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année MP-PC-T des Instituts
Préparatoires aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Le document présent comporte les concepts de base associés aux bases de données
relationnelles. Il expose ainsi la représentation et la manipulation des tables et relations,
ainsi que l’accès à la base à travers les requêtes exprimées en algèbre relationnelle ou en
SQL. L’utilisation de la bibliothèque Python SQLite3 est également présentée. Des exercices
d’application avec leurs corrigés sont intégrés à la fin.
Bases de données
[Tapez ici]
Bases de données
[Tapez ici]
Bases de données
4
Révision Informatique, Concours MP-PC-T 2020
I I NTRODUCTION
Une base de données relationnelle (BDR) est une base de données où l'information est organisée selon le modèle
relationnel. Les données sont organisées en tables et manipulées par des opérateurs algébriques. Dans ce qui suit,
les notions de base associées aux BDR sont présentées afin de pouvoir créer et alimenter une base de données avec
Python et écrire des requêtes en langage algébrique ou langage SQL.
Exemple
● La relation Etudiant ayant pour attributs Numéro, Nom, prénom, adresse, âge, département.
● Chaque attribut possède un domaine.
● Une relation a au moins une clé et peut en avoir plusieurs clés : ce sont les clés candidates.
● Parmi les clés candidates, le concepteur choisit une et une seule clé primaire.
● Par convention, on représente la clé primaire en la soulignant dans l’énoncé de la relation
Bases de données
5
Révision Informatique, Concours MP-PC-T 2020
Exemple
Bases de données
6
Révision Informatique, Concours MP-PC-T 2020
C’est un langage abstrait, avec des opérations qui travaillent sur une (ou plusieurs) relation(s) pour définir une
nouvelle relation sans changer la (ou les) relation(s) originale(s).
III.1 Projection
La projection d'une relation R1 est la relation R2 obtenue en supprimant les attributs de R1 non mentionnés.
La projection permet d’éliminer des attributs d’une relation. Elle correspond à un découpage vertical :
Exemple :
Bases de données
7
Révision Informatique, Concours MP-PC-T 2020
Exemple :
III.3 Jointure
La jointure de deux relations R1 et R2 est une relation R3 dont les n-uplets sont obtenus en concaténant les n-
uplets de R1 avec ceux de R2 et en ne gardant que ceux qui vérifient la condition de liaison
On notera : R3 = R1 ⋈ R2 (condition).
Remarques
Le schéma de la relation résultante de la jointure est la concaténation des schémas des opérandes (s'il y a des
attributs de même nom, il faut les renommer).
Les n-uplets de R1 ⋈ R2 (condition) sont tous les couples (u1,u2) d'un n-uplet de R1 avec un n-uplet de R2 qui
satisfont "condition".
La jointure de deux relations R1 et R2 est le produit cartésien des deux relations, suivi d'une restriction.
Bases de données
8
Révision Informatique, Concours MP-PC-T 2020
Exemple :
Requête : Donner les identifiants des clients ayant acheté un produit de marque Apple.
Réponse en AR : R1 = σPRODUIT (marque = 'Apple')
R2 = R1 ⋈ VENTE (R1.IdPro = VENTE.IdPro)
RESUL = πR2 (IdCli)
III.4 Union
L'union de deux relations R1 et R2 de même schéma est une relation R3 de schéma identique qui a pour n-uplets
les n-uplets de R1 et/ou R2.
On notera : R3 = R1 ∪ R2
Requête : Donner les identifiants des clients de Nice et les clients de Paris.
Réponse en AR : R1 = σClient (ville= 'Nice')
R2 = σClient (ville='paris')
R3 = R1 ∪ R2
RESUL = πR3 (IdPro)
Bases de données
9
Révision Informatique, Concours MP-PC-T 2020
III.5 Intersection
L’intersection entre deux relations R1 et R2 de même schéma est une relation R3 de schéma identique ayant
pour n-uplets les n-uplets communs à R1 et R2. On notera : R3 = R1 ∩ R2.
Exemple :
Requête : Donner les identifiants des produits de marque Apple et de prix < 2000
Réponse en AR : R1 = σPRODUIT (marque = Apple')
R2 = σPRODUIT (prix < 2000)
R3 = R1∩R2
RESUL = πR3 (IdPro)
III.6 Différence
La différence entre deux relations R1 et R2 de même schéma est une relation R3 de schéma identique ayant
pour n-uplets les n-uplets de R1 n'appartenant pas à R2. On notera : R3 = R1 − R2.
Exemple :
Requête : Donner les identifiants des clients n'ayant acheté que des produits de marque Apple
Réponse en AR : R1 = VENTE ⋈ PRODUIT (VENTE.IdPro = PRODUIT.IdPro)
R2 = σR1 (marque = 'Apple')
R3 = πR2 (IdCli)
R4 = σR1 (marque ≠ 'Apple')
R5 = πR4 (IdCli)
RESUL = R3 − R5
Bases de données
10
Révision Informatique, Concours MP-PC-T 2020
IV.1 Introduction
SQL est un langage standard pour accéder aux bases de données. Il est composé de plusieurs sous-langages,
dont :
○ Le Langage de Définition des données (LDD) pour la création et la suppression d’objets dans la base de
données. Il comporte les commandes SQL : CREATE, DROP, ALTER.
○ Le Langage de Manipulation des données (LMD) pour la recherche, l'insertion, la mise à jour et la
suppression de données. Il comporte les commandes SQL : SELECT, INSERT, UPDATE, DELETE.
La commande CREATE TABLE crée la définition d'une table selon la syntaxe suivante :
CREATE TABLE table (
-- définition des colonnes
colonne type [ NOT NULL [UNIQUE] ]
[ DEFAULT valeur ]
[ PRIMARY KEY ]
[ REFERENCES table ]
[ CHECK condition ] ,
... ,
-- contraintes de table
[ PRIMARY KEY (liste de colonnes) ],
[ UNIQUE (liste de colonnes) ] ,
[ FOREIGN KEY (liste de colonnes) REFERENCES table )
Bases de données
11
Révision Informatique, Concours MP-PC-T 2020
Exemple
Pour l’exemple associé au magasin (section II.4) :
● CREATE TABLE client (
IdCli CHAR(4) PRIMARY KEY ,
nom CHAR(20) ,
ville CHAR(30) ,
CHECK (ville IN ('Nice', 'Paris', 'Rome', 'Tunis') ) )
● CREATE TABLE produit (
IdPro CHAR(6) PRIMARY KEY ,
nom CHAR(30) NOT NULL UNIQUE ,
marque CHAR(30) ,
prix DEC(6,2) ,
qstock SMALLINT CHECK (qstock BETWEEN 0 AND 100)
)
● CREATE TABLE vente (
IdCli CHAR(4) NOT NULL REFERENCES client ,
IdPro CHAR(6) NOT NULL ,
date DATE NOT NULL ,
qte SMALLINT CHECK (qte BETWEEN 1 AND 10) ,
-- contrainte de table
PRIMARY KEY (IdCli, IdPro, date) ,
FOREIGN KEY (IdPro) REFERENCES produit
)
IV.2.2 Suppression / Modification de Table
Suppression d’une table : Toute table peut être supprimée à l’aide de DROP. Par exemple :
DROP TABLE Vente
Ajout d’une colonne : Pour ajouter une colonne à une table, on utilise ALTER. Par exemple :
ALTER TABLE client ADD COLUMN tel CHAR(16)
A l’exécution de cette commande, la table possède une nouvelle colonne qui ne contient que des
valeurs NULL pour toutes les lignes.
On ne peut ajouter une colonne obligatoire (NOT NULL) que si la table est vide ou si cette colonne
possède une valeur par défaut (DEFAULT).
Bases de données
12
Révision Informatique, Concours MP-PC-T 2020
La commande INSERT permet d'ajouter de nouvelles lignes à une table selon la syntaxe suivante :
INSERT
INTO table [ (liste de colonnes) ]
{VALUES (liste de valeurs) | requête}
Remarques :
● Dans le cas où la liste de colonnes n'est pas spécifiée tous les attributs de la table cible doivent être
fournis dans l'ordre de déclaration.
● Si seulement certaines colonnes sont spécifiées, les autres sont insérées avec la valeur NULL.
● Une insertion à partir d'une requête permet d'insérer plusieurs lignes dans la table cible à partir
d'une autre table.
Exemples
- Insertion d'une seule ligne
Pour ajouter le client ('TN100', 'Ali', Tunis') dans la table client :
INSERT
INTO client (IdCli, nom, ville)
VALUES ('TN100', 'Ali', 'Tunis')
- Insertion de plusieurs lignes
Pour ajouter dans une table « temp » de même schéma que la table Vente avec toutes les ventes qui sont
antérieures au 01-Jan-2019 :
INSERT
INTO temp (IdCli, IdPro, date, qte)
SELECT V.no_cli, V.IdPro, V.date, V.qte
FROM vente V
WHERE V.date < '01-jan-2019'
Bases de données
13
Révision Informatique, Concours MP-PC-T 2020
La commande UPDATE permet de changer des valeurs d'attributs des lignes existantes, selon la syntaxe
suivante :
UPDATE table
SET liste d'affectations
[ WHERE qualification ]
Remarque : L'absence de clause WHERE signifie que les changements doivent être appliqués à toutes les
lignes de la table cible.
Exemple
La commande SELECT (projection en AR) permet de rechercher des données à partir de plusieurs tables ; le
résultat est présenté sous forme d'une table réponse.
Exemples
Bases de données
14
Révision Informatique, Concours MP-PC-T 2020
On peut introduire dans la clause FROM un synonyme (alias) à un nom de table, en le plaçant
immédiatement après le nom de la table.
Les noms de table ou les synonymes peuvent être utilisés pour préfixer les noms de colonnes dans le
SELECT.
SELECT P.nom, P.marque, P.prix
FROM produit P
● Q2 : Donner les différentes marques de produit :
SELECT P.marque
FROM produit P
Pour éliminer les doublons, il faut spécifier DISTINCT.
Bases de données
15
Révision Informatique, Concours MP-PC-T 2020
● Q7 : Lister les produits dont le prix est compris entre 50 dinars et 120 dinars
SELECT *
FROM produit P
WHERE P.prix BETWEEN 50 AND 120
Le prédicat BETWEEN teste l'appartenance à un intervalle.
Bases de données
16
Révision Informatique, Concours MP-PC-T 2020
Q14 : Donner les noms des clients qui ont acheté le produit de nom 'PS1'.
SELECT C.nom
FROM client C , produit P, vente V
WHERE V.IdCli = C.IdCli
AND V.IdPro = P.IdPro
AND P.nom = 'PS1‘
ou bien :
SELECT C.nom
FROM VENTE V join produit P
ON V.IdPro = P.IdPro
join Client C
ON V.IdCli = C.IdCli
WHERE P.nom = 'PS1‘
Q15 : Donner les noms des clients de la même ville que Ali.
SELECT C2.nom
FROM client C1 JOIN client C2
ON C1.ville = C2.ville
WHERE C1.nom = ‘Ali'
AND C2.nom <> ‘Ali‘
Cet exemple utilise, pour le couplage des villes, la jointure de la table Client avec elle-même (auto-
jointure).
Pour pouvoir distinguer les références ville dans les 2 copies, il faut introduire 2 alias différents C1 et C2
de la table client.
Bases de données
17
Révision Informatique, Concours MP-PC-T 2020
– dans des prédicats de comparaison (=, <>, <, <=, >, >=)
– dans des prédicats IN
– dans des prédicats EXISTS
Une sous-requête dans un prédicat de comparaison doit se réduire à une seule valeur ("singleton select").
Une sous-requête dans un prédicat IN doit représenter une table à colonne unique.
Q16 : Donner les noms des clients qui ont acheté le produit d'identifiant 'SHP1'
❏ Avec sous-requête
SELECT C.nom
FROM client C
WHERE IdCli IN
(
SELECT V.IdCli
FROM vente V
WHERE V.IdPro = 'SHP1'
)
❏ Avec jointure
SELECT C.nom
FROM client C , vente V
WHERE C.IdCli = V.IdCli
AND V.IdPro = 'SHP1'
Q17 : Donner les noms des produits qui n'ont pas été acheté
SELECT P.nom
FROM produit P
WHERE NOT EXISTS
( SELECT *
FROM vente V
WHERE V.IdPro = P.IdPro )
Le prédicat EXISTS permet de tester si le résultat d'une sous-requête est vide ou non.
Bases de données
18
Révision Informatique, Concours MP-PC-T 2020
Les opérations ensemblistes d’union, intersection ou différence peuvent être exprimées en SQL, en
connectant SELECT avec UNION, INTERSECT ou EXCEPT.
Q18 : Donner les numéros des produits de marque IBM ou ceux achetés par le client d'identifiant
'100'.
SELECT P.IdPro
FROM produit P
WHERE P.marque = 'IBM'
UNION
SELECT V.IdPro
FROM vente V
WHERE V.IdCli = ‘100'
SQL fournit des fonctions de calcul opérant sur l'ensemble des valeurs d'une colonne de table :
– COUNT : nombre de valeurs
– SUM : somme des valeurs
– AVG : moyenne des valeurs
– MAX : plus grande valeur
– MIN : plus petite valeur
Q19 : Donner le nombre total de clients.
SELECT COUNT ( IdCli )
FROM client
Bases de données
19
Révision Informatique, Concours MP-PC-T 2020
On peut faire précéder l'argument du mot clé DISTINCT pour indiquer que les valeurs redondantes
doivent être éliminées avant application de la fonction.
La fonction spéciale COUNT (*) compte toutes les lignes dans une table.
Q22 : Donner les noms des produits moins chers que la moyenne des prix de tous les produits
SELECT P1.nom
FROM produit P1
WHERE P1.prix <
(
SELECT AVG ( P2.prix )
FROM produit P2
)
Cet exemple montre un "singleton select " pour calculer la moyenne des prix.
Bases de données
20
Révision Informatique, Concours MP-PC-T 2020
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre maximum de résultats que
l’on souhaite obtenir.
Q25 : Donner le nom et la marque des deux plus chers produits.
SELECT P.nom, P.marque
FROM produit P
Order by P.prix DESC
Limit 2
WHERE qualification
V SQLITE
SQLite est un système de gestion de base de données (SGBD) qui sauvegarde la base sous forme d'un fichier multi-
plateforme. C’est une bibliothèque qui fournit une base de données légère sur disque ne nécessitant pas de processus
serveur distinct et permet d’accéder à la base de données à l’aide d’une variante du langage de requête SQL Il
permet ainsi une gestion simple et rapide des bases de données.
Les bases créées avec cette librairie sont enregistrées sous forme de fichier .db, .sq3.
Un fichier .db/.sq3 s'ouvre en créant un objet de type Connection :
conn = sqlite3.connect('magasin.sq3')
Un curseur est ensuite créé à partir de l'objet Connection. Ce curseur représente un canal entre la base de données
et le script Python :
cur = conn.cursor()
Bases de données
21
Révision Informatique, Concours MP-PC-T 2020
Pour exécuter des commandes dans la base, on crée des requêtes SQL sous forme de chaînes de caractères.
Ensuite, on l’exécute à partir de la fonction execute() :
requete = 'SELECT * FROM vente'
cur.execute(requete)
Lorsque le travail prévu est terminé, il est nécessaire d’enregistrer les modifications faites sur la base :
conn.commit()
▪ En passant un dictionnaire :
data = {"name" : "ramzi", "city" : "Tunis"}
cur.execute("""INSERT INTO client(nom,ville) VALUES(:name, :city)""", data)
Bases de données
22
Révision Informatique, Concours MP-PC-T 2020
On peut récupérer toutes les lignes de la même recherche en utilisant la fonction fetchall() :
lignes = cur.fetchall() # Le résultat est une liste de tuples
Bases de données
23
Révision Informatique, Concours MP-PC-T 2020
VI E XERCICES D ’A PPLICATION
VI.1 Exercice 1
Soit les relations suivantes de la société Gavasoft :
Exemple
12. Ecrire le/les instructions permettant d’ajouter ce nouvel employé dans la base de données.
Bases de données
24
Révision Informatique, Concours MP-PC-T 2020
13. Ecrire une fonction Employes(ville) qui prend en paramètre le lieu ville d’un département et qui retourne
la liste des employés de la ville donnée.
14. Ecrire une fonction getVilles ( ) qui retourne la liste des villes de tous les départements.
15. Ecrire les instructions nécessaires permettant de sauvegarder les renseignements des employés de
chaque ville dans des fichiers. Chaque fichier sera nommé par le nom de la ville. Par exemple
‘Creteil.txt’ comporte dans chaque ligne les données d’un employé séparées par un point-virgule.
VI.2 Exercice 2
On considère le schéma relationnel suivant qui modélise une application sur la gestion de livres et de disques
dans une médiathèque.
Bases de données
25
Révision Informatique, Concours MP-PC-T 2020
Partie SQL:
4. Créer la table Dept (NumD s’incrémente automatiquement)
CREATE TABLE `Dept` (
`NumD` INTEGER PRIMARY KEY AUTOINCREMENT,
`NomD` TEXT,
`Lieu` TEXT
);
5. Ajouter le département ‘RH’ situé à Paris
Insert into Dept(nomD , Lieu ) values(‘RH , ‘Paris’)
6. Attacher tous les doyens à ce nouveau département ‘RH’
Update Emp set numD = 3 where fonction = ‘Doyen’
7. Donner la liste des employés ayant une commission (non NULL) classé par commission décroissante
Select nomE
From Emp
Where Comm is not NULL
Order by comm desc
8. Donner la moyenne des salaires des employés travaillant à laval
Select avg(salaire)
From emp
Bases de données
26
Révision Informatique, Concours MP-PC-T 2020
Ou bien :
Select avg(salaire)
From emp
Join dept
ON emp.numD = dept.numD
Where lieu = ‘laval’
9. Donner la liste des employés gagnant plus que la moyenne des salaires de l’entreprise
Select *
From emp
Where salaire > (select avg(salaire)
From emp
)
10.Donnez le nombre d’employés par département
Select count(*)
From Emp
Group by numD
11.Donnez le lieu de département dont le nombre d’employés dépasse 100
Select lieu
From Dept
Join Emp
On Dept.NumD = Emp.NumD
Group by Dept.NumD
Having count(*) > 100
Partie SQLITE :
Soit le script python suivant :
import sqlite3
conn = sqlite3.connect(‘Gavasoft.db’)
cur = conn.cursor()
nouveau={‘nom’ :’Martin’, ‘fonction’ : stagiaire’, ‘embauche’ : 2010}
Bases de données
27
Révision Informatique, Concours MP-PC-T 2020
12.Ecrire le/les instructions permettant d’ajouter ce nouveau employé dans la base de donnée
cur.execute ( ‘insert into emp values( :nom, :fonction, :embauche) ,nouveau )
13.Ecrire une fonction Employes(ville) qui prend en paramètre le lieu ville d’un département et qui retourne
la liste des employés de la ville donnée.
def getEmployes(ville) :
req = ‘select * from emp where numD = (select numD from dept where lieu
={}’.format(ville)
cur.execute(req)
employes = cur.fetchall()
return employes
14.Ecrire une fonction getVilles ( ) qui retourne la liste des villes de tous les départements.
def getVilles ( ) :
req = ‘select distinct lieu from dept’
cur.execute(req)
return cur.fetchall()
15.Ecrire les instructions nécessaires permettant de sauvegarder les renseignements des employés de chaque
ville dans des fichiers. Chaque fichier sera nommé par le nom de la ville par exemple ‘Creiteil.txt’et comporte
dans chaque ligne les données d’un employé séparées par un point-virgule
villes = getVilles ( )
for ville in villes :
f = open(ville+’txt’ , ‘w’)
Lemp = getEmployes(ville)
for emp in Lemp :
emp = [str(x) for x in emp ]
ligne =’ ;’.join( emp) +’\n’
f.write(ligne)
f.close()
Bases de données
28
Révision Informatique, Concours MP-PC-T 2020
4)SELECT Nom, Prenom FROM Disque D, Auteur A WHERE D.CodeA=A.CodeA INTERSECT SELECT
Nom, Prenom FROM Livre L, Auteur A WHERE D.CodeA=L.CodeA
7) SELECT Nom, Téléphone, COUNT(*) FROM Abonne A, Prêt P WHERE A.NumAbo=P.NimAbo GROUP
BY Nom, Téléphone
14) SELECT COUNT(*) FROM E_Disque WHERE DateAchat BETWEEN ’01-Jan-2006’ AND ’10-Dec-
2007’
16) SELECT Nom, Prénom, Rue, Ville, CodeP FROM Abonne A, Prêt P, Disque D WHERE
A.NumAbo=P.NumAbo AND P.CodeOuv=D.CodeOuv AND DatePret=’12-Jan-2006’
17) SELECT Titre FROM Abonne A, Prêt P, Disque D WHERE A.NumAbo=P.NumAbo AND
P.CodeOuv=D.CodeOuv AND NOM="Gava" AND Prénom="Frédéric" UNION SELECT Titre FROM
Abonne A, Prêt P, Livre L WHERE A.NumAbo=P.NumAbo AND P.CodeOuv=L.CodeOuv AND
NOM="Gava" AND Prénom="Frédéric"
18) SELECT CodeOuv FROM Prêt P, Abonne A WHERE P.NumAbo=A.NumAbo AND Prénom="Frédéric"
AND Nom="Gava" AND CodeOuv IN (SELECT CodeOuv FROM Livre WHERE Genre="Policier")
OR CodeOuv IN (SELECT CodeOuv FROM Disque WHERE Style="Jazz")
19) SELECT Identité FROM Auteur A, Livre L WHERE A.CodeOuv=L.CodeOuv AND Genre="Policier"
AND NOT ALL(SELECT Identité FROM Auteur A, Livre L WHERE A.CodeOuv=L.CodeOuv AND
Genre<>"Policier")
Bases de données
29
Révision Informatique, Concours MP-PC-T 2020
Ouvrages :
Toute l’informatique en CPGE scientifique, Etienne Cochard, Sophie Rainero, Marielle Roussange, Emanuelle
Sebert-Cuvillier
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack& al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de W.Meftah, Les bases de données relationnelles, pour 2ème année préparatoire MP-PC-T et
BG, IPEIS, Année universitaire 2019-2020.
Sites Web :
https://docs.python.org/3/library/sqlite3.html
https://python.doctor/page-cours-python-debutant-documentation
https://www.cours-gratuit.com/langage-sql/
Bases de données
Simulation Numérique et
Applications
Aide-Mémoire pour la préparation de l’épreuve
d’Informatique du Concours National d’Entrée aux
Ecoles d’Ingénieurs BG 2020
Elaboré par :
-- Avril 2020 --
[Tapez ici]
Préambule
Ce document est destiné aux étudiants de deuxième année BG des Instituts Préparatoires
aux Etudes d’Ingénieurs.
Le but de ces supports est d’accompagner les étudiants de tout le territoire Tunisien dans
leur révision en leur fournissant à tous les mêmes documents, afin d’assurer une équité
entre eux, qu’ils bénéficient ou non d’un enseignement ou tutorat à distance.
Toutefois, ces documents sont considérés comme des aide-mémoires et ne remplacent pas
les cours assurés en présentiel.
Pour les différentes bibliothèques, quelques fonctions seulement parmi les plus utilisées
sont décrites. Aussi, toutes les applications présentées sont données juste à titre d’exemple
et ne constituent en aucun cas un ensemble complet.
I Introduction
Python offre une panoplie de bibliothèques intéressantes pour, entre autres, la simulation numérique et le calcul
scientifique. Dans ce but, nous exposerons dans ce qui suit les principales fonctionnalités de Numpy, Matplotlib
et Scipy. Nous présenterons ensuite des applications liées au traitement d’image et à la bio-informatique, en plus
de plusieurs exercices d’application avec leurs corrigés.
>>>import numpy as np
>>>a=np.array([1,4,5,8])
>>>b=np.array([[1,2],[3,4],[5,6]],dtype=float)
>>>c=np.array([[[1,2],[1,2]],[[1,2],[1,2]]])
>>>print(a)
[1 4 5 8]
>>>print(b)
[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]]
>>>print(c)
[[[1 2]
[1 2]]
[[1 2]
[1 2]]]
>>>c[1,1,1]
2
Nous limiterons notre propos aux tableaux uni et bi-dimensionnel appelés aussi vecteurs et matrices.
II.1.1 Vecteurs
En Python la fonction numpy.array permet de créer un vecteur qui est un tableau à une dimension. Pour
créer un vecteur il suffit de passer l'itérable contenant les éléments comme argument.
Les fonctions size retourne le nombre d’éléments d’un vecteur et la fonction ndim retourne la dimension
qui est 1 dans le cas d’un vecteur (2 pour une matrice).
Les fonctions empty, zeros, ones, arange, linspace permettent aussi la création de vecteurs
particuliers.
Empty Construit un vecteur non initialisé (le contenu est totalement np.empty(taille)
imprédictible ou aléatoire).
Exemple
>>>v1=np.linspace(-1,1,10)
>>>print(v1)
[-1. -0.77777778 -0.55555556 -0.33333333 -0.11111111 0.11111111
0.33333333 0.55555556 0.77777778 1. ]
>>>v2=np.arange(10)
>>>print(v2)
[0 1 2 3 4 5 6 7 8 9]
>>>type(v2)
<type 'numpy.ndarray'>
>>>v3=np.arange(2,10,2)
>>>print(v3)
[2 4 6 8]
>>>v4=np.zeros(8);v5=np.ones(6,dtype=int)
>>>print(v4);print(v5)
[ 0. 0. 0. 0. 0. 0. 0. 0.]
[1 1 1 1 1 1]
1
Les opérations sur les vecteurs sont possibles avec les opérateurs classiques de Python, tels que décrit ci-
dessous.
>>>u=np.array([1,2,3,4]);v=np.array([5,6,7,8])
>>>u+v
>>>v-u
>>>u*2
>>>v**3
>>>u*v
>>>v/u
II.1.2 Matrices
Pour créer une matrice en Python, qui est un tableau à deux dimensions, il suffit de passer un itérable
d'itérables (liste de listes, liste de tuples, tuple de tuples, etc.) comme argument à la fonction array.
Les fonctions size, shape et ndim retournent respectivement le nombre d’élément, nombre de
lignes/colonnes et la dimension. Par exemple :
La fonction reshape permet de redimensionner un vecteur ou une matrice, comme décrit ci-après :
>>>m1=np.reshape(np.arange(10),(2,5))
#ou bien m1 = np.arange(10).reshape((2,5))
>>>print(m1)
[[0 1 2 3 4]
[5 6 7 8 9]]
>>>m.reshape(2,3)
array([[ 1.2, 2.5, 3.2],
[ 1.8, 1.1, 4.3]])
Les fonctions empty, zeros, ones, eye et diag permettent de créer des matrices particulières.
ones Construit une matrice dont les éléments sont tous 1 np.ones((l,c))
Exemple
>>>m2=np.zeros((2,4));m3=np.ones((3,3),dtype=int);
>>>m4=np.eye(4); m5=np.diag([1,2,3])
>>> print('m2=',m2);print('m3=',m3);print('m4=',m4);print('m5=',m5)
m2= [[0. 0. 0. 0.]
[0. 0. 0. 0.]]
m3= [[1 1 1]
[1 1 1]
[1 1 1]]
m4= [[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
m5= [[1 0 0]
[0 2 0]
[0 0 3]]
L’accès à un élément d’une matrice se fait à l’aide d’indexage 𝐴[𝑖, 𝑗] où 𝑖 désigne la ligne et 𝑗 la colonne. On
peut également récupérer une partie d’une matrice : ligne, colonne et sous-matrice. Par exemple :
>>>A=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=int)
>>>A[1,0];A[2,2]
4
9
>>>A[0,:];A[:,1]
array([1, 2, 3])
array([2, 5, 8])
>>>A[0:1,:];A[:,1:2]
array([[1, 2, 3]])
array([[2],
[5],
[8]])
Les opérations algébriques sur les matrices sont possibles avec les opérateurs classiques de Python.
>>>A+A
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
>>>A-A
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>>A*2
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
Pour le produit matriciel, il faut utiliser la fonction dot, comme l’exemple suivant :
La trace et la transposé s’obtiennent avec les fonctions trace et transpose. Par exemple :
Le déterminant, le rang, l’inverse, les valeurs propres et les vecteurs propres s’obtiennent respectivement par
les fonctions det, matrix_rank, inv, eigvals et eig du module numpy.linalg. Par exemple :
>>>np.linalg.det(A)
6.66133814775e-16
>>>np.linalg.matrix_rank(A)
2
>>>np.linalg.inv(A)
[[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]
[ 9.00719925e+15 -1.80143985e+16 9.00719925e+15]
[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]]
>>>np.linalg.eigvals(A)
[ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
>>>np.linalg.eig(A)
(array([ 1.61168440e+01, -1.11684397e+00, -1.30367773e-15]),
array([[-0.23197069, -0.78583024, 0.40824829],
[-0.52532209, -0.08675134, -0.81649658],
[-0.8186735 , 0.61232756, 0.40824829]]))
Pour finir, la fonction solve du module numpy.linalg permet de résoudre le système linéaire 𝐴 ⋅ 𝑥 = 𝑏
>>>print(np.linalg.solve(A,np.array([1,0,1])))
[ -9.00719925e+15 1.80143985e+16 -9.00719925e+15]
Cette fonction peut être utilisée de nombreuses manières différentes, pour obtenir des résultats assez fins.
L’idée générale est de lui donner en argument deux tableaux de nombres, décrivant respectivement les
abscisses et les ordonnées des points à tracer. Sans autre option, ces points sont reliés par des segments
bleus, en traits pleins.
Exemple 1
Les options graphiques permettent notamment de modifier le type de segment (pointillés, sans segment),
d’afficher ou non un marqueur au niveau de chaque point et de changer la couleur de ces objets.
Exemple 2
On peut enfin appeler plusieurs fois la fonction plot successivement. Les tracés sont alors superposés.
Exemple 3
Pour tracer une fonction, on trace en fait des cordes de cette fonction, à partir d’une subdivision de
l’intervalle considéré. La fonction linespace() de la bibliothèque numpy permet de créer automatiquement
de telles subdivisions, avec un nombre de points à régler manuellement.
Exemple
Pour tracer le graphe de la fonction 𝑥 ↦ 𝑥 sur [0,1] avec une subdivision en 100 segments, donc en utilisant
101 points, on peut utiliser le code suivant :
II.3.1 Présentation
Scipy est une bibliothèque numérique d’algorithmes et de fonctions mathématiques, basée sur les tableaux,
complétant ou améliorant (en termes de performance) les fonctionnalités de la bibliothèque numpy.
La librairie Scipy contient de nombreuses boîtes à outils consacrées aux méthodes de calcul scientifique :
- Fonctions spéciales : scipy.special (fonctions de Bessel, erf, gamma, etc.)
- Intégration numérique : scipy.integrate (intégration numérique ou d’équations différentielles)
- Méthodes d’optimisation : scipy.optimize (minimisation, moindres-carrées, zéros d’une fonction)
- Interpolation : scipy.interpolate
- Transformées de Fourier : scipy.fftpack
- Traitement de signal : scipy.signal (convolution, corrélation, filtrage, ondelettes, etc.)
- Algèbre linéaire : scipy.linalg
- Statistiques : scipy.stats (fonctions et distribution statistiques)
- Traitement d’images multidimensionnelles : scipy.ndimage
- Entrées/Sorties : scipy.io
Ce module propose des fonctions qui permettent de déterminer des valeurs approchées des zéros d’une
fonction :
- fsolve : déterminer la racine d’une équation scalaire ou vectorielle.
- bisect : permet d’implémenter la méthode de recherche par dichotomie.
- newton : permet d’implémenter la méthode de recherche newton.
Exemple
L’extension scipy.integrate propose des fonctions pour calculer des intégrales simples, doubles ou
même triples et aussi de résoudre des équations différentielles de premier ou second ordre.
Exemple
import math
import scipy.integrate as spi
h = lambda x:math.cos(x)
y=spi.quad(h,0.0,math.pi/2.0)
>>>y
(0.9999999999999999, 1.1102230246251564e-14)
La fonction odeint résout numériquement des équations différentielles avec des conditions initiales de la
forme : = 𝑓(𝑦(𝑡), 𝑡)
La représentation graphique des solutions de cette résolution peut être donnée par :
Remarque : Sur une image en niveaux de gris, chaque pixel est ou bien noir (0) ou bien blanc (255) ou bien
possède un niveau de gris entre les deux. Cela signifie que les trois composantes R, G, B ont la même valeur.
Dans la suite de cette partie, les traitements ne s’appliquent qu’à des images en niveaux de gris, il est possible
d’opérer sur des images couleurs en appliquant les traitements proposés sur chacune des trois couleurs du
triplet.
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>check=np.zeros((8,8,3),dtype='uint8') #exemple pour image couleur
>>>check[:,1:,::2]=255
>>>plt.imshow(check)
>>>plt.show()
Contraste :
Le contraste peut être modifié par l’application de fonctions mathématiques. Par exemple, en remplaçant la
valeur de chaque pixel par sa racine carrée, l’image assombrie alors qu’elle s’éclaircit si la valeur du pixel
est remplacée par son carré. Ces fonctions ont pour effet de diminuer le contraste.
Une autre idée consiste à faire un réajustement linéaire des valeurs des pixels selon :
𝑓: [0,256[ → [0,256[
𝑦 = 𝑥 + 0,4. (𝑥 − 127) 𝑠𝑖 𝑦 ∈ [0,255]
𝑥 ↦ 0 𝑠𝑖 𝑦 < 0
255 𝑠𝑖 𝑦 > 255
Il s’agit d’augmenter l’écart entre la valeur du pixel et la valeur moyenne (127) pour une image dont les
valeurs sont comprises entre 0 et 255. Cette fonction permet d’augmenter le contraste, les "noirs" sont plus
noirs et les "blancs" plus blancs.
2. Ecrire le script de la fonction Python permettant de modifier le contraste d’une image donnée.
5. Ecrire le script de la fonction Python permettant de filtrer une image donnée en utilisant la méthode de
moyennage.
En effectuant cette opération pour chaque pixel, on supprime une partie du bruit, car ce bruit est constitué de
fluctuations aléatoires, qui sont diminuées par un calcul de moyennes.
Le moyennage des pixels est très efficace pour enlever le bruit dans les images, malheureusement il détruit
également une grande partie de l’information de l’image. On peut en effet s’apercevoir que les images
obtenues par moyennage sont floues. Ceci est en particulier visible près des contours, qui ne sont pas nets.
Afin de réduire ce flou, il faut remplacer le moyennage par une opération un peu plus complexe, que l’on
nomme médiane. Etant donné la valeur a d’un pixel, et les valeurs b, c, d, e, f, g, h, i, on commence par les
classer par ordre croissant.
La médiane des neuf valeurs a, b, c, d, e, f, g, h, i est la 5ème valeur de ce classement (c’est-à-dire la valeur
centrale de ce classement).
6. Ecrire le script de la fonction Python permettant de filtrer une image donnée en utilisant la méthode de
médiane.
Détection de contours :
Pour localiser des objets dans les images, il est nécessaire de détecter les bords de ces objets. Ces bords
correspondent à des zones de l’image où les valeurs des pixels changent rapidement.
Afin de savoir si un pixel avec une valeur a est le long d’un bord d’un objet, on prend en compte les valeurs
b, c, d, e de ses quatre voisins (deux horizontalement et deux verticalement), qui sont disposés par rapport à
a. Notons que l’on utilise ici seulement les 4 voisins qui ont un coté commun avec le pixel considéré, ce qui
est différent du calcul de moyennes et de médianes où l’on utilisait 8 voisins. Ceci est important afin de
détecter aussi précisément que possible les bords des objets.
IV Application à la Bio-Informatique
L'ADN, pour Acide DésoxyriboNucléique, est une macromolécule constituée de deux brins qui forme une
double hélice maintenue par des liaisons hydrogène. Ces brins sont formés par un enchainement de maillons
appelés, nucléotides qui contiennent les bases de l'ADN :
A pour Adénine
T pour Thymine
G pour Guanine
C pour Cytosine
Les bases de l'ADN fonctionnent par paire, une sur chaque brin : adénine avec thymine et guanine avec
cytosine.
La transcription est un mécanisme qui permet de "recopier" l'ADN dans le noyau de la cellule pour former un
ARN (acide ribonucléique) qui sera utilisé dans la cellule notamment lors de la traduction. L'ARN présente la
même structure que l'ADN mais lors de la transcription, la thymine (T) est remplacée par l'uracile (U).
La traduction de l'ADN consiste à lire l'ARN issue de la transcription pour synthétiser une protéine avec l'aide
de la machinerie cellulaire. L'ARN est découpé en codons qui sont constitués de 3 bases et correspondent à un
acide aminé, c'est le code génétique. Les codons sont lus les uns à la suite des autres et les protéines sont
assemblées comme une chaîne (peptidique) d’acides aminés.
Le tableau ci-dessous vous donne la correspondance entre un codon, composé de trois bases de l'ARN et un
acide aminé.
1. Écrire une fonction prend en paramètre un brin ADN et réalise la transcription de l'ADN en ARN
2. Écrire une fonction qui traduit l'ARN et renvoie la chaîne d'acides aminés correspondante en se basant sur
le code génétique. Attention, elle doit s'arrêter au codon STOP.
3. Ecrire un script python qui permet de calculer le nombre d'acides aminés
1. Binarisation
import numpy as np
def Binariser(M,s):
n,p=np.shape(M)
M1=np.zeros((n,p))
for i in range(n):
for j in range(p):
if M[i,j]>s:
M1[i,j]=255
return M1
A=plt.imread("source.png")
B=Binariser(A,127)
plt.imshow(B)
plt.show()
plt.imsave("cible.png")
2. Contraste
f=lambda x:x-0.4*(x-127)
def Contraste(M):
n,p=np.shape(M)
M1=np.empty((n,p))
for i in range(n):
for j in range(p):
y=f(M[i,j])
if y>255:
M1[i,j]=255
elif y<0:
M1[i,j]=0
else:
M1[i,j]=y
return M1
def Negatif(M):
n,p=np.shape(M)
M1=np.empty((n,p))
for i in range(n):
for j in range(p):
M1[i,j]=255-M[i,j]
return M1
def Transformer(M):
R,V,B=M[:,:,0], M[:,:,1], M[:,:,2]
M1=0.21*R + 0,71*V + 0.07*B
return M1
def Filtrer_moy(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
return M1
def Filtrer_mediane(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
L.sort()
M1[i,j]=L[4]
return M1
7. Détection de contours
def Detecter_contours(M):
n,p=np.shape(M)
M1=M[:,:]
for i in range(1,n-1):
for j in range(1,p-1):
I=M[i-1:i+2,j-1,j+2]
l=int(np.sqrt((I[1,0]-I[0,1])**2+(I[1,2]-I[2,1])**2))
if l==0:
M1[i,j]=0
elif l>200:
M1[i,j]=255
return M1
import numpy as np
BASES_ADN=['A','T','C','G']
BASES_ARN=['A','U','C','G']
STOP=['TAA','TAG','TGA']
def gen_brins(nbases):
if nbases%3!=0 or nbases<9:
return('brin invalide')
else:
brin='AUG'
for i in range(nbases-6):
brin=brin+BASES_ADN[np.random.randint(0,4)]
brin=brin+STOP[np.random.randint(0,3)]
return(brin)
brin = gen_brins(18)
print(brin)
print(len(brin))
fragment = gen_brins(99)
print(fragment)
write_file(fragment, ‘adn.dat’)
read_adn(‘adn.dat’)
4. Identifier s'il s'agit d'un brin d'ADN ou d'ARN et si ce brin est valide
def is_valid(fragment, typ):
# type ADN ou ARN
if typ == "ADN":
bases = BASES_ADN
elif typ == "ARN":
bases = BASES_ARN
else:
print("typ doit être 'ARN' ou 'ADN', typ = %s" % typ)
valid=False
return valid
# valeur retournée
valid = True
# test multiple de 3
if len(fragment) % 3 != 0:
valid = False
print("Error number of bases")
return valid
# test des bases :
else:
for base in fragment:
if base not in bases:
valid = False
print("Error : ", base, " is not valid.")
break
return valid
# pour tester:
adn_ok = "TAATCCTAAAACCCT"
adn_bad = "TAATCCTAAAACCT" # erreur nbre de bases
arn_ok = "UAAUCCUAAAACCCU"
arn_bad = "UAAUYCUAAXACCCU" # erreur nom des bases
print("adn_ok : ", is_valid(adn_ok, "ADN"))
print("adn_bad : ", is_valid(adn_bad, "ADN"))
print("arn_ok : ", is_valid(arn_ok, "ARN"))
print("arn_bad : ", is_valid(arn_bad, "ARN"))
if not identify:
raise ValueError("ERREUR : codon %s non identifié" % uncodon)
return acideAmine
#pour tester:
print(codon_to_aa("CAA"))
print(codon_to_aa("AZF"))
Traduction de l’ARN
def traduction(fragment):
"""
Traduit le brin d'ARN en séquence peptidique.
Args:
fragment (str): fragment d'ARN à traduire
Returns:
sequence (str): séquence peptidique.
"""
#nombre de codons dans le fragment
ncodon = len(fragment) // 3
# traduction
sequence = ""
n = 0
while n < ncodon:
aa = codon_to_aa(fragment[3*n : 3*n+3])
if aa != "STOP":
sequence += aa + "-"
n += 1
else:
sequence += aa
break
return sequence
3. Nombres d’acides aminés
adn = gen_brins(21)
print(adn)
arn = transcription(adn)
print(arn)
sequence = traduction(arn)
print(sequence)
# exemple de résultat
AUGTCGCATTATTTCCTATAA
AUGUCGCAUUAUUUCCUAUAA
Met-Ser-His-Tyr-Phe-Leu-STOP
la sequence contient 7 acides aminés
Bibliographie et Netographie
Ouvrages :
Learning Python, Mark Lutz, Edition O’Reilly, Juin 2013, ISBN: 9781449355722.
Informatique pour tous en classes préparatoires aux grandes écoles, Benjamin Wack& al., Edition Eyrolles,
Août 2013, ISBN: 978-2-212-13700-2.
Supports de Cours
Support de Cours de M.Hammami, Simulation numérique, pour 2ème année préparatoire MP-PC-T, IPEIEM,
Année universitaire 2019-2020.
Support de Cours de S.Elloumi, Simulation numérique, pour 2ème année préparatoire BG, IPEIEM, Année
universitaire 2017-2018.
Sites Web :
https://www.python-course.eu/
https://www.ics.uci.edu/~brgallar/index.html
https://www.scipy.org/
https://numpy.org/
https://matplotlib.org/