Python
Python
Houda ANOUN
[email protected]
Participation & discipline
Présence
Mini-projet
Quizs à l’improviste
Examen final
Maitrise de la syntaxe du langage Python
Compréhension d’un code Python et exécution pas à pas sur papier
Développement de l’art de la programmation en python :
Apprendre à penser de manière algorithmique pour résoudre un problème
Encourager l’utilisation de bonnes pratiques de programmation : lisibilité, modularité
réutilisabilité de code
Promouvoir la recherche de solutions élégantes et efficaces
Favoriser la créativité dans la résolution de problèmes (interdiction d’utiliser les modèles de
langage de type ChatGPT pour résoudre les exercices)
Favoriser l’expérimentation et l’esprit critique : explorer différents algorithmes et identifier
le plus performant
Mini-projet : mettre en pratique les compétences acquises et encourager le travail en équipe
Eléments de base du langage Python
Variables
Types élémentaires et opérateurs
Entrées /sorties
Structures conditionnelles et itératives
Fonctions
Modules
Structures de données prédéfinies : listes, tuples, strings, ensembles et dictionnaires
Manipulation des fichiers
Classes et objets
Python est un langage de programmation interprété : chaque ligne de
code est lue puis interprétée pour être exécutée par l’ordinateur
Atouts :
Multiplateforme : il fonctionne sur de nombreux systèmes
d'exploitation :Windows, Mac OS X, Linux, Android, iOS
Facile à appréhender
C'est un langage de haut niveau. Il demande relativement peu de
connaissances sur le fonctionnement d'un ordinateur pour être utilisé
Riche : types de données, branchements conditionnels, boucles,
organisation du code en procédures et fonctions, objets et classes
Il dispose de plusieurs librairies très performantes, notamment pour le
calcul scientifique et IA(Numpy, Pandas, Scikit-learn, Keras etc)
Dans un interpréteur de
commandes, le symbole >>>
correspond au signal d’invite,
(prompt principal), il indique que
Python est prêt à exécuter une
commande.
Les lignes non précédées de ce
symbole correspondent à l’affichage
d’un résultat.
Après avoir saisi chaque instruction,
il suffit de taper sur la touche Entrer
pour que la commande soit
exécutée (interprétée)
Une variable est une zone de la mémoire de l’ordinateur dans laquelle une valeur est stockée
En Python, la déclaration d’une variable et son initialisation se font en même temps.
Les variables en Python sont dynamiquement typées, ce qui signifie que le type d'une variable
peut changer au cours de l'exécution du programme.
Exemple :
bool : correspond au type booléen, il prend deux valeurs possibles True et False
Opérations applicables : not (négation logique), and (ET logique), or (OU logique), ^ (ou exclusif)
Exemples : not (False) and True = True, not(False or True)=False
str : désigne les chaînes de caractères. Une constante chaîne de caractères doit être délimitée par
des guillemets (ou des quotes)
Opérations applicables :
+ : concatène (assemble) deux chaînes de caractères.
* : l’opération s * n (où n est un nombre entier) duplique (répète) la chaine s, n fois.
Exemples : "A" + "B" = "AB", ("A" + "B")*3 = "ABABAB"
Conversion en numérique :
s= "2023.5" #s est de type chaîne de caractères
a= float(s) #a est de type float, sa valeur est 2023.5
b= int(a) #b est de type int, sa valeur est 2023
Remarque : Si la conversion n’est pas possible, ex. float("toto"), Python renvoie une erreur
Conversion en booléen :
a= bool("TRUE") #a est de type bool, elle contient la valeur True
a= bool(1) #la valeur de a est True également
Les objets sont les éléments qu’on souhaite afficher. Ils peuvent être des variables, des
constantes ou des expressions.
sep est un paramètre optionnel qui spécifie le séparateur entre les objets à afficher. Par
défaut, il est égal à l’espace (sep =' ')
end est un autre paramètre optionnel qui spécifie le caractère de fin de ligne à afficher
après les objets. Par défaut, il est égal au saut de ligne (end ='\n').
Les littéraux de chaînes de caractères formatées, également appelés f-strings, sont
introduits à partir de la version Python 3.6
Ils permettent d'insérer des expressions Python à l'intérieur des chaînes de caractères
en utilisant des accolades { }.
Exemples :
La fonction input() permet de demander à l'utilisateur de saisir une valeur à partir du
clavier. Elle peut récupérer en paramètre un message d’invite qui sera affiché
Elle renvoie la valeur saisie sous forme de chaîne de caractères.
Exemple :
Remarque : La fonction input() renvoie toujours une chaîne, il faut la convertir en cas de
besoin
Instructions conditionnelles et itératives
Syntaxe Organigramme
if condition :
Bloc Instructions A
x = 15 x=3
if x > 10: if x > 10:
print("Youpi!") print("Youpi")
print(x, "est plus grand que 10") print(x, "est plus grand que 10")
print("Fin") print("Fin")
Affichage après l’exécution : Affichage après l’exécution :
Youpi! Fin
15 est plus grand que 10
Fin
Un bloc est défini par une indentation obtenue en décalant le début des
instructions vers la droite grâce à des espaces en début de ligne
(habituellement 4 espaces mais ce n’est pas obligatoire).
Toutes les instructions d’un même bloc doivent être indentées exactement
au même niveau (c’est-à-dire décalées à droite d’un même nombre
d’espaces).
Exemple :
if(9 > 5) :
print("9 est plus grand que 5")
print("5 est plus petit que 9")
IndentationError !!
Syntaxe Organigramme
if condition :
Bloc d’Instructions A
else :
Bloc d’Instructions B
Avec conditions vraie Avec condition fausse
x=5 x = -5
if x > 0: if x > 0:
print(x, "est positif") print(x, "est positif")
else: else:
print(x, "est négatif ou nul") print(x, "est négatif ou nul")
print("Fin") print("Fin")
Exemples :
>>> 12==13
False
>>> not(12 >= 13) and (6 != 7)
True
Syntaxe Organigramme
if condition 1 :
Bloc d’Instructions 1
elif condition 2 :
Bloc d’Instructions 2
….
elif condition n-1 :
Bloc d’Instructions n-1
else :
Bloc d’Instructions n
Exemple 1 Exemple 2
a = 16 a = 20
if ( a <= 17 ) : if ( a <= 17 ) :
print ("Vous êtes mineur") print ("Vous êtes mineur")
elif ( a == 18 ) : elif ( a == 18 ) :
print("Vous venez d'atteindre la majorité") print("Vous venez d'atteindre la majorité")
else : else :
print ("Vous êtes majeur") print ("Vous êtes majeur")
Exemples :
range(4) = [0, 1, 2, 3]
range(1, 3) = [1, 2]
range(1, 6, 2) = [1, 3, 5]
Qu’affiche le programme suivant ?
La boucle while répète l’exécution d’un bloc d’instruction tant qu’une condition est
vraie
Syntaxe Organigramme
while condition :
Bloc Instructions A
Exemple : calcul de n! (n!= 1* 2* 3* …*n)
n =int(input("Saisir la valeur de n : "))
i =1
f =1
while(i<=n):
f=f * i
i=i +1
print("La factorielle de ", n, "est : ", f)
Scénario d’exécution :
Saisir la valeur de n : 4
La factorielle de 4 est : 24
Ecrire un programme qui lit un entier naturel n et qui calcule puis affiche la somme
de ses chiffres.
Voici un scénario d’exécution :
Votre entier ? 2023
La somme des chiffres de 2023 est 7
Indication :
Utiliser les opérateurs arithmétiques % et // :
n%10 est le chiffre des unités de n
n//10 : n privé de son chiffre des unités
L’instruction break permet de « casser » l’exécution d’une boucle while ou for
Exemple
while True:
n = int(input("donnez un entier > 0 : "))
print("vous avez fourni", n)
if n > 0:
break
print("reponse correcte")
Scénario d’exécution :
donnez un entier > 0 : -5
vous avez fourni -5
donnez un entier > 0 : -2
vous avez fourni -2
donnez un entier > 0 : 1
vous avez fourni 1
reponse correcte
L’instruction continue permet de passer prématurément au tour suivant de la boucle
Exemple Affichage
debut iteration 0
bonjour
for i in range(4): debut iteration 1
print("debut iteration", i) bonjour
print("bonjour") debut iteration 2
if i < 2: bonjour
continue fin iteration 2
print("fin iteration", i) debut iteration 3
print("apres la boucle") bonjour
fin iteration 3
apres la boucle
Dans plusieurs langages, il existe une instruction do…while (Répèter … jusqu’à) qui permet
de créer une boucle non bornée mais qui doit s’exécuter au moins une fois.
Cette instruction n’existe pas en Python, mais on peut facilement simuler son fonctionnement
comme suit :
import random Scénario d’exécution:
# Génération d'un nombre secret entre 1 et 10
nombre_secret = random.randint(1, 10) Devinez le nombre secret entre 1 et 10 : 5
while True: Essaie encore
# Demander à l'utilisateur de deviner le nombre Devinez le nombre secret entre 1 et 10 : 2
guess = int(input("Devinez le nombre secret entre 1 et 10 : ")) Essaie encore
if guess == nombre_secret: Devinez le nombre secret entre 1 et 10 : 3
print("Félicitations, vous avez deviné le nombre secret !") Félicitations, vous avez deviné le nombre
break # Sortir de la boucle si l’utilisateur devine le nombre secret !
else: Fin du jeu.
print("Essaie encore. ")
print("Fin du jeu.")
Il est possible de créer des boucles imbriquées en Python (des boucles qui contiennent
une ou plusieurs autres boucles).
La forme la plus courante est une boucle for imbriquée dans une autre boucle for, mais on
peut également avoir n’importe quelles combinaisons de boucles imbriquées
Exemple Affichage
*
for i in range(7) : **
for j in range(i) : ***
print('*', end=" ") ****
print() #pour effectuer un retour à la ligne *****
******
Ecrire un programme qui lit un entier n et qui affiche sur des lignes séparées, n
suites d’entiers où la ième suite contient les entiers de 1 jusqu’à i.
Scénario d’exécution :
Pour n = 5, on obtiendra l’affichage suivant :
1
12
123
1234
12345
Une fonction Python est une suite d’instructions, regroupées dans un bloc de code
nommé, qui sera exécuté à la demande
Avantages :
La réutilisation du code : éviter de répéter les mêmes séries d’instructions à plusieurs endroits
d’un programme ;
La modularité : découper une tâche complexe en plusieurs sous-tâches plus simples.
Amélioration de la lisibilité
Utilisation : Utilisation :
n=int(input(''Saisir un entier'')) n=int(input(''Saisir un entier''))
x=cube(n) afficheCube(n)
print(''Le cube de '', n, '' est '', x)
En python, les fonctions peuvent renvoyer une valeur unique ou plusieurs valeurs
séparées par des virgules (représentées par un tuple)
Les valeurs renvoyées peuvent être attribuées à des variables individuelles lors de
l'appel de la fonction.
Définition Appel
def divmod(a, b): q, r = divmod(15, 4)
quotient = a // b print("Le quotient est :", q)
reste = a % b print("Le reste est :", r)
return quotient, reste
Une docstring est une chaîne de caractères avec trois doubles quotes """ situées au début d’une
fonction.
Elle explique ce que fait le code et donne éventuellement des informations sur les paramètres de la
fonction et ses valeurs de retour .
Exemple :
>>>print(n)
NameError : name ‘n’ is not defined
Un nombre Armstrong est un nombre qui est égal à la somme de ses chiffres élevés
à la puissance du nombre total de chiffres.
Par exemple, 153 est un nombre Armstrong car 1^3 + 5^3 + 3^3 = 153.
1. Écrire une fonction en Python est_armstrong(n) qui renvoie True si n est un
nombre Armstong et False sinon
2. Ecrire une procédure afficher_armstrong() qui affiche tous les nombres
Armstrong à trois chiffres.
En Python, les modules sont des fichiers qui contiennent des fonctions et/ou des
classes que l'on est amené à réutiliser souvent (on les appelle aussi bibliothèques ou
libraries).
Les modules permettent d'organiser et de réutiliser efficacement du code en le
regroupant par fonctionnalité ou par thème.
Pour utiliser un module dans votre programme, vous devez l'importer. L'importation
d'un module rend toutes ses fonctionnalités disponibles dans votre programme.
# mon_module.py #mon_programme.py
Indexation : on accède aux éléments en utilisant des indices (e.g., chaine[2], tuple[0])
Tranches : on peut extraire une sous-séquence en utilisant la notation de découpage, e.g.,
chaine[1:3]
Opérateurs de concaténation (+) et répétition (*) : e.g., [1, 2]*3=[1, 2, 1, 2, 1, 2]
Longueur : e.g., len([1, 2, 3])=3, len("Maroc")=5
Une liste est une structure de données qui permet de stocker une collection
ordonnée et modifiable d’éléments
Python autorise la construction de listes contenant des valeurs de types
différents
Exemples de création de listes :
animaux = ["girafe", "tigre", "singe", "souris"] #liste de chaines de caractères
tailles = [5, 2.5, 1.75, 0.15] #liste de réels
mixte = ["girafe", 5, "souris", 0.15] # liste mixte d’éléments de types différents
type(mixte)
<class ‘list’>
On accède aux éléments d’une liste en utilisant leur indice, il commence à partir de
0 et se termine à n-1 (n = taille de la liste)
Exemples :
>>>animaux = ["girafe", "tigre", "singe", "souris"]
indices : 0 1 2 3
>>> animaux[0]
'girafe'
>>> animaux[1]
'tigre'
>>> animaux[3]
'souris'
On peut également utiliser des indices négatifs pour accéder aux éléments d’une
liste en partant de la fin. L'indice -1 correspond au dernier élément de la liste
>>>animaux= ["girafe", "tigre", "singe", "souris"]
indice positif : 0 1 2 3
indice négatif : -4 -3 -2 -1
>>> animaux[-1]
'souris'
>>> animaux[-2]
'singe'
Avantage : on peut accéder au dernier élément d’une liste avec l’indice -1 sans
connaitre la taille de la liste
Soit k >0, pour une liste li de taille n, on a li[-k]=li[n-k]
Les éléments d'une liste peuvent être modifiés en utilisant leur indice.
Les listes supportent l’opérateur + (concaténation) et l’opérateur * (duplication)
Exemples :
>>> ani1 = ["girafe", "tigre"]
>>> ani2 = ["singe", "souris"]
>>>print(ani1 + ani2)
['girafe', 'tigre', 'singe', 'souris']
>>>print(ani1 * 3)
['girafe', 'tigre', 'girafe', 'tigre', 'girafe', 'tigre']
Les tranches ("slicing" en anglais), permettent d'extraire une partie spécifique d'une liste
en Python.
La syntaxe générale pour les tranches est la suivante :
liste[début: fin: pas]
où :
• début : l'indice (inclus) à partir duquel la tranche doit commencer (par défaut, le premier
élément).
• fin : l'indice (exclus) jusqu'auquel la tranche doit aller (par défaut, jusqu'à la fin de la liste).
• pas : l'incrément entre les indices de la tranche (par défaut, 1).
Exemples :
Affichage : Affichage :
Solution 1 Solution 2
def recherche2(l, e):
debut = 0
fin=len(l) -1
def recherche1(l, e): while debut<=fin:
for i in l: milieu= (fin + debut)//2
if i==e: if l[milieu] == e :
return True return True
return False elif l[milieu] < e:
debut = milieu + 1
else :
fin = milieu -1
return False
Complexité linéaire : au pire des cas, Complexité logarithmique : à
toute la liste sera parcourue quand chaque étape, on élimine la moitié
l’élément n’existe pas des éléments à examiner
Un entier est dit distinct s’il est composé de chiffres distincts (différents).
Ecrire une procédure est_distinct(nb) qui permet d’afficher si nb est distinct ou non.
Scénarios d’exécution :
>>> est_distinct(21456)
21456 est un entier distinct!
>>> est_distinct(2022)
2022 n’est pas un entier distinct, le chiffre 2 apparait 3 fois!!
Ecrire une procédure supprimer_doublons(liste) qui prend en paramètre
une liste d’entiers et supprime tous ses doublons (les éléments qui se
répètent). La procédure doit modifier la liste d'origine pour qu'elle ne
contienne que des éléments uniques, en conservant leur ordre
d'apparition.
Exemple d’utilisation :
>>>liste = [1, 2, 3, 2, 4, 3, 5, 4]
>>>supprimer_doublons(liste)
>>>print(liste)
[1, 2, 3, 4, 5]
En Python, les matrices sont représentées par des listes
multidimensionnelles où chaque élément de la liste est lui-même une
liste imbriquée.
Exemple de création & manipulation de matrice :
#creation d’une matrice 2 x 3 (2 lignes/3 colonnes)
matrice =[[1, 4, 8],
[7, 10, 6]]
print(matrice[0][1]) #affiche 4
matrice[1][1]=3
print(matrice) #affiche =[[1, 4, 8], [7, 3, 6]]
Méthode 1 : sans indices Méthode 2 : avec indices
matrice =[[1, 4, 8], matrice =[[1, 4, 8],
[7, 10, 6]] [7, 10, 6]]
s=0 s=0
for ligne in matrice : n=len(matrice)
for e in ligne : m=len(matrice[0])
s=s+e for i in range(n) :
print(''La somme des éléments est :'', s) for j in range(m) :
s = s + matrice[i][j]
print("La somme des éléments est :", s)
Affichage : Affichage :
La somme des éléments est : 36 La somme des éléments est : 36
Ecrire une fonction somme_diagonales(matrice) qui prend en entrée une matrice
numérique carrée et qui renvoie la somme des deux diagonales de cette matrice.
Scénario d’utilisation :
matrice==[[1, 4, 8],
[7, 10, 6],
[2, 6, 1]]
print(somme_diagonales(matrice)) #affiche 22
Un tuple est une collection ordonnée d'éléments similaire à
une liste mais avec une différence principale : elle est
immutable, cad : elle ne peut pas être modifiée une fois créée.
Exemple de création d’un tuple :
>>> mon_tuple=(1, 7, 9)
ou plus simplement :
>>> mon_tuple= 1, 7, 9
>>> type(mon_tuple)
<class 'tuple'>
Comme pour les listes, on peut accéder aux éléments d’un tuple en utilisant leurs
indices (positifs ou négatifs)
Exemple :
>>>mon_tuple=(1,2, 3, 4, 5)
>>>print(mon_tuple[2])
3
>>>print(mon_tuple[-2])
4
>>>mon_tuple[0]=8
TypeError : ‘tuple’ object does not support item assignment
Exemple :
def language(*args):
for i in args: Language: Java
print("Language:", i) Language: C++
print("Il y'a", len(args), " langages!") Language: Python
print(type(args)) Il y'a 3 langages!
<class 'tuple'>
language("Java", "C++", "Python")
A={1, 2, 3, 4, 5}
print(id(A))
A = A | {6}
print(id(A)) #les deux adresses sont différentes
Synthèse :
A.add(e) : ajoute l’élément e à l’ensemble existant référencé par A
A | {e} : crée un nouvel ensemble qui contient l’union des éléments de A et e
On ne peut pas accéder aux éléments d'un ensemble en utilisant des indices car les
ensembles ne sont pas ordonnés. On peut parcourir les éléments de l'ensemble à l'aide
d'une boucle for.
Exemple :
gagnants={"Toto", "Momo","Fati"}
for e in gagnants :
print(e)
#on peut avoir un ordre d’affichage différent!
Fati
Momo
Toto
gagnants_competitions = [
("Momo", {"Python", "C", "JAVA"}),
("Toto", {"C"}),
("Mimi", {"Lisp", "C++"}),
("Fifi", {"C++", "Python", "C"})]
def enigme(gagnants_competitions):
m=0 1. Quel est le type de la variable
ens={} gagnants_competitions?
for gagnant, competitions in gagnants_competitions: 2. Qu’affiche ce code?
nb=len(competitions) 3. Quel est le rôle de la fonction
if nb > m: enigme?
m = nb
ens={gagnant}
elif nb == m:
ens.add(gagnant)
return ens
print(enigme(gagnants_competitions))
Les dictionnaires sont des structures de données qui permettent de stocker des paires clé-valeur, les
clés devant être uniques
On les appelle également tableaux associatifs dans d’autres langages de programmation
Les clés peuvent être de n’importe quel type immutable, tels que les nombres ou chaînes de caractères
Exemples de création d’un dictionnaire :
#création d’un dictionnaire vide
mon_dico={}
#création d’un dictionnaire avec des paires clé-valeur
capitales={
"France" : "Paris",
"Maroc" : "Rabat",
"Espagne" : "Madride"
}
print(type(capitales))
<class 'dict'>
On peut accéder aux valeurs d'un dictionnaire en utilisant les clés
correspondantes
Exemples :
print(capitales["Maroc"]) #affiche Rabat (la valeur associée à la clé "Maroc")
print(capitales["France"]) #affiche Paris
capitales["Espagne"]="Madrid" #modification de la valeur de la clé "Espagne"
print(capitales["Espagne"]) #affiche Madrid
Ajout d’une paire clé-valeur Suppression d’une paire clé-valeur
capitales["Tunisie"]="Tunis" del capitales["Tunisie"]
print(capitales) print(capitales)
Affichage : Affichage :
{'France': 'Paris', 'Maroc': 'Rabat', 'Espagne': {'France': 'Paris', 'Maroc': 'Rabat', 'Espagne':
'Madrid', 'Tunisie': 'Tunis'} 'Madrid'}
Il existe plusieurs façons de parcourir un dictionnaire en Python. On peut parcourir les clés,
les valeurs ou les paires clé-valeur.
Parcours des clés Parcours des valeurs Parcours des paires clé-valeur
for cle in capitales : for valeur in capitales.values() : for cle, val in capitales.items():
print(cle) print(valeur) print(cle, " a comme capitale " , val)
Remarque :
Il est essentiel de fermer un fichier après avoir fini de l'utiliser pour libérer les
ressources système associées. Pour cela, on utilise la méthode close() sur l'objet
fichier.
Pour lire le contenu d'un fichier, nous avons quelques méthodes disponibles :