Académique Documents
Professionnel Documents
Culture Documents
AMDOUNI
Cours Programmation
Python
Pour les étudiants de la 1ère année Licence
Licence
Préparé par :
Dr. Naama AMDOUNI
A.U : 2021-2022
1 / 55
Prog.Python FST-LCS1 N.AMDOUNI
PLAN DU COURS
2 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
Python est un langage de programmation interprété, càd l’'interpréteur va exécuter les
lignes du code une par une, en décidant à chaque étape ce qu'il va faire ensuite, développé en
1989. Ses principales caractéristiques sont les suivantes :
• «open-source» : son utilisation est gratuite et les fichiers sources sont disponibles et
modifiables ;
• simple et très lisible ;
• doté d’une bibliothèque de base très fournie ;
• importante quantité de bibliothèques disponibles : pour le calcul scientifique, les
statistiques, les bases de données, la visualisation . . . ;
• grande portabilité : indépendant vis à vis du système d’exploitation (linux, windows,
MacOS);
• orienté objet ;
• typage dynamique : le typage (association d’un type à une variable et allocation d’une
zone mémoire en conséquence) est fait automatiquement lors de l’exécution du
programme, ce qui permet une grande flexibilité et rapidité de programmation.
• présente un support pour l’intégration d’autres langages.
3 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Remarque :
Le nom des variables en Python peut être constitué de lettres minuscules (a à z), de lettres
majuscules (A à Z), de nombres (0 à 9) ou du caractère souligné (_). Vous ne pouvez pas
utiliser d’espace dans un nom de variable.
Par ailleurs, un nom de variable ne doit pas débuter par un chiffre et il n’est pas
recommandé de le faire débuter par le caractère _ (sauf cas très particuliers).
Python est sensible à la casse, ce qui signifie que les variables TesT, test ou TEST sont
différentes.
En plus de ces règles, il faut encore ajouter que vous ne pouvez pas utiliser comme nom de
variables les 33 « mots réserves » ci-dessous (ils sont utilisés par le langage lui-même) :
NB : Tout ce qui suit le caractère # est considéré comme un commentaire et ne sera jamais
évalué.
Remarque :
Python reconnaît certains types de variable automatiquement (entier, float). Par contre,
pour une chaîne de caractères, il faut l’entourer de guillemets (doubles, simples, voire trois
guillemets successifs doubles ou simples) afin d’indiquer à Python le début et la fin de la
chaîne de caractères.
4 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Dans l’interpréteur, l’affichage direct du contenu d’une chaîne de caractères se fait avec
des guillemets simples, quel que soit le type de guillemets utilisé pour définir la chaîne de
caractères.
En Python, comme dans la plupart des langages de programmation, c’est le point qui est
utilisé comme séparateur décimal.
Il est interdit d’utiliser une variable non initialisée (sans valeur de départ) dans une
expression :
2- Affectation multiples
5 / 55
Prog.Python FST-LCS1 N.AMDOUNI
On peut aussi effectuer des affectations parallèles à l’aide d’un seul opérateur.
Pour afficher la valeur d’une variable à l’écran, il existe deux possibilités. La première qui est
une fonctionnalité secondaire de l’interpréteur consiste à entrer au clavier le nom de la
variable, puis la touche <Entrée>. Python répond en affichant la valeur correspondante. La
deuxième consiste à utiliser la fonction print().
6 / 55
Prog.Python FST-LCS1 N.AMDOUNI
NB : La fonction print() n’affiche strictement que la valeur de la variable, telle qu’elle a été
encodée, alors que l’autre méthode (celle qui consiste à entrer seulement le nom de la
variable) affiche aussi des apostrophes afin de vous rappeler que la variable traitée est du type
« chaine de caractères ».
Il est également possible d’afficher le contenu de plusieurs variables (quel que soit leur type)
en les séparant par des virgules :
On peut afficher plusieurs messages sur une même ligne en choisissant le caractère de
séparation en utilisant la syntaxe suivante : print(mes1,mes2,…mesk,sep=caractère)
7 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Pour choisir le caractère de fin de ligne, on utilise l’option end de la commande print (si le
caractère choisi est «» alors il n’y aura pas de retour à la ligne) :
Pour avoir plus de contrôle sur le formatage de vos sorties que de simplement imprimer des
valeurs séparées par des espaces, on a recours à utiliser la méthode format().
On utilise la commande input() qui quand rencontrée, le script attend jusqu’à ce que
l’utilisateur introduise une valeur qui peut importe son type sera comptée comme une chaine
de caractères. On peut documenter l’opération d’entrée en ajoutant un message entre les () de
input et qui sera affiché au moment de l’exécution de l’instruction :
8 / 55
Prog.Python FST-LCS1 N.AMDOUNI
On peut tout de même forcer la saisie d’un entier ou d’un réel directement en utilisant
respectivement les deux commandes int et float déjà rencontrées :
Parfois l’utilisateur se trompe sur la valeur introduite, l’instruction input déclenche une
erreur ou une exception, un message en rouge apparait indiquant la nature de l’erreur :
6- Opérations arithmétiques
Les opérateurs sont précisés dans la liste ci-dessous :
Certains opérateurs sont évalués avant les autres, dans l’ordre de priorité suivant :
9 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• Partie réelle
10 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• Partie imaginaire
• Conjugué
11 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• Valeur absolue :
• Conversion de types :
Par défaut, la base utilisée est la base 10. Il est possible d’exprimer un entier dans les bases
classiques en informatique : la base 2 (binaire), la base 8 (octal) et la base 16 (hexadécimal).
Pour cela, on fait précéder la représentation du nombre dans ces bases du préfixe 0b (binaire),
0o (octal) ou 0x (hexadécimal).
12 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Parmi les modules les plus importants, on note le module math qui regroupe un ensemble
de fonctions mathématiques définies sur le corps IR tels que la racine carrée, les fonctions
trigonométriques, les fonctions
ctions log, exp…
De même l’aide correspondant à une commande d’un module est accessible via la commande
help(nomModule.NomCommande
.NomCommande) :
13 / 55
Prog.Python FST-LCS1 N.AMDOUNI
14 / 55
Prog.Python FST-LCS1 N.AMDOUNI
D’une manière analogique, le module cmath offre toutes les fonctions mathématiques
applicables sur les nombres complexes :
• l’argument : phase
15 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
En programmation, on est souvent confronté à des situations où on a besoin de choisir
entre 2 ou plusieurs traitements selon la réalisation ou non d’une certaine condition d’où la
notion de traitement conditionnel.
Python renvoie la valeur True si la comparaison est vraie et False si elle est fausse. True et
False sont des booléens.
Dans le cas des chaînes de caractères, seuls les tests == et != ont un sens. En fait, on peut
aussi utiliser les opérateurs <, >, <= et >=. Dans ce cas, l’ordre alphabétique est pris en
compte, par exemple "a" < "b" renvoie True c.à.d. "a" est inférieur à "b" car le caractère a est
situé avant le caractère b dans l’ordre alphabétique. En fait, c’est l’ordre ASCII des caractères
qui est pris en compte (à chaque caractère correspond un code numérique).
Enfin, on peut comparer des chaînes de caractères de plusieurs caractères. Dans ce cas,
Python compare les deux chaînes de caractères, caractère par caractère, de la gauche vers la
16 / 55
Prog.Python FST-LCS1 N.AMDOUNI
droite (le premier caractère avec le premier, le deuxième avec le deuxième, etc). Dès qu’un
caractère est différent entre l’une et l’autre des deux chaînes, il considère que la chaîne la plus
petite est celle qui présente le caractère ayant le plus petit code ASCII (les caractères suivants
de la chaîne de caractères sont ignorés dans la comparaison).
Si <condition> Alors
<action(s)>
Fin si
Dans cette forme, la condition est évaluée. Si elle vaut vrai alors c'est la séquence d'actions
qui est exécutée sinon c'est l'action qui suit l'action conditionnelle dans l'algorithme qui est
exécutée.
17 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Si <condition> Alors
<action(s)1>
Sinon
<action(s)2>
Fin si
Dans cette forme, la condition est évaluée. Si elle vaut vrai alors c'est la séquence d'actions
1 qui sera exécutée sinon c'est la séquence d’actions 2 qui sera exécutée.
Si <condition1> Alors
<action(s)1>
Sinon
Si <condition2> Alors
<action(s)2>
SinonSi <condition k-1> Alors
<action(s)k-1>
Sinon
<action(s)k>
Fin si
18 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Si la condition 1 est vraie, alors la séquence d’actions 1 sera exécutée sinon on évalue la
condition 2 si elle est vraie la séquence d’actions 2 sera exécutée. Enfin, si aucune des k-1
conditions est vraie alors on exécute la séquence d’actions k.
Pourtant les 2 codes sont très similaires produisent des résultats très différents.
19 / 55
Prog.Python FST-LCS1 N.AMDOUNI
et de l’opérateur ET :
En Python, on utilise le mot réservé and pour l’opérateur ET et le mot réservé or pour
l’opérateur OU. Respectez bien la casse des opérateurs and et or qui, en Python, s’écrivent en
minuscule. En voici un exemple d’utilisation :
Notez que le même résultat serait obtenu en utilisant deux instructions if imbriquées :
20 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
En programmation, on est souvent amené à répéter plusieurs fois une ou plusieurs
instructions. Les structures itératives (ou répétitives) permettent d'exécuter plusieurs fois de
suite une ou plusieurs instructions, d’où leur appellation équivalente de boucle.
Incontournables à tout langage de programmation, les boucles vont nous aider à réaliser cette
tâche de manière compacte et efficace.
La notion d’intervalle est utilisée pour déterminer la plage des valeurs que va prendre un
compteur dans une boucle.
21 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Syntaxe :
L’instruction Pour est matérialisée via le mot clé for de python dont la syntaxe a la forme
suivante :
Pour <compteur> de <début> à <fin> faire
<instruction(s)>
Finpour
indentation
1- Boucle croissante
Supposons qu’on veut utiliser une boucle for pour effectuer différents affichages :
22 / 55
Prog.Python FST-LCS1 N.AMDOUNI
2- Boucle décroissante :
Le pas doit être une valeur négative avec l’argument début > l’argument fin :
Remarque :
On peut utiliser une boucle for pour itérer sur les éléments d’une chaîne de caractères. La
forme générale de la boucle est la suivante :
Exemple :
23 / 55
Prog.Python FST-LCS1 N.AMDOUNI
On utilise l’instruction while pour répéter un traitement tantque une condition est vérifiée
ou jusqu’à ce qu’une condition soit vraie. Notons que l’instruction while réserve une
indentation pour le bloc qui se répète.
1- TANTQUE ….FAIRE :
Syntaxe :
24 / 55
Prog.Python FST-LCS1 N.AMDOUNI
2- REPETER ….JUSQU’A :
Syntaxe :
Répéter
<instruction(s)>
Jusqu’à (<Condition>)
25 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Elle permet de sauter une itération d’une boucle et de passer à l’itération suivante :
2- L’instruction break
3- L’instruction else
26 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
Python permet de regrouper un ensemble de données de même type ou de types différents
à l’intérieur de structures de données spéciales appelées conteneurs. Il existe deux catégories
de conteneur :
• Les conteneurs séquentiels : On note les listes, les tuples et les chaines de caractères.
A l’intérieur de ces structures de données, les éléments sont rangés en utilisant des
index (commençant de 0).
• Les conteneurs à accès directs qui seront abordés dans le chapitre suivant.
Dans la suite, on va exposer les propriétés communes aux conteneurs séquentiels, puis on
abordera le côté spécifique de chacun de ces derniers.
• Une chaine : une séquence de caractères encadrés par des côtes ou des chevrons ‘’ ou
«»:
• Taille : len(C)
• Accès à un élément : C[index de l’élement] : Les index permis sont compris entre 0 et
len(C )-1 pour un parcours de gauche à droite et entre -1 et –len(C) pour un parcours
de droite à gauche
27 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• Accès à une partie des éléments : C[i :j] : renvoie un conteneur constitué des éléments
se trouvant entre la position i et la position j-1.
NB :
C[ :i] : un conteneur constitué des éléments d’indices compris entre 0 et i-1
C[i :] : un conteneur constitué des éléments d’indices compris entre i et len(C)-1.
C[ ::] : renvoie la totalité du conteneur
C[ ::-1] : inverse la liste des éléments
• Accès à une partie des éléments avec notion de pas : C[i :j :k] : renvoie un conteneur
stockant les éléments entre les deux positions i et j-1 en effectuant des sauts
d’amplitude k
• Test d’appartenance : x in C
28 / 55
Prog.Python FST-LCS1 N.AMDOUNI
NB : Les conteneurs ne peuvent pas être tous modifiés après leurs créations, seules les listes
sont des structures de données modifiables ou mutables ou non immuables. Les tuples et les
chaines sont non modifiables, non mutables ou immuables.
29 / 55
Prog.Python FST-LCS1 N.AMDOUNI
avec les [] :
30 / 55
Prog.Python FST-LCS1 N.AMDOUNI
conversion
d’un slice
• ajout
d’un élément à la fin : on utilise la commande append
31 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• suppression
d’un élément : trois possibilités : del, remove et pop
d’un slice
• copie :
copie normale : avec la commande copy :
32 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Donc, on remarque que A=L (une affectation) n’implique pas la création d’un
nouvel objet, mais plutôt la création d’une nouvelle étiquette (référence) vers
l’objet déjà créé.
D’où la modification d’une liste implique la modification de l’autre liste. La
solution à ce problème consiste à créer une copie de l’objet mutable indépendante
de l’originale.
Mais si une liste contient des objets eux-mêmes mutables, la copie que nous
venons d’effectuer est insuffisante car ile s’agit d’une copie superficielle.
La solution : Effectuer une copie profonde, en utilisant la fonction deepcopy du
module copy.
33 / 55
Prog.Python FST-LCS1 N.AMDOUNI
par conversion
en compréhension
• modification :
Les tuples sont non modifiables, toute tentative de mise à jour déclenche une erreur :
34 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Un tuple est immuable (non modifiable) donc chaque modification revient à créer un
nouveau tuple et non à modifier le tuple existant (L’id du tuple change).
35 / 55
Prog.Python FST-LCS1 N.AMDOUNI
36 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• Recherche d’une sous chaine dans une autre chaine : commande find :
37 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
Dans le chapitre précédent, on a traité les conteneurs séquentiels de Python. Pour accéder à un
élément d’un conteneur, on utilise son index. Les valeurs autorisées des index sont
obligatoirement séquentielles. Python permet d’utiliser une autre catégorie de conteneurs
maniant des index organisés d’une manière non séquentielle. Le conteneur n’est plus une
structure ordonnée, il s’agit bien d’un conteneur à accès direct.
• Dictionnaire vide :
• Les {} :
38 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• En compréhension
La taille d’un dictionnaire qui est le nombre d’entrées qu’il contient est accessible via la
commande len,, pour afficher une valeur correspondante à une clé, on utilise la syntaxe
NomDict[clé],, les deux opérateurs in et not in testent l’appartenance d’une clé à un
dictionnaire :
39 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Python permet d’accéder aux informations stockées au niveau d’un dictionnaire de plusieurs
manières :
• créer une entrée vide si on fournit un index non encore utilisé et pas de valeur en
deuxième paramètre :
La mise à jour d’un dictionnaire passe par l’ajout, la modification et la suppression d’entrées :
40 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• pop : la syntaxe est NomDict.pop(index) : supprime l’entrée dont la clé est index et la
retourne en résultat ; popitem : la syntaxe est NomDict.popitem() : supprime
aléatoirement une entrée et la retourne :
• copy : La syntaxe est d2=d1.copy() : copie un dictionnaire dans un autre après avoir
importer le module copy.
41 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• ensemble vide :
• la commande set :
• les {}
• en compréhension
Un ensemble est une structure de données non ordonnée. La commande len donne la
cardinalité de l’ensemble. On peut tester l’appartenance d’un élément à un ensemble mais on
ne peut pas utiliser un indice :
42 / 55
Prog.Python FST-LCS1 N.AMDOUNI
43 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• L’union
• L’intersection
• La différence
Les opérations de réunion, intersection et différence se présentent sous une 2ème forme en
python qui autorise une sorte de mise à jour de l’ensemble en question :
44 / 55
Prog.Python FST-LCS1 N.AMDOUNI
I- Introduction
Python offre une panoplie de fonctions prédéfinies prêtes à l’utilisation. On distingue les
fonctions qui se chargent au moment du démarrage de l’interpréteur comme la fonction abs()
ou la fonction len() …(il suffit d’appeler ses fonctions en précisant le(s) paramètre(s) de
chacune), d’autres qui se chargent au moment de l’importation de modules (cas de sqrt du
module math ou de polar du module cmath) … Ce chapitre a pour but d’initier à la
programmation des fonctions en Python.
II- Définition
Une fonction est un bloc d’instructions qui possède un nom, qui reçoit (éventuellement) un
certain nombre de paramètres non typés et retourne un résultat (un ou plusieurs objets),
comme elle peut ne rien retourner (procédure). L’usage des fonctions permet :
• d’éviter la répétition
• de rendre le code réutilisable à travers l’importation de fichiers de fonctions
• et de décomposer les tâches complexes en tâches simples plus abordables.
On doit définir une fonction alors à chaque fois qu’un bloc d’instructions se trouve répété à
plusieurs reprises.
III- Syntaxe
La syntaxe Python pour la définition d’une fonction est la suivante :
45 / 55
Prog.Python FST-LCS1 N.AMDOUNI
On vient de créer une première fonction sous Python (La saisie peut être effectuée au
niveau du shell ou à l’intérieur d’un nouveau fichier .py. La fonction TableMul5
bleMul5 ne possède
pas de paramètres, on lui a confié la responsabilité d’afficher la table de multiplication
mu de 5,
ce qui explique la documentation entre triple côte. Une fois déclarée, la fonction peut être
appelée comme le montre l’exemple suivant :
Une fonction est définie pour assurer la factorisation du code et la réutilisabilité. Dans
l’exemple
ple précédent, en dehors de la valeur 5, la fonction n’accepte aucune autre valeur. D’où
la pertinence de la notion de paramétrage. On redéfinit alors TableMul en réservant un
paramètre n qui représentera la valeur de l’entier dont on cherche à afficher sa table de
multiplication :
46 / 55
Prog.Python FST-LCS1 N.AMDOUNI
La fonction TableMul autorise des appels avec des paramètres de natures différentes
(Besoin de contrôle d’éventuelles erreurs de saisie à travers la gestion des exceptions…) :
On va partir d’une fonction qui affiche la somme de deux entiers passés en paramètres :
En vérifiant le type du résultat obtenu, on tombe sur le cas d’un objet vide, très logique
print ne fait pas le travail de return :
47 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Rectifions la fonction som de sorte qu’elle soit une vraie fonction avec un return :
Quand l’instruction return retourne plus d’un résultat en retour (plusieurs objets retournés
en même temps), la fonction retourne un tuple composé des objets retournés.retournés La fonction
somdifprod calcule la somme, la différence et le produit de deux entiers a et b passés en
paramètres, un objet de type tuple constitué des trois résultats est alors retourné. Au moment
de l’appel, il faut prendre en considération la nature du résultat. Soit qu’on utilise un objet qui
stockera tout le tuple
ple puis pour accéder aux résultats on utilise les indices respectifs suivant la
taille de ce dernier, soit qu’on effectue un appel basé sur trois variables :
48 / 55
Prog.Python FST-LCS1 N.AMDOUNI
VI- Passage
assage des paramètres
3- Paramètres
res par défaut
Le principe est d’affecter des valeurs aux paramètres formels lors de la définition de la
fonction. Si le paramètre n’est pas précisé lors de l’appel, c’est la valeur par défaut qui sera
considérée. Si la valeur du paramètre est précisée lors de l’appel, c’est bien cette dernière qui
sera utilisée.
Les paramètres formels avec valeur par défaut doivent être regroupés à la fin de la liste des
paramètres.
Attention, cette définition n’est pas correcte : def QR(a=25,b),, il faut utiliser la définition
d
suivante : def QR(b,a=25)
49 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Exemple 1 :
Pour réussir la modification, l’appel doit créer un nouvel objet en écrasant l’ancien contenu
de a en utilisant une affectation :
50 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Exemple 2 :
Une variable globale est une variable définie au niveau du programme principal. Elle est
donc visible par n’importe qu’elle fonction définie au niveau de ce programme.
Pour qu’une fonction utilise une variable globale définie au niveau du programme
principal, on utilise le mot clé global suivi du nom de la variable en question.
51 / 55
Prog.Python FST-LCS1 N.AMDOUNI
52 / 55
Prog.Python FST-LCS1 N.AMDOUNI
NomFonction=lambda
lambda paramètres : expression
Ou
NomFonction=lambda
lambda paramètres : expression1
expression1 if condition else expression 2
Les
es fonctions lambda sont réservées à des situations
situations relativement simples. Leur définition
doit tenir sur une seule ligne, et elles ne peuvent pas contenir d’instructions composées (pas
d’affectation, pas de boucle, etc.). Elles consistent donc essentiellement en la définition d’une
expression calculée en fonction des paramètres qui lui sont passés.
Pour prendre un exemple simpliste (et pas très utile), les deux définitions suivantes de la
fonction f sont équivalentes :
Exemples :
Les fonctions anonymes permettent d’appliquer deux commandes intéressantes intér sur les
listes :
• map : Applique une fonction sur tous les éléments d’une liste pour former une
nouvelle liste distincte de l’initiale. La syntaxe de map est la suivante : list(map(f,l))
53 / 55
Prog.Python FST-LCS1 N.AMDOUNI
• filter : crée une liste contenant les éléments qui ne vérifient pas un critère spécifié par
une fonction f d’une liste initiale. La syntaxe de filter est la suivante : list(filter(f,l))
Supposons qu’on veut supprimer tous les multiples de 3 d’une liste d’entiers :
Exemple :
54 / 55
Prog.Python FST-LCS1 N.AMDOUNI
Parfois la fonction ne retourne aucune valeur, mais effectue des actions récursives,
récursives tel est
le cas de l’affichage d’une liste ou son inversion :
• Pour choisir les éléments à charger d’un module et gagner en mémoire, la syntaxe
suivante est sollicitée : from nom_module import fonction1,fonction2,var1 …
Dans ce cas, les éléments importés sont accessibles sans le préfixe nom_module.
55 / 55