Voici le descriptif d'un diagramme de classe :
|
Nom du TAD
operateur1(param1, param2, ...) : type_résultat operateur2(param*, ...) [conditions] : type_résultat ... |
# -*- coding: utf-8 -*-
class Pile :
"""Implémentation du TAD «Pile» en Python. """
def __init__(self, taille) :
"""Instancier un objet de la classe Pile. """
self.taille = taille
self.contenu = []
def empiler(self, element) :
"""Empile un élément au sommet de la pile. """
if self.est_pleine() :
print("Impossible, la pile est pleine")
else :
self.contenu.append(element)
def depiler(self) :
"""Extrait et retourne le sommet de la pile. """
if self.est_vide() :
print("Impossible, la pile est vide. ")
else :
return self.contenu.pop()
def est_vide(self) :
"""La pile est-elle vide ? """
if self.contenu == [] :
return True
else :
return False
def est_pleine(self) :
"""La pile est-elle pleine ? """
if len(self.contenu) >= self.taille :
return True
else :
return False
def nbr_elements(self) :
"""Donne le nombre d'éléments dans la pile"""
return len(self.contenu)
pileA = Pile(6)
for k in range(1,10) :
print("On empile l'élément ",k)
pileA.empiler(k)
print("Nb d'éléments dans la pile : ",pileA.nbr_elements())
print("On dépile 2 éléments : ", pileA.depiler(), pileA.depiler())
print("Nb d'éléments dans la pile : ", pileA.nbr_elements())
class
en python permet de définir une classe d'objet.
Le bloc indenté suivant, contient ses attributs (structure de données) et ses méthodes
(interface).self
(en anglais : soi) fait référence à
l'instance de cette classe.
Il faut remarquer que self
est passé en premier paramètre de chaque méthode, même s'il
n'est pas forcément utilisé dans la méthode.__init__
.
Celle-ci définit les attributs de l'objet qui
part vivre dans la mémoire vive de l'ordinateur.
Une instance de l'objet a été créée.class
terminé, on peut instancier une pile de taille 6,
en écrivantpileA = Pile(6)
.
Dans le cas général : mon_objet = Nom_Classe(paramètres)
.
En effet, écrire le nom de la classe appelle son constructeur (méthode __init__
).
Il faut donc donner les paramètres nécessaires à ce dernier, c'est-à-dire les attributs
de l'objet à construire (mais sans le self
).empiler('truc')
de l'objet pileA
, on écrit :
pileA.empiler('truc')
qui signifie j'applique la méthode empiler
à l'instance pileA
(cas général : mon_objet.ma_méthode(paramètres)
).Pile.empiler(pileA, 'truc')
qui signifie j'utilise la méthode empiler
de la classe Pile
à l'objet pileA
avec le paramètre "truc"
.Vocabulaire du TAD | Vocabulaire de l'implémentation en POO | Exemple en python |
---|---|---|
type abstrait de donnée (TAD) | classe d'objet | class Nom : |
structure de donnée | attributs | self.attribut |
opérateurs | méthodes | def methode(self, ...): |
constructeur | méthode | def __init__(self, ...): |
el
dans la liste, à la place i
, si elle n'est pas rempliei
el
x
à insérer à son emplacement i
. On constate que cet algorithme parcours une fois la liste (même moins que la liste). Il s'agit donc d'une complexité linéaire en `O(n)`.Il est aussi possible de rencontrer des listes doublement chaînées (chaque élément est attaché à l'adresse de son successeur et de son prédécesseur), ou bien de former des cycles (au lieu de pointer sur une fin de liste, on pointe sur le premier élément créant ainsi une boucle.
list
en python va beaucoup plus loin que la structure abstraite commune «liste» dont nous venons de parler. Il faut garder à l'esprit que même s'il est possible de l'ignorer en utilisant python, on a bien affaire à des listes chaînées en mémoire. Le type list
python est donc assez «lourd» mais très complet et flexible, donc il ne faut pas hésiter à l'utiliser.
ls = [14, 9, 8, 8]
print(ls)
print("Longueur de la liste :", len(ls))
print("Somme des valeurs de la liste :", sum(ls))
print("Ajouter un élément à la fin (ici 1000) :", end=" ")
ls.append(1000)
print(ls)
print("Enlever un élément à une certaine place (ici place 1):", end=" ")
ls.pop(1)
print(ls)
print("Vérifier la présence d'une valeur dans la liste (ici 12) :", 12 in ls)
print("Compter le nombre d'occurence d'une valeur (ici 8) :", ls.count(8))
print("Trouver la première place d'une valeur (ici 8) :", ls.index(8))
print("Enlever une valeur (ici 8) :", end=" ")
ls.remove(8)
print(ls, end=" ")
print("C'est la première apparition qui est enlevée !")
print("Concaténer deux listes :", ls+[4, 6])
print("Concaténer plusieurs fois une liste avec elle-même :", 3*ls)
print("Trier une liste :", end=" ")
ls.sort()
print(ls)
print("8nverser une liste :", end=" ")
ls.reverse()
print(ls)
print("Créer une sous-listes : ", ls[:2])
bool
, tuple
, str
, bytes
, frozenset
et range
sont immuables, ainsi que les types numériques int
, float
et complex
.
Les objets tuple
sont des listes immuables d'objets hétérogènes en python. On peut voir le
type tuple
comme le pendant immuable de list
, et frozenset
comme le pendant immuable de set
.
Interface du TAD Dictionnaire :
|
Dictionnaire
créer_dico_vide() : Dictionnaire insérer(dico, clé, valeur) : vide supprimer(dico, clé) [si la clé existe] : vide lire(dico, clé) [si la clé existe] : type T rechercher(dico, clé) : booléen |
Interface du TAD Vecteur :
|
Vecteur
créer_vecteur(x, y) : vecteur afficher(vecteur) : vide modifier(vecteur, x, y) : vide est_nul(vecteur) : booléen det(vecteur1, vecteur2) : nombre |
__init__
def det(self, other) :
other
self.x*other.y-self.y*other.x
u(2, 4)
u
u(0.2, 1)
modifier
v(1.4, 7)
det
u
v
==
w = v
del v
w
del w
_
utilisation | nom |
---|---|
conversion en string pour la fonction print | __str__(self) |
affichage lors d'un appel en console | __repr__(self) |
opération | symbole | méthode | symbole unaire | méthode |
---|---|---|---|---|
addition | + | __add__(self,other) | += | __iadd__(self,other) |
soustraction | - | __sub__(self,other) | -= | __isub__(self,other) |
multiplication | * | __mul__(self,other) | *= | __imul__(self,other) |
division | / | __truediv__(self,other) | /= | __itruediv__(self,other) |
élévation à la puissance | ** | __pow__(self,other) | **= | __ipow__(self,other) |
division entière | // | __floordiv__(self,other) | //= | __ifloordiv__(self,other) |
reste de la division entière (modulo) | % | __mod__(self,other) | %= | __imod__(self,other) |
opération | symbole | méthode |
---|---|---|
opposé | - | __neg__(self) |
positif | + | __pos__(self) |
valeur absolue | abs() | __abs__(self) |
Opérateurs de comparaison :
opération | symbole | méthode |
---|---|---|
égal | == | __eq__(self,other) |
non égal | != ou <> | __ne__(self,other) |
strictement inférieur | < | __lt__(self,other) |
strictement supérieur | > | __gt__(self,other) |
inférieur ou égal | <= | __le__(self,other) |
supérieur ou égal | >= | __ge__(self,other) |
opération | syntaxe | méthode |
---|---|---|
dimension | len(objet) | __len__(self) |
accès aux éléments en lecture | objet[key] | __getitem__(self,key) |
accès aux éléments en écriture | objet[key] = ... | __setitem__(self,key,value) |