Introduction à la Programmation Python
Introduction à la Programmation Python
Plan
• Généralités
• Entrées/sorties formatées
• Les tests et les boucles
• Les Collections
• Les Fonctions et exceptions
• Les modules et package python
• Les Fenêtres graphiques
• Le Graphisme
• Les Fichiers
• Programmation Orienté Objet en python
1
27/10/2024
Compilation et Interprétation
- Langage interprété :
- Langage compilé :
Python (interprété)
Certains langages modernes tentent de combiner
les deux techniques afin de garder le meilleur de chacune.
.py .pyc
2
27/10/2024
Installation python/windows
1 – Télécharger l’installateur Python directement depuis le site
[Link]. La dernière version le jour d’écriture des slides est :
[Link]
C:\> python -V
Python 3.x.z
Installation python/Linux
Installé par :
# sudo apt-get install python3
# sudo dnf install python3
Sous windows/Linux
#pip install pandas
3
27/10/2024
Conventions générales
• Un programme en python est nommé nom_prog.py
• Une instruction par ligne
• Un programme python doit être identé
4
27/10/2024
l‘Indentation
• L'indentation en python n'est pas seulement esthétique mais obligatoire
• Chaque niveau d'indentation représente un nouveau bloc de code.
• Un blocs de code est construit pour les boucles, les conditions, les
fonctions et les classes.
• Il est recommandé d’utiliser quatre espaces pour l'indentation. Sinon
un minimum d'un espace est obligatoire.
• La première ligne de code Python ne peut pas être indentée.
• Ne pas mélanger les tabulations et les espaces pour l'indentation
variables
5
27/10/2024
Saisie (input)
11
Affichage (print)
print("nom=",nom, end="")
print("nom=%s \n\t age=%d \n\t note=%f" %(n,a,t))
String Format(): crée variable dynamique par placeholder {}
quantite = 3
article = "ImprimanteHP"
prix = 1800
1 - Nommage
print(“Article {a} coûte {p} dirhams".format(p=prix, a= article))
2- Indexation
cmd=“je commande {2} article {0} pour {1} dirhams"
print([Link](article,prix,quantite))
3- Positionnement
cmd = "je commande{} articles {} pour {:.2f} dirhams."
print([Link](quantite, article, prix))
12
6
27/10/2024
f-string
f"…{}……"
- Variables:
prix= 59
txt = f“le prix est {prix} dirhams“
f-string
- Modificateur:
Un modificateur est inclus en ajoutant deux points :
suivis d'un type de formatage, comme :
.2f, <,>,b,o,d,h….
prix = 20.123
print(f“{prix:.2f}“) 20.12
print(f'{prix:>8}') 20.123
print(f'{prix :->8}') --20.123
print(f'{prix :-<8}') 20.123--
print(f'{prix:->15.8f}') ----20.12300000
7
27/10/2024
f-string
Fonctions :
txt = f“La surface est {sqrt(2) * my_fct(30)} mètre au
carré”
test
8
27/10/2024
range(5,50,10)
range(10,1,-2)
9
27/10/2024
boucle while
row = 1
while row <= 5:
*
col = 1
**
*** while col <= row:
**** print('*',end='')
****** col += 1
print('')
row +=1
break
10
27/10/2024
1- Tableau array
Liste non
2- Liste list Séquences
modifiable 3-Tuple tuple Ordonnées
index
4- Chaîne string
Ordonné
5- Dictionnaire dict par clé
Les tableaux
11
27/10/2024
tableau
module array
i : int
f : float
d : doule
u : caractère
Exemple(array)
12
27/10/2024
Module numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
print("après redimensionnement de A: ", A) marice 2x4 de 1 : [[1 1 1 1]
[1 1 1 1]]
Numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
print("après redimensionnement de A: ", A) marice 3x3 de 0 : [[0 0 0]
[0 0 0]
[0 0 0]]
13
27/10/2024
Numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
print("après redimensionnement de A: ", A) marice identité 3x3 : [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
Numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
print("après redimensionnement de A: ", A) marice 3x3 de rand :
[[0.73027733 0.11816261 0.12234324]
[0.08726113 0.52372866 0.18307537]
[0.12085452 0.01354457 0.71866588]]
14
27/10/2024
Numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
3
print("après redimensionnement de A: ", A) -9
6
0.3333333333333333
numpy
import numpy as np
print("marice 2x4 de 1 : ", [Link]((2,4),dtype=int)) #float par défaut
print("marice 3x3 de 0 : ", [Link]((3,3),dtype=int)) #float par défaut
print("marice identité 3x3 : ", [Link](3,3))
print("marice 3x3 de rand : ", [Link](3, 3)) # entre 0 et 1
A=[Link]([ [2,2,-3], [-2,-1,-9], [6,4,4]])
print([Link](A))
print([Link](A))
print([Link](A))
print([Link](A))
print("A est une matrice de taille :", [Link](A))
print("A est une matrice de dimension :", [Link](A))
[Link]=(1,9)
print("après redimensionnement de A: ", A)
A est une matrice de taille : 9
A est une matrice de dimension : (3, 3)
après redimensionnement de A:
[[ 2 2 -3 -2 -1 -9 6 4 4]]
15
27/10/2024
array vs numpy
import numpy as np
import array as arr
array/numpy
import numpy as np
import array as arr
T3=[Link]([6,8,0,'ensa'])
print(T3) ['6' '8' '0' 'ensa']
16
27/10/2024
Produit matriciel
import numpy as np
# produit, somme, transposé ...
m1 = [Link]([ [1, 2, 3], [4, 5, 6] ])
m2 = [Link]([ [2, 1, 3], [3, 2, 1] ])
m3 = [Link]([ [4],[2],[1] ])
A = [Link]([[3,1], [1,2]])
B = [Link]([[9],[8]])
print("solution du système AX=B est : ",[Link](A, B))
solution du système AX=B est : [[2.]
[ 3.]]
17
27/10/2024
Les Listes
18
27/10/2024
SLICING
19
27/10/2024
Nombre d’occurence
>>> L5=[-4,3,8,-7,10,2,10,70,80,90]
>>> [Link](10)
4
>>> [Link](10,5,8)
6
Ajout
>>> [Link]([70,80,90])
[-4,3,8,-7,10,2,10,70,80,90]
20
27/10/2024
>>> L0=[2,9]
>>> L1=[1,8]
>>> [Link](L0)
>>> L1
[1, 8, [2, 9]]
>>> len(L1)
3
21
27/10/2024
>>> L0
[2, 9, 3, 50, 9, 70, 80, 90]
>>> [Link](9)
>>> L0
[2, 3, 50, 9, 70, 80, 90]
pop (index) : Supprime et retourne l’élément d’indice index (si pas donnée le dernier)
>>[Link](1)
3
>>> L5
[2, 50, 9, 70, 80, 90]
>> [Link]()
90
>> [Link]()
80
>> L5
[2, 50, 9, 70]
>>> L5=[-4,3,8,-7,10,2,10,70,80,90]
>>> [Link]()
>>> L5
[90, 80, 70, 10, 2, 10, -7, 8, 3, -4]
>>> L6=[Link]()
>>> L6
[-4,3,8,-7,10,2,10,70,80,90]
>>> [Link]()
>>> L6
[]
22
27/10/2024
tri
23
27/10/2024
suppression
del list_name[index]
>>> del L5
Supprime toute la liste L5
Output : 9 62 286
24
27/10/2024
tri
sorted(list_name, reverse=bool)
filtrer
filter(Fonction, List)
e=filter(lambda x: x % 2 == 0, lst)
print (list(e))
Output : [20, 62]
Syntaxe : filter(fonction, séquence)
retourne <filter object > qui est un itérable.
list(e) créer une liste de tous les éléments renvoyés.
25
27/10/2024
Exemple
26
27/10/2024
Sélection/calcul
sur chaque élément
lst1 = [1,6,9,2,7,4,12,11,21,4]
lst2 = [ ]
for v in lst1:
if v%2==1 :
[Link](v**2)
2ème approche
res=[ expression]
27
27/10/2024
Exemple 1
1ème approche
# carrés des nombres impairs de lst1
lst1 = [1,6,9,2,7,4,12,11,21,4]
lst2 = [ ]
for v in lst1:
if v%2==1 :
[Link](v**2)
2ème approche
Exemple2
Approche 1 : append()
res = []
for x in range(1,5):
for y in range(1,5):
if x!=y:
[Link](x*y)
Approche 2: expression
28
27/10/2024
lstpoints =[(1,3),(9,2),(7,7),(8,4),(6,11),(3,9)]
enumerate
29
27/10/2024
30
27/10/2024
allocation automatique
Tableau A plein
typedef struct {
PyObject_VAR_HEAD //macro pour les types d’objets dont la longueur varie
PyObject ** ob_item;
Py_ssize_t allocated;
}PyListObject;
#define : demande au préprocesseur de remplacer un mot par une valeur dans tout le
code : simple rechercher/remplacer fait par le préprocesseur avant la compilation.
#define : permet aussi de remplacer un mot par un code source dans tous votre
projet: c’est une macro.
31
27/10/2024
Macro C PyObject_VAR_HEAD
return 0;
}
__sizeof__() : méthode intégrée qui renvoie la taille de la mémoire d'un objet en octets
>>> list=[]
>>> - Mémoire pour les méthodes
print(list.__sizeof__()) intégrées ….
40
>>> len(list)
0
32
27/10/2024
Implémentation interne
lst = []
print(lst.__sizeof__()) #40
[Link](10)
print(lst.__sizeof__()) #72
Implémentation interne
72=40+8*4
33
27/10/2024
Implémentation interne
Maintenant, lorsque nous ajoutons plus d'éléments, les espaces
alloués sont d'abord remplis
lst = []
print(lst.__sizeof__()) #40
[Link](10)
print(lst.__sizeof__()) #72
[Link]([22,33,44])
print(lst.__sizeof__()) #72
Implémentation interne
34
27/10/2024
Implémentation interne
lst = []
print(lst.__sizeof__()) #40
[Link](10)
print(lst.__sizeof__()) #72
[Link]([22,33,44])
print(lst.__sizeof__()) #72
[Link](99)
print(lst.__sizeof__()) #104=40+8*8
35
27/10/2024
string
Les chaînes sont des cas particulier des listes (listes de caractères).
String
-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
[index]
0 1 2 3 4 5 6 7 8 9 10
(11 éléments)
EnsaAgadir
s = "EnsaAgadir"
s[4] "A" s[6:9] "adi" s[::2] "EsAai"
s[:3] "Ens" s[7:] "dir" s[::-1] "ridagAasnE"
36
27/10/2024
tuple
37
27/10/2024
Lise de tuple
Soit la liste de données démographiques
demographie = [
demographie[2][2][2][1] 462
38
27/10/2024
39
27/10/2024
dictionnaire
Les clés peuvent être de type : str, int, float, tuple mais pas une
liste : une liste objet mutable, ne peut pas être une clé de
dictionnaire.
dictionnaire
{clé1:valeur1, clé2:valeur2,....}
Les dictionnaires n’étant pas ordonnés (non indicés par des entiers
mais par des clés), la technique du slicing n’est pas applicable
40
27/10/2024
dictionnaire
Les méthodes .keys(), .values() et .items() retournent les séquences
des clés, les valeurs et les (clés,valeurs) respectivement.
jours={1:"lundi",2:"mardi",3:"mercredi",4:"jeudi",5:"vendredi",6:"samedi",7:"dimanche"}
print ([Link]())
print ([Link]())
print ([Link]())
dict_items([(1, 'lundi'), (2, 'mardi'), (3, 'mercredi'), (4, 'jeudi'), (5, 'vendredi'), (6, 'samedi'), (7, 'dimanche')])
dict_keys([1, 2, 3, 4, 5, 6, 7])
dict_values(['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
Exercice
On considère le dictionnaire suivant dont les clés sont les noms des élèves et les valeurs
des clés sont les moyennes générales :
Admis : dont les clés sont les étudiants admis et les moyennes obtenues (moyenne
supérieurs ou égales à 10 ).
Ajournes : dont les clés sont les étudiants non admis et les moyennes obtenues
(moyenne inférieur ou égale à 10).
41
27/10/2024
correction
Admis = dict({})
Ajournes = dict({})
Exercice
creatures = [
{"nom" : "sammy", "espèce" : "requin", "numéro de réservoir" : "11", "type" : "poisson"},
{"nom" : "ashley", "espèce" : "crabe", "numéro de réservoir" : "25", "type" : "crustacé"},
{"nom" : "jo", "espèce" : "guppy", "numéro de réservoir" : "18", "type" : "poisson"},
{"nom" : "jackie", "espèce" : "homard", "numéro de réservoir" : "21", "type" : "crustacé"},
{"nom" : "charlie", "espèce" : "poisson-clown", "numéro de réservoir" : "12", "type" :
"poisson"},
{"nom" : "olly", "espèce" : "Tortue verte", "Numéro de réservoir" : "34", "type" : "tortue"}
]
42
27/10/2024
Réponse
creatures = [
{"nom" : "sammy", "espèce" : "requin", "numéro de réservoir" : "11", "type" : "poisson"},
{"nom" : "ashley", "espèce" : "crabe", "numéro de réservoir" : "25", "type" : "crustacé"},
{"nom" : "jo", "espèce" : "guppy", "numéro de réservoir" : "18", "type" : "poisson"},
{"nom" : "jackie", "espèce" : "homard", "numéro de réservoir" : "21", "type" : "crustacé"},
{"nom" : "charlie", "espèce" : "poisson-clown", "numéro de réservoir" : "12", "type" : "poisson"},
{"nom" : "olly", "espèce" : "Tortue verte", "Numéro de réservoir" : "34", "type" : "tortue"}
]
x=input("entrer mot de recherche")
res=[]
for v in creatures:
if x in [Link]() :
[Link](v)
print (res)
dictionnaire
43
27/10/2024
Exemple
jours={1:"lundi",2:"mardi",3:"mercredi",4:"jeudi",5:"vendredi",6:"samedi",
7:"dimanche"}
days=jours
days[2]=""الثالثاء
print ([Link]())
print ([Link]())
dict_values(['lundi', ''الثالثاء, 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
dict_values(['lundi', ''الثالثاء, 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
import copy
jours={1:"lundi",2:"mardi",3:"mercredi",4:"jeudi",5:"vendredi",6:"samedi",
7:"dimanche"}
days=[Link](jours) # days=[Link]()
days[2]=""الثالثاء
print ([Link]())
print ([Link]())
dict_values(['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
dict_values(['lundi', ''الثالثاء, 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
deepcopy() vs copy()
>>> dict = {'1': ‘aloua', '2': 'alami', '3': 'salimi', '4': {'age': '20', 'niveau': 'B'} }
>>> deep=[Link](dict)
>>> dict["4"]["age"]='30‘
>>> dict
{'1': ' aloua ', '2': 'alami', '3': 'salimi', '4': {'age': '30', 'niveau': 'B'}}
>>> cop
{'1': ' aloua ', '2': 'alami', '3': 'salimi', '4': {'age': '30', 'niveau': 'B'}}
>>> deep
{'1': ' aloua ', '2': 'alami', '3': 'salimi', '4': {'age': '20', 'niveau': 'B'}}
44
27/10/2024
set
set est une collection non ordonnée, itérable, mutable (add() et
remove() et pop() ) et ne comporte aucun doublant. set n’est pas
une séquence (les éléments ne sont pas ordonnés, donc non
accessibles par des indices entiers), mais ils supportent l’itération
(l’ordre n’étant cependant pas significatif).
set
[Link](B) : Renvoie un set contenant tous les éléments des deux
ensembles, les doublons sont exclus : opérateur |
[Link](B) : Revoie l’intersection: opérateur &
[Link](B) : crée un set avec tous les éléments qui existe uniquement
dans A mais pas dans B : opérateur -
A.symmetric_difference(B) : Inclut tous les éléments de A et B sans les
éléments communs. Opérateur ^
45
27/10/2024
Exercice1
ch=input("entre chaine")
p=set(ch)
for car in p:
print ("caractère %c figure %d fois" %(car, [Link](car)))
Comparaison
Création?? [] () {} {}
46
27/10/2024
fonction
Exercice
creatures = [
{"nom" : "sammy", "espèce" : "requin", "numéro de réservoir" : "11", "type" : "poisson"},
{"nom" : "ashley", "espèce" : "crabe", "numéro de réservoir" : "25", "type" : "crustacé"},
{"nom" : "jo", "espèce" : "guppy", "numéro de réservoir" : "18", "type" : "poisson"},
{"nom" : "jackie", "espèce" : "homard", "numéro de réservoir" : "21", "type" : "crustacé"},
{"nom" : "charlie", "espèce" : "poisson-clown", "numéro de réservoir" : "12", "type" :
"poisson"},
{"nom" : "olly", "espèce" : "Tortue verte", "Numéro de réservoir" : "34", "type" : "tortue"}
]
Ecrire une fonction pour filtrer la liste cratures extraire les espèces
via une valeur quelconque val de de ses clés.
47
27/10/2024
Réponse
print(list((filtre(creatures, "crustacé"))))
48
27/10/2024
maFonction(c=30)
maFonction(c=8, b="Hello", a=3)
maFonction()
Arguments Arbitraires : *
Il est possible de déclarer une fonction qui accepte un nombre
quelconque de paramètres : on compacte les paramètres sous
la forme d’un tuple grâce à l’opérateur *.
Par convention, on appelle généralement ce tuple args :
def moy(*args):
nb = len(args)
somme = 0
for v in args:
somme += v
return somme / nb
print(moy (4,6,8,1,23))
49
27/10/2024
Arguments Arbitraires : **
def afficher_params(**kwargs):
for k, v in [Link]():
print("Paramètre", k, "qui a comme valeur", v)
Arguments Arbitraires : * , **
Il est possible d’associer les deux formes de compactage est
ainsi créer une fonction qui accepte n’importe quels
paramètres :
nb = len(args)
somme = 0
for v in args:
somme += v
return somme / nb
print(fonction_libre(4,6,8,1,prenom="aziz", age=17,filiere="SITCN"))
50
27/10/2024
def fonction(*args):
Lors de l’appel d’une fonction, il nb = len(args)
est possible d’utiliser des somme = 0
paramètres sous forme d’une for v in args:
liste. On utilise pour cela
somme += v
l’opérateur * parfois appelé
unpack operator. return somme / nb
dict={"prenom":"aziz", "age":17,"filiere":"SITCN"}
fonct(**dict)
51
27/10/2024
def add(a):
x=3
return a+x - x n’existent que dans la fonction. Il n’existe pas
en dehors de la fonctions
- X est détruit lorsque l’on sort du bloc de la
fonction.
print(add(4))
print(x) NameError: name ‘x' is not defined
x=7 x=7
def add(a): def add(a):
return a+x x=3
11
return a+x
print(add(4))
print(add(4))
7
print(x) 7
52
27/10/2024
print(add(4))
7
print(x) 3
import sys
compteur = 0
def comptage() :
global compteur
compteur = compteur + 1
print(compteur)
if compteur==3 :
[Link](0)
1
for i in range (10): 2
comptage() 3
53
27/10/2024
def externe():
print(‘externe fonction’)
def interne():
print('interne fonction’)
interne()
def externe():
message = 'externe fonction' Pour la fonction interne,
print(message) python ne trouve pas
la variable message dans la
def interne(): portée locale. Python la
print(message) externe fonction recherche donc dans la portée
interne() externe fonction englobante externe.
externe()
54
27/10/2024
portées globale
externe()
def externe():
message = 'externe scope'
print(message)
def interne():
message = 'interne scope'
print(message)
interne()
externe scope
print(message) interne scope
externe() externe scope
55
27/10/2024
def externe():
message = 'externe scope'
print(message)
def interne():
nonlocal message
message = 'interne scope'
print(message)
interne()
externe scope
print(message) interne scope
externe() interne scope
56
27/10/2024
Fonction lambda
Syntaxe
lambda arguments : une expression
Une fonction lambda est une petite fonction anonyme qui peut
prendre n'importe quel nombre d'arguments, mais ne peut avoir
qu'une seule expression.
L'expression est exécutée et le résultat est renvoyé.
x = lambda a : a + 10
print(x(5))
print((lambda x : x*x*x)(10))
57
27/10/2024
l = [1, 2, 3, 4, 5, 6]
res = list(map(lambda x: x*x, l))
res=[v*v for v in l]
print(res)
l = [1, 2, 3, 4, 5, 6]
res = filter(lambda x: x % 2 == 0, l)
for num in res:
print(num, end=" ")
58
27/10/2024
calcule ((((1+2)+3)+4)+5)
récursivité
59
27/10/2024
Fonction récursif
Exemple : somme des n premiers naturels.
def sum1 ( n):
result = 0
while n > 0:
result += n
n -= 1
return result
print (sum1(10))
print (sum2(10))
print(sum([n for n in range(10)]))
Même résultat : 55
119
Fonction récursif
renvoie (1+2+3+4+5+6+7+8+9)+10
renvoie (1+2+3+4+5+6+7)+8
appel sum(9)
sum(8)
appel ………………
.................
renvoie (1) + 2
……………….
renvoie 1
sum(2)
appel
sum(1)
appel
60
27/10/2024
Exemple
Ecrire une fonction récursive « Binaire » permettant
d’imprimer à l’écran la représentation binaire d’un
nombre N.
def binaire(N):
if N == 0:
return []
return binaire(N//2)+[N % 2]
print(binaire(129))
Exemple
def maximum(T):
if len(T) == 1:
return T[0]
m = len(T)//2
max1 = maximum(T[:m])
max2 = maximum(T[m:])
if max1 > max2:
return max1
return max2
61
27/10/2024
Objet Python
Un objet python est caractérisé par:
son identité (un entier qui identifie de manière
unique l’objet) ;
un type (qui identifie les opérations que vous pouvez
effectuer avec votre objet)
le contenu de l'objet.
>>obj=[1,2,3]
>>> id(obj)
2698212637504 # the identity of `obj`
>>> type(obj)
<class 'list'> # the type of `obj`
>>> obj
[1, 2, 3] # the contents of `obj`
62
27/10/2024
immutable
String est immutable car une fonction qui la modifie retourne un nouveau
objet avec un noveau id:
>>> ch="ensa"
>>> id(ch)
1470285519760
>>> id([Link]())
1470285314592
Une autre façon de vérifier que string est immutable et qu’elle ne supporte
pas l’attribution par indice:
>>> ch[2]='v'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
lorsqu'une chaîne est créée, elle reste la même. Si on change la chaîne alors on crée un autre objet. De
même pour int, float , tuple, bool…
63
27/10/2024
x=a
id(a) = id(x) li=l li=l
id(li) = id(l) id(li) = id(l)
Mais int est imutable: Le type liste est mutable: Mais li=[42,73,0]
Si on change x alors on crée On peut changer le contenu Change l’id de li vers
un autre objet sans changer le type et id. la nouvelle liste
id(a) # id(x) car imutable
Copie superficielle
Les listes et les dictionnaires ont une méthode membre copy qui
renvoie une copie superficielle de l'objet correspondant.
Regardons un exemple avec une liste :
64
27/10/2024
Copie superficielle
>>> l0[2].append(99)
>>> l2
[1,2, [99]]
>>> l1
[1,2, [99]]
Lorsque nous modifions le contenu de l0,
même l2 répercute ces changements...
Copie profonde
Pour ne pas partager des références aux objets internes lors de la
copie, nous devons effectuer une « copie profonde » de l’objet :
comme un algorithme récursif.
Voici une implémentation récursive simple d'une copie profonde
pour les listes qui contiennent d'autres listes :
def mydeepcopy(l):
return [elem if not isinstance(elem, list) else
mydeepcopy(elem) for elem in l ]
l1 = [42, 73, []]
l2= mydeepcopy(l1)
l1= [42, 73, [73]]
l1[2].append(73) l2= [42, 73, []]
print("l1=", l1)
print("l2=", l2)
65
27/10/2024
66
27/10/2024
Fichier [Link]
Notes:
# module prog1 Les espaces de noms sont des dictionnaire:
x = 23 clé/valeur, la clé est l’espace de nom, la valeur est
y=9 une list
l = [1,2,3] On peut utiliser dir() sur un espace de noms
import math
def f(p_x): print(dir(math) )
return 3*p_x+1 print(dir()) | print(dir("[Link]"))
x y l f
23 9 [1,2,3] la fonction f
L'import effectue une recopie des noms, qui référencent les mêmes données.
Fichier [Link]
# module prog2
x=2
from prog1 import *
y = 11
[Link](4)
print(f(y))
67
27/10/2024
L'import effectue une recopie des noms, qui référencent les mêmes
données.
Fichier [Link] Fichier [Link]
# module prog1 # module prog2
x = 23 x=2
y=9 from prog1 import *
l = [1,2,3] y = 11
[Link](4)
def f(p_x): print(f(y))
return 3*p_x+1
x y l f x y l f
23 9 [1,2,3] la fonction f 2
L'import effectue une recopie des noms, qui référencent les mêmes
données.
Fichier [Link] Fichier [Link]
# module prog1 # module prog2
x = 23 x=2
y=9 from prog1 import *
l = [1,2,3] y = 11
[Link](4)
def f(p_x): print(f(y))
return 3*p_x+1
x y l f x y l f
23 9 [1,2,3] la fonction f 2 11
68
27/10/2024
x y l f x y l f
23 9 [1,2,3,4] la fonction f 2 11
Espaces de noms
x y l f prog1
23 9 [1,2,3] la fonction f
69
27/10/2024
Espaces de noms
x y l f prog1 x
23 9 [1,2,3] la fonction f -3
Espaces de noms
x y l f prog1 x
23 5 [1,2,3] la fonction f -3
70
27/10/2024
x y l f x y l f prog1 x
23 5 [1,2,3,4] la fonction f 2 11 -3
Algorithmes de tri
71
27/10/2024
72
27/10/2024
Au départ, la main gauche est vide, donc elle bien triée. À chaque fois que l'on
insère une carte depuis la main droite, la main gauche reste triée, et la main
droite (l'ensemble des cartes non triées) perd une carte.
Tri insertion
import random
def tri_insertion(liste):
L = list(liste) # copie de la liste
N = len(L)
for i in range(1,N):
cle = L[i]
j = i-1
while j>=0 and L[j] > cle:
L[j+1] = L[j] # decalage
j = j-1
L[j+1] = cle
return L
liste = []
for k in range(10):
[Link]([Link](0,20))
liste_triee = tri_insertion(liste)
print(liste_triee)
73
27/10/2024
Fonction fusion
L'algorithme maintient trois pointeurs, un pour chacun des deux tableaux et un pour
maintenir l'index actuel du tableau trié final.
74