Académique Documents
Professionnel Documents
Culture Documents
• Python est un langage qui continue à évoluer, soutenu par une communauté
d'utilisateurs enthousiastes et responsables.
3
Python conserve la tête du classement IEEE
pour l’année 2021, loin devant Java
Le magazine IEEE Spectrum a publié l’édition 2021 de son classement annuel
des meilleurs langages de programmation selon les développeurs. Le site web a
recoupé plusieurs sources pour établir un classement interactif et déterminer la
popularité des différents langages selon les plateformes.
Python en tête pour la 5ème année consécutive
4
Les 6 meilleurs frameworks Python
Les frameworks facilitent la vie des développeurs en leur offrant une structure
pour le développement d’applications. Ils automatisent la mise en œuvre de
solutions communes, réduisant ainsi le temps de développement et permettant
aux développeurs de se concentrer sur la logique de l’application plutôt que sur
les éléments de routine.
6
Les 6 meilleurs frameworks Python
7
Les 6 meilleurs frameworks Python
Les microframeworks
9
Les 6 meilleurs frameworks Python
10
Les 6 meilleurs frameworks Python
Attention: Bottle ne convient que si vous créez une très petite application
avec au maximum 500 lignes de code et sans exigences particulières.
11
Les 6 meilleurs frameworks Python
CherryPy est créé pour être extensible. Il a son propre serveur web, en
fait, une application web fonctionnant avec CherryPy est une application
python autonome qui intègre son propre serveur web multithread. Les
applications CherryPy fonctionnent sur tout système d’exploitation qui
supporte Python (Windows, macOS, Linux, etc.).
Vous n’avez pas besoin d’Apache pour les applications CherryPy, mais
vous pouvez exécuter une application CherryPy derrière Apache.
12
PyCharm
14
Compare Python code editors, IDE
Utiliser Pycharm
PyCharm est disponible en trois éditions:
- PyCharm Edu est gratuit et à des fins éducatives:
https://www.jetbrains.com/fr-fr/pycharm-edu/
- PyCharm Community est également gratuit et destiné au développement
python pur.
-PyCharm Professional est payé, a tout ce que l’édition communautaire
a et est également très bien adapté pour le développement Web et
scientifique avec un support pour des cadres tels que Django et Flask,
Database et SQL, et des outils scientifiques tels que Jupyter.
18
Utiliser Pycharm
19
Utiliser Pycharm
23
Les variables
• Type de variables
– entier (python: int) pour manipuler des entiers
– réel (python: float) pour manipuler des nombres
réels
– booléen (python: bool) pour manipuler des valeurs
booléennes
– Caractère (python: str) pour manipuler des caractères
alphabétiques ou numériques.
24
Les opérateurs et les expressions
• Les opérateurs: +, -, *, / Avec en plus pour les entiers div et mod,
qui permettent respectivement de calculer une division entière et le
reste de cette division.
par exemple :11 div 2 vaut 5, 11 mod 2 vaut 1
En Python: 11//2 vaut 5 et 11%3 vaut 2
• L’opérateur d’égalité :
pour les types simples il permet de savoir si les deux opérandes
sont égales ou non.
Il est représenté par le caractère = (en algo) et par (= =) en python
Le résultat d'une expression contenant cet opérateur est un booléen
• On a aussi l’opérateur d’inégalité : ≠ (en python !=)
• Et pour les types possédant un ordre les opérateurs de comparaison
<, ≤, >, ≥ 25
Les opérateurs logiques
Les operateurs logiques sont : ET ( and en python), OU (or en
python) et NON (not en python).
27
Les entrées / sorties
• Instructions de lecture:
variable = (int, float, …) (input("votre message"))
Exemple:
>>> Nom=input('Donner votre nom:’)
Donner votre nom:'NOUH'
>>> print('Ton nom est:',Nom)
Ton nom est: 'NOUH'
>>> Annee=int(input("Donner l'anneé en cours:"))
Donner l'anneé en cours:2020
>>> print("L'année dernière c’était", Annee-1)
L'année dernière c’était 2019 28
Instruction conditionnelle
if (conditions 1): ATTENTION à l’indentation en Python !!!!
……………….
elif (conditions 2):
……………….
elif (conditions 3):
…………….
else :
……………….
30
Les boucles for et while
• Il est fréquent que le nombre de répétitions soit connu à
l'avance, et que l'on ait besoin d'utiliser le numéro de l'itération
afin d'effectuer des calculs ou des tests.
while <test> :
<instructions
31
Les boucles for et while
• La boucle for fonctionne sur les chaînes, les listes, les tuples et
d’autres objets.
• La partie else: … est optionnelle.
• L’instruction range (a,b,pas) permet de créer une liste L
croissante ou décroissante d’entiers successifs . aL, a+pas L,
a+2*pas L, a+3*pas L, ….. Et x L: x<b
• Exemple:
for i in range(10,20,3):
print (i);
print("Sortie de la boucle avec i=",i);
10
13
Donne à l’exécution: 16
19
Sortie de la boucle avec i= 19 32
Instruction conditionnelle
Exercice 2:
-Ecrire un programme python qui permet de calculer le
produit 1*2*3*…*n pour un nombre entier n.
33
Les boucles for et while
Exercice 3:
programme qui compte le nombre de chiffres d’un nombre
a=int(input("Entrer un entier:"));
if a==0:
print("le nombre de chiffres est:",1);
else:
nbchif=0;
while a>0:
a=a//10;
nbchif=nbchif+1;
else:
print("le nombre de chiffres est:",nbchif);
# ou bien lent(str(a))
34
Les fonctions
Il arrivera souvent qu'une même séquence d'instructions doive être utilisée à plusieurs
reprises dans un programme, et on souhaitera bien évidemment ne pas avoir à la
reproduire systématiquement.
35
Les fonctions
>>> def table7():
... n=1
... while n <11 :
... Print( n * 7)
... n = n+1
Pour utiliser la fonction que nous venons de définir, il suffit de l'appeler par son
nom. Ainsi :
>>> table7()
Provoque l'affichage de :
7 14 21 28 35 42 49 56 63 70
36
Les fonctions
La fonction table() telle que définie ci-dessous utilise le paramètre base pour
calculer les dix premiers termes de la table de multiplication de base.
37
Les fonctions
La fonction table() est certainement intéressante, mais elle n'affiche toujours que les dix
premiers termes de la table de multiplication, alors que nous pourrions souhaiter qu'elle en
affiche d'autres. Nous allons l'améliorer en lui ajoutant des paramètres supplémentaires,
dans une nouvelle version que nous appellerons cette fois tableMulti() :
def cube(n):
return n**3
def volumeSphere(r):
return 4 * 3.1416 * cube(r) / 3
39
Fonction anonyme (lambda function)
Le mot-clé lambda en Python permet la création de fonctions anonymes
(i.e. sans nom et donc non définie par def)
Exemple:
>>> f = lambda x : x * x
>>> f ( 3 )
9
On peut également préciser plusieurs arguments:
>>> g = lambda x , y : x * y
>>> g(5, 7)
35
On peut également préciser des valeurs par défaut :
40
Fonctions comme valeurs de première classe
En Python, une fonction est une valeur comme une autre, c’est-à-dire qu’elle peut
être passée en argument, renvoyée comme résultat ou encore stockée dans une
variable. On dit que les fonctions sont des valeurs de première classe.
Une application directe est la définition d’un opérateur mathématique par une
fonction.
n
i =1
f (i )
Par exemple, la somme : , pour une fonction f quelconque, peut être
ainsi définie :
def somme_fonction( f , n ):
s = 0
for i in range(n+1):
s = s + f ( i )
return s
41
Exemple d’application:
def carre ( x ) :
return x*x
42
Fonctions récursives
Une fonction est dite récursive si elle s’appelle elle-même : on parle alors d’appel
récursif de la fonction.
(n! =
k
)
k =1 est simplement définie par la relation de récurrence suivante:
0! = 1
n ! = n.(n − 1)! n *
43
Exemple d’exécution de la fonction récursive fact:
fact(1)=1*fact(0) fact(1)=1
Procédure et fonction
Les "fonctions": assez proches de la notion mathématique correspondante.
Notamment, une fonction dispose d'arguments (en python, une fonction peut ne
pas comporter des arguments) qui correspondent à des informations qui lui sont
transmises et elle fournit un résultat qui peut être d’un type reconnu en python
(nombre, liste, tuple, …..
L’appel d’une fonction peut apparaître dans une expression.
def cube(n):
return n**3
def volumeSphere(r):
return 4 * 3.1416 * cube(r) / 3
46
Les fonctions
Exercice 4:
1) En utilisant une boucle while, écrire la fonction logarithme_binaire, qui à un
réel strictement positif a associe :
3) En Python, une fonction est une valeur comme une autre, c’est-à-dire
qu’elle peut être passée en argument. On dit que les fonctions sont des
valeurs de première classe.
n
Ecrire une fonction somme_fonction( f , n ) qui calcule la somme: i =1
f (i )
4) Ecrire une fonction python qui recherche le plus petit nombre entier naturel
dont le carré se termine par n fois le même chiffre.
Exemple : pour n = 2, le résultat est 10 car 100 se termine par 2 fois le
même chiffre
47
Les fonctions
Variable locale et variable globale
1. Variable locale
Les variables déclarées dans une fonction sont uniquement visibles à
l'intérieur de cette fonction. On dit que ce sont des variables locales.
2. Variable globale
Les variables déclarées à l'extérieur de toutes les fonctions sont disponibles
à toutes les fonctions du programme par l’utilisation du mot clé global. Ce
sont alors des variables globales.
Conseils :
▪ Les variables globales sont à utiliser avec précaution.
▪Il est conseillé d'écrire des programmes aussi localement que possible.
48 48
Les tableaux à une dimension
Comme tous les langages, Python permet d'utiliser des "tableaux". On nomme ainsi tableau
tout ensemble d'éléments de même type désigné par un identificateur unique; chaque
élément est repéré par un "indice" précisant sa position au sein de l'ensemble.
1 Déclarer un tableau
from array import array
X = array('i') # tableau d’entiers (int)
X = array(‘f') # tableau de réels (float)
7. inverser un tableau:
X.reverse(); print(X)
➔array('i', [0, 3, 2, 1])
50 50
Les fonctions
Exercice 5:
1) Ecrire une fonction qui retourne le minimum des nombres positifs d’un
tableau T
2) La médiane d’un tableau A de valeurs réels est la valeur m telle que le
nombre de valeurs du tableau A supérieurs ou égales à m est égal au
nombre de valeurs inférieures ou égales à m. Pour déterminer la médiane
d'un tableau T il suffit :
De trier T par ordre croissant
Et de retourner la valeur qui est au centre du tableau T après le tri.
Donner une fonction def Mediane(T) qui retourne la médiane du tableau
T passé en paramètre.
En Python, les caractères peuvent être n’importe quelle lettre de l’alphabet, mais
aussi des symboles, comme les signes de ponctuation. Une chaîne de
caractères est une suite finie de caractères consécutifs, qu’on note entre
apostrophes ou guillemets :
'Ceci est une chaine'
La chaîne vide se note '' ou " "
Accès à un caractère:
On peut stocker une chaîne dans une variable :
s = 'Bonjour'
et accéder à chacun des caractères à l’aide de la construction s[i] :
>>>s[2]
'n’
Comparaison:
>>> ‘bonjour’ == ‘bonne journée’
False
52
Les chaines de caractères
les chaînes sont immuables
>>> s[0] = 'A'
TypeError: 'string' object does not support item assignment
>>> n=x.count(‘o')
➔n=2
>>> x.endswith("ants")
➔True
>>> x.startswith("Bon")
➔True
>>>y =x.lower()
➔y= ="bonjour aux étudiants"
>>> y=x.upper()
➔‘BONJOUR AUX ETUDIANTS‘
>>>x.find(‘jour')
➔3
>>> x.index(‘jour')
➔3
55
Les chaines de caractères
>>> x="Bonjour mes chers"
>>> x.islower()
False >>> chaine = 'Aujourd'hui'
>>> chaine = 'Aujourd\'hui'
>>> x.isupper() → False
>>> print (chaine)
>>> x.isdigit() → False >>> chaine = "Aujourd'hui"
>>> x.isalpha() → False >>> print (chaine)
>>> x.isalnum() → False >>> chaine = 'Première ligne\nDeuxième ligne'
>>> y=x.replace(' ','') >>> print(chaine)
>>> y >>> X="Pa"
'Bonjourmeschers' >>> Y=X*2
>>> y.isalnum() → "PaPa"
True
>>> X="Bon"
>>> '6'.isdigit()
>>> Y=X*2
True → "BonBon"
>>>« 132455".isnumeric()
True
56
Les chaines de caractères
>>> " ".isspace()
➔True
>>> "Bonjour Monsieur".isspace()
➔False
>>> " ".isspace()
➔True
>>> "\t".isspace()
➔True
>>> "Titre".istitle()
➔True
>>> "TitrE".istitle()
➔False
>>> "Titre de mon site".istitle()
➔False
>>> "Titre De Mon Site".istitle()
➔True
>>> "***".join(["Master", "Data" , "Science"])
➔"Master***Data***Science"
➔>>> "Bonjour".replace("jour", " week-end")
➔ "Bon week-end") 57
Les chaines de caractères
>>>"Master\nBig\nData".splitlines() [‘Master', ‘Big', ‘Data']
>>> x="bonjour amine"
>>> x.capitalize()➔'Bonjour amine'
>>> x='bon'
>>> x.isprintable() ➔True
>>> x='bon'
>>> x.isprintable() ➔True
>>> y="c'estunevariable100%"
>>> y.isidentifier()➔False
>>> x="Bonjour Chers Etudiants"
>>> x.swapcase()➔'bONJOUR cHERS eTUDIANTS‘
>>> x="ceCi n'eSt pas BOn"
>>> x.title()➔"Ceci N'Est Pas Bon"
58
Les chaines de caractères
Exercice 6:
59
Les Listes
Définition d'une liste
C’est une collection ordonnée et modifiable d’éléments éventuellement hétérogènes.
>>> nombres = [5, 38, 10, 25]
>>> mots = ["Master", "Licence", "Doctorat"]
>>> L= [5000, "Big Data", 3.1416, ["Bon", "Jour", 1947]]
Dans le dernier exemple ci-dessus, nous avons rassemblé un entier, une chaîne,
un réel et même une liste, pour vous rappeler que l'on peut combiner dans une liste
des données de n'importe quel type, y compris des listes.
Accès aux éléments d’une liste
Pour accéder aux éléments d'une liste, on utilise les mêmes méthodes (index,
découpage en tranches) que pour accéder aux caractères d'une chaîne :
>>> print(nombres[2])
10 >>> print(nombres[:2])
>>> print(nombres[1:3]) [5, 38]
[38, 10] >>> print(nombres[-1])
>>> print(nombres[2:3]) 25
[10] >>> print(nombres[-2])
>>> print(nombres[2:]) 10
[10, 25]
60
Les Listes
Les listes sont modifiables
Les listes sont des séquences modifiables.
Exemples :
>>> nombres[0] = 17
>>> print(nombres)
[17, 38, 10, 25]
Les listes sont des objets
Sous Python, les listes sont des objets pour les quels on peut appliquer des méthodes
(fonctions) particulièrement efficaces. En voici quelques-unes :
>>> nombres = [17, 38, 10, 25, 72]
>>> nombres.sort() # trier la liste
>>> nombres
[10, 17, 25, 38, 72]
>>> nombres.append(12) # ajouter un élément à la fin
>>> nombres
[10, 17, 25, 38, 72, 12]
>>> nombres.reverse() # inverser l'ordre des éléments
>>> nombres
[12, 72, 38, 25, 17, 10]
61
Les Listes
>>> nombres.index(17) # retrouver l'index d'un élément
4
>>> nombres.remove(38) # enlever (effacer) un élément
>>> nombres → [12, 72, 25, 17, 10]
En plus de ces méthodes, vous disposez encore de l'instruction intégrée del, qui vous
permet d'effacer un ou plusieurs éléments à partir de leur(s) index :
>>> del(nombres[2])
>>> nombres → [12, 72, 17, 10]
>>> del(nombres[1:3])
>>> nombres → [12, 10]
10 100 1000
13 169 2197
16 256 4096
Supposons par exemple que vous voulez créer une liste B qui contient le même
nombre d'éléments qu'une autre liste A. Vous pouvez obtenir ce résultat de différentes
manières, l'une des plus simples consiste à effectuer : B = [0]*len(A).
>>>'orange‘ in fruits
True
>>>len(fruits)
2
65
Les Listes
index(L,x,a,b) retourne la position de la première occurrence de x
dans la liste L entre les deux positions a et b. si b n’est pas donné la
recherche s’éffectue de la position a à la fin.
67
Les Listes
>>> T=[6,4,8,4,9,4,7,4,9]
>>> T.remove(T[3])
>>> T → [6, 8, 4, 9, 4, 7, 4, 9]
>>> del(T[2])
>>> T → [6, 8, 9, 4, 7, 4, 9]
>>> a=T.pop()
>>> a → 9
>>> T → [6, 8, 9, 4, 7, 4]
>>> b=T.pop(-2)
>>> T → [6, 8, 9, 4, 4]
>>> b=T.pop(1)
>>> b
8
68
Les Listes
>>> T=[6,4,8,4,9,4,7,4,9]
>>> T.append([1,2,3])
>>> T → [6, 4, 8, 4, 9, 4, 7, 4, 9, [1, 2, 3]]
>>> T.extend([7,8,9])
>>> T → [6, 4, 8, 4, 9, 4, 7, 4, 9, [1, 2, 3], 7, 8, 9]
>>> T.insert(2,10000) # insére 10000 dans la position 2 de
la liste T
>>> T
[6, 4, 10000, 8, 4, 9, 4, 7, 4, 9, [1, 2, 3], 7, 8, 9]
>>> L=["Bon","Jour","Monsieur"]
>>> C="***".join(L)
>>> C
'Bon***Jour***Monsieur’
69
Les Listes
Exercice 7:
70
Les tuples
Vous savez qu’il n’est pas possible de changer les caractères au sein d’une chaîne
existante, alors que vous pouvez modifier les éléments d’une liste.
Un tuple est une collection d’éléments à l’intérieur de parenthèses séparés par des
virgules semblable à une liste mais il n’est pas modifiable.
Un tuple peut représenter une clé de dictionnaire ce qu’une liste ne peut faire.
Les tuples sont préférables aux listes partout où l’on veut être certain que les
données transmises ne soient pas modifiées par erreur.
>>> saisons = ("printemps", "été", "automne", "hiver")
>>> print(saisons)
('printemps', 'été', 'automne', 'hiver')
>>> print(saisons[2:3])
('automne',) Il faut toujours au moins
>>> print (("printemps",) + saisons[1:4]) une virgule pour définir
('printemps', 'été', 'automne', 'hiver') un tuple.
>>> saisons[2] = "Automne"
Pour accéder aux valeurs d’un tuple, on utilise les crochets de la même façon
qu’avec les listes.
72
Modification d’un tuple
On peut modifier certains éléments d’un tuple si ces éléments sont modifiables.
>>> T = (5, [0, 1, 2])
>>> print (T)
(5, [0, 1, 2])
>>> T[0] = 6
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
T[0] = 6
TypeError: 'tuple' object does not support item assignment
>>> T[1][0] = -1
>>> print (T)
(5, [-1, 1, 2]) 73
Suppression d’un tuple ou des éléments d’un tuple
Il est impossible de supprimer individuellement les éléments d’un tuple.
On peut assembler un nouveau tuple en omettant les éléments indésirables.
Pour supprimer explicitement un tuple entier, on utilise del :
del (teinte)
Les opérateurs *, +, in, [], == et les fonctions intégrées len, max, min
se comportent exactement de la même façon avec les tuples qu’avec les listes.
>>> T = (2, 3)
Les fonctions intégrées list() et tuple() permettent >>> T = list(T)
de convertir une liste en tuple ou vice versa. >>> print (T)
[2, 3] 74
Exercice 8:
1) Construire des listes de chaines de caractères valeur et couleur.
La première comprend les valeurs possibles d’une carte : 1, 2, 3,
. …, 9, Valet, Dame, Roi, As ; la deuxième les quatre couleurs
possibles : Trèfle, Carreau, cœur, pique.
Une carte sera codée par un couple. Par exemple, la Dame de Cœur
sera codée par le couple (‘Dame’,’Cœur’).
3) Ecrire une fonction afficherCarte qui prend en entrée un couple
correspondant à une carte et qui retourne la carte sous un format
compact, comme dans l’exemple ci-dessous :
>>>afficherCarte((‘Dame’, ‘Cœur’)) ➔ ‘DC’
>>>afficherCarte((‘3’,’Carreau’)) ➔ ‘3K’
>>>afficherCarte((‘As’, ’pique’)) ➔ ‘AP’
4) Ecrire une fonction Melanger(paquet) qui prend en paramètre la
liste paquet et la mélange d’une manière aléatoire.
75
Exercice 8:
5) Le bridge est un jeu pour 4 joueurs qui se joue avec un jeu de
52 cartes. On distribue l’ensemble des cartes aux joueurs. Chacun
reçoit ainsi 13 cartes qui forment ce que l’on appelle sa main. Les
joueurs forment deux équipes de deux et vont devoir dans un premier
temps essayer de communiquer le plus possible d’informations sur
leurs mains respectives via un système codifié d’enchères. Pour y
parvenir, chaque joueur doit évaluer au mieux la force de sa main. On
associe, pour ce faire, une valeur à certaines cartes :
✓ 1 point pour chaque valet
✓ 2 points pour chaque Dame
✓ 3 points pour chaque Roi
✓ 4 points pour chaque As
76
Exercice 8:
Exemple :
>>> m=mains()
>>> m[0]
[('As', 'Coeur'), (4, 'Coeur'), (8, 'Coeur'), (5, 'Pique'), (8, 'Carreau'),
(9, 'Pique'), (4,'Pique'), (10, 'Coeur'), (4, 'Carreau'), (3, 'Pique'), (10,
'Pique'), ('Roi', 'Pique'), ('Dame‘,'Coeur')]
77
Exercice 8:
6) Ecrire une fonction triMain qui prend en entrée une main et qui
retourne la main triée suivant l’ordre usuel du bridge.
Exemple :
>>> triMain(m[0])
[(4, 'Carreau'), (8, 'Carreau'), (4, 'Coeur'), (8, 'Coeur'), (10, 'Coeur'),
('Dame', 'Coeur'), ('As', 'Coeur'), (3, 'Pique'), (4, 'Pique'), (5,
'Pique'), (9, 'Pique'), (10, 'Pique'), ('Roi', 'Pique')]
>>> triMain(m[2])
[(4, 'Trèfle'), (5, 'Trèfle'), (6, 'Trèfle'), ('Valet', 'Trèfle'), ('Dame', 'Trèfle'),
(5,'Carreau'), ('Dame', 'Carreau'), ('As', 'Carreau'), (2, 'Coeur'),
(6,'Coeur'), (7, 'Coeur'), (2, 'Pique'), ('Valet', 'Pique')]
78
Exercice 8:
7) Ecrire une fonction Python afficherMain qui prend en entrée une main
(de treize cartes) et affiche la main triée sous un format compact,
comme dans l’exemple ci-dessous:
2T-5T-10T-RT-6K-10K-RK-AK-8C-AC-4P-7P-10P
8) Ecrire une fonction Python force qui prend en entrée la main d’un
joueur (donc une liste de treize cartes) et qui retourne la force de
cette main calculée comme décrit ci-dessus (diapositive précédente)
Exemple :
>>> m[2]
[(4, 'Trèfle'), ('Dame', 'Trèfle'), (5, 'Trèfle'), (2, 'Coeur'), ('As',
'Carreau'), (7, 'Coeur'), (6, 'Coeur'),
('Valet', 'Pique'), ('Valet', 'Trèfle'), (6, 'Trèfle'), (2, 'Pique'), (5, 'Carreau'),
('Dame', 'Carreau')]
>>> force(m[2])
10
79
Exercice 8:
80
Exercice 8:
Ecrire une fonction Python partieBridge sans entrée qui affecte une main
de treize cartes à chacun des quatre joueurs puis qui affiche pour chacun
d’entre eux la main, sa force et ses particularités. Par convention, les
joueurs au bridge sont appelés Nord, Sud, Est et Ouest.
>>> PartieBridge() #Voici un exemple d’utilisation de partieBridge
Nord :
2T-5T-10T-RT-10K-RK-AK-7C-8C-AC-4P-7P-10P
Force de la main : 14
Est :
2K-4K-5K-6K-7K-8K-DK-VC-DC-2P-3P-9P-DP
Force de la main : 7
Chicane Trèfle
Dominante Carreau
Sud :
3T-4T- DT- AT -3K-2C-3C -5C -6C- 5P - 6P-VP-AP
Force de la main : 11
Singleton Carreau
Ouest :
6T-7T-8T-9T –VT- 9K -VK -4C- 9C -10C –RC- 8P -RP
Force de la main : 8 81
Dictionnaires
Les types composites (chaînes de caractères, listes et tuples) considérés jusqu’à
maintenant étaient tous des séquences, i.e. des suites ordonnées d’éléments.
Un dictionnaire ressemble à une liste et est modifiable mais n’est pas une
séquence car les éléments enregistrés ne sont pas disposés dans un ordre
immuable.
On peut accéder à un élément d’un dictionnaire à partir d’une clé. Cette clé
peut être une chaîne, un nombre ou même d’un type composite sous certaines
conditions. On ne peut pas modifier les clés d’un dictionnaire.
Nous pouvons utiliser en guise de clés n’importe quel type de donnée non
modifiable : des entiers, des réels, des chaînes de caractères et même des tuples.
>>> sudoku = {}
>>> sudoku[(0, 1)] = 9
>>> sudoku[(0, 4)] = 5
>>> sudoku[(0, 7)] = 3
>>> print(sudoku)
{(0, 1): 9, (0, 7): 3, (0, 4): 5} Chaque clé dans un
>>> print(sudoku[(0,4)]) dictionnaire est unique.
5
>>> print(sudoku[(2,2)])
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print sudoku[(2,2)]
KeyError: (2, 2)
Les dictionnaires permettent tous les opérateurs de type standard mais n’autorisent
pas d’opérations telles que la concaténation, la répétition ou l’extraction d’un groupe
d’éléments contigus car les dictionnaires ne sont pas des séquences, c’est-à-dire
les éléments ne sont pas disposés dans un ordre particulier. 84
Les dictionnaires
Contrairement à une liste, nous ne faisons pas appel à une méthode particulière
telle que append() pour ajouter un nouvel élément à un dictionnaire. Il suffit de
créer une nouvelle paire clé-valeur.
>>> print(traduction)
{'mouse': 'souris', 'keyboard': 'clavier'}
>>> traduction["computer"] = "ordinateur"
>>> print(traduction)
{'computer': 'ordinateur', 'mouse': 'souris', 'keyboard': 'clavier'}
dict() : renvoie un dictionnaire issu par exemple d’une séquence où ses éléments
doivent être associés deux à deux. Le premier élément constituera une
nouvelle clé et le second sa valeur associée.
85
Supprimer des éléments d’un dictionnaire ou des dictionnaires entiers
86
Accès aux valeurs d’un dictionnaire
bleu---blue
vert---green
rouge---red
bleu---blue
vert---green
rouge---red
87
On doit vérifier si un dictionnaire possède une clé avant de tenter d’accéder à
sa valeur.
Vous pouvez mettre à jour un dictionnaire en lui ajoutant une nouvelle entrée ou
en modifiant une entrée existante.
>>> dictionnaire = {'rouge': 'red', 'vert': 'green', 'bleu': 'blue'}
>>> dictionnaire['noir'] = 'black'
>>> dictionnaire['bleu'] = 'BLUE'
>>> print(dictionnaire)
{'bleu': 'BLUE', 'noir': 'black', 'vert': 'green', 'rouge': 'red'}
Lorsqu’on affecte une valeur à une clé qui n’existe pas encore, la clé est créée
dans le dictionnaire et la valeur est ajoutée. Mais si la clé existe déjà, alors la
valeur existante est remplacée par la nouvelle.
>>> dictionnaire = {1: "vert", 1:"VERT"}
>>> print(dictionnaire)
{1: 'VERT'} 88
Fonctions et méthodes permettant de manipuler des dictionnaires.
>>> print(traduction.keys())
['computer', 'keyboard']
>>> print(traduction.values())
['ordinateur', 'clavier']
>>> print(traduction.has_key("mouse"))
False
>>> print(traduction.items())
[('computer', 'ordinateur'), ('keyboard', 'clavier')]
D.copy() : effectue une vraie copie d’un dictionnaire D au lieu d’un alias.
>>> conversion = traduction.copy()
>>> conversion["mouse"] = "souris"
>>> print traduction
{'computer': 'ordinateur', 'keyboard': 'clavier'}
>>> print conversion
{'computer': 'ordinateur', 'mouse': 'souris', 'keyboard': 'clavier'}
89
Exercice 9:
On dispose d’un dictionnaire associant à des noms de commerciaux
d’une société le nombre de ventes qu’ils ont réalisées.
Par exemple :
ventes= {"Amine":14, "Rachid":19, "Hamza":15, "Taha":21, "Aya":17}
90
Ensembles
Définition d’un ensemble. Opérations sur les ensembles. Accès, suppression et
ajout d’éléments d’un ensemble. Fonctions permettant de manipuler les
ensembles.
Les ensembles en Python
Ce sont des ensembles non ordonnés de valeurs distinctes. Ces valeurs peuvent
être de différents types.
Puisque les ensembles ne sont pas ordonnés, il n’est pas possible d’utiliser un
indice ni de sélectionner une tranche, et il n’existe pas de clé permettant d’accéder
aux valeurs.
93
Comment créer des ensembles et leur affecter des valeurs ?
Il n’existe pas de syntaxe particulière pour les ensembles comme il en existe par
exemple pour les listes et pour les dictionnaires.
98
Sous-ensemble de ou sur-ensemble de (<, <=, >, >=)
Inégalité stricte :
A<B signifie que A est un sous-ensemble de B mais n’est pas égal.
A>B signifie que A est un sur-ensemble de B mais n’est pas égal.
Inégalité au sens large :
A <= B signifie que A est un sous-ensemble de B mais les 2 ensembles
peuvent être égaux.
A >= B signifie que A est un sur-ensemble de B mais les 2 ensembles
peuvent être égaux.
>>> groupeA = set([" AB", "CD", « EF"])
>>> groupeB = set([" EF", "AB", "CD", "MN", "FG"])
>>> groupeA < groupeB
True
Union (|)
Cette opération est équivalente au OU logique entre ensembles. L’union de 2
ensembles est un autre ensemble dont chaque élément appartient au moins à
l’un des 2 ensembles. union() est une méthode équivalente à cette opération.
>>> s = set("aeiouy") | set(range(10))
>>> print (s)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'e', 'i', 'o', 'u', 'y'])
>>> set("aeiouy").union(set(range(10)))
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'e', 'i', 'o', 'u', 'y']) 99
Intersection (&)
Cette opération est équivalente au ET logique entre ensembles. L’intersection
de 2 ensembles est un autre ensemble dont chaque élément appartient aux 2
ensembles de départ. intersection() est une méthode équivalente à cette opération.
>>> set(range(10)) & set(range(5, 15))
set([8, 9, 5, 6, 7])
>>> s = set("proximités")
>>> s |= set("permissivité")
>>> print(s)
set(['é', 'e', 'i', 'm', 'o', 'p', 's', 'r', 't', 'v', 'x'])
-= Cet opérateur ne conserve que les membres de l’ensemble existant qui ne sont
pas membres de l’autre ensemble. difference_update() est une méthode
équivalente à cette opération.
>>> s = set("proximités")
>>> s -= set("permissivité")
>>> print(s)
set(['x', 'o']) 101
^= Cet opérateur ne conserve que les membres appartenant à l’un des deux
ensembles d’origine mais pas aux deux. symmetric_difference_update() est
une méthode équivalente à cette opération.
>>> s = set("proximités")
>>> s ^= set("permissivité")
>>> print s
set(['e', 'o', 'v', 'x'])
Fonctions intégrées
len() Retourne la cardinalité de l’ensemble.
>>> len(set("0123456789"))
10
>>> len(range(10))
10
>>> len(set(["a", "e", "i", "o", "u", "y"]))
6
102
Nous avons déjà mentionné l’existence de plusieurs méthodes s’appliquant aux
ensembles équivalentes à des opérateurs.
>>> s
set(['e', 'o', 'v', 'x'])
>>> t = s.copy()
>>> print t
set(['x', 'e', 'o', 'v'])
>>> t.add("u")
>>> print s
set(['e', 'o', 'v', 'x'])
>>> print t
set(['x', 'e', 'u', 'o', 'v'])
103
Sauvegarde des données d’un programme dans un fichier Fichiers
Nous allons considérer divers mécanismes permettant de créer
des fichiers,d’y envoyer des données et de les récupérer par après.
Lecture des données du fichier et transfert dans une variable de type string.
Puisque la méthode read est utilisée sans argument et puisque nous n’avions
inséré aucun caractère de séparation, la totalité du fichier est transférée. Ce
code est raisonnable si la taille des fichiers n’est pas trop importante.
106
Note : La méthode read peut être utilisée avec un argument, le nombre de
caractères à lire, à partir de la position déjà atteinte dans le fichier.
>>> FichierLogique.close()
Si la fin du fichier est déjà atteinte, read() renvoie une chaîne vide.
107
Exemple : Copie d’un fichier dans un autre, 10 caractères à la fois.
La méthode readlines() transfère toutes les lignes restantes dans une liste
de chaînes tandis que readline() renvoie une chaîne. 109
Exercice 10:
Pour sécuriser (d’une façon très simple) un message (ne contenant que
des lettres alphabétiques majuscules) que nous voulons transmettre on
peut le crypter par la méthode de césar de la façon suivante : la lettre A
devient D, B devient E, …, X devient A, Y devient B et Z devient C. La
figure suivante illustre ce cryptage.
L=[]
def Ajouter(L):
try:
x = int(input("Entrer un entier: "))
L.append(x)
except ValueError: # valeur non convertible par exemple
print("vous devez entrer un entier")
pass
def LectureFichier():
try:
f=open("D:\\message.txt","r")
print(f.read())
except IOError: # acces à un fichier qui n’existe pas par exemple
print("verifier le chemin d 'acces stp!!!!")
pass
Gestion des Exceptions sous Python
def f(a,b):
try:
f=a/b
print(f)
except ZeroDivisionError:
print("division par zero impossible, changer b")
pass
def modifier(L,i,x):
try:
L[i]=x
except IndexError: # Si i<0 ou i≥len(L)
print('indice incorrect')
pass
Bibliothèques mathématiques: Numpy, Linalg,…
• Les tableaux (arrays) sont des objets fournis par le module numpy.
Contrairement aux listes ils contiennent des objets de types identiques,
comme des flottants, des complexes ou des entiers.
• L’instruction : >>> from numpy import * permet de charger en mémoire
toute la bibliothèque numpy
• >>> T = array([0.1, 3, -1, 4, 6.7]) permet de convertir la liste [0.1, 3, -1, 4,
6.7] en un tableau de type array.
• >>> M=array([[0.4, 0.9, 4],[-1.5, 2, 1./3]]) permet de construire la matrice
[0.4, 0.9, 4]
[-1.5, 2, 1./3] à partir des deux listes [0.4, 0.9, 4] et [-1.5, 2, 1./3].
113
• >>> import numpy
• >>> A=[[0.4, 0.9, 4],[-1.5, 2, 1./3],[1,3,6]]
• >>> B=numpy.array(A)
• >>> B.trace()
8.4000000000000004
• >>> B.transpose()
array([[ 0.4 , -1.5 , 1. ],
[ 0.9 , 2. , 3. ],
[ 4. , 0.33333333, 6. ]])
• >>> A.trace()
• Traceback (most recent call last):File "<console>", line 1, in
<module> AttributeError: 'list' object has no attribute 'trace'
• >>> A.transpose()
Traceback (most recent call last):File "<console>", line 1, in
<module> AttributeError: 'list' object has no attribute 'transpose'
114
• >>> range(1,3,0.5)
Traceback (most recent call last):File "<console>", line 1, in
<module> TypeError: 'float' object cannot be interpreted as an
integer
• >>> arange(1,3,0.5)
array([ 1. , 1.5, 2. , 2.5])
• linspace(a,b,n) permet de créer un tableau dont les n
composantes sont uniformément réparties entre a et b.
• >>> from numpy import *
• >>> a=1;b=2;n=3;pas=(b-a)/(n-1)
• >>> linspace(a,b,n)
array([ 1. , 1.5, 2. ])
• >>> list(arange(a,b+pas,pas))
[1.0, 1.5, 2.0]
115
• >>> np.zeros(5)
array([ 0., 0., 0., 0., 0.])
• >>> np.ones((2,4)) # tableau 2d de taille 2 x 4 contenant des 1
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
• >>> B=numpy.array([[0.4, 0.9, 4],[-1.5, 2, 1./3],[1,3,6]])
• >>> C=zeros_like(B)
array([[ 0., 0., 0.], [ 0., 0., 0.],[ 0., 0., 0.]])
• >>> D=ones_like(B)
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
116
• >>> from numpy import *
• >>> T=random.rand(4) # pour un tableau 1d de 4 éléments
T= array([ 0.05662015, 0.58904519, 0.72276614, 0.13775529])
>>> T.dtype
dtype(’float64’)
• >>> X=random.randn(3,3) # pour une matrice aléatoire 3*3
• >>> X
array([[ 1.50331972, -0.56666019, -0.03043645],
[ 0.86226869, 0.07233328, 0.28352836],
[ 1.41434694, -0.67787242, 0.36466105]])
• >>> X=random.randint(0,9,5) # loi uniforme sur les entiers de
[0,9[ (donc [0,8])
• >>> #génération aléatoire de 5 entiers dans l'intervalle [0,8]
• >>> X
array([6, 7, 5, 5, 2]) 117
• >>> X=random.randint(0,9,(3,3)) # pour obtenir une matrice 3*3
à valeurs entières dans [0,8]
X= array([[3, 3, 5], [1, 2, 4], [2, 3, 1]])
• >>> T=diag(X,k=0); print(T)
[3 2 1]
• >>> T=diag(X,k=1); print(T)
[3 4]
• >>> T=diag(X,k=-1); print(T)
[1 3]
>>> M=eye(3) # matrice identité 3*3
M= array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
118
• >>> T=numpy.array([3,2.6,8,7,9,100.5])
• >>> T.ndim
1
• >>> T.shape
(6,)
• >>> M=reshape(T,(3,2))
M=array([[ 3. , 2.6],
[ 8. , 7. ],
[ 9. , 100.5]])
• >>> M[1][0]= 44
• M=array([[ 3. , 2.6],
[ 44. , 7. ],
[ 9. , 100.5]])
• >>> T
array([ 3. , 2.6, 44. , 7. , 9. , 100.5]) 119
• >>> M=random.randint(0,10,(4,4))
array([[9, 5, 2, 9],
[4, 8, 0, 6],
[8, 8, 3, 6],
[9, 1, 7, 0]])
• >>> M[:,1]
array([5, 8, 8, 1])
• >>> M[2,:]
array([8, 8, 3, 6])
• >>> M[2,3]
6
• >>> N=10*M
>>> C=4*M+2*N
• >>> C
• array([[216, 120, 48, 216],
• [ 96, 192, 0, 144],
• [192, 192, 72, 144],
• [216, 24, 168, 0]]) 120
• >>> M=random.randint(0,10,(2,2))
• >>> N=random.randint(0,10,(2,2))
• >>> S=M+N
• >>> M
array([[4, 6],
[6, 2]])
• >>> N
array([[4, 7],
[2, 4]])
• >>> S
array([[ 8, 13],
[ 8, 6]])
• >>> P=M*N # produit élément par élément
• >>> P
array([[16, 42],
[12, 8]])
121
• la multiplication matricielle s’obtient avec la fonction dot :
• >>> A=random.randint(0,10,(2,2))
• >>> A
• array([[0, 6],
[9, 9]])
• >>> B=random.randint(0,10,(2,2))
• >>> B
• array([[0, 5],
[8, 2]])
• >>> C=dot(A,B)
• >>> C
array([[48, 12],
[72, 63]])
• >>> D=A.dot(B)
• >>> D
• array([[48, 12], [72, 63]])
122
• Concaténation de tableaux, on utilise la fonction concatenate.
• >>>A=random.randint(0,10,(2,2))
• >>> B=random.randint(0,10,(2,2))
• >>> C=concatenate ((A,B),axis=0)
• >>> D=concatenate((A,B),axis=1)
• >>> A array([[9, 0],
[2, 3]])
• >>> B
array([[2, 8],
[0, 0]])
• >>> C
• >>> D
array([[9, 0],
array([[9, 0, 2, 8],
[2, 3],
[2, 3, 0, 0]])
[2, 8],
[0, 0]]) 123
Les références partagées et le module copy
• Par erreur, il y a des personnes qui pensent que la manière la
plus simple de copier une liste est de déclarer une variable et de
lui affecter ladite liste comme dans l’exemple ci-dessous:
liste_initiale = [1, 6.3, [‘Amrani', ‘Yassine']]
copie_liste = liste_initiale
print(copie_liste)
Résultat : [1, 6.3, [‘Amrani', ‘Yassine']]
• Mais en faisant cela, nous avons simplement créé un alias, c’est-
à-dire que nous avons instancié un nouvel objet qui partage la
même référence que la liste copiée! Autrement dit nous avons
donné un deuxième nom copie_liste de la liste liste_initiale.
liste_initiale = [1, 6.3, ['Amrani', 'Yassine']]
copie_liste = liste_initiale
liste_initiale[0]=4
print(liste_initiale)
print(copie_liste)
➔
[4, 6.3, ['Amrani', 'Yassine']]
[4, 6.3, ['Amrani', 'Yassine']]
On remarque clairement la dépendance entre la liste et sa copie.
Faire une shallow copy avec list() ou liste[:]
Essayons de voir si nous pouvons solutionner le problème en déclarant une
nouvelle liste et en lui affectant liste_initiale. Deux possibilités s’offrent à nous :
➔
[4, 6.3, ['Saadi', 'Anis']]
[1, 6.3, ['Saadi', 'Anis']]
[1, 6.3, ['Saadi', 'Anis']]
Avec le code ci-dessous, on arrive certes à faire une copie profonde
mais ce n’est pas l’idéal.
liste_initiale = [1, 6.3, ['Amrani', 'Yassine']]
copie_liste = list(liste_initiale); copie_liste[2] = list(liste_initiale[2])
liste_initiale[2][0]='Louhmadi'; liste_initiale[2][1]= 'Salim'
print(liste_initiale ); print(copie_liste)
➔ [1, 6.3, ['Louhmadi', 'Salim']]
[1, 6.3, ['Amrani', 'Yassine']]
Dans le cas d’une liste représentant un arbre (liste de listes de listes
de listes ….) la solution présentée en haut n’est pas très pratique!
Le module copy qui fonctionne avec tous les types mutables, permet
de faire deux sortes de copies différentes:
• la shallow copy (shallow signifie superficiel ou peu profond.)
• la deep copy (deep signifie profond.)
Pour utiliser ces deux méthodes, il faut importer le module copy:
• copy.copy effectue une shallow copy
• copy.deepcopy effectue une deep copy
• une shallow copy effectue une copie des éléments de premier
niveau. Elle copie les éléments 1 et 6.3 tandis que le troisième
élément (qui est une liste) devient une référence partagée. Cela
signifie que si vous remplacez « Amrani » par « Saadi » dans la
petite liste qui se trouve à l’indice 2 de la liste copie_liste, cette
modification affectera liste_initiale car ce n’est pas un élément de
premier niveau.
import copy
liste_initiale = [1, 6.3, ['Amrani', 'Yassine']]
copie_liste = copy.copy(liste_initiale)
liste_initiale[1]=7.15 ; liste_initiale[2][0]='Saadi';
liste_initiale[2][1]='Anis'
print(liste_initiale); print(copie_liste)
➔ [1, 7.15, ['Saadi', 'Anis']] [1, 6.3, ['Saadi', 'Anis']]
import copy
liste_initiale = [1, 6.3, ['Amrani', 'Yassine',[15,18]]]
copie_liste = copy.deepcopy(liste_initiale)
liste_initiale[1]=7.15 ; liste_initiale[2][0]='Saadi';
liste_initiale[2][1]='Anis' ; liste_initiale[2][2][1]=19
print(liste_initiale); print(copie_liste)
➔[1, 7.15, ['Saadi', 'Anis', [15, 19]]]
[1, 6.3, ['Amrani', 'Yassine', [15, 18]]]
Le module copy (avec ses méthodes shallow copy et deep copy)
fonctionne parfaitement avec d’autres objets mutables tels que les
dictionnaires.
import copy
dico = {"Nom" : "Amrani", 'Prénoms' : {'Prénom 1' : "Yassine",
'Prénom 2' : "Yasmine"}}
copie_dico = copy.deepcopy(dico)
copie_dico['Nom'] = "Saadi"
copie_dico['Prénoms']['Prénom 1'] = "Nissrine"
print(dico) ; print(copie_dico)
➔
{'Nom': 'Amrani', 'Prénoms': {'Prénom 1': 'Yassine', 'Prénom 2':
'Yasmine'}}
{'Nom': 'Saadi', 'Prénoms': {'Prénom 1': 'Nissrine', 'Prénom 2':
'Yasmine'}}
Le même raisonnement s’applique sur les tuples:
T1=(1,2,3,[4,6,[7,8,9]]) ; T2=T1; T3=copy.deepcopy(T1)
T1[3][0]=7777; print(T1); print(T2);print(T3)
➔ (1, 2, 3, [7777, 6, [7, 8, 9]])
(1, 2, 3, [7777, 6, [7, 8, 9]])
(1, 2, 3, [4, 6, [7, 8, 9]])
Le même raisonnement s’applique sur les ensembles
import copy
S1=set(); S1.add(10); S1.add('Master M1-GL');S1.update({11,12,13})
S2=S1 ; S3=copy.deepcopy(S1)
S2.remove(10) ; S3.remove(12); print(S1); print(S2); print(S3)
➔
{'Master M1-GL', 11, 12, 13}
{'Master M1-GL', 11, 12, 13}
{'Master M1-GL', 10, 11, 13}
Avec les objets de type str(), int() ou bien float(), il est inutile
d’utiliser le module copy puisque de toute façon, l’affectation va
créer un nouveau objet qui aura sa propre référence.
Base de données Sqlite sous python 3
135
import sqlite3 Connexion des bases de données avec Python
fichierDonnees = "C:/______________python cigma 20-21/DB1.sqlite"
conn=sqlite3.connect(fichierDonnees)
cur=conn.cursor()
cur.execute("INSERT INTO fournisseur
(numero_fr,nom_fr,ville_fr)VALUES(6401,'Ahmadi','meknes'),
(909,'A','B')")
cur.execute("SELECT * FROM fournisseur")
TableFournisseurs=cur.fetchall() # ou bien: list(cur)
cur.execute("delete FROM fournisseur where numero_fr=61")
conn.commit()
cur.close()
conn.close()
136
Base de données Sqlite sous python 3
def ListeDesProduit(numFour):
import sqlite3
fichierDonnees ="C:/DB1.sqlite"
conn=sqlite3.connect(fichierDonnees)
cur=conn.cursor()
requete="SELECT * FROM produit where numero_fr="+str(numFour)
cur.execute(requete)
resultat=cur.fetchall()
for r in resultat:
print(r)
cur.close()
conn.close() 141
Base de données Sqlite sous python
def InformationsProduit(REF):
import sqlite3
fichierDonnees = "C:/DB1.sqlite"
conn=sqlite3.connect(fichierDonnees)
cur=conn.cursor()
requete="SELECT * FROM produit where ref_produit="+str(REF)
print(requete)
cur.execute(requete)
resultat=cur.fetchone()
print(resultat)
cur.close()
conn.close() 142
Base de données Sqlite sous python
def InformationsProduit(DESIGN):
import sqlite3
fichierDonnees = "C:/DB1.sqlite"
conn=sqlite3.connect(fichierDonnees)
cur=conn.cursor()
requete="SELECT * FROM produit where désignation="+'"'+DESIGN+'"'
print(requete)
cur.execute(requete)
resultat=cur.fetchone()
print(resultat) ; cur.close() ; conn.close()
143
Base de données Sqlite sous python
four=(2999,'Louhmadi','Mohammedia'); f3=(112611,'Akrami','Casablanca')
def InsererFournisseur(f):
import sqlite3
fichierDonnees = "C:/DB1.sqlite"
conn=sqlite3.connect(fichierDonnees)
cur=conn.cursor()
requete="insert into fournisseur values"+str(f)
cur.execute(requete)
choix=input("Pour valider cette insertion taper O, sinon N:")
if choix=='O':
conn.commit()
else:
conn.rollback()
cur.close()
conn.close()
144
Introduction à la programmation Orienté Objet sous python 3
145
Introduction à la programmation Orienté Objet sous python 3
146
Introduction à la programmation Orienté Objet sous python 3
147
Introduction à la programmation Orienté Objet sous python 3
148
Introduction à la programmation Orienté Objet sous python 3
Introduction à la programmation Orienté Objet sous python 3
Introduction à la programmation Orienté Objet sous python 3
151
Introduction à la programmation Orienté Objet sous python 3
152
Surcharge d’opérateurs
153
Surcharge d’opérateurs
154
Surcharge d’opérateurs
158
Surdéfinition de fonctions
def f(x):
print("je suis une fonction avec un seul paramètre:"+str(x))
def f(x,y):
print("je suis une fonction avec deux paramètres:"+str(x)+ '
et '+ str(y))
print(f(100))
print(f(100))
print(f(1111,2222))
===========================➔
je suis une fonction avec un seul paramètre:100
je suis une fonction avec deux paramètres:1111 et 2222
160
Framework Django
161
Framework Django
162
Framework Django
Quels gros sites sont faits en Django ?
Disqus MichaelMoore.com
Pinterest newyorktimes.com
Instagram washingtonpost.com
Mahalo guardian.co.uk
bitbucket lawrence.com
lanyrd mercedesbenz.com
support.mozilla.com nationalgeographic.com
addons.mozilla.org discoverychannel.com
The Onion orange.ch
EveryBlock developer.vodafone.com
GiantBomb
ComicVine
163
Framework Django
Différences entre Django et php ?
Python et Django sont beaucoup plus rapides que PHP, Python peut
être très puissant, il est généralement utilisé pour les applications
complexes et volumineuses, mais il n’est pas aussi facile à déployer et à
maintenir que PHP. Donc, si vous faites du contenu Web traditionnel,
mieux vaut rester avec PHP. Les deux environnements ont leurs propres
avantages, il n’y a tout simplement pas de «meilleur». C’est plutôt
subjectif et dépend de vos besoins.
164
Framework Django
PostgreSQL.
MariaDB.
MySQL.
Oracle.
165
Framework Django
166
Framework Django
Démarrer Pycharm Edu et créer un nouveau projet
167
Framework Django
Localiser votre projet dans un dossier: MonDossierDjango (à créer)
168
Framework Django
Environnements virtuels:
Imaginons que vous travailliez avec la version 1.0 de Librairie1 dans un projet X.
Six mois plus tard, vous avez de nouveau besoin de cette librairie mais la version
a changé, il s'agit désormais de la 1.1. Vous installez donc la nouvelle version qui,
elle-même, dépend d'autres modules ! Très vite, un château de cartes instable
s'installe dans votre ordinateur.
L'idéal, me direz-vous, serait de pouvoir isoler les librairies installées par projet.
Ou même mieux : de pouvoir décider quel environnement de développement
nous souhaitons utiliser.
C'est exactement l'objectif des environnements virtuels : créer un
environnement comprenant une certaine version de Python et les librairies que
vous souhaitez. Si votre ordinateur était un immeuble, nous pourrions imaginer
qu'un environnement virtuel serait une pièce de cet immeuble dans laquelle vous
installez ce que vous souhaitez. Lorsque vous entrez dans la pièce, les librairies
installées sont accessibles. Mais lorsque vous la quittez, plus rien n'existe !
169
Framework Django
La meilleure pratique de Python consiste à créer une virtualenv pour
chaque projet. Pour ce faire, développez le nœud Interpréteur Python:
Nouvel environnement Virtualenv et sélectionnez un outil utilisé pour
créer un nouvel environnement virtuel.
Virtual environment qui n'a pas accès aux packages de sites globaux. Ainsi,
l'interpréteur n‘est pas au courant des packages nouvellement installés.
➔ Pour résoudre le problème, modifiez ou recréez simplement votre
interprète virtuel et cochez l' Inherit global site-packages option.
170
Framework Django
171
Framework Django
Apprenons Django avec un exemple complet sur les sondages:
Nous allons créer une application simple de sondage. Cela consistera
en deux parties :
➢Un site public qui permet à des gens de voir les sondages et d’y
répondre.
➢Un site d’administration qui permet d’ajouter, de modifier et de
supprimer des sondages (coté base de données).
Nous supposerons que Django est déjà installé. Vous pouvez savoir si
Django est installé et sa version en exécutant la commande suivante
dans un terminal:
-> py -m django --version
172
Framework Django
Vérifier l’installation de Django:
C:\mes donnees\_____________________________________________python pour Web 21-
22\MonDossierDjango> py -m django --version
C:\mes donnees\_____________________________________________python pour Web 21-
22\MonDossierDjango\Scripts\python.exe: No module named django
Le premier répertoire racine mysite/ est un contenant pour votre projet. Son
nom n’a pas d’importance pour Django ; vous pouvez le renommer comme
vous voulez.
175
Framework Django
176
Framework Django
Le serveur de développement:
C:\mes donnees\_____________________________________________python
pour Web 21-22\MonDossierDjango> cd mysite
C:\mes donnees\_____________________________________________python
pour Web 21-22\MonDossierDjango\mysite> py manage.py runserver
177
Framework Django
Vous verrez les messages suivants défiler en ligne de
commande :
You have 18 unapplied migration(s). Your project may not work properly
until you apply the migrations for app(s): admin, auth, contenttypes,
sessions.
Run 'python manage.py migrate' to apply them.
November 08, 2020 - 12:49:23
Django version 3.1.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
====➔ CTRL-C.
178
Framework Django
Cliquer sur le lien: http://127.0.0.1:8000
Si vous voulez changer cette valeur, passez-la comme paramètre sur la ligne de
commande. Par exemple, cette commande démarre le serveur sur le port 8080 :
...\> py manage.py runserver 8080
180
Framework Django
181
Framework Django
Création d’une application Polls (sondage):
Maintenant que votre environnement – un « projet » – est en place, vous êtes prêt
à commencer à travailler.
Chaque application que vous écrivez avec Django est en fait un paquet Python
qui respecte certaines conventions. Django est livré avec un utilitaire qui
génère automatiquement la structure des répertoires de base d’une
application, ce qui vous permet de vous concentrer sur l’écriture du code,
plutôt que sur la création de répertoires.
Dans ce qui suit, nous allons créer une application de sondage dans le même
dossier que le fichier manage.py pour qu’elle puisse être importée comme
module de premier niveau plutôt que comme sous-module de mysite.
Pour créer votre application, assurez-vous d’être dans le même répertoire
que manage.py et saisissez cette commande :
..\> py manage.py startapp polls
ou bien : django-admin startapp polls
ou bien : py -m django startapp polls
182
Framework Django
Cela va créer un répertoire polls, qui est structuré de la façon
suivante :
Une fonction de vue (ou vue pour faire simple), est une fonction Python
acceptant une requête Web et renvoyant une réponse Web. Cette
réponse peut contenir le contenu HTML d'une page Web, une redirection,
une erreur 404, un document XML, une image… ou n'importe quoi d'autre.
184
Framework Django
Objets HttpResponse: Attributs
Contrairement aux objets HttpRequest qui sont automatiquement créés par Django,
les objets HttpResponse sont de votre responsabilité en tant que développeur.
Chaque vue que vous écrivez est responsable d’instancier, de remplir et de
renvoyer un objet HttpResponse.
La classe HttpResponse se trouve dans le module django.http.
187
Framework Django
Dans le fichier polls/urls.py, insérez le code suivant :
from django.urls import path
from . import views
urlpatterns = [ path('', views.index, name='index'),]
- Le paramètre path: route: une chaîne contenant un motif d’URL.
- Le paramètre view: fonction de vue
-Le paramètre name: Les espaces de noms d’URL permettent la
résolution inverse de motifs d’URL nommés de manière unique (voir
Résolution inversée des URL à la diapositive 233 de ce cours).
Une URL est une adresse web. Elle est visible dans la barre d'adresse de
votre navigateur. (127.0.0.1:8000 est aussi une URL ….)
Chaque page internet a besoin de sa propre URL. C'est grâce à cela que
votre application sait ce qu'elle doit afficher à un utilisateur qui ouvre cette
URL.
188
Framework Django
L’étape suivante est de faire pointer la configuration d’URL racine
vers le module polls.urls. Dans mysite/mysite/urls.py, ajoutez une
importation django.urls.include et insérez un appel include() dans la
liste urlpatterns, ce qui donnera :
mysite/mysite/urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [ ……………………………………..,
path('admin/', admin.site.urls),]
189
Framework Django
La fonction include() permet de référencer d’autres configurations
d’URL. Quand Django rencontre un include(), il tronque le bout
d’URL qui correspondait jusque là et passe la chaîne de caractères
restante à la configuration d’URL incluse pour continuer le
traitement.
L’idée derrière include() est de faciliter la connexion d’URL. Comme
l’application de sondages possède son propre URLconf
(polls/urls.py), ses URL peuvent être injectés sous « /polls/ », sous
« /fun_polls/ » ou sous « /content/polls/ » ou tout autre chemin
racine sans que cela change quoi que ce soit au fonctionnement de
l’application.
Quand utiliser include() ?
Il faut toujours utiliser include() lorsque l’on veut inclure d’autres
motifs d’URL. admin.site.urls est la seule exception à cette règle.
190
Framework Django
Vous avez maintenant relié une vue index dans la configuration d’URL.
191
Gabarits
• Par sa nature liée au Web, Django a besoin d’un procédé de
génération dynamique de HTML. L’approche la plus couramment
utilisée est de se baser sur des gabarits. Un gabarit contient la
partie statique du résultat HTML souhaité ainsi qu’une certaine
syntaxe particulière définissant comment insérer le contenu
dynamique.
• Un gabarit Django est un document texte ou une chaîne Python,
balisés à l’aide du langage de gabarit de Django. Certaines
structures sont reconnues et interprétées par le moteur de
gabarit. Les principales sont les variables et les balises.
• Un gabarit est produit avec un contexte. Le processus de
production remplace les variables par leurs valeurs qui sont
cherchées dans le contexte, et il exécute les balises. Tout le reste
est affiché tel quel.
192
Gabarits
Les variables
Une variable affiche une valeur à partir du contexte, qui est un objet
de type dictionnaire faisant correspondre des clés à des valeurs.
def ViewGabarit1(request):
ch="Bonjour mes chers"
I=2020
R=3.14
template = loader.get_template('polls/gabarit1.html')
context = {'MaChaine':ch, 'MonInt':I, 'MonRéel':R }
return HttpResponse(template.render(context,request))
193
Gabarits
Tout d’abord, créez un répertoire nommé templates dans votre
répertoire polls. C’est là que Django recherche les gabarits.
196
Gabarits
Les variables
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit1.html
197
Gabarits
Les balises
Les balises permettent d’appliquer une logique arbitraire dans le
processus de rendu.
Par exemple, une balise peut produire du contenu, servir de
structure de contrôle telle qu’une instruction « if » ou une boucle
« for », extraire du contenu d’une base de données ou même de
donner accès à d’autres balises de gabarit.
Les balises sont entourées par {% et %}, comme ceci :
{% for e in DictionnaireDesVentes.items %}
<li> Le vendeur: {{ e.0 }} a vendu {{ e.1 }} produits</li>
<!--tester e[0]-->
{% endfor %}
198
Gabarits
Les variables
def ViewGabarit2(request):
199
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit2.html et
y insérer le gabarit suivant:
<h3> <p style="color:#FF0000";>Je vous réponds en utilisant
le gabarit "C:\______________python cigma 20-
21\mysite\polls\templates\polls\gabarit2.html" </p></h3>
{% if ifosGLM2%}
<h3>Le nombre d'éléments dans la liste ifosGLM2:
{{ ifosGLM2|length }} </h3>
{% else %}
La liste ifosGLM2 donnée par la vue est vide
{% endif %} 200
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('testGabarit2.html', views.ViewGabarit2),
……………]
201
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit2.html
202
Gabarits
La consultation de dictionnaire, d’attribut et d’indice
de liste (ou chaine ou tuple) est implémentée par
une notation pointée :
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
203
Gabarits
Les variables
def ViewGabarit3(request):
204
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit3.html et
y insérer le gabarit suivant:
<ol>
{% for e in DictionnaireDesVentes.items %}
<li> Le vendeur: {{ e.0 }} a vendu {{ e.1 }} produits</li>
<!--tester e[0]-->
{% endfor %}
</ol>
205
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('testGabarit3.html', views.ViewGabarit3),
……………]
206
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit3.html
207
Gabarits
Dans mysite/polls/view insérer la vue suivante:
def ViewGabarit4(request):
L=[100,200,300,400,500]
ch='Bonjour'
ventes = {"Amine": 14, "Rachid": 19, "Hamza": 15,
"Taha": 21, "Aya": 17}
template = loader.get_template('polls/gabarit4.html')
context = {'DictionnaireDesVentes':ventes, 'maListe':L,
'maChaine':ch }
return HttpResponse(template.render(context,request))
208
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit4.html et
y insérer le gabarit suivant:
{{DictionnaireDesVentes.keys}}<br>
{{maListe.0}}<br>
{{maListe.4}}<br> <!--tester 2:4-->
{{maChaine.3}}
<!--maChaine.replace('o','a')-->
{#ceci est un commentaire sur le gabarit 4#}
209
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('testGabarit4.html', views.ViewGabarit4),
……………]
210
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit4.html
211
Gabarits
Les filtres:
Les filtres transforment les valeurs de variables et les
paramètres de balises.
Ils ressemblent à ceci :
{{ liste | length }}
{{ chaine|upper }}
{{maChaine|add:" mes amis"}}
…..
212
Gabarits
Dans mysite/polls/view insérer la vue suivante:
import datetime
def ViewGabarit5(request):
L=[100,200,300,400,500]
ch='Bonjour'
Datecomplete=datetime.datetime.now()
Annee = Datecomplete.year
ventes = {"Amine": 14, "Rachid": 19, "Hamza": 15, "Taha": 21, "Aya": 17}
template = loader.get_template('polls/gabarit5.html')
context = {'DictionnaireDesVentes':ventes, 'maListe':L, 'maChaine':ch,
'DateActuelle':Datecomplete, 'Annee':Annee}
return HttpResponse(template.render(context,request))
213
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit5.html et y
insérer le gabarit suivant:
214
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('testGabarit5.html', views.ViewGabarit5),
……………]
215
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit5.html
216
Gabarits
Les moteurs de gabarit sont disponibles dans django.template.engines:
Dans mysite/polls/view insérer la vue suivante:
from django.template import engines
django_engine = engines['django']
217
Gabarits
218
Gabarits
Les variables
219
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/testGabarit6.html
220
Les URLs
Distribution des URL:
Une organisation propre et élégante des URL est un aspect
important dans une application Web de qualité. Django vous laisse
organiser vos URL comme bon vous semble, sans restriction
imposée par le système.
3) Django parcourt chaque motif d’URL dans l’ordre et s’arrête dès qu’il
trouve la première correspondance de path_info avec l’URL
demandée.
222
Les URLs
Processus de traitement des requêtes par Django
4) Une fois qu’un des motifs d’URL correspond, Django importe et appelle
la vue correspondante, qui est une fonction Python. La vue se voit
passer les paramètres suivants :
• Une instance HttpRequest.
• Si le motif d’URL correspondant ne contient pas de groupes
nommés, les correspondances de l’expression régulière sont
transmises comme paramètres positionnels.
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/’, views.article_detail),
• Inutile de préfixer vos URL d’une barre oblique, elles en ont toutes une.
225
Les URLs
Exemple: Processus de traitement des URLs par Django
•Une requête vers /articles/2005/03/ correspondrait à la troisième entrée
dans la liste. Django appellerait la fonction:
views.month_archive(request, year=2005, month=3).
227
Gabarits
Cas des listes contenant des listes …
228
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit8.html et y
insérer le gabarit suivant:
229
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('<int:debut>/<int:fin>/<int:pas>/<str:ch>/', views.ViewGabarit8),
……………]
230
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/1/10/1/avec/
231
Les expressions régulières
Le module re a été spécialement conçu pour travailler avec les expressions
régulières (Regular Expressions).
232
Les expressions régulières
233
Les expressions régulières
Pour rechercher au début de la chaîne: le signe ^.
Pour matérialiser la fin de la chaîne, vous utiliserez le signe $.
chat*:
Nous avons rajouté une astérisque (*) après le caractère t de chat.
Cela signifie que notre lettre t pourra se retrouver 0, 1, 2, … fois
dans notre chaîne. Autrement dit, notre expression chat* sera
trouvée dans les chaînes suivantes : 'chat', 'chaton', 'chateau',
'herbe à chat', 'chapeau', 'chatterton', 'chattttttttt'
import re
print(re.match('chat*','chapeau')!=None) ➔ True
print(re.match('chat*','chatterton')!=None) ➔ True
print(re.match('chat*','chameau')!=None) ➔ True
bat*e:
Cette expression est trouvée dans les chaînes suivantes :
'bateau', 'batteur' et 'joan baez'.
234
Les expressions régulières
235
Les expressions régulières: Les classes de caractères
•Vous pouvez préciser entre crochets plusieurs caractères ou classes de
caractères. Par exemple, si vous écrivez [abcd], cela signifie : l'une des
lettres parmi a, b, c et d.
•Pour exprimer des classes, vous pouvez utiliser le tiret - entre deux lettres
ou un chiffre ».
•Si vous voulez par exemple rechercher 5 lettres majuscules qui se suivent
237
Les expressions régulières
En plaçant un r avant le délimiteur qui ouvre notre chaîne, tous les
caractères anti-slash qu'elle contient sont échappés.
print(re.match(r'Fromage\s[a-zA-Z]{0,}', 'Fromage amk')!=None)
➔True
X='FromageLavacheQuiRit‘
print(re.match(r'Fromage\s[a-zA-Z]{0,}',X)!=None)
False
\ : symbole d'échappement ;
\d : classe des nombres entiers ;
\s : classe des caractères d'espacement ;
\w : classe des caractères alphanumériques ;
\D : négation de la classe \d ;
\S : négation de la classe \s ;
\W : négation de la classe \w ; 238
Les expressions régulières
. désigne tout caractère non spécial quel qu’il soit
\d désigne tout chiffre, est équivalent à [0-9]
\D désigne tout caractère différent d’un chiffre, est équivalent à [^0-9]
\s désigne tout espace ou caractère approché, est équivalent
à [\; \t\n\r\f\v]. Ces caractères sont spéciaux, les plus utilisés sont \t qui
est une tabulation, \n qui est une fin de ligne et qui \r qui est un retour
à la ligne.
\S désigne tout caractère différent d’un espace, est équivalent
à [^ \t\n\r\f\v]
\w désigne tout lettre ou chiffre, est équivalent à [a-zA-Z0-9\_]
\W désigne tout caractère différent d’une lettre ou d’un chiffre, est
équivalent à [^a-zA-Z0-9\_]
^ désigne le début d’un mot sauf s’il est placé entre crochets
$ désigne la fin d’un mot sauf s’il est placé entre crochets
239
Les expressions régulières
telephone='0645124511'
if re.match('^0[5-6]([.-]?[0-9]{2}){4}$',telephone):
print("oui, numero de telephone valide")
else:
print("Non ! numero de telephone invalide")
expression="^[a-zA-Z][A-Za-z0-9._-]+@[A-Za-z._-]+.[(com|fr|ma)]$"
for mail in mails:
if re.match(expression,mail)!=None:
print ("Ce mail : " +mail + " est valide")
else:
print ("Ce mail : " +mail + " est non valide")
oui, numero de telephone valide
Ce mail : olivier@mailbidon.com est valide
Ce mail : olivier@mailbidon.ma est valide
Erreur ce mail : 8@mailbidon.com est non valide
Erreur ce mail : @mailbidon.com est non valide
Erreur ce mail : olivier@mailbidon est non valide
Les URLs
Utilisation d’expressions régulières: Si la syntaxe des chemins et
convertisseurs n’est pas suffisante pour définir vos motifs d’URL, vous
pouvez également utiliser des expressions régulières. Pour ce faire,
utilisez re_path() à la place de path().
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)
Voici de nouveau l’exemple de configuration d’URL écrit en utilisant des
expressions régulières :
241
Les URLs
from django.urls import path, re_path ; from . import views
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',
views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$',
views.article_detail), ]
Cela fait plus ou moins la même chose que l’exemple précédent, sauf que :
➢L’URL précis qui va correspondre sera légèrement plus contraint. Par
exemple, l’année 10000 ne correspondra plus puisque les nombres entiers
des années sont limités à exactement quatre chiffres.
➢Chaque paramètre capturé est envoyé à la vue en tant que chaîne de
caractères, peu importe la correspondance qu’effectue l’expression régulière
(ce problème peut être géré en faisant des conversion dans les vues). 242
Les URLs
from django.urls import path, re_path ; from . import views
urlpatterns = [ path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
…………..]
➢Dans les deux cas, il est recommandé d’employer un seul style dans une
expression donnée. Lorsque les styles sont mélangés, tout groupe non
nommé est ignoré et seuls les groupes nommés sont transmis à la fonction
de vue.
243
Gabarits
Dans mysite/polls/view insérer la vue suivante:
from datetime import *
def ViewGabarit9(request,year, month, day):
d = date(int(year), int(month), int(day))
L=["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"]
ch="C'est un "+str(L[d.weekday()])
template = loader.get_template('polls/gabarit9.html')
context = {'reponse':ch}
return HttpResponse(template.render(context,request))
244
Gabarits
Créer le fichier html : mysite\polls\templates\polls \ gabarit9.html et y
insérer le gabarit suivant:
{{reponse}}
245
Gabarits
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
from django.urls import path, re_path
urlpatterns = [
re_path(r'^date/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/
(?P<day>[0-9]{2})/$', views.ViewGabarit9), ……………]
247
Gabarits
Démarrer le serveur et allez à :
http://127.0.0.1:8000/polls/date/20200/12/05/
248
Les URLs
Valeurs par défaut des paramètres de vue:
Une astuce pratique est de définir des valeurs par défaut pour les paramètres de
vos vues. Voici un exemple de configuration d’URL et de vue :
# URLconf
from django.urls import path
from . import views
urlpatterns = [ path('blog/', views.page),
path('blog/page<int:num>/', views.page), ]
# View (in blog/views.py)
def page(request, num=1):
. ...
Dans l’exemple ci-dessus, les deux motifs d’URL pointent vers la même
vue: views.page mais le premier motif ne capture aucun élément de l’URL. Si le
premier motif correspond, la fonction page() utilisera la valeur par défaut de son
paramètre num=1. Si le second motif correspond, page() utilisera la valeur capturée.
249
Les URLs
Résolution inversée des URL:
Django permet de travailler dans les deux sens suivants:
Le premier sens correspond à l’utilisation dont nous avons parlé dans les
sections précédentes. Le second correspond à ce qu’on appelle la résolution
inversée des URL, ou plus simplement l’inversion d’URL.
Django met à votre disposition des outils pour réaliser une inversion d’URL dans
les différentes couches où les URL sont nécessaires.
250
Les URLs
Exemples: Reprenons comme exemple cette ligne de configuration d’URL :
252
Les URLs
Les variables
Allez à polls/urls.py et ajouter l’ url suivant dans la liste urlpatterns :
urlpatterns = [
path('<int:N>/', views.ViewGabarit7),
……………]
253
Les URLs
Démarrer le serveur et allez à : http://127.0.0.1:8000/polls/2/
254
Les URLs
Allez à polls/urls.py et modifier l’ url pécédent dans la liste urlpatterns :
En ajoutant: 'name=URL_des_decalages‘
Et ajouter la ligne: path('ici/<int:X>/', views.redirect_to_autre_URL),
urlpatterns = [
path('<int:N>/', views.ViewGabarit7, name='URL_des_decalages'),
path('ici/<int:X>/', views.testredirect_to_autre_URL), ………]
Dans mysite/polls/view insérer la vue suivante:
from django.http import HttpResponseRedirect
from django.urls import reverse
def testredirect_to_autre_URL(request, X):
if X>1000: return HttpResponse ('vous avez saisi un grand entier ! ' )
else:
return HttpResponseRedirect(reverse('URL_des_decalages', args=(X,)))
255
Les URLs
Démarrer le serveur et allez à : http://127.0.0.1:8000/polls/ici/100/
http://127.0.0.1:8000/polls/ici/1000000/
256
Framework Django
Création d’une application Django pour les sondages
(polls) : Configuration de la base de données
Maintenant, ouvrez mysite/settings.py. C’est un module Python avec des
variables de module qui représentent des réglages de Django.
base de données sera un fichier sur votre ordinateur. Dans ce cas, NAME
def ViewGabarit5_v2(request):
from django.utils import timezone
d=timezone.now()
template = loader.get_template('polls/gabarit5_time_zone.html')
context = {'DateActuelle':d}
return HttpResponse(template.render(context,request))
urls.py:
path('test_time_zone.html', views.ViewGabarit5_v2),
259
Framework Django
il nous faut créer les tables dans la base avant de pouvoir les
utiliser. Pour ce faire, lancez la commande suivante :
py manage.py migrate
260
Framework Django
py manage.py migrate
261
Création d’une application Django pour les sondages (polls) : suite
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
# il ya aussi FloatField
263
Framework Django
Ici, chaque modèle est représenté par une classe qui hérite de:
django.db.models.Model. Chaque modèle possède des variables de classe,
chacune d’entre elles représentant un champ de la base de données.
Chaque champ est représenté par une instance d’une classe Field – par
exemple, CharField pour les champs de type caractère, et DateTimeField
pour les champs date et heure. Cela indique à Django le type de données
que contient chaque champ.
Le nom de chaque instance de Field (par exemple, question_text ou pub_date)
est le nom du champ en interne.
Notez que nous définissons une relation, en utilisant ForeignKey.
Cela indique à Django que chaque vote (Choice) n’est relié qu’à une seule
Question. Django propose tous les modèles classiques de relations :
plusieurs-à-un, plusieurs-à-plusieurs, un-à-un. 264
Framework Django
Activation des modèles:
Ce petit morceau de code décrivant les modèles fournit beaucoup
d’informations à Django. Cela lui permet de :
- Créer un schéma de base de données (instructions CREATE TABLE) pour
cette application.
- Créer une API Python d’accès aux bases de données pour accéder aux
objets Question et Choice (comme nous allons le voir dans la suite de ce
cours).
Mais il faut d’abord indiquer à notre projet que l’application de
sondages polls est installée.
265
Framework Django
Pour inclure l’application dans notre projet, nous avons besoin d’ajouter
une référence à sa classe de configuration dans le
réglage INSTALLED_APPS. La classe PollsConfig se trouve dans le
fichier polls/apps.py, ce qui signifie que son chemin pointé
est 'polls.apps.PollsConfig'. Modifiez le fichier mysite/settings.py et ajoutez
ce chemin pointé au réglage INSTALLED_APPS. Il doit ressembler à ceci :
monsite/settings.py
267
Framework Django
class Migration(migrations.Migration):
initial = True
fichier polls/migrations/0001_initial.py.
dependencies = [ ]
operations = [migrations.CreateModel(name='Question',
fields=[('id', models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')),
('question_text', models.CharField(max_length=200)),
('pub_date', models.DateTimeField(verbose_name='date
published')),
],
),
migrations.CreateModel( name='Choice',
fields=[ ('id', models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('votes', models.IntegerField(default=0)),
('question',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
to='polls.question')),
],
),
]
268
Framework Django
Il existe une commande qui exécute les migrations et gère
automatiquement votre schéma de base de données, elle s’appelle migrate.
Nous y viendrons bientôt, mais tout d’abord, voyons les instructions SQL
que la migration produit. La commande sqlmigrate accepte des noms de
migrations et affiche le code SQL correspondant :
269
Framework Django
270
Framework Django
Notez les points suivants :
•Ce que vous verrez dépendra de la base de données que vous utilisez.
L’exemple ci-dessus est généré pour SQLite.
•La relation de clé étrangère: explicite par une contrainte FOREIGN KEY.
•Ce que vous voyez est adapté à la base de données que vous utilisez.
Ainsi, des champs spécifiques à celle-ci
comme integer primary key autoincrement (SQLite) sont gérés pour vous
automatiquement. Tout comme pour les guillemets autour des noms 271 de
champs (simples ou doubles).
Framework Django
Remarquez la création de la base db.sqlite3 dans votre dossier: mysite
272
Framework Django
vous pouvez aussi exécuter python manage.py check; cette commande vérifie la
conformité de votre projet sans appliquer de migration et sans toucher à la base de
données.
(venv) C:\______________python cigma 20-21\mysite>py manage.py check
System check identified no issues (0 silenced).
La commande migrate sélectionne toutes les migrations qui n’ont pas été appliquées
(Django garde la trace des migrations appliquées en utilisant une table spéciale dans
la base de données : django_migrations (voir diapositive précédente: l’avant dernière
table) puis les exécute dans la base de données, ce qui consiste essentiellement à
synchroniser les changements des modèles avec le schéma de la base de données.
273
Framework Django
Remarquez la modification de la base db.sqlite3 dans votre dossier:
mysite (ajout de deux tables)
274
Framework Django
Les migrations sont très puissantes et permettent de gérer les
changements de modèles dans le temps, au cours du développement d’un
projet, sans devoir supprimer la base de données ou ses tables et en
refaire de nouvelles. Une migration s’attache à mettre à jour la base de
données en live, sans perte de données.
Exemple d’application :
1) Modifiez les modèles (dans models.py).Par exemple, ajouter la ligne:
question_type = models.CharField(max_length=100, default='polytique') à
la classe Question.
2) Exécutez py manage.py makemigrations polls pour créer des
migrations correspondant à ces changements.
3) Exécutez py manage.py migrate pour appliquer ces modifications à la
base de données.
4) supprimer question_type = models.CharField(max_length=100,
default='polytique') de la classe Question et refaire les étapes 2) et 3).
Framework Django
(venv) C:\______________python cigma 20-21\mysite>py manage.py makemigrations polls
Migrations for 'polls':
polls\migrations\0002_question_question_type.py
- Add field question_type to question
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
278
Framework Django
Jouer avec l’interface de programmation (API)
# Access model field values via Python attributes.
>>> Q.question_text
'vous voulez enseignement à distance ou présentiel?'
>>> Q.pub_date
datetime.datetime(2020, 11, 11, 13, 25, 21, 852167, tzinfo=<UTC>)
>>> Q.question_text=Q.question_text+ "ou enseignement hybride ?"
>>> Q.save()
>>> Q.question_text
'vous voulez enseignement à distance ou présentiel?ou enseignement
hybride ?‘
279
Framework Django
Jouer avec l’interface de programmation (API)
280
Framework Django
Jouer avec l’interface de programmation (API)
>>> timezone.now()
datetime.datetime(2020, 11, 11, 13, 53, 4, 556444, tzinfo=<UTC>)
>>> x=timezone.now() - datetime.timedelta(days=10)
>>> x
datetime.datetime(2020, 11, 1, 13, 53, 8, 102430, tzinfo=<UTC>)
281
Framework Django
Jouer avec l’interface de programmation (API)
Enregistrez ces modifications et retournons au shell interactif de Python
en exécutant à nouveau python manage.py shell ou bien Arrêter
(boutton 2: rouge) et reRun (Boutton 1) Shell Python
>>> Question.objects.all()
<QuerySet [<Question: vous voulez enseignement à
distance ou présentiel?ou enseignement hybride ?>]>
>>> Question.objects.filter(id=1)
<QuerySet [<Question: vous voulez enseignement à
distance ou présentiel?>]>
282
Framework Django
Jouer avec l’interface de programmation (API)
>>> Question.objects.filter(question_text__startswith='vous')
<QuerySet [<Question: vous voulez enseignement à distance ou
présentiel? ou enseignement hybride ?>]>
285
Framework Django
Ajout d’autres choix
>>> q = Question.objects.get(pk=1)
>>> q.choice_set.create(choice_text='Hybride', votes=15)
>>> q.choice_set.all()
<QuerySet [<Choice: Présentiel>, <Choice: Distantiel>, <Choice: Hybride>]>
286
Framework Django
Autres requêtes
>>> # Afficher les choix (objets Choice) ayant plus que 4 votes:
>>> Choice.objects.filter(votes__gt=4)
<QuerySet [<Choice: Présentiel>, <Choice: Distantiel>, <Choice: Hybride>,
<Choice: oui, je veux un café>, <Choice: matin>, <Choice: après-midi>]>
287
Framework Django
Autres requêtes
>>> #Donner la liste des questions ordonnées par la taille du champ question_text
from django.db.models.functions import Length
>>> Question.objects.order_by(Length('question_text').desc())
<QuerySet [
<Question: Vous êtes pour l'invertissement dans des projets commerciaux ou des
projets éducatifs ?>,
<Question: vous voulez enseignement à distance ou présentiel?ou enseignement
hybride ?>,
<Question: Vous préférez les écoles nationales ou celles de missions ?>,
<Question: Vous préférer faire la médecine ou l'ingénierie ?>,
<Question: Vous préférer cours le matin ou l'aprés midi ? >,
<Question: Vous voulez prendre un café ou non ?>
]>
288
Framework Django
Autres requêtes
>>> # incrémenter de 10, les votes du choix d’id=1(modifier)
>>> choix_1= Choice.objects.get(id=1)
choix_1.votes+= 10
choix_1.save()
Expressions F()
Un objet F() représente la valeur d’un champ de modèle ou d’une colonne
annotée (nommée). Il permet de se référer à des valeurs de champs de modèles
et d’effectuer avec elles des opérations en base de données sans avoir à les
récupérer préalablement de la base de données vers la mémoire Python.
Pour ça, Django utilise un objet F() pour générer une expression SQL qui
décrit l’opération requise au niveau de la base de données. 289
Framework Django
Autres requêtes
>>> from django.db.models import F
>>> from polls.models import Choice, Question
>>> choix_2_question_1= Choice.objects.get(id=2)
>>> print(choix_2_question_1.votes)
30
>>> choix_2_question_1.votes=F('votes') + 15
>>> choix_2_question_1.save()
>>> print(choix_2_question_1.votes)
F(votes) + Value(15)
>>> choix_2_question_1.refresh_from_db()
>>> print(choix_2_question_1.votes)
45 290
Framework Django
Lancement de requêtes SQL brutes
291
Framework Django
292
Framework Django
Lancement de requêtes SQL brutes: Exemple
py manage.py shell
>>>from polls.models import Choice, Question
>>>L=[p for p in Choice.objects.raw('SELECT * FROM polls_Choice')]
>>>print(L)
[<Choice: Présentiel>, <Choice: Distantiel>, <Choice: Hybride>, <Choice: oui, je
veux un café>, <Choice: non, je ne veux pas un café>, <Choice: matin>,
<Choice: après-midi>]
>>>L[0].votes
20
--------------------------------------------------------------------------------------------
>>> L=[p for p in Choice.objects.raw('SELECT * FROM polls_Question natural join polls_Choice')]
>>> L[0].votes
32
>>> L[0].pub_date
datetime.datetime(2020, 12, 2, 20, 39, 29, 466846)
293
Framework Django
Lancement de requêtes SQL brutes: Exemple
py manage.py shell
>>>from polls.models import Choice, Question
>>>L=[p for p in Choice.objects.raw('SELECT * FROM polls_Choice')]
>>>print(L)
[<Choice: Présentiel>, <Choice: Distantiel>, <Choice: Hybride>, <Choice: oui, je
veux un café>, <Choice: non, je ne veux pas un café>, <Choice: matin>,
<Choice: après-midi>]
294
Framework Django
Lancement de requêtes SQL brutes: Exemple
>>> L[0].votes
32
>>> L[0].pub_date
datetime.datetime(2020, 12, 2, 20, 39, 29, 466846, tzinfo=<UTC>)
295
Framework Django
Lancement de requêtes SQL brutes: Exemple
>>>
from polls.models import Choice, Question
L=[p for p in Question.objects.raw('SELECT * FROM polls_Question natural join
polls_Choice')]
Attributs_selectionnes=list(L[0].__dict__.keys())
DetailsSelection=""
for i in range(len(L)):
Details=[]
for e in Attributs_selectionnes[1:]:
Details+=[(e,getattr(L[i],e))]
DetailsSelection+=str(Details)+'\n'
print(DetailsSelection)
296
Framework Django
[[('id', 2), ('question_text', 'vous voulez enseignement à distance ou
présentiel?ou enseignement hybride ?'), ('pub_date', datetime.datetime(
2021, 12, 11, 10, 3, 18, 989038, tzinfo=<UTC>)), ('choice_text', 'Dista
ntiel'), ('votes', 425), ('question_id', 2)],
[('id', 4), ('question_text', "Vous préférer cours le matin ou l'aprés midi ? "), ('pub_date', d
atetime.datetime(2020, 11, 11, 17, 27, 21, 852167, tzinfo=<UTC>)), ('ch
oice_text', 'oui, je veux un café'), ('votes', 6), ('question_id', 3)],
[('id', 5), ('question_text', "Vous êtes pour l'invertissement dans de
s projets commerciaux ou des projets éducatifs ?"), ('pub_date', dateti
me.datetime(2020, 11, 23, 12, 27, 21, 852167, tzinfo=<UTC>)), ('choice_
text', 'non, je ne veux pas un café'), ('votes', 1), ('question_id', 3)],
[('id', 6), ('question_text', "Vous préférer faire la médecine ou l'
ingénierie ?"), ('pub_date', datetime.datetime(2020, 11, 15, 17, 27, 21
, 852167, tzinfo=<UTC>)), ('choice_text', 'matin'), ('votes', 20), ('qu
estion_id', 4)], [('id', 7), ('question_text', 'Vous préférez les école
s nationales ou celles de missions ?'), ('pub_date', datetime.datetime(
2020, 12, 11, 17, 27, 21, 852167, tzinfo=<UTC>)), ('choice_text', 'aprè
s-midi'), ('votes', 20), ('question_id', 4)]]
297
Framework Django
Lancement de requêtes SQL brutes: Exemple
>>> from polls.models import Choice, Question
>>> L=list(Choice.objects.raw('SELECT * FROM polls_Choice'))
>>> for e in L:
... print("pour le choix numéro:"+str(e.id)+"==> texte:"+e.choice_text+",
les votes="+str(e.votes))
...
pour le choix numéro:1==> texte:Présentiel, les votes=20
pour le choix numéro:2==> texte:Distantiel, les votes=45
pour le choix numéro:4==> texte:Hybride, les votes=15
pour le choix numéro:9==> texte:oui, je veux un café, les votes=6
pour le choix numéro:10==> texte:non, je ne veux pas un café, les votes=1
pour le choix numéro:11==> texte:matin, les votes=20
pour le choix numéro:12==> texte:après-midi, les votes=20
298
Framework Django
from polls.models import Choice, Question
# ci-dessous, problème id non sélectionné
X=[p for p in Choice.objects.raw('SELECT votes FROM polls_Choice')]
print(X)
➔ Voir : Choice.objects.values_list('votes’) diapositive 323
Ajout d’annotations
300
Framework Django
301
Framework Django
requete= "SELECT *, julianday(datetime('Now'))-julianday(pub_date) AS age "
requete = requete +" FROM polls_Question"
>>> L=Question.objects.raw(requete)
>>> for p in L:
... print("l'age de la question "+str(p.id)+" est:"+str(p.age))
...
l'age de la question 1 est:16.63683488406241
l'age de la question 2 est:37.936923009343445
l'age de la question 3 est:37.72858967585489
l'age de la question 4 est:25.936923009343445
l'age de la question 5 est:33.72858967585489
l'age de la question 6 est:7.7285896758548915
l'age de la question 8 est:0.12668954860419035
302
Framework Django
Exécution directe de code SQL
• Dans certains cas, même Manager.raw() ne suffit pas : il se peut
que des requêtes doivent être effectuées sans correspondre
proprement à des modèles ou que vous vouliez exécuter
directement des requêtes UPDATE, INSERT ou DELETE.
303
Framework Django
Exécution directe de code SQL
>>> from django.db import connection
>>> def mon_code_sql():
... L=[]
... with connection.cursor() as cursor:
... cursor.execute("UPDATE polls_Choice SET votes = votes+1")
... cursor.execute("SELECT * FROM polls_Choice")
... L=cursor.fetchall()
... print(L)
…
304
Framework Django
Exécution directe de code SQL
>>> mon_code_sql()
[(1, 'Présentiel', 26, 1), (2, 'Distantiel', 51, 1), (4, 'Hybride', 21, 1), (9,
'oui, je veux un café', 12, 2), (10, 'non, je ne veux pas un café', 7, 2),
(11, 'matin', 26, 3), (12, 'après-midi', 26, 3)]
>>> mon_code_sql()
[(1, 'Présentiel', 27, 1), (2, 'Distantiel', 52, 1), (4, 'Hybride', 22, 1), (9,
'oui, je veux un café', 13, 2), (10, 'non, je ne veux pas un café', 8, 2),
(11, 'matin', 27, 3), (12, 'après-midi', 27, 3)]
305
Framework Django
Référence de l’API QuerySet
• Méthodes renvoyant de nouveaux QuerySet: Django fournit un
grand nombre de méthodes d’affinage des QuerySet qui
modifient soit le type de résultats renvoyés par le QuerySet ou sa
façon d’exécuter la requête SQL.
• filter():
filter(**kwargs): Renvoie un nouveau QuerySet contenant les
objets qui répondent aux paramètres de recherche donnés.
• Les paramètres de recherche (**kwargs) doivent être dans le
format décrit dans les diapositives de Recherches dans les
champs ci-dessous. Plusieurs paramètres sont combinés
via AND dans l’instruction SQL sous-jacente.
306
Framework Django
Recherches dans les champs
• Par commodité, lorsqu’aucune recherche particulière n’est
indiquée (comme dans Choice.objects.get(id=4)), Django suppose
que la recherche souhaitée est exact.
• exact: Correspondance exacte. Si la valeur fournie pour la
comparaison vaut None, elle sera interprétée comme un NULL SQL.
Exemples :
Choice.objects.get(id__exact=4) SELECT ... WHERE id = 4
Choice.objects.get(id__exact=None) SELECT ... WHERE id IS NULL
• iexact: Correspondance exacte insensible à la casse.
Exemple : Choice.objects.get(choice_text__iexact='matin')
SELECT ... WHERE choice_text like ='matin'
307
Framework Django
Recherches dans les champs
• contains: Test d’inclusion sensible à la casse.
Exemple :
Choice.objects.get(choice_text__contains='matin')
SELECT ... WHERE choice_text LIKE ='%matin%‘
>>> Choice.objects.get(choice_text__contains='midi') ➔<Choice: après-midi>
>>> Choice.objects.get(choice_text__contains='Midi') ➔ <Choice: après-midi>
(vous constatez que: contains fonctionne comme icontains for SQLite)
• icontains: Test d’inclusion non sensible à la casse.
Exemple :
Choice.objects.get(choice_text__icontains='matin')
SELECT ... WHERE choice_text ILIKE ='%matin%'
>>> Choice.objects.get(choice_text__icontains='Midi') ➔<Choice: après-midi>
308
Framework Django
Recherches dans les champs
• in: Dans un itérable donné ; souvent une liste, un tuple ou un jeu
ou des chaînes.
Exemple :
Choice.objects.filter(id__in=[1,3,6])
SELECT ... WHERE id in (1,3,6)
>>> Choice.objects.filter(id__in=[1,4,9]) ➔
<QuerySet [<Choice: Présentiel>, <Choice: Hybride>, <Choice: oui, je veux un café>]>
• Pas de notin
309
Framework Django
Recherches dans les champs
lte: Plus petit ou égal à: <= gte: Plus grand ou égal à : >=
310
Framework Django
Recherches dans les champs
>>> import datetime
<Question: Vous préférer cours le matin ou l'aprés midi ? >, <Question: Vous êtes
pour l'invertissement dans des projets commerciaux ou des projets éducatifs ?>,
<Question: Vous préférer faire la médecine ou l'ingénierie ?>, <Question: Vous
préférez les écoles nationales ou celles de missions ?>]
311
Framework Django
Recherches dans les champs
Requêtes imbriquées:Exemple :
L= Choice.objects.filter(votes__lt=20)
>>> idCVF=id_choix_avec_votes_faibles
>>> text_choix_avec_votes_faibles=Choice.objects.filter(id__in=idCVF)
>>> text_choix_avec_votes_faibles
313
Framework Django
Référence de l’API QuerySet
>>>Question.objects.exclude(pub_date__lt=datetime.date(2020,12,3
0),question_text__icontains='préférer')
<QuerySet [<Question: vous voulez enseignement à distance ou présentiel?ou
enseignement hybride ?>, <Question: Vous voulez prendre un café ou non ?>,
<Question: Vous êtes pour l'invertissement dans des projets commerciaux ou
des projets éducatifs ?>, <Question: Vous préférez les écoles nationales ou celles
de missions ?>]>
315
Framework Django
Référence de l’API QuerySet
316
Framework Django
Référence de l’API QuerySet
>>> from polls.models import Choice, Question
>>> Question.objects.filter(question_text__istartswith='vous voulez')
<QuerySet [<Question: vous voulez enseignement à distance ou
présentiel?ou enseignement hybride ?>, <Question: Vous voulez
prendre un café ou non ?>]>
>>> A=Question.objects.filter(question_text__istartswith='vous
voulez').values(); print(A);
<QuerySet [{'id': 1, 'question_text': 'vous voulez enseignement à distance ou
présentiel?ou enseignement hybride ?', 'pub_date': datetime.datetime(2020,
12, 2, 20, 39, 29, 466846, tzinfo=<UTC>)}, {'id': 2, 'question_text': 'Vous voulez
prendre un café ou non ?', 'pub_date': datetime.datetime(2020, 11, 11, 13, 27,
21, 852167, tzinfo=<UTC>)}]>
>>> print(A[0]['pub_date'])
2020-12-02 20:39:29.466846+00:00 317
Framework Django
Les dates
>>> from polls.models import Question
319
Framework Django
Les datetimes
>>> S=Question.objects.datetimes('pub_date', 'second'); print(S)
320
Framework Django
regex et iregex
• regex: recherche par expression régulière, sensible à la casse.
321
Framework Django
regex et iregex
• iregex: recherche par expression régulière, non sensible à la
casse.
322
Framework Django
values_list
>>> qs1 = Choice.objects.values_list('votes')
>>> print(qs1)
<QuerySet [(32,), (57,), (27,), (18,), (13,), (32,), (32,)]>
>>> qs2 = Choice.objects.values_list('votes','question_id')
>>> qs2
<QuerySet [(32, 1), (57, 1), (27, 1), (18, 2), (13, 2), (32, 3), (32, 3)]>
323
Framework Django
Union, intersection, différence
>>> qs3=Choice.objects.filter(votes__lte=40).values_list('votes'); print(qs3)
<QuerySet [(32,), (27,), (18,), (13,), (32,), (32,)]>
>>> qs4=Choice.objects.filter(votes__gte=2).values_list('votes'); print(qs4)
<QuerySet [(32,), (57,), (27,), (18,), (13,), (32,), (32,)]>
>>> qs5=Choice.objects.filter(votes=57).values_list('votes'); print(qs5)
<QuerySet [(57,)]>
>>> inter=qs3.intersection(qs3,qs4,qs5); print(inter)
<QuerySet []>
>>> unionn= qs3.union(qs3,qs4,qs5); print(unionn)
<QuerySet [(13,), (18,), (27,), (32,), (57,)]>
>>> dif=qs4.difference(qs3,inter); print(dif)
<QuerySet [(57,)]>
324
Framework Django
Opérateurs renvoyant de nouveaux QuerySet
>>> qs3=Choice.objects.filter(votes__lte=40).values_list('votes'); print(qs3)
<QuerySet [(32,), (27,), (18,), (13,), (32,), (32,)]>
>>> qs4=Choice.objects.filter(votes__gte=2).values_list('votes'); print(qs4)
<QuerySet [(32,), (57,), (27,), (18,), (13,), (32,), (32,)]>
>>> inter=qs3&qs4; print(inter)
<QuerySet [(32,), (27,), (18,), (13,), (32,), (32,)]>
>>> unionn= qs3|qs4|qs5; print(unionn)
<QuerySet [(32,), (57,), (27,), (18,), (13,), (32,), (32,)]>
AND (&): Combine deux requêtes QuerySet en utilisant l’opérateur SQL AND (ET).
325
Framework Django
get()
• get(**kwargs): Renvoie l’objet correspondant aux paramètres de
recherche indiqués dans les diapositives précédentes. Vous devriez
utiliser des critères qui sont garantis comme uniques, tels que des clés
primaires ou des champs disposant d’une contrainte d’unicité (CIN,
CNE, Num_Permis, Num_Passeport,….).
• >>> Choice.objects.filter(votes__lte=40)
<QuerySet [<Choice: Présentiel>, <Choice: Hybride>, <Choice: oui, je
veux un café>, <Choice: non, je ne veux pas un café>, <Choice:
matin>, <Choice: après-midi>]>
329
Framework Django
aggregate()
• aggregate(….): Renvoie un dictionnaire de valeurs agrégées
(moyennes, sommes, etc.) calculées dans le QuerySet. Chaque
paramètre d”aggregate() définit une valeur qui sera incluse dans le
dictionnaire renvoyé.
>>> from django.db.models import Count
>>> q=Choice.objects.all().values_list('votes'); print(q)
<QuerySet [(32,), (57,), (27,), (18,), (13,), (32,), (32,)]>
>>> N= Choice.objects.aggregate(Count('votes')); print(N)
{'votes__count': 7}
>>> N= Choice.objects.aggregate(Count('votes',distinct=True)); print(N)
{'votes__count': 5} # notez bien: distinct en miniscule.
330
Framework Django
aggregate()
>>> from django.db.models import Min, Max, Avg, Sum
>>> mi= Choice.objects.aggregate(Min('votes')); print(mi)
{'votes__min': 13}
>>> ma= Choice.objects.aggregate(Max('votes')); print(ma)
{'votes__ max': 57}
>>> S= Choice.objects.aggregate(Sum('votes')); print(S)
{'votes__ sum': 211}
>>> moy= Choice.objects.aggregate(Avg('votes')); print(moy)
{' 'votes__ avg': 30.142857142857142}
331
Framework Django
update()
• update(**kwargs): Effectue une requête de mise à jour SQL pour
les champs indiqués et renvoie le nombre de lignes affectées (qui
n’est pas forcément égal au nombre de lignes mises à jour dans la
mesure où certaines lignes possèdent déjà la nouvelle valeur).
>>> q=Choice.objects.get(choice_text__startswith="oui")
>>> v=q.votes
>>>Choice.objects.filter(choice_text__startswith="oui").update(votes=v+10)
1
>>>Choice.objects.filter(choice_text__startswith="oui").update(votes=votes+10)
Traceback (most recent call last): File "<console>", line 1, in
<module> NameError: name 'votes' is not defined
332
Framework Django
delete()
• delete(): Effectue une requête de suppression SQL de toutes les
lignes de QuerySet et renvoie le nombre d’objets supprimés ainsi
qu’un dictionnaire avec le nombre de suppressions par type
d’objet.
>>> from polls.models import Choice
>>>C=Choice(choice_text="semi présentiel",votes=20, question_id=1)
>>> C.save()
>>> A=Choice.objects.filter(choice_text="semi présentiel"); print(A);
<QuerySet [<Choice: semi présentiel>]>
>>> Choice.objects.filter(choice_text="semi présentiel").delete()
(1, {'polls.Choice': 1})
>>> A=Choice.objects.filter(choice_text="semi présentiel"); print(A);
<QuerySet []> 333
Framework Django
Introduction au site d’administration de Django
334
Framework Django
Introduction au site d’administration de Django
À présent, ouvrez un navigateur Web et allez à l’URL « /admin/ » de votre
domaine local – par exemple, http://127.0.0.1:8000/admin/. Vous devriez voir
l’écran de connexion à l’interface d’administration , sinon redémarrer le
serveur : (venv) C:\_.......................\mysite>py manage.py runserver
Terminal➔MonDossierDjango\mysite>
py manage.py createsuperuser saidnouh
335 azerty
Framework Django
Introduction au site d’administration de Django
344
Framework Django
Exploration des fonctionnalités de l’interface d’administration
Maintenant que nous avons inscrit Question dans l’interface
d’administration, Django sait que cela doit apparaître sur la page d’index :
345
Framework Django
Exploration des fonctionnalités de l’interface d’administration
Cliquez sur « Questions ». À présent, vous êtes sur la page « liste pour
modification » des questions. Cette page affiche toutes les questions de la base
de données et vous permet d’en choisir une pour la modifier. Il y a la question
que nous avons créée précédemment :
346
Framework Django
Introduction au site d’administration de Django
Question +add ➔
Framework Django
•Le formulaire est généré automatiquement à partir du modèle Question.
•Les différents types de champs du modèle (DateTimeField, CharField)
correspondent au composant graphique d’entrée HTML approprié. Chaque
type de champ sait comment s’afficher dans l’interface d’administration de
Django.
•La partie inférieure de la page vous propose une série d’opérations :
•Enregistrer – Enregistre les modifications et retourne à la page liste pour
modification de ce type d’objet.
•Enregistrer et continuer les modifications – Enregistre les modifications et
recharge la page d’administration de cet objet.
•Enregistrer et ajouter un nouveau – Enregistre les modifications et charge un
nouveau formulaire vierge pour ce type d’objet.
•Supprimer – Affiche une page de confirmation de la suppression. 348
Framework Django
suivantes :
La page de sommaire des questions – affiche quelques-unes des dernières
questions.
•La page de détail d’une question – affiche le texte d’une question, sans les
résultats mais avec un formulaire pour voter.
•La page des résultats d’une question – affiche les résultats d’une question
particulière.
•Action de vote – gère le vote pour un choix particulier dans une question
précise.
349
Framework Django
350