Python Parcours Complet Integral
Python Parcours Complet Integral
Python Parcours Complet Integral
Parcours complet
Pr Mamadou BOUSSO
Maitre de conférence en Informatique
UIDT / UFR SES
M. Mansour DIOUF
Doctorant en Informatique ED2DS – UIDT
Introduction à l’algorithmique
PARTIE 1
Introduction à Instructions Séquentielles
l’algorithmique
en Python
Structures Conditionnelles
Structures Itératives
ALGORITHME PROGRAMME
Problème
Traduction
Algorithme
Exécution
Programme
Résultats
SOFT WARE
HARD WARE
2. Unité Arithmétique et logique : Exécute les opérations arithmétiques et logiques (+-*/ et ou …) d’un
• Le processeur peut y accéder à n’importe quel moment en lecture (consultation) ou en écriture (modification)
Périphérique de communication
Périphérique de mémorisation
• Boucles (Répétitions)
Variable et Constante
Instructions
Séquentielles Expression, Affectation et Calcul
Lecture
Ecriture
BOIS
3L
(7L)
0L 6L 0L 0L 0L 5L 3L
FER
(9L) 8L
0L 0L 6L 6L 6L 6L 8L
Exemple valide : A1
Exemple invalide : 1A
l Doit être constitué uniquement de lettres, de chiffres et du soulignement _
(par exemple en Python : int, float, else, def, for, if , while, return, …)
Le type d’une variable détermine l’ensemble des valeurs qu’elle peut prendre.
Exemple :
Constante PI = 3,14
Il suffit juste d’écrire l’identifiant de la variable puis de lui fournir une valeur ensuite
Python se chargera de calculer le type et de l’attribuer à la variable.
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 44
Les mots reserves et regle de nomination:
Regle de nomination
d'une variable:
- Snake Case pour les
noms de fonctions et de
variables:
number_of_college_grad
uates
- Pascal Case pour les
noms de
classes: NumberOfColle
geGraduates
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 45
Exemple :
type(identifiant_variable)
permet de retourner le
type d’une variable.
§ On peut également utiliser l’écriture scientifique avec un E ou un e suivi d’une puissance de 10.
Les opérations de modification sur les chaînes produisent donc de nouvelles chaînes.
l Une opérande est une entité (variable, constante ou expression) utilisée par
un opérateur ;
• + est l'opérateur
Une expression est évaluée de gauche à droite mais en tenant compte de priorités
Exercice 3 :
Ecrire un programme permettant d’échanger les valeurs de deux variables A et B
• Pour afficher une information on utilise la commande ECRIRE suivie entre parenthèses de la
chaîne de caractères entre guillemets et/ou des variables de type simple à afficher séparées par
des virgules, par exemple :
ECRIRE ("La valeur de la variable a est : ", a) ;
• Pour donner la possibilité à l'utilisateur de saisir une information, on utilise la commande LIRE
suivie entre parenthèses de la variable de type simple qui va recevoir la valeur saisie par
l'utilisateur, par exemple :
LIRE (b)
Variable A, B : entier
Début_Algo
LIRE (A);
B ← 2*A;
Fin_Algo
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 70
Pour chaque instruction séquentielle
(Déclaration des variables et constante, Affectation, Lecture et Ecriture…) nous pouvons proposer
sa représentation sous forme d’algorigramme :
Exemple : B ← B+1 Exemple : LIRE (A)
Représentation en algorigramme Représentation en algorigramme
LIRE (A)
B ← B+1
ECRIRE (B)
Début
Fin
ECRIRE ("Le double de ", A, " est : ", B);
§ Elle peut prendre en argument une chaîne de caractères qui est affichée afin de
donner des indications à l’utilisateur.
§ Elle stoppe l’exécution du programme jusqu’a ce que l’utilisateur ait saisi une
valeur validée par l’appui sur la touche Entrée.
§ Elle retourne une donnée de type str contenant la saisie, ce qui fait que la saisie
nécessite parfois un transtypage (conversion de type)
§ Elle prend un nombre variable d’arguments, séparés par des virgules, qu’elle
affiche sous forme de texte lisible, en les séparant par des espaces et en
terminant par un retour à la ligne ;
§ Les arguments de la fonction peuvent être des valeurs littérales, des variables,
ou toute expression permettant de calculer un résultat.
Variable A, B : entier
Début ALGO
ECRIRE ("Entrer la valeur de A ");
LIRE (A);
B ← 2*A;
ECRIRE ("Le double de ", A, " est : ", B);
Fin
§ Chaînes de caractères dont la déclaration est préfixée par un f (f"..."), et qui peuvent
§ Les champs contiennent des variables ou des expressions dont la valeur est évaluée
Expression booléenne
Structures
Conditionnelles Evaluation d’une expression booléenne
• En psychologie, la décision est l'action volontaire et réfléchie de l'esprit qui se détermine à l'occasion d'un
choix d'une des issues au terme d'un processus de délibération ;
• En droit ou dans les domaines administratifs, la décision est une disposition arrêtée par une autorité
compétente collégiale ou unique, après délibération, ou une instruction de service émanant d'une autorité
hiérarchique (par exemple : couvre feu) ;
• En économie, les micro ou macro décisions correspondent aux décisions prises par des agents
économiques simples ou complexes ;
• En stratégie, la décision est d'abord un courage opposé constamment aux détracteurs, appliqué à une
situation d'incertitude, se révélant perspicace dans la capacité à anticiper et réactualisé constamment pour
s'adapter aux aléas de l’adversité.
• De même, dans les langage de programmation, il est possible de décider de n'exécuter une
Nous avons :
- Les structures conditionnelles simple et / ou composées (Si)
- Les structures conditionnelles alternatives (Si…Sinon)
- Les structures conditionnelles imbriquées (Si…Sinon…Si…Sinon)
- Les structures à choix multiple (Selon...Que)
Lorsque l’expression booléenne est vraie, le bloc d’instruction est exécuté intégralement
Au cas échéant l’algorithme saute les instructions, puis exécute ce qui suit.
E1 E2 E1 ET E2 E1 E2 E1 OU E2
VRAI VRAI VRAI VRAI VRAI VRAI
VRAI FAUX FAUX VRAI FAUX VRAI
FAUX VRAI FAUX FAUX VRAI VRAI
FAUX FAUX FAUX FAUX FAUX FAUX
E1 NON E1
VRAI FAUX
FAUX VRAI
Instructions2
Fin
Fin
• Même principe d’exécution que le modèle précédent
• A la seule différence l’exécution du SINON inverse le contenu de
l’expression booléenne.
SINON
SI (expression booléenne) ALORS
FAUX
Début
Instructions 2
Instructions2
Fin
Fin
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 92
Exemple :
Ecrire un algorithme qui permet de vérifier l’état de l’eau selon une température.
VARIABLE TEMP : ENTIER
DÉBUT_ALGO
ECRIRE("ENTRER LA VALEUR DE TEMPÉRATURE ")
LIRE(TEMP)
SI (TEMP<0 OU TEMP==0) ALORS
DÉBUT_SI
ECRIRE("GLACE")
SINON
DEBUT_SINON
SI (TEMP<100) ALORS
DÉBUT_SI
ECRIRE("LIQUIDE")
FIN_SI
SI (TEMP>=100) ALORS
DÉBUT_SI
ECRIRE("VAPEUR")
FIN_SI
FIN_SINON
FIN_SI
FIN_ALGO
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 93
SYNTAXE
SELONQUE permet d'effectuer tel ou tel traitement en fonction de la valeur des conditions 1 ou 2 ou...n
SELONQUE
<condition 1> : <action 1>
<condition 2> : <action 2>
...
<condition n> : <action n>
SINON : <action_sinon>
FINSELONQUE
• Si la condition 1 est vraie, alors on exécute l'action correspondante et on quitte la structure selon-que
( au cas où l'action sinon n'existe pas alors aucune action n'est exécutée !)
Itératives
Boucle à compteur ou définie
Par exemple :
De même que les langages de programmation, il est possible d'exécuter autant de fois une action
Début {tant_que}
Instructions
Fin {tant_que} FAUSSE
Principe :
• 1 - Le programme va tester avant chaque tour de boucle si la condition est vraie
• 2 - Dans l’affirmative il exécute les instructions jusqu’au fin tant que,
• 3 - Puis il revient au test de la condition.
• 4 - Lorsque la condition devient fausse, la boucle tant que se termine et le programme continue normalement
son exécution après l’instruction qui suit le fin{tant que}
1. Il faut vérifier qu’à un moment on peut entrer dans la boucle pour y exécuter les instructions,
VRAI
Condition
FAUSSE
i ← i + 1
VRAIE
i n’a pas
atteint finale
Instructions
FAUSSE
• 1 - Pour une variable de boucle dont le contenu varie de val_Initiale à val_Fin par pas de val_pas
• 2 - L’instruction de contrôle Pour permet d’exécuter les instructions un nombre déterminé de fois.
• 3 - La boucle ne s’arrête que lorsque le nombre de répétition des instructions demandé a été réalisé.
§ Tout ce qu'on peut écrire avec POUR peut être remplacé avec TANT QUE
Variable N, m, i: entier;
Debut_Algo
LIRE(N) ALGO
i ← 0
Pour i ← 1 à 12
Debut_Pour
m = N*i
Ecrire(N,"x",i,"=",m)
Fin_Pour
Fin_Algo
for i in range(1,11,2):
print(f"{i}")
Fonction et Procédure
Décomposition fonctionnelle
Module
La modularité reprend l'idée de fabriquer un produit (le programme) à partir de composants reliés.
Ainsi elle décompose un programme complexe en modules (groupes de fonctions) de méthodes et de
traitements, pour pouvoir les développer et les améliorer indépendamment, puis les réutiliser.
Exemple :
Par analogie la conception d’une chaise passe par :
1. Créer les pieds et le support ;
2. Créer le siège et le dossier ;
3. Assemblage le tout avec des vis.
Fonction
(peut prendre en entrée des paramètres) Procédure
(peut prendre en entrée des paramètres)
• Variable globale :
Elle est créée quand le programme est lancé et est "détruite" quand le programme s’arrête.
• Variable locale :
Elle est créée quand le sous programme est appelé et est "détruite" quand il se termine.
c = 0.1
Représente un paramètre par défaut
sa portée englobante. Les critères qui doivent être remplis pour créer une closure en Python sont
• Nous devons avoir une fonction imbriquée (fonction à l'intérieur d'une fonction).
• La fonction imbriquée doit faire référence à une valeur définie dans la fonction englobante.
qui prend une tâche complexe et la dissèque pour visualiser les différentes étapes qui la
composent.
• Elle permettra ensuite d’analyser et de comprendre les relations entre tous les éléments
constitutifs afin d’avoir une vision globale et détaillée des actions à réaliser pour aboutir à
SOUS-PROGRAMME mettre_la_table()
DEBUT PROGRAMME prendre un repas
placer(nappe) DEBUT
placer(assiettes) mettre_la_table()
placer(couverts) presenter(plat_du_jour) SOUS-PROGRAMME ranger_la_table()
placer(verres) manger(plat_du_jour) DEBUT
FIN presenter(dessert) ranger(couverts)
manger(dessert) nettoyer (nappe)
ranger_la_table() FIN
FIN
SOUS-PROGRAMME manger(plat)
DEBUT
mon_assiette = se_servir (plat)
manger_dans(mon_assiette, mes_couverts)
boire_dans(mon_verre)
FIN
4. Implémentation et test
• Ce qu’il fait
Ils aideront au développement rapide des blocs, ainsi qu’à leur validation de façon plus efficace.
Le tableau de flux :
C’est la représentation du diagramme de flux sous forme d’un tableau.
!
𝑥
𝑄=
𝑛!
1. Ecriture les commentaires de spécification internes aux blocs d’instruction
2. Tableau des flux entre les blocs
3. Diagramme des flux
4. Implémentation et test des blocs d’instruction en Python
!
𝑥
𝑄=
𝑛!
Listing des blocs d’instruction
Fonction 1 : Puissance
Fonction 2 : Factorielle
Fonction 3 : Quotient
Fonction 4 : Saisie
Procédure : Programme principal
principal
F x,n
n
P
factorielle
puissance
Maintenabilité : les modules sont généralement conçus de manière à imposer des limites logiques entre les différents
domaines de problèmes.
Réutilisabilité : les fonctionnalités définies dans un seul module peuvent être facilement réutilisées par d'autres
parties de l'application.
Portée : les modules définissent généralement un espace de noms distinct, ce qui permet d'éviter les collisions entre
les identifiants dans différentes zones d'un programme.
Les fonctions, modules et packages sont tous des constructions en Python qui favorisent la modularisation du code.
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 149
En Python, on peut distinguer trois grandes catégories de module :
• Les modules standards ne font pas partie du langage en soi mais sont intégrés automatiquement
par Python. Exemple : random, math, os, re...
• Un module peut être écrit en C et chargé dynamiquement au moment de l'exécution,
comme le module re (expression régulière).
• Les modules développés par des développeurs externes qu’on va pouvoir utiliser. Exemple :
panda, networkx...
• Les modules qu’on va développer nous mêmes.
https://docs.python.org/3/library/
Utilisation de la fonction
puissance depuis le module math
§ Chaque module a sa propre table privée de symboles privée, qui sert de table de symboles
globale pour tous les objets définis dans le module. Ainsi, un module crée un espace de noms
séparé.
§ Les objets définis dans le module restent dans la table privée de symboles du module.
§ Depuis l'appelant, les objets du module ne sont accessibles que s'ils sont préfixés par
<nom_du_module> via la notation ‘.’
• Étant donné que cette forme d'importation place les noms d'objet directement dans la table des
symboles de l'appelant, tous les objets qui existent déjà avec le même nom seront écrasés.
• Ce n'est pas nécessairement recommandé dans le code de production à grande échelle. C'est un
peu dangereux parce que vous entrez en masse des noms dans la table des symboles locaux. À
moins que vous ne les connaissiez tous bien et que vous soyez sûr qu'il n'y aura pas de conflit, vous
avez de bonnes chances d'écraser un nom existant par inadvertance.
• Cependant, cette syntaxe est assez pratique lorsque vous vous contentez de jouer avec l'interpréteur
, à des fins de test ou de découverte, car elle vous donne rapidement accès à tout ce qu'un module a
à offrir sans trop de frappe.
- Puis on crée un autre fichier python sur lequel on importe notre module :
import nom_de_notre_module
Ecrire un module nommé "perimetre" qui implémente les périmètres des figures suivantes :
• Carré = cote * 4
• Cercle = 2 * pi * rayon
Tuple
Structures de Dictionnaire
données Set
Algorithmes de tri
Structures de données
Liste
indexées sur Python
Dictionnaire
Set
Mamadou UGB
Mansour UIDT
Dame UCAD
CLE VALEUR
#Définir un dictionnaire
d1 = {'Macky Sall':58,'Abdoulaye Wade':94,'Abdou Diouf':85}
print(d1) # {'Macky Sall': 58, 'Abdoulaye Wade': 94, 'Abdou Diouf': 85}
print(d1.items())
#Liste des clés
print(d1.keys()) # dict_keys(['Macky Sall', 'Abdoulaye Wade', 'Abdou Diouf'])
#Liste des valeurs
print(d1.values()) # dict_values([58, 94, 85])
#Accés à l'age de Abdoulaye Wade
print(d1['Abdoulaye Wade']) # Resultat retourné 94
#Si clé n'existe pas
print(d1['Leopold Senghor'])
• Un ensemble peut être modifié, mais les éléments de l'ensemble doivent être d'un type immuable.
1. Afficher la liste
2. Afficher la liste en colonne de manière à afficher l’index et son contenu
3. Additionner tous les éléments de la liste
4. Créer une nouvelle liste qui sera le multiple (3) de tous les éléments de la liste
5. Obtenir le plus grand entier de la liste
6. Obtenir le plus petit entier de la liste
7. Compter le nombre des entiers pairs présents dans la liste
8. Calculer la somme de tous les nombres impairs de la liste
Récursivité croisée
Récursivité et
Complexité
Récursivité imbriquée
Compléxité
• On s'arrêtera quand cette taille sera celle d'un problème immédiatement résolvable.
Application § La récursivité est toujours appliquée aux fonctions. § L’itération est appliquée aux instructions d’itération « ex : des boucles ».
• RECURSIVITE MULTIPLE
• RECURSIVITE IMBRIQUEE
def impair(n):
if n==0:
return False
else:
return pair(n-1)
𝑛 1, 𝒔𝒊 𝒌 = 𝟎 𝒐𝒖 𝒔𝒊 𝒌 = 𝒏
= $ 𝑛 −1 𝑛 −1
𝑘 + 𝒔𝒊𝒏𝒐𝒏
𝑘 −1 𝑘
def coeff_bin(n,k):
if k==0 or k==n:
return 1
elif k>n:
return ""
else:
return coeff_bin(n-1,k-1) + coeff_bin(n-1,k)
n = 10
k = 10
for i in range(0,n+1):
s = ''
for j in range(0,k+1):
X = coeff_bin(i,j)
s=s+" "+str(X)
print(s)
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 219
C’est une fonction récursive dont l’appel à lui même contient un autre appel à lui même
Exemple : Fonction de Ackermann
𝑛 + 1 𝒔𝒊 𝒎 = 𝟎
𝐴(𝑚, 𝑛) = 4 𝐴 𝑚 − 1,1 𝒔𝒊 𝒎 > 𝟎 𝒆𝒕 𝒏 = 𝟎
𝐴 𝑚 − 1, 𝐴 𝑚, 𝑛 − 1 𝒔𝒊 𝒎 > 𝟎 𝒆𝒕 𝒏 > 𝟎
def ackermann(m,n):
if m==0:
return n+1
elif m>0 and n==0:
return ackermann(m-1,1)
elif m>0 and n>0:
return ackermann(m-1,ackermann(m,n-1))
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF 01/02/2021 220
Des problèmes plus complexes se résolvent aussi naturellement de façon récursive,
avec des algorithmes s’appéllant eux-mêmes une ou plusieurs fois sur des données
de tailles inférieures.
• Résolvables immédiatement.
- Algorithme de karatsuba
T1 = [-1,4,5,7,9,3]
T2 = [8,9,6]
print(fusion(T1,T2))
def trifusion(T):
if len(T)<=1:return T
T1=[T[x] for x in range(len(T)//2)]
T2=[T[x] for x in range(len(T)//2,len(T))]
return fusion(trifusion(T1),trifusion(T2))
print(trifusion(X))
# Test
arr = [-1,4,5,7,9,3]
print(maximumListe(arr,0,5))
arr = [-1,4,5,7,9,3]
print(dicho(arr,19,0,5))
- En utilisant :
§ Complexité spatiale :
• Complexité temporelle :
Heritage, Encapsulation
Polymorphisme, Agrégation
- Encapsulation
- Modularité
Diviser un gros système en entités plus petite
1. Maîtriser la complexité
bol 3 bol 3
bol 3 bol 2
bol 2
bol 2 bol 2 bol 2
bol 1 bol 1 bol 1 bol 1 bol 1
1. Création de la pile
2. Possibilité d’empiler
3. Possibilité de dépiler
5. Vider la pile
def facto(n):
F = 1
if (n==0 or n==1):
F = 1
else:
F = facto(n-1) * n
return F
Et6
DEFILER
Et1
1. Création de la file
3. Possibilité de défiler
5. Vider la file
- Regrouper des fonctions, des propriétés en rapport à un type donné dans un module
Des modèles :
Une démarche : Facilitent les retours sur la
Explique la marche à suivre en conception et l’évolution des
exploitant au mieux les principes de systèmes
modularité, d’abstraction, de
réutilisation, etc
Un formalisme de représentation :
Facilite la communication,
l’organisation et la vérification
Méthodes
existantes Méthodes systémiques :
Séparation des données
et des traitements
Méthodes objets :
Intégration des données et des
traitements dans un objet unique
Un objet possède :
– Une identité :
Permet de distinguer chaque objet par rapport aux autres
– Un état :
Correspond aux valeurs de tous ses attributs à un instant donné
– Un comportement :
Ensemble des opérations qu’il peut exécuter en réaction aux messages provenant des autres objets
PRIVE (-)
PROTÉGÉ (#)
• Attribut ou méthode visible juste à l’intérieur d’une classe et de par ses sous classe
Personne
Attribut privé +nom
+prenom
+age
-cerveau
Méthode privée
+manger()
+marcher()
-réfléchir()
<<interface>>
Forme
calculAire()
Triangle Rectangle
norme = racine_carre(x² + y²
+long : float
+larg : float Classe mère
+surface(long,larg) : float
Classe fille
Pavé
+hauteur : float
+volume(surf,haut) : float
Carnivore Herbivore
Omnivore
+surface(long,larg) : float
L’usage du double __ "underscore"
rend l’attribut privé
Coin inférieur
Coin supérieur
Méthode Description
__init__ Méthode appelée automatiquement lors de la création d’un objet. Elle permet d’initialiser l’objet.
__new__ Cette méthode en réalité s’agit véritablement du constructeur.
__del__ Méthode appelée implicitement lors de la destruction d’un objet.
__name__ Méthode pour renvoyer le nom de la classe.
__doc__ Méthode renvoie le doc String de la classe interrogée.
__dict__ Méthode pour renvoyer un dictionnaire des méthodes et attributs disponibles pour l’objet.
__module__ Permet de connaitre le nom du module dans lequel est codé une fonction
__class__ Pour connaitre à partir de quelle classe l’objet a été créé
__repr__ Méthode pour donner la représentation textuelle de n’importe quel objet
• Donne une vision globale (i.e. de haut niveau et non détaillée) de la conception du système
Module 3
Module 2
Module 1
• Indique les moyens retenus pour atteindre les objectifs en terme de qualité
problème, d’une façon telle que l’on peut réutiliser cette solution des
Quelles situations de conception peu satisfaisantes peuvent tirer avantage de l’utilisation du modèle ?
§ Structure :
§ Constituants :
§ Conséquences :
§ Implémentation :
De quels pièges astuces, ou techniques faut-il être averti lors de l’implémentation du modèle.
Extraits de programme illustrant qu’il convient de développer le modèle dans un langage donné?
§ Utilisations remarquables :
§ Modèle apparentés:
§ Vocabulaire de base
§ Private Methods
§ Immutable Objet
§ Solution
§ Définir une interface spécifiant le service offert (Abstraction)
§ Les classes serveur implantent cette abstraction
§ Les clients réfèrent au type de l’interface et travaillent avec une instance d’une classe
implantant cette interface
§ Conséquences
§ Améliore la maintenabilité
§ Améliore l’adaptabilité
§ Si sur-utilisation alors on a une perte de performance
ü Exemple :
Annotations, Propriétés
ü Exemple :
En Java l’interface cloneable indique que la classe supporte totalement la méthode clone
ü Véritable clonage
Spécialisation
§ Classe abstraite
§ Plusieurs sous-classes peuvent être définies pour implanter des comportements différents
§ Une classe qui hérite d’une classe abstraite doit implanter toutes les méthodes abstraites
de la classe parent
def call_private(self):
§ L’état d’un objet est défini par la valeur de ses différentes variables d’instance
Solution
§ Rendre toutes les variables d’instance privées
§ Définir des méthodes pour l’accès aux valeurs des variables d’instance
§ Définir des méthodes de modification de l’état et des valeurs des variables d’instance
§ Utiliser les méthodes d’accès et de modification même à l’interne de la classe
§ S’applique aux classes qui ne présentent pas de comportement spécifique, mais agissent
comme conteneurs de données
§ Problème
§ L’état d’une instance ne doit pas être modifié durant toute sa durée de vie
CREATEUR COMPORTEMENTAL
STRUCTUREL
Interprète
CLASSE Fabrication Adaptateur
Patron de méthode
Fabrique abstraite Adaptateur Chaine de responsabilité
Monteur Pont Commande
Prototype Composite Itérateur
Singleton Décorateur Médiateur
OBJET Façade Mémento
Poids Mouche Observateur
Procuration Etat
Stratégie
Visiteur
Les camions délivrent par la route et les bateaux délivrent par la mer.
INCONVENIENTS
• Le code peut devenir plus complexe puisque vous devez introduire de
nombreuses sous-classes pour la mise en place du patron. La condition optimale
d’intégration du patron dans du code existant se présente lorsque vous avez déjà
une hiérarchie existante de classes de création.
INCONVENIENTS
• Retirer un emballeur spécifique de la pile n’est pas chose aisée.
• Il n’est pas non plus aisé de mettre en place un décorateur dont le comportement
ne varie pas en fonction de sa position dans la pile.
• Le code de configuration initial des couches peut avoir l’air assez moche.
INCONVENIENTS
• L’utilisation de ce patron est exagérée si votre application ne se sert que de
collections simples.
• Les itérateurs sont parfois moins efficaces que certaines collections spécialisées.
La classe originale (le contexte) doit avoir un attribut qui garde une référence
INCONVENIENTS
• Si vous n’avez que quelques algorithmes qui ne varient pas beaucoup, nul besoin de rendre
votre programme plus compliqué avec les nouvelles classes et interfaces qui accompagnent la
mise en place du patron.
• Les clients doivent pouvoir comparer les différentes stratégies et choisir la bonne.
• De nombreux langages de programmation modernes gèrent les types fonctionnels et vous
permettent d’implémenter différentes versions d’un algorithme à l’intérieur d’un ensemble de
fonctions anonymes. Vous pouvez ensuite utiliser ces fonctions exactement comme vous le
feriez pour des objets stratégie, sans encombrer votre code avec des classes et interfaces
supplémentaires.
Packaging
• Les doublons (redondances) : un code superflu contient souvent des redondances qui, à l’étape de la
maintenance, doivent être modifiées séparément à chaque entrée. Elles génèrent donc du temps de
travail et des coûts supplémentaires.
• Les classes avec un trop grand nombre de fonctions : les classes comprenant de trop nombreuses
fonctions définies comme méthodes, également connues sous le nom d’objet dieu, qui rendent presque
impossible toute modification du logiciel.
• Les classes avec trop peu de fonctions : les classes comprenant trop peu de fonctions définies
comme méthodes, qui sont superflues.
• Les codes trop généraux avec des cas spécifiques : les fonctions avec des cas particuliers trop
spécifiques, qui ne se produisent que rarement ou jamais et compliquent l’ajout de compléments
nécessaires.
• Les Middle Men : une classe distincte fait office d’intermédiaire entre les méthodes et différentes
classes, alors que les méthodes pourraient appeler directement une classe.
def printOwing(self):
self.printBanner()
# print details print("name:",
self.name) print("amount:",
self.getOutstanding())
UNITAIRE SYSTÈME
(VALIDATION)
INTEGRATION
Dans un projet informatique, l'intégration est de fait d'assembler plusieurs composants (ou modules)
élémentaires en un composant de plus haut niveau. Un test d'intégration valide les résultats des
interactions entre plusieurs composants et permet de vérifier que leur assemblage s'est produit sans
défaut. Il peut être manuel ou automatisé. Un nombre croissant de projets logiciels mettent en place un
processus d'intégration continue. Cela consiste à vérifier que chaque modification ne produit pas de
régression dans l'application développée. L'intégration continue est nécessairement liée à une batterie de
tests qui se déclenchent automatiquement lorsque des modifications sont intégrées au code du projet.
Ces tests sont réalisés lors de la recette (validation) par un client d'un projet livré par l'un de ses
fournisseurs. Souvent écrits par le client lui-même, ils portent sur l'ensemble du logiciel et permettent de
vérifier son comportement global en situation. De par leur spectre large et leur complexité, les tests de
validation sont le plus souvent manuels. Les procédures à suivre sont regroupées dans un document
projet/
│
└── notre_somme/
└── __init__.py
Description de la fonction :
Cette implémentation crée une variable appelée total, une variable val vas itérer sur toutes les valeurs
de arg et les ajoute à total. Il renvoie ensuite le résultat une fois que l'itérable a été épuisé.
projet/
│
├── notre_somme/
│ └── __init__.py
|
└── sunu_test.ipynb
Python qui permet la génération facile de tests basés sur la sortie du shell d'interpréteur.
Grâce à doctest, le programmeur peut inclure des tests unitaires directement dans la
Trying:
fact(5)
Expecting:
120
ok
1 items had no tests:
__main__
1 items passed all tests:
1 tests in __main__.fact
1 tests in 2 items.
1 passed and 0 failed.
Test passed.
Python, UIDT / SES / MSDA / M. BOUSSO - M. DIOUF Source: Lien 01/02/2021 453
Créer un package pkg avec deux modules mod1.py et mod2.py
§ Fichier de contrôle contenant le nom du logiciel, sa version, ses dépendances logicielles, etc. ;
§ Fichiers de configuration ;
§ Fichiers de documentation ;
• triangle
• carré
• rectangle
• cercle
[build-system]
requires = [
"setuptools>=42",
"wheel"
]
build-backend = "setuptools.build_meta"
[metadata]
# replace with your username:
name = example-pkg-YOUR-USERNAME-HERE
version = 0.0.1
author = Example Author
author_email = [email protected]
description = A small example package
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/pypa/sampleproject
project_urls =
classifiers =
package_dir =
Arbres particuliers
• Arbre binaire
• Arbre binaire de recherche
• Arbre équilibré
• Arbre complet
• Arbre presque complet
Propositions :
• P1 : {100,100,100,100,50,25,10}
• P2 : {200,200,50,10,10,10,5}
• P3 : {250,100,25,10}
• P4 : {250,25,25,25,25,25,10}
• ...
Un infinité de proposition peut être effectuée maintenant reste à savoir la plus optimale.
L’usage d’un algorithme glouton vas permettre à Mamadou d’optimiser ses pièces.
• Les programmes n’ont pas d’état • Les données (p. ex. variables) ne sont pas modifiables
• Code facilement vérifiable : même les fonctions sans état • Ne convient pas en cas de nombreuses récursions d'une même
peuvent être vérifiées pile
La fonction d'identité, une fonction qui renvoie son argument, est exprimée avec une définition de fonction
Python standard en utilisant le mot - clé def comme suit :
identity() prend un argument x et le renvoie lors de l'invocation.
En revanche, si vous utilisez une construction lambda Python vous avez une syntaxe plus simple.
Argument
Mot clé lambda
§ Par exemple:
sa portée englobante. Les critères qui doivent être remplis pour créer une closure en Python sont
• Nous devons avoir une fonction imbriquée (fonction à l'intérieur d'une fonction).
• La fonction imbriquée doit faire référence à une valeur définie dans la fonction englobante.
§ Il est recommandé de ne pas écrire les méthodes des classes sous forme de
fonctions lambda
§ Les lambdas imposent une vue fonctionnelle de la programmation
§ Syntaxe lourd parfois
§ Avec timeit
§ Une autre possibilité est que votre application rencontre des erreurs ou des exceptions qui amènent
le flux de contrôle à contourner le code responsable de la libération de la ressource disponible.
§ Python met à notre disposition deux approches générales pour gérer les
ressources:
§ try ……..finally
§ with
§ « expression » doit être un objet qui implémente le protocole de gestion des ressources qui
comprend deux méthodes spéciales:
§ .__ enter __ () est appelée par l'instruction with pour entrer dans le contexte d'exécution.
§ .__ exit __ () est appelée lorsque l'exécution quitte le bloc de code with.
§ Remarque: certains gestionnaires de contexte renvoient None de .__ enter__ () car ils n'ont
aucun objet à retourner à l'appelant. Dans ces cas, la spécification d'un target_var n'a aucun
sens.
§ En effet, si True est retourné, l’exception survenue dans le contexte sera attrapée.
• Open retourne un objet io.TextIOBase qui herite de la classe IOBase qui est gestionnaire
de contexte
• Cet objet sera affecté à file avec __enter()__ par l’instruction with
• On execute avec file le corps du bloc associé à with
• On appelle __exit()__ qui va se charger de la fermeture du fichier même si une exception
survient dans le bloc du with
§ Ouvrir et fermer
§ Verrouiller et libérer
§ Modifier et réinitialiser
§ Créer et supprimer
§ Entrer et sortir
§ Démarrer et arrêter
§ Configuration et libérer
§ Vous pouvez fournir du code pour gérer en toute sécurité l'une de ces paires
d'opérations dans un gestionnaire de contexte. Ensuite, vous pouvez réutiliser ce
gestionnaire de contexte avec des instructions dans tout votre code.
Question: Qu’est-ce qui se passe en cas d’exception dans l’execution du bloc de code du with ?
§ Un grand nombre d’outils Python que nous verrons par la suite travaillent avec des
itérables, il est donc intéressant d’en tirer profit.
§ Ainsi :
§ Un itérable est un objet possédant une méthode __iter__ retournant un itérateur ;
§ Un itérateur est un objet possédant une méthode __next__ retournant la valeur suivante à
chaque appel, et levant une exception de type StopIteration en fin de course.
§ La documentation Python indique aussi qu’un itérateur doit avoir une
méthode __iter__ où il se retourne lui-même, les itérateurs étant ainsi des itérables
à part entière.
§ En des termes plus abstraits, les itérateurs fournissent une interface commune qui vous
permet de traiter chaque élément d’un conteneur tout en étant complètement isolé de
la structure interne du conteneur.
§ Qu'il s'agisse d'une liste d'éléments, d'un dictionnaire, d'une séquence infinie ou d'un
autre type de séquence, tout cela n'est qu'un détail d'implémentation.
§ Chacun de ces objets peut être parcouru de la même manière par la puissance des itérateurs.
§ islice(p, start, stop, step) — Fait un travail semblable aux slices, mais en travaillant avec
des itérables (nul besoin de pouvoir indexer notre objet) ;
§ zip_longest(p, q, ...) — Similaire à zip, mais s’aligne sur l’itérable le plus grand plutôt
que le plus petit (en permettant de spécifier une valeur de remplissage).
§ Que donne l’expresion suivante: first, *middle, last = *[0, 1, 2], 3, 4, *[5, 6], 7
§ Dans ces cas et plus, les générateurs et l'instruction yield Python sont là pour vous
aider.
§ Un générateur est un itérable, mais aussi un itérateur qui n’a pas besoin d’implementer le
protocole d’un iterateur (__iter()__, __next()__)
§ Objets sur lesquels vous pouvez boucler comme une liste. Cependant, contrairement aux
listes, les itérateurs « paresseux » ne stockent pas leur contenu en mémoire.
§ Un generateur est un one time operation ie on ne peut itérer sur les données qu’une
seule fois. Pour le itérer à nouveau il faudra appeler le générateur à nouveau
§ Equivalent: for i in s:
if condition:
yield expression
§ Lorsque vous appelez une fonction générateur ou utilisez une expression générateur, vous retournez un
itérateur spécial appelé générateur.
§ Vous pouvez affecter ce générateur à une variable pour l'utiliser.
§ Lorsque vous appelez des méthodes spéciales sur le générateur, telles que next(), le code de la fonction est
exécuté jusqu'à yield.
§ Lorsque l'instruction yield est atteinte, le programme suspend l'exécution de la fonction et renvoie
la valeur produite à l'appelant. (En revanche, return arrête complètement l'exécution de la fonction.)
§ Lorsqu'une fonction est suspendue, l'état de cette fonction est sauvegardé. Cela inclut toutes les
liaisons de variables locales au générateur, le pointeur d'instruction, la pile interne et toute gestion
des exceptions.
§ Cela vous permet de reprendre l’exécution de la fonction chaque fois que vous appelez le
générateur. De cette façon, toutes les évaluations de fonctions sont reprises juste après le yield.
§ Les fonctions peuvent être transmises et utilisées comme arguments, comme n'importe
quel autre objet (string, int, float, list, etc.).
§ Considérez les trois fonctions suivantes:
§ Comme avec toutes les autres fonctions, l'impression n'a lieu que lorsque les
fonctions internes sont exécutées.
§ De plus, les fonctions internes ne sont pas définies tant que la fonction parent n'est
pas appelée.
§ Elles n'existent qu'à l'intérieur de la fonction parent () en tant que variables locales.