Académique Documents
Professionnel Documents
Culture Documents
Jamâl-Dine DISSOU
1. INTRODUCTION À PYTHON
Un ordinateur est une machine dont la fonction principale est de traiter des
données, c’est-à-dire d’exécuter des séries d’instructions pour effectuer différentes
tâches.
En tant que développeurs, nous allons vouloir fournir nos séries d’instructions aux
ordinateurs afin qu’ils exécutent certaines tâches précises dans un certain ordre.
Pour cela, il va falloir que l’ordinateur nous comprenne et il va donc falloir qu’on
exprime nos instructions dans un langage qu’il comprend. Le souci, ici, est que les
ordinateurs ne comprennent qu’un seul langage : le binaire ou “langage machine”
qui est très opaque pour nous (les Humains) et très long à écrire.
Pour pallier à ce problème, certaines personnes ont créé ce qu’on appelle des
langages de programmation. Le but premier de tout langage de programmation
est de passer des instructions à l’ordinateur.
Tous les langages de programmation ne sont pourtant pas égaux : certains sont
plus facilement compréhensibles pour nous que d’autres et certains nous
permettent de transmettre uniquement certaines instructions à l’ordinateur.
Python est un langage de programmation dit de “très haut niveau”. Cela signifie
qu’il possède un haut niveau d’abstraction par rapport au langage machine. Pour
le dire très simplement : plus un langage de programmation est de “haut niveau”,
plus sa syntaxe se rapproche de notre langage (l’anglais) plutôt que du langage
machine. Un langage de haut niveau est donc plus facile à comprendre et à
utiliser qu’un langage de plus bas niveau.
Python est modulable et extensible : une fois qu’on connait les bases du langage,
on va pouvoir relativement simplement ajouter de nouvelles fonctions ou
modules pour étendre les possibilités de ce langage.
Python est un langage de programmation conçu dès le départ pour être “full
stack”, c’est-à-dire pour avoir de multiples applications à la différence du PHP par
exemple qui a clairement été imaginé pour fonctionner dans un contexte Web.
Ce langage est un langage orienté objet à la base mais Python supporte également
d’autres paradigmes comme la programmation procédurale et fonctionnelle. Un
paradigme est une “façon de coder” ou une “façon d’imaginer le code et de le
structurer”. Nous reviendrons là dessus plus tard.
En informatique, les langages évoluent par “version”. Les équipes qui créent un
langage travaillent sans cesse à l’amélioration de celui-ci mais chaque
changement fait sur le langage n’est pas immédiatement intégré au langage ni
disponible au public.
La première grosse mise à jour de Python date de 2000 avec la version Python 2.
Les versions se sont ensuite enchainées normalement avec Python 2.1, 2.2, 2.3, etc.
jusqu’en 2009 avec la sortie de Python 3.
Pour Python 3, l’équipe qui gère l’évolution du Python a fait le choix audacieux de
partir sur de nouvelles bases et de casser la compatibilité avec les anciennes
versions.
Le souci ici est que Python 2.x était déjà très populaire à l’époque et que cela allait
mettre de nombreuses personnes dans l’embarras. L’équipe de Python a donc fait
le choix de conserver deux versions du langage : Python 2.x et Python 3.x et de les
faire évoluer de front. Pour être tout à fait précis, la version 3 est la version dont
les fonctionnalités allaient continuer d’évoluer tandis que la version 2 n’allait
recevoir que des mises à jour liées à la sécurité.
Aujourd’hui encore, on retrouve ces deux versions de Python qui co-existent. Pour nous, cependant,
le problème ne se pose pas : nous travaillerons bien évidemment avec la dernière version en date
de Python qui est à l’heure où j’écris la version 3.7.3.
Dans cette leçon, nous mettons en place notre environnement de travail en nous
équipant des logiciels nécessaires pour pouvoir développer en Python.
Python est un langage Open Source. Cela signifie que ses sources et son
interpréteur sont disponibles au public et donc que n’importe qui peut
commencer à développer ses propres programmes Python gratuitement.
Python est un langage interprété, ce qui signifie qu’on va avoir besoin d’un
programme nommé interpréteur pour convertir nos instructions Python en un
langage compréhensible par notre ordinateur.
Sur cette page, commencez par télécharger la dernière version stable de Python
qui correspond à votre système. L’interpréteur sera parmi les fichiers téléchargés.
Notez que si vous utilisez un Mac un interpréteur Python devrait déjà être installé
sur votre machine par défaut. Cependant, l’interpréteur pré-installé risque de
correspondre à une ancienne version et nous voulons dans ce cours travailler avec
la dernière version stable du langage (Python 3.7.3 à l’heure de ce cours).
Une fois que vous avez téléchargé la ressource Python disponible sur le site officiel,
ouvrez la en double cliquant dessus. Un processus d’installation démarre. Si vous
êtes sur Windows, cochez la case “Ajouter Python 3.x au PATH”. Suivez ensuite le
processus d’installation comme pour n’importe quel autre logiciel.
Vous venez d’installer l’interpréteur Python ainsi que d’autres ressources pour
vous aider dans vos développements Python, notamment IDLE et Python
Launcher si vous utilisez un Mac.
Pour exécuter nos scripts Python, il va falloir les passer à l’interpréteur. Pour cela,
nous allons utiliser l’invite de commande (Windows) ou le terminal (Mac).
Une fois que vous êtes dans l’invite de commande ou dans le terminal,
commencez par vérifier que l’interpréteur Python a bien été installé. Pour cela,
tapez la commande python -V (avec un V majuscule) et pressez la touche Entrée. Si
vous êtes sur Mac, Python 2.7 devrait déjà être installé et sera probablement la
version renvoyée. Tapez plutôt la commande python3 -V. La version de
l’interpréteur Python installée devrait vous être renvoyée.
Pour appeler l’interpréteur, tapez simplement python3 (ou python3.7 dans le cas où
il y aurait une ambiguïté) (Mac) ou python (Windows). Si la version de
l’interpréteur vous est renvoyée te que vous voyez un triple chevron $gt;$gt;$gt;,
c’est gagné ! Ce triple chevron est le moyen pour l’interpréteur de nous dire “je
suis prêt à recevoir la prochaine instruction”.
A partir de là, nous avons deux options : on va pouvoir soit directement écrire nos
instructions Python dans l’invite de commande ou dans le terminal pour les
exécuter immédiatement, soit créer des fichiers de script Python avec
l’extension .py avec un éditeur de texte et les passer ensuite à l’interpréteur. Dans
l’image ci-dessus, par exemple, j’ai tapé et exécuté une première instruction
Python print() qui sert simplement à afficher un message.
Ecrire son code directement dans l’invite de commande / le terminal est très
pratique pour tester rapidement un code. Cependant, en conditions “réelles”, c’est-
à-dire lorsque vous devrez créer de vrais programmes contenant potentiellement
plusieurs scripts ou lorsque vous voudrez distribuer votre code, vous stockerez vos
instructions dans des fichiers .py que vous allez créer avec un éditeur de texte ou
un IDE.
Un éditeur de texte nous permet tout simplement d’écrire des lignes de code et
d’enregistrer nos fichiers au bon format.
Il existe des centaines d’éditeur prêt à télécharger sur le Web et la majorité d’entre
eux sont gratuits. Je n’ai pas de conseil spécifique à vous donner quant au choix de
votre éditeur de texte : essayez simplement d’en trouver un avec lequel vous êtes à
l’aise et si possible installez plutôt un IDE (Environnement de Travail Intégré)
qu’un simple éditeur.
Vous pouvez utiliser Brackets, Atom, Sublime Text ou encore Komodo si vous
préférez.
Notez par ailleurs qu’il existe certains éditeurs spécialement conçus pour écrire du
code Python dont le célèbre PyCharm notamment.
Dans cette leçon, nous allons découvrir quelques éléments de syntaxe de base de
Python. Nous allons également exécuter nos première instructions Python en
utilisant l’interpréteur de manière interactive ou en créant un fichier Python
qu’on va ensuite passer à l’interpréteur.
Nous avons deux choix pour exécuter du code Python : on peut soit écrire
directement notre code dans l’invite de commande (Windows) ou dans le terminal
(Mac) afin que l’interpréteur Python interprète directement notre code et nous
renvoie son résultat ou on peut créer des fichiers Python avec un ensemble
d’instructions à l’intérieur et qu’on va ensuite passer à l’interpréteur.
L’intérêt principal d’un fichier est qu’il peut être sauvegardé et distribué. En
conditions réelles, vous utiliserez donc souvent votre éditeur de texte et créerez
des fichiers Python pour mener à bien des projets.
Dans ce cours, j’écrirai directement dans mon terminal pour vous montrer les
résultats d’instructions simples et nous ne créerons des fichiers que lorsque cela
sera nécessaire. Cependant, pour cette première leçon concrète, je voulais tout de
même vous montrer comment créer un fichier Python et comment exécuter ce
fichier.
Pour créer un fichier Python, nous allons déjà ouvrir notre éditeur de texte, allons
ouvrir un nouveau fichier et enregistrer ce fichier en lui donnant une
extension .py. On peut appeler ce fichier cours.py par exemple et l’enregistrer dans
un dossier Python sur notre bureau.
Ici, on commence par enregistrer notre fichier au format Python avant même
d’écrire un quelconque code car cela va permettre à notre éditeur de reconnaitre
le type de code qu’on souhaite écrire et d nous proposer des fonctionnalités
relatives à cela. Par ailleurs, il est possible que votre éditeur vous propose
d’installer des extensions spécifiques Python pour faciliter l’écriture, l’affichage et
le debugging de votre code. Si c’est le cas, n’hésitez pas à les installer.
Ensuite, ajoutez les lignes de code suivantes dans votre fichier (nous allons
expliquer par la suite ce qu’elles signifient) :
Pour exécuter un fichier Python et obtenir le résultat des opérations faites dans ce
fichier, commencez déjà par ouvrir votre invite de commande ou votre terminal.
Ici, si vous avez bien ajouté Python au PATH, vous n’avez qu’à taper cours.py pour
exécuter le code du fichier “cours.py”. Si votre système possède plusieurs versions
de Python, comme c’est le cas sur Mac, il faudra préciser la version utilisée : on
tapera alors python3 cours.py.
Si Python n’a pas été ajouté au PATH, il va falloir préciser où le fichier se trouve.
Pour cela, on va commencer par taper la commande cd Desktop. La
commande cd signifie “change directory” (“changer de dossier”).
Ensuite, on n’a plus qu’à préciser l’emplacement de notre fichier par rapport à
notre bureau (Desktop), c’est à dire dans notre cas Python/cours.py (Mac)
ou Python\cours.py (Windows) pour exécuter notre fichier, en précisant
éventuellement également une version si plusieurs versions sont installées sur
notre système (python3 Python/cours.py pour Mac).
Cette fonctionnalité est très utile lorsqu’on souhaite tester rapidement des bouts
de code ou pour l’apprentissage.
Ensuite, on a plus qu’à écrire nos différentes instructions et à presser Entrée afin
que l’interpréteur les interprète immédiatement.
Chaque langage informatique est basé sur une série de règles et de conventions. La
syntaxe d’un langage définit ses différents éléments et la façon dont on va pouvoir
et devoir les utiliser.
J’aimerais pour le moment m’arrêter sur deux éléments de syntaxe de base que
sont les commentaires et l’indentation ainsi que sur la fonction print().
Les commentaires sont des éléments de langage qu’on retrouve dans de nombreux
langages de programmation.
Les commentaires servent à “commenter” le code : ils vont être ignorés lors de
l’exécution du code (ils n’auront aucun impact sur le script) et vont donc être
totalement transparents pour l’utilisateur final.
Python n’a pas de syntaxe particulière pour écrire des commentaires multi-lignes.
Pour écrire un commentaire sur plusieurs lignes, on insérera un # au début de
chaque ligne.
L’indentation Python
En Python, l’indentation a un tout autre rôle : elle est utilisée par Python pour
définir des blocs de code, c’est-à-dire pour indiquer à l’interpréteur quelle
instruction appartient à quelle autre.
Si on indente mal notre code Python, celui-ci ne s’exécutera tout simplement pas
et Python renverra une erreur. Pas de panique, nous allons apprendre au cours de
ce cours à quelle moment indenter. Cela est cependant relativement évident et ne
devrait pas vous poser de problème : dès qu’il y a une relation de dépendance, il
faudra ajouter un retrait (une fabulation).
Dans le code ci-dessus, par exemple, nous avons utilisé une structure
conditionnelle if. Le principe de cette structure est simple : on lui fournit un test
et SI le test est validé, alors on exécute un code. Le code à exécuter dépend du
résultat du test; on effectuera donc un retrait pour mentionner ce code afin que
Python puisse bien s’apercevoir qu’il dépend de la structure conditionnelle.
La fonction print()
Les fonctions sont d’autres éléments de langage que nous étudierons plus tard.
Grosso-modo, une fonction est définie par un nom et une série d’instructions.
Lorsqu’on appelle une fonction (en utilisant son nom et un couple de parenthèses
juste derrière), elle exécute toutes les instructions qu’elle contient. Les fonctions
servent généralement à effectuer une action précise qui peut être plus ou moins
complexe.
Dans cette leçon, nous allons découvrir un élément fondamental des langages de
programmation : les variable. Nous allons expliquer ce que sont les variables en
informatique, les usages qu’on va pouvoir en faire et comment créer des variables
Python.
Les variables ont une durée de vie limitée (une variable ne vit
généralement que le temps de l’exécution d’un script ou de la fonction qui
l’a définie), ce qui signifie qu’on ne va pas pouvoir utiliser les variables pour
stocker des données de manière pérenne ;
La valeur d’une variable peut varier : les variables peuvent peuvent stocker
différentes valeurs au cours de leur vie (la nouvelle valeur remplaçant
l’ancienne).
Les variables donc être au coeur de nos scripts puisqu’elles vont nous permettre de
conserver des valeurs le temps d’un script et d’effectuer toutes sortes de
manipulations sur ces valeurs en toute simplicité.
Pour créer une variable en Python, on va donc devoir choisir un nom et affecter
une valeur à ce nom, c’est-à-dire stocker une valeur dans notre variable.
Le choix du nom pour nos variables est libre en Python. Il faut cependant
respecter les règles usuelles suivantes :
Pour affecter ou “assigner” une valeur à une variable, nous allons utiliser un
opérateur qu’on appelle opérateur d’affectation ou d’assignation et qui est
représenté par le signe =. Attention, le signe = ne signifie pas en informatique
l’égalité d’un point de vue mathématique : c’est un opérateur d’affectation.
Le signe = ne sert pas à dire que la valeur est égale au nom de variable ou que la
variable “vaut” cette valeur, il indique simplement qu’on affecte ou qu’on stocke
une certaine valeur dans un conteneur.
D’un point de vue mathématique, par exemple, écrire x = x + 2 n’a aucun sens car
la variable x ne peut être égale qu’à elle même. En informatique, cependant, c’est
tout à fait possible puisque l’opérateur = n’est pas un opérateur d’égalité mais
d’affectation. Ecrire x = x + 2 signifie qu’on affecte une nouvelle valeur à x qui est
égale à l’ancienne valeur de x à laquelle on ajoute 2.
Les variables vont pouvoir stocker différents types de valeurs comme des
nombres, des chaines de caractères, des booléens, et plus encore.
Il est important de connaitre le type de valeur stocké dans une variable car nous
n’allons pas pouvoir effectuer les même opérations avec une variable qui stocke
un nombre ou avec une variable qui stocke une chaine de caractères par exemple.
Nous étudierons les spécificités liées à chaque type de valeur que peut stocker une
variable Python dans la prochaine leçon.
Nous allons pouvoir réaliser toutes sortes d’opérations avec nos variables. La plus
basique d’entre elles consiste à afficher le contenu d’une variable. Pour afficher la
valeur d’une variable Python, il suffit d’écrire son nom, ou éventuellement
d’utiliser la fonction print() en renseignant le nom de la variable entre les
parenthèses/
Comme je l’ai précisé plus haut, l’une des caractéristiques fondamentales des
variables va être de pouvoir stocker différentes valeurs durant sa vie. Ainsi, on
peut tout à fait affecter une nouvelle valeur à une variable. Une variable «
classique » ne va pouvoir stocker qu’une valeur à la fois. En affectant une nouvelle
valeur à une variable, la valeur précédente est ainsi écrasée.
Pour comprendre ce code, vous devez savoir qu’ici les instructions sont exécutées
linéairement, c’est-à-dire dans leur ordre d’écriture. On commence par affecter la
valeur 29 à notre variable age et la valeur Pierre à notre variable prenom, puis on
affiche le contenu de ces variables.
On affecte ensuite de nouvelles valeurs dans nos variables. Ces nouvelles valeurs
remplacent (“écrasent”) les précédentes. Lorsqu’on affiche à nouveau le contenu de
nos variables, les valeurs renvoyées sont les dernières stockées.
Les variables sont des éléments de base présents dans la quasi-totalité des
langages de programmation car elles vont s’avérer indispensables dans de très
nombreuses situations.
Imaginons par exemple qu’on crée un programme qui va effectuer des calculs à
partir d’une valeur qui va lui être envoyée uniquement lorsque ce programme sera
exécuté. Lors de la création du programme, on ne connait pas cette valeur et cette
valeur va pouvoir être différente entre différentes exécutions du programme.
On va pouvoir indiquer que cette valeur (inconnue pour le moment) devra être
stockée dans telle variable au début du programme et ensuite définir les
différentes opérations qui devront être effectuées sur cette valeur en utilisant le
nom de la variable (qui sera remplacée par sa valeur effective lorsque le
programme s’exécutera).
Un “type” de données pour un langage est défini par les manipulations qu’on va
pouvoir faire sur ces données : on va pouvoir effectuer les mêmes opérations sur
chaque donnée d’un même type et des opérations différentes sur différents types
de données.
Prenons un nombre entier par exemple. Il semble tout à fait logique de pouvoir
effectuer des opérations mathématiques de base avec ce nombre : addition,
soustraction, multiplication, etc. En revanche, on ne va pas pouvoir effectuer les
mêmes opérations / manipulations sur un texte, puisque multiplier un texte par
quelque chose par exemple n’a aucun sens.
Python définit de nombreux types de données qu’on va pouvoir stocker dans nos
variables et manipuler à loisir ensuite : nombres entiers, décimaux, complexes,
chaines de caractères, booléens, listes, tuples, dictionnaires, etc.
Dans cette leçon, nous allons nous contenter de passer en revue les types de
données les plus simples à se représenter (nombres, chaines et booléens). Les
autres types de données feront l’objet de leçons séparées.
Le type float qui représente les nombres décimaux et certaines expressions scientifiques
comme le e pour désigner une exponentielle par exemple;
Le type complex qui représente les nombres complexes ou nombres imaginaires et qui se
sert de la lettre j pour représenter la partie imaginaire d’un nombre.
Le type de données “nombre entier” ou int pour être technique (“int” = “integer” =
entier) couvre tous les nombres entiers positifs ou négatifs. On va pouvoir
effectuer toutes sortes d’opérations arithmétiques avec ce premier type de
données : addition, soustraction, multiplication, division, élévation à la puissance,
etc.
On peut également stocker des nombres dans des variables et utiliser ces variables
pour effectuer nos calculs. Ici, on commence par définir une variable x et on lui
Le type de données “nombre décimal” ou float couvre tous les nombres décimaux
(c’est-à-dire les nombres à virgule) ainsi que certaines expressions scientifiques
comme le e qui désigne une exponentielle.
Nous allons grosso-modo pouvoir réaliser les mêmes opérations avec des données
de type float qu’avec des données de type int (même si le traitement en arrière
plan va être différent).
On effectue plusieurs opérations arithmétiques d’un coup sur nos dernières lignes
dans l’exemple ci-dessus. Dans ce cas là, il faudra faire attention à l’ordre des
opérations. L’ordre des opérations va être le même qu’en mathématiques : les
Notez qu’on peut également utiliser une syntaxe alternative utilisant des triples
guillemets simples ou doubles pour entourer notre chaine et qui nous dispense
ainsi d’avoir à échapper les apostrophes et les guillemets dans notre chaine :
J’ai dit plus haut que pour définir une chaine de caractères il fallait l’entourer de
guillemets simples ou doubles droits. Réciproquement, toute valeur entourée par
des guillemets simples ou doubles sera considéré par Python comme une valeur
de type str (“str” = “string” = chaine de caractères).
Comme vous pouvez le voir, on n’obtient pas du tout les mêmes résultats
lorsqu’on additionne deux nombres ou lorsqu’on additionne (ou plus exactement
concatène) deux chaines.
Finalement, vous pouvez également remarquer que Python nous renvoie une
erreur lorsqu’on tente d’additionner / de concaténer un entier avec une chaine.
Le dernier type de valeurs simple Python que je tenais à vous présenter est le
type bool (pour “booléen”).
Le type de valeur booléen est un type qui ne contient que deux valeurs qui servent
à représenter deux états. Les deux valeurs sont True (vrai) et False (faux). Attention
en Python à bien indiquer des majuscules car dans le cas contraire Python ne
reconnaitra pas ces booléens.
Pour stocker un booléen dans une variable, il ne faut pas utiliser de guillemets : si
on les utilise, ce seront les chaines de caractères “True” et “False” qui seront
stockés et on ne va pas pouvoir effectuer les mêmes opérations.
Les valeurs booléennes sont très utilisées en informatique. Elles sont notamment
très utiles pour valider ou invalider un test et sont au coeur des différentes
structures de contrôle en général.
On voudra souvent s’assurer qu’une variable contient bien une valeur d’un certain
type, notamment pour pouvoir effectuer différentes manipulations avec cette
variable.
Pour connaitre le type de valeur stockée dans une variable, on peut utiliser la
fonction Python type(). On va passer la variable à tester en argument de cette
fonction (c’est-à-dire écrire le nom de la variable entre les parenthèses de la
fonction). La fonction type() va alors tester la valeur contenue dans la variable et
renvoyer le type de cette valeur.
Dans cette nouvelle leçon, nous allons définir ce qu’est un opérateur, établir la
liste des types d’opérateurs disponibles en Python et apprendre à en manipuler
certains.
Python dispose de nombreux opérateurs qui peuvent être classés selon les
catégories suivantes :
Nous étudierons les autres types d’opérateurs plus tard dans ce cours, lorsque nous
en aurons besoin pour illustrer certaines notions de Python.
Opérateur Nom
+ Addition
– Soustraction
* Multiplication
/ Division
% Modulo
** Puissance
// Division entière
Le résultat de 13//3, par exemple, sera 4 tandis que le résultat de 13%3 sera 1 car
dans le cas d’une division entière 13/3 = 4 avec reste = 1.
Ces deux symboles remplissent donc un rôle relativement similaire que lorsqu’ils
sont utilisés avec des données de type numériques mais attention tout de même
de ne pas confondre le + utilisé pour additionner deux nombres et le + utilisé pour
concaténer deux chaines de caractères : on distingue ici bien deux opérateurs
différents même si le même symbole est utilisé.
Ces opérateurs vont donc nous permettre de réduire la taille de notre code en
nous offrant une écriture simplifiée. Voici la liste des opérateurs d’affectation
supportés par Python et leur équivalent en “version longue” :
Equivalent
Opérateur Exemple Description
à
Equivalent
Opérateur Exemple Description
à
Vous pouvez également déjà noter qu’il existe également les opérateurs
d’affectation combinés &=, |=, ^=, >>= et <<= qui vont permettre d’effectuer des
opérations dont nous discuterons plus tard et d’affecter le résultat de ces
opérations directement à une variable.
Dans cette leçon, nous allons découvrir un premier type de données composites
Python : les listes. Nous allons comprendre l’intérêt de ce type de données et
apprendre à les manipuler.
Jusqu’à présent, nous n’avons stocké qu’une seule valeur à la fois dans nos
variables. Les listes sont un type de données très particulier au sens où elles
représentent des données composées ou combinées. Une liste est en effet par
définition composée d’une suite de valeur ou d’éléments.
Pour définir une nouvelle liste en Python, on va devoir utiliser une paire de
crochets [ ]. Nous allons placer les différents éléments de notre liste dans ces
crochets en les séparant par des virgules. On peut par exemple créer une liste de 5
éléments et la placer dans une variable liste comme ceci :
Notre liste est ici composée de 5 valeurs de type numérique. On va pouvoir stocker
tous types de valeurs dans une liste, comme des chaines de caractères par exemple
:
De plus, vous devez savoir que tous les éléments d’une liste n’ont pas à être du
même type, on va très bien pouvoir créer des listes composées de nombres,
chaines et booléens par exemple :
Note : Si vous avez déjà étudié un langage de script par le passé, les liste doivent
vous faire penser à ce qu’on appelle communément dans ces autres langages des
tableaux. En effet, les listes Python sont très proches des tableaux (numérotés)
qu’on peut retrouver dans de nombreux autres langages.
Les listes Python sont par défaut indexées ou indicées. Cela signifie que chaque
valeur d’une liste est lié à un indice qu’on va pouvoir utiliser pour récupérer cette
valeur en particulier.
Pour récupérer une valeur en particulier dans une liste, on va devoir préciser le
nom de la liste suivi de l’indice de cette valeur entre crochets. Notez que les
indices négatifs sont acceptés; dans ce cas on partira de la fin de la liste (l’indice -1
correspond au dernier élément, -2 à l’avant dernier et etc.).
On va également pouvoir récupérer une tranche de valeurs dans une liste, c’est-à-
dire un ensemble de valeurs qui se suivent. Pour cela, on utilisera le
symbole : entre les crochets avec 0, 1 ou 2 indices autour.
Si on utilise : sans indice, alors une copie superficielle de la liste sera renvoyée. Si
on mentionne un indice avant : mais pas d’indice après, alors une copie
superficielle partielle de la liste de départ sera renvoyée, en commençant à copier
à partir de l’indice donné. Si au contraire on mentionne un indice après : mais pas
d’indice avant, une copie superficielle partielle de la liste de départ sera renvoyée
qui commence au début de la liste et jusqu’à l’indice donné. Enfin, si deux indice
sont mentionnés de part et d’autre de :, la tranche de valeurs correspondant à ces
indices sera renvoyée.
Vous devez également savoir que ce qu’on a vu jusqu’ici sur les listes s’applique
également aux chaines de caractères. Les chaînes de caractères peuvent en effet
également être indexées, ce qui signifie qu’on peut accéder aux caractères par leur
position). Cela est logique après tout : les chaines de caractères sont des
“séquences” de caractères tandis que les listes sont des “séquences” de valeurs.
Comme pour les listes, le premier caractère d’une chaîne possède l’indice 0, le
deuxième l’indice 1 et etc; On va également pouvoir utiliser des indices négatifs et
récupérer des tranches avec :.
Notez qu’il n’existe pas de type distinct pour les caractères en Python : un
caractère est simplement une chaîne de longueur 1.
A la différence des types de données simples comme les chaines qui sont
immuables, les listes sont un type de données altérable ce qui signifie qu’on va
pouvoir altérer leur structure ou modifier leur contenu en ajoutant, supprimant
ou remplaçant des valeurs.
En effet, vous devez bien comprendre qu’une fois qu’on définit une valeur “chaine
de caractères” par exemple, celle-ci ne peut plus être modifiée par la suite. Les
seules opération qu’on va pouvoir faire vont être de créer une nouvelle chaine en
concaténant deux chaines d’origine (qui une nouvelle fois ne seront pas modifiées)
ou de remplacer une chaine par une autre valeur en affectant une nouvelle valeur
dans une variable (ce qui a pour effet d’écraser la chaine de départ).
Dans cette leçon, nous allons nous intéresser à un nouveau type de données composites Python
qui peut faire penser aux listes à premières vue : les tuples. Nous allons souligner les différences
entre les listes et les tuples, voir les cas d’usage des tuples et apprendre à créer des tuples.
Les chaines de caractères et les listes sont deux types séquentiels de données : ce
sont des données qui sont organisées sous la forme de séquence de caractères ou
de valeurs. Les tuples sont un autre type séquentiel de données.
Les tuples peuvent contenir différents types de valeurs comme des nombres, des
chaines, des listes etc. et même d’autres tuples imbriqués. Illustrons
immédiatement cela :
La grande différence entre un tuple et une liste est qu’un tuple est une donnée
immuable à la différence d’une liste qui est altérable. Cela signifie qu’on ne va pas
pouvoir modifier les valeurs d’un tuple après sa création.
Il va donc être intéressant d’utiliser des tuples plutôt que des listes dans les cas où
on veut s’assurer que les données ne soient pas modifiées dans un programme.
Notez que dans le cas où on souhaite créer un tuple vide, on utilisera une paire de
parenthèses vides. Si on souhaite créer un tuple avec une seule valeur, alors il
faudra faire suivre cette valeur d’une virgule.
Attention ici : il faut bien faire attention à écrire les variables qui vont recevoir les
valeurs du tuple avant le tuple car dans le cas contraire cela ne fonctionnerait
pas.
Dans cette leçon, nous allons nous intéresser à un autre type de données Python
composites : les dictionnaires. Nous allons découvrir l’intérêt des dictionnaires et
apprendre à manipuler ce nouveau type de données.
Les dictionnaires sont un type natif de données Python. Ce type de données peut,
de la même façon que les données séquentielles, contenir plusieurs valeurs et
chaque valeur va être indexée ce qui signifie qu’un indice unique va être attribué à
chaque valeur.
Les dictionnaires nous laissent une bien plus grande liberté ici puisqu’on va
pouvoir choisir nous mêmes nos clefs (ou index ou indice) et attribuer la clef de
notre choix à chaque valeur à partir du moment où cette clef n’est pas déjà
utilisée dans ce dictionnaire et où la clef est une valeur immuable. La
conséquence de cela est que les valeurs d’un dictionnaire ne sont pas ordonnées à
la différence des valeurs d’une séquence.
Si vous avez des notions en PHP ou dans certains autres langages de script, vous
pouvez retenir que les dictionnaires Python sont l’équivalent des tableaux
associatifs dans ces langages.
Comme vous pouvez le voir dans l’exemple ci-dessus, on utilise une nouvelle fois le
syntaxe avec des crochets pour lire les différentes valeurs de notre dictionnaire.
Pour être tout à fait précis, on passe ici une clef entre crochets pour récupérer la
valeur qui lui est associée.
Pour cela, on va tout simplement utiliser le nom de notre dictionnaire suivi d’un
couple de crochets [ ] en passant une clef entre ces crochets puis affecter une
valeur à cette clef. Dans le cas où la clef existe déjà, l’ensemble clef : valeur n’est
pas ajouté mais la valeur originellement liée à la clef est plutôt remplacée par la
nouvelle valeur.
Pour supprimer une paire clef : valeur d’un dictionnaire, nous allons utiliser
l’instruction del (abréviation de “delete” = supprimer en anglais) suivi du nom du
dictionnaire avec la clef de l’élément à supprimer entre crochets comme ceci :
Dans cette leçon, nous allons voir un nouveau type de données Python : les
ensembles ou “set”. Nous allons découvrir l’intérêt de ce type de données et
comment créer des ensembles Python.
Une des utilisation les plus courantes des ensembles est de les utiliser pour
supprimer des valeurs doublons à partir d’un autre type de données.
Pour créer un ensemble, nous allons utiliser une paire d’accolades { } en placer les
différents éléments de notre ensemble entre ces accolades en les séparant avec
une virgule.
Notez que pour créer un ensemble vide il faudra utiliser la fonction set() car la
syntaxe { } va créer un dictionnaire vide et non pas un ensemble vide.
10.2. Récapitulatif sur les types de données et sur les types composites Python
Dans cette partie, nous avons étudié des types de données simples et des types de
données composites (des données composées de plusieurs éléments) Python.
Les types de données simples étudiés sont les Nombre (entier, décimaux ou
complexes), les Booléens et les Chaines de caractères. Il sont facile à manier et il
est simple de savoir quand utiliser une type plutôt qu’un autre.
Les types de données composite étudiés sont les listes, les tuples, les dictionnaires
et les ensembles. Il est généralement moins évident de choisir quel type de
données utiliser ici car on a tendance à penser “qu’ils se ressemblent tous”.
Voici donc un résumé des grandes caractéristiques de ces types et se qui les
différencie :
Les listes sont des collections d’éléments ordonnés et altérables qui peuvent contenir
plusieurs fois la même valeur ;
Les tuples sont des collections d’éléments ordonnés et immuables qui peuvent contenir
plusieurs fois la même valeur ;
Les dictionnaires sont des collection d’éléments non ordonnés mais indexés avec des clefs
de notre choix et altérables qui n’acceptent pas de contenir plusieurs fois le même
élément ;
Les ensembles sont des collections d’éléments non ordonnées, non indexés et non
modifiables qui n’acceptent pas de contenir plusieurs fois le même élément.
Dans cette nouvelle partie, nous allons étudier et comprendre l’intérêt des
structures de contrôle en Python. Une structure de contrôle est un ensemble
d’instructions qui permet de contrôler l’exécution du code.
Il existe différents types de structures de contrôle. Les deux types de structures les
plus communément utilisées sont les structures de contrôle conditionnelles qui
permettent d’exécuter un bloc de code si une certaine condition est vérifiée et les
structures de contrôle de boucle qui permettent d’exécuter un bloc de code en
boucle tant qu’une condition est vérifiée.
Nous allons très souvent utiliser les conditions avec des variables : selon la valeur
stockée dans une variable, nous allons vouloir exécuter un bloc de code plutôt
qu’un autre.
La condition if (“si”) ;
La condition if…else (“si…sinon”) ;
La condition if…elif…else (“si…sinon si… sinon”) .
Nous allons étudier et comprendre l’intérêt de chacune de ces conditions dans la
suite de cette leçon. Avant de les étudier, cependant, nous allons devoir présenter
un nouveau type d’opérateurs : les opérateurs de comparaison qui vont être au
centre de nos conditions.
Comme je l’ai précisé plus haut, nous allons souvent construire nos conditions
autour de variables : selon la valeur d’une variable, nous allons exécuter tel bloc de
code ou pas.
Pour pouvoir faire cela, nous allons comparer la valeur d’une variable à une
certaine autre valeur donnée et selon le résultat de la comparaison exécuter un
bloc de code ou pas. Pour comparer des valeurs, nous allons devoir utiliser des
opérateurs de comparaison.
Opérateur Définition
< Permet de tester si une valeur est strictement inférieure à une autre
> Permet de tester si une valeur est strictement supérieure à une autre
<= Permet de tester si une valeur est inférieure ou égale à une autre
>= Permet de tester si une valeur est supérieure ou égale à une autre
Notez bien ici que ces opérateurs ne servent pas à indiquer à Python que telle
valeur est supérieure, égale, inférieur ou différente à telle autre valeur. Lorsqu’on
utilise un opérateur de comparaison, on demande au contraire à Python de tester
si telle valeur est supérieure, égale, inférieur ou différente à telle autre valeur.
Python va donc comparer les deux valeurs et toujours renvoyer un booléen
: True si la comparaison est vérifiée ou False dans le cas contraire.
Vous pouvez retenir ici que c’est cette valeur booléenne renvoyée par le Python à
l’issue de toute comparaison que nous allons utiliser pour faire fonctionner nos
conditions.
On va en fait passer une expression à cette condition qui va être évaluée par
Python. Cette expression sera souvent une comparaison explicite (une
comparaison utilisant les opérateurs de comparaison) mais pas nécessairement.
Nous créons ici deux conditions if. Comme vous pouvez le voir, la syntaxe générale
d’une condition if est if condition : code à exécuter. Pensez bien à indiquer le : et à
bien indenter le code qui doit être exécuté si la condition est vérifiée sinon votre
condition ne fonctionnera pas.
Dans notre deuxième if, on demande cette fois-ci à Python de nous dire si le
contenu de x est égal au chiffre 5. Ce n’est pas le cas et donc Python
renvoie False et le code dans ce if n’est donc pas exécuté.
Au final, vous pouvez retenir que toute expression qui suit un if va être évaluée
par Python et que Python renverra toujours soit True, soit False. Nous n’avons
donc pas nécessairement besoin d’une comparaison explicite pour faire
fonctionner un if.
Pour comprendre cela vous devez savoir qu’en dehors des comparaisons Python
évaluera à True toute valeur passée après if à l’exception des valeurs suivantes qui
seront évaluées à False :
Avec la condition if, nous restons relativement limités puisque cette condition
nous permet seulement d’exécuter un bloc de code si que le résultat d’un test soit
évalué à True.
Notre deuxième condition fait exactement le même travail mais cette fois si on
compare la valeur de yà 5.
Notez bien ici qu’on n’effectuera jamais de test dans un else car le else est par
définition censé prendre en charge tous les cas non pris en charge par le if.
En effet, nous allons pouvoir ajouter autant de elif que l’on souhaite entre le if de
départ et le else de fin et chaque elif va pouvoir posséder son propre test ce qui va
nous permettre d’apporter des réponses très précises à différentes situations.
Dans cette nouvelle leçon, nous allons aller plus loin avec les conditions Python est voir comment
créer des conditions complexes en utilisant notamment les opérateurs logiques et les opérations
d’appartenance.
Souvent, nous allons vouloir comparer plusieurs valeurs au sein d’une même
condition, c’est-à-dire n’exécuter son code que si plusieurs conditions sont
vérifiées.
Pour faire cela, nous allons pouvoir soit utiliser plusieurs opérateurs de
comparaison, soit les opérateurs logiques, soit imbriquer plusieurs conditions les
unes dans les autres.
Les opérateurs logiques vont nous permettre de créer des conditions plus
puissantes mais dans certains cas il sera plus intéressant et plus rapide
d’imbriquer des conditions.
Dans cet exemple, on imbrique deux structures if…else l’une dans l’autre. La
première structure demande à Python de tester si notre variable x contient un
nombre strictement inférieur à 5. Si c’est le cas, on rentre dans le if et on teste
donc la condition du deuxième if. Dans le cas contraire, on va directement
au else de fin.
Les opérateurs logiques vont être principalement utilisés avec les conditions
puisqu’ils vont nous permettre d’écrire plusieurs comparaisons au sein d’une
même condition ou encore d’inverser la valeur logique d’un test.
Opérateur Définition
and Renvoie True si toutes les deux expressions sont évaluées à True
Les opérateurs logiques and et or vont nous permettre de passer plusieurs tests
pour évaluation à Python. On va par exemple pour tester si une
variable x contient une valeur inférieure à 5 et / ou si y contient une valeur
inférieure à 10 au sein d’une même condition.
Dans le cas où on utilise and, chaque expression devra être évaluée à True par
Python pour que le code dans la condition soit exécuté.
Dans le cas où on utilise or, il suffit qu’une expression soit évaluée à True par
Python pour que le code dans la condition soit exécuté.
Ici, vous pouvez noter que Python a l’inverse de la plupart des autres langages
possède une syntaxe très logique et très intuitive qui va nous permettre
d’effectuer plusieurs tests dans une condition “comme si” on utilisait un opérateur
logique and en utilisant tout simplement plusieurs opérateurs de comparaison à
la suite.
Finalement, l’opérateur logique not est très particulier puisqu’il nous permet
d’inverser la valeur logique d’un test : si Python renvoie False à l’issue d’une
évaluation par exemple et qu’on utilise l’opérateur not sur cette expression
l’opérateur inversera la valeur renvoyée par Python et la valeur finale passée à la
condition sera True.
Python met à notre disposition deux opérateurs d’appartenant qui vont nous
permettre de tester si une certaine séquence de caractères ou de valeurs est
présente ou pas dans une valeur d’origine.
Comme des valeurs booléennes sont renvoyées, on va tout à fait pouvoir utiliser ce
type d’opérateurs au sein de nos conditions même si ils sont communément plus
utilisés au sein de boucles qu’on étudiera dans la prochaine leçon.
Dans les exemples précédents, nous avons utilisé plusieurs opérateurs différents
dans nos conditions : des opérateurs de comparaisons divers, des opérateurs
logiques, etc.
A partir de là, cependant, il faut commencer à être très rigoureux pour obtenir des
résultats conformes à nos attentes et il va notamment falloir bien connaitre
l’ordre de priorité d’application des différents opérateurs en Python.
Opérateur Description
() Opérateur de groupement
** Elévation à la puissance
Opérateur Description
Les boucles, tout comme les conditions, sont une structure de contrôle Python de
base et il est donc essentiel de comprendre comment elles fonctionnent et de
savoir les utiliser.
Les boucles vont nous permettre d’exécuter plusieurs fois un bloc de code, c’est-à-
dire d’exécuter un code « en boucle » tant qu’une condition donnée est vérifiée.
Nous allons ainsi pouvoir utiliser les boucles pour parcourir les valeurs d’une
variable de liste liste ou pour afficher une suite de nombres.
Pour éviter de rester bloqué à l’infini dans une boucle, vous pouvez donc déjà
noter qu’il faudra que la condition donnée soit fausse à un moment donné (pour
pouvoir sortir de la boucle). Selon le type de condition, on va avoir différents
moyens de faire cela. Nous allons voir les plus courants dans la suite de cette
leçon.
On crée ensuite notre boucle while qui va baser sa condition de sortie autour de la
valeur de la variable x.
Littéralement, cette boucle signifie “tant que x stocke une valeur strictement
inférieure à 10, affiche la valeur de x puis ajoute 1 à cette valeur”.
Lors du premier tour dans la boucle, x stocke la valeur 0 qui est bien inférieure à
10. On rentre donc dans la boucle, on affiche la valeur de x et on ajoute 1 à cette
valeur.
La boucle Python for possède une logique et une syntaxe différente de celles des
boucle for généralement rencontrées dans d’autres langages.
En effet, la boucle for Python va nous permettre d’itérer sur les éléments d’une
séquence (liste, chaine de caractères, etc.) selon leur ordre dans la séquence.
On va pouvoir utiliser la fonction range() pour itérer sur une suite de nombres
avec une boucle for.
Cette fonction permet de générer une suite de valeurs à partir d’une certain
nombre et jusqu’à un autre avec un certain pas ou intervalle.
Dans son utilisation la plus simple, nous allons nous contenter de passer un
nombre en argument (entre les parenthèses) de range(). Dans ce cas, la fonction
génèrera une suite de valeurs de 0 jusqu’à ce nombre – 1 avec un pas de
1. range(5) par exemple génère les valeurs 0, 1, 2, 3 et 4.
Les instructions break et continue sont deux instructions qu’on retrouve dans de
nombreux langages et qui sont souvent utilisées avec les boucles mais qui peuvent
être utilisées dans d’autres contextes.
Dans cette nouvelle partie, nous allons étudier une autre notion incontournable
de tout langage de programmation qui se respecte : les fonctions. Nous allons
notamment définir ce qu’est une fonction et comprendre l’intérêt d’utiliser ces
structures puis nous verrons comment créer nos propres fonction en Python ainsi
que certains concepts avancés relatifs aux fonctions.
Une fonction est un bloc de code nommé. Une fonction correspond à un ensemble
d’instructions créées pour effectuer une tâche précise, regroupées ensemble et
qu’on va pouvoir exécuter autant de fois qu’on le souhaite en “l’appelant” avec son
nom. Notez “qu’appeler” une fonction signifie exécuter les instructions qu’elle
contient.
L’intérêt principal des fonctions se situe dans le fait qu’on va pouvoir appeler une
fonction et donc exécuter les instructions qu’elle contient autant de fois qu’on le
souhaite, ce qui constitue au final un gain de temps conséquent pour le
développement d’un programme et ce qui nous permet de créer un code beaucoup
plus clair.
Les fonction prédéfinies sont des fonctions déjà créées et mises à notre disposition
par Python. Dans ce cours, nous avons déjà utilisé des fonctions prédéfinies
comme la fonction print() ou la fonction type() par exemple.
Lorsqu’on a utilisé print() pour afficher des données pour la première fois
ou type() pour connaitre le type d’une donnée, on ne s’est pas posé la question de
ce qu’il se passait en arrière plan.
En fait, ces deux fonctions sont des fonctions complexes et qui contiennent de
nombreuses lignes d’instructions leur permettant d’accomplir une tâche précise :
l’affichage d’un résultat ou la détermination du type d’une valeur en l’occurence.
Cette complexité nous est cachée : nous n’avons qu’à appeler nos fonctions pour
qu’elles fassent leur travail et n’avons pas à écrire la série d’instructions qu’elles
contiennent à chaque fois et c’est tout l’intérêt des fonctions.
En plus des fonction prédéfinies, Python nous laisse la possibilité de définir nos
propres fonctions. Ces fonctions ne seront bien évidemment disponibles et
utilisables que dans l’espace où elles ont été définies, c’est-à-dire uniquement au
sein de nos scripts et non pas pour l’ensemble des développeurs utilisant Python.
Les fonctions vont aussi être de très bons outils d’abstraction lorsqu’on voudra
distribuer notre code : on préférera souvent fournir des fonctions à utiliser aux
autres développeurs plutôt que de les laisser se débrouiller avec des séries
d’instructions “sauvages”.
Pour définir une nouvelle fonction en Python, nous allons utiliser le mot
clef def qui sert à introduire une définition de fonction. Ce mot clef doit être suivi
du nom de la fonction, d’une paire de parenthèses au sein desquelles on pourra
fournir une liste de paramètres (nous reviendrons là dessus plus tard) et de : pour
terminer la ligne comme ceci def ma_fonction():.
Le nom d’une fonction Python doit respecter les normes usuelles concernant les
noms : un nom de fonction doit commencer par une lettre ou un underscore et
ne contenir que des caractères alphanumériques classiques (pas d’accent ni de
cédille ni aucun caractère spécial).
Notez que les noms de fonctions sont sensibles à la casse en Python, ce qui signifie
que les
fonctions ma_fonction(), Ma_fonction(), ma_FONCtion() et MA_FONCTION() par
exemple seront des fonctions bien différentes pour Python.
Nous allons ensuite placer la liste des différentes instructions de notre fonction à
la ligne suivant sa définition et en les indentant par rapport à la définition afin
que Python comprenne que ces instructions appartiennent à notre fonction.
Notez que la première instruction d’une fonction peut être une chaîne de
caractères littérale qui sera alors utilisée comme chaine de documentation de la
fonction.
Nous avons ici défini nos deux premières fonctions. Ces fonctions ne sont pas très
utiles ici : elles se contentent simplement d’exécuter une fonction print() mais
c’est déjà un bon début !
Maintenant que nos fonctions sont créées, nous allons devoir les appeler pour
exécuter le code qu’elles contiennent. Pour cela, nous allons utiliser leur nom suivi
d’un couple de parenthèses. On va pouvoir appeler nos fonctions autant de fois
qu’on le souhaite dans notre script : c’est tout l’intérêt des fonctions !
Les fonctions que nous avons créées ci-dessus se contentent d’exécuter toujours la
même fonction print() et donc de renvoyer toujours le même message.
Elles ne sont pas très utiles en l’état. Un autre aspect fondamental des fonctions
est qu’elles vont pouvoir accepter des informations qui viennent de l’extérieur,
c’est-à-dire qui sont externes à leur définition et qui vont les amener à produire
des résultats différents. Souvent même, les fonctions vont avoir besoin qu’on leur
passe des informations externes pour fonctionner normalement.
C’est par exemple le cas des fonctions print() et type() : ces deux fonctions
permettent d’afficher un message et de déterminer le type d’une donnée. Pour
afficher un message, print() va avoir besoin qu’on lui passe les données qu’elle doit
afficher. De même, type() va avoir besoin qu’on lui fournisse la donnée dont elle
doit déterminer le type.
Ces informations dont vont avoir besoin certaines fonctions pour fonctionner et
qu’on va passer à nos fonctions entre le couple de parenthèses sont appelées des
arguments ou des paramètres.
Pour rester très simple et très schématique ici, on parle de “paramètres” lorsqu’on
définit une fonction, c’est-à-dire lorsqu’on indique dans la définition de la
fonction que telle fonction a besoin d’une, de deux… informations pour
Expliquons ce code. On crée une nouvelle fonction bonjour() dont le rôle est
d’afficher “Bonjour” suivi du prénom de quelqu’un. Pour que cela fonctionne, il va
falloir lui passer un prénom lorsqu’on appelle notre fonction en argument de
celle-ci.
Ici, je vous rappelle que le mot qu’on utilise comme paramètre lors de la
définition de la fonction sera remplacé par la valeur passée en argument lors de
l’appel à la fonction. On va donc utiliser notre paramètre dans print() afin que
cette fonction affiche bien “Bonjour” suivi d’un prénom.
Le code de notre fonction n’est cependant pas très optimisé ici : en effet, on utilise
de la concaténation dans print() or la concaténation ne va fonctionner que si la
valeur passée est bien une chaine de caractères. Si on passe un un chiffre en
argument de bonjour(), Python renverra une erreur.
Ici, il va être plus efficace de passer le texte et l’argument comme deux arguments
différents de print(). En effet, vous devez savoir que print() est capable d’accepter
un nombre infini d’arguments qu’elle affichera à la suite. Cela résout notre
problème de type de valeurs :
Dans cette leçon, nous allons étudier quelques concepts relativement avancés liés au nombre de
paramètres des fonctions en passant en revue différentes syntaxes qui vont nous permettre de
passer un nombre variable d’arguments à une fonction.
Dans la leçon précédente, nous avons défini ce qu’étaient des paramètres et des
arguments. Nous avons créé une fonction bonjour() qui avait besoin qu’on lui passe
un argument pour fonctionner comme ceci :
Cette définition impose qu’on passe un et un seul argument à notre fonction pour
qu’elle fonctionne : si on tente de l’appeler sans argument ou en lui passant
plusieurs arguments Python renverra une erreur.
Dans certaines situations, nous voudrons créer des fonctions plus flexibles qui
pourront accepter un nombre variable d’arguments. Cela peut être utile si on
souhaite créer une fonction de calcul de somme par exemple qui devra
additionner les différents arguments passés sans limite sur le nombre
d’arguments et sans qu’on sache à priori combien de valeurs vont être
additionnées.
En Python, il existe deux façons différentes de créer des fonctions qui acceptent
un nombre variable d’arguments. On peut :
Définir des valeurs de paramètres par défaut lors de la définition d’une fonction ;
Utiliser une syntaxe particulière permettant de passer un nombre arbitraire d’arguments.
Préciser des valeurs par défaut pour les paramètres d’une fonction
On va déjà pouvoir préciser des valeurs par défaut pour nos paramètres. Comme
leur nom l’indique, ces valeurs seront utilisées par défaut lors d’un appel à la
fonction si aucune valeur effective (si aucun argument) n’est passée à la place.
Utiliser des valeurs par défaut pour les paramètres de fonctions permet donc aux
utilisateurs d’appeler cette fonction en passant en omettant de passer les
arguments relatifs aux paramètres possédant des valeurs par défaut.
On va pouvoir définir des fonctions avec des paramètres sans valeur et des
paramètres avec des valeurs par défaut. Attention cependant : vous devez bien
comprendre qu’ici, si on omet de passer des valeurs lors de l’appel à la fonction,
Python n’a aucun moyen de savoir quel argument est manquant. Si 1, 2, etc.
arguments sont passés, ils correspondront de facto au premier, aux premier et
deuxième, etc. paramètres de la définition de fonction.
Pour cette raison, on placera toujours les paramètres sans valeur par défaut au
début et ceux avec valeurs par défaut à la fin afin que le arguments passés
remplacent en priorité les paramètres sans valeur.
Si on souhaite s’assurer que les valeurs passées à une fonction vont bien
correspondre à tel ou tel paramètre, on peut passer à nos fonctions des arguments
nommés. Un argument nommé est un argument qui contient le nom d’un
paramètre présent dans la définition de la fonction suivi de la valeur qu’on
souhaite passer comme ceci : argument = valeur.
On va pouvoir passer les arguments nommés dans n’importe quel ordre puisque
Python pourra faire le lien grâce au nom avec les arguments attendus par notre
fonction. Notez cependant qu’il faudra ici passer les arguments nommés en
dernier, après les arguments sans nom. Par ailleurs, aucun argument ne peut
recevoir de valeur plus d’une fois. Faites donc bien attention à ne pas passer une
La syntaxe *args (remplacez “args” par ce que vous voulez) permet d’indiquer lors
de la définition d’une fonction que notre fonction peut accepter un nombre
variable d’arguments. Ces arguments sont intégrés dans un tuple. On va pouvoir
préciser 0, 1 ou plusieurs paramètres classiques dans la définition de la fonction
avant la partie variable.
Ici, on utilise une boucle for pour itérer parmi les arguments : tant que des valeurs
sont trouvées, elles sont ajoutées à la valeur de s. Dès qu’on arrive à court
d’arguments, on print() le résultat.
Dans cette exemple, j’utilise la méthode Python items() dont le rôle est de
récupérer les différentes paires clefs : valeurs d’un dictionnaire. Nous reparlerons
des méthodes lorsque nous aborderons l’orienté objet. Pour le moment, vous
pouvez considérer qu’une méthode est l’équivalent d’une fonction.
Les syntaxes *args et **kwargs peuvent être utilisées pour réaliser les opérations
inverse de celles présentés ci-dessus, à savoir séparer des données composites pour
passer les valeurs ou éléments de ces données un à un en arguments des
fonctions.
On, utilisera la syntaxe *args pour séparer les arguments présents dans une liste
ou un tuple et la syntaxe **kwargs pour séparer les arguments présents dans un
dictionnaire et fournir des arguments nommés à une fonction.
Dans cette leçon, nous allons voir comment faire pour que nos fonctions retournent explicitement
une valeur et comprendre l’intérêt de faire retourner une valeur à nos fonctions Python.
Jusqu’à présent, nos fonctions n’ont fait qu’afficher leur résultat après qu’on les
ait appelées. En pratique, cette façon de procéder est rarement utilisée et ceci
pour deux raisons : d’une part, nous n’avons aucun contrôle sur le résultat affiché
puisque celui est affiché dès que la fonction a fini de s’exécuter et ensuite car nous
ne pouvons pas utiliser ce résultat pour effectuer de nouvelles opérations.
Pour cela, créons par exemple une fonction très simple qui renvoie la différence
entre deux nombres.
Ici, on utilise return afin de demander à notre fonction de retourner son résultat.
On stocke ensuite ce résultat dans une variable x dont on pourra se resservir dans
la suite du script.
Une fonction ne peut retourner qu’une donnée à la fois. Cependant, Python met à
notre disposition des types de données composites comme les listes ou les tuples
par exemple.
On va donc pouvoir utiliser return pour faire retourner “plusieurs valeurs” à la fois
à nos fonctions ou pour être tout à fait exact pour leur faire retourner une donnée
composite.
Pour cela, on va préciser les différentes valeurs que doit retourner return en les
séparant par des virgules. Les valeurs retournées seront retournées dans un tuple.
Nous avons vu dans les leçon précédente qu’une fonction pouvait exécuter une
autre fonction, par exemple dans le cas où on demande à une fonction d’exécuter
une fonction print() pour afficher une valeur.
Vous devez savoir qu’une fonction peut également s’appeler elle même dans son
exécution : c’est ce qu’on appelle la récursivité. Lorsqu’on définit une fonction
récursive, il faudra toujours faire bien attention à fournir une condition qui sera
fausse à un moment ou l’autre au risque que la fonction s’appelle à l’infini.
L’exemple de fonction récursive par excellence est la définition d’une fonction qui
calculerait une factorielle. La factorielle d’un nombre est le produit des nombres
entiers inférieurs ou égaux à celui-ci; la factorielle de 4 par exemple est égale à 4 *
3 * 2 * 1.
Ici, la condition de sortie de notre fonction est atteinte dès que la valeur passée en
argument atteint ou est inférieure à 1. Expliquons comment fonctionne cette
fonction en détail. Si on passe une valeur inférieure ou égale à 1 à notre fonction
au départ, on retourne la valeur 1 et la fonction s’arrête.
Par définition, toute fonction est censée renvoyer une valeur. Une fonction qui ne
renvoie pas de valeur n’est pas une fonction : on appelle cela en programmation
une procédure.
En Python, en fait, même les fonctions sans instruction return explicite renvoient
une valeur qui est None. Le valeur None est une valeur qui correspond justement à
l’absence de valeur. Cette valeur sert à indiquer “il n’y a pas de valeur”.
L’interpréteur Python l’ignore lorsque c’est la seule valeur qui est renvoyée mais
elle existe tout de même et c’est la raison pour laquelle on appelle les fonctions
qui ne possèdent pas de return explicite des fonctions en Python.
Dans cette leçon, nous allons découvrir un concept fondamental lié aux fonctions
et aux variables qui est celui de portée des variables. Nous allons comprendre les
conditions d’accès et d’utilisation des différentes variables dans un script.
En Python, nous pouvons déclarer des variables n’importe où dans notre script :
au début du script, à l’intérieur de boucles, au sein de nos fonctions, etc.
Le terme de “portée des variables” sert à désigner les différents espaces dans le
script dans lesquels une variable est accessible c’est-à-dire utilisable. En Python,
une variable peut avoir une portée locale ou une portée globale.
Les variables définies dans une fonction sont appelées variables locales. Elles ne
peuvent être utilisées que localement c’est-à-dire qu’à l’intérieur de la fonction
qui les a définies. Tenter d’appeler une variable locale depuis l’extérieur de la
fonction qui l’a définie provoquera une erreur.
Cela est dû au fait que chaque fois qu’une fonction est appelée, Python réserve
pour elle (dans la mémoire de l’ordinateur) un nouvel espace de noms (c’est-à-dire
une sorte de dossier virtuel). Les contenus des variables locales sont stockés dans
cet espace de noms qui est inaccessible depuis l’extérieur de la fonction.
Cet espace de noms est automatiquement détruit dès que la fonction a terminé
son travail, ce qui fait que les valeurs des variables sont réinitialisées à chaque
nouvel appel de fonction.
Les variables définies dans l’espace global du script, c’est-à-dire en dehors de toute
fonction sont appelées des variables globales. Ces variables sont accessibles (=
utilisables) à travers l’ensemble du script et accessible en lecture seulement à
l’intérieur des fonctions utilisées dans ce script.
Pour le dire très simplement : une fonction va pouvoir utiliser la valeur d’une
variable définie globalement mais ne va pas pouvoir modifier sa valeur c’est-à-
dire la redéfinir. En effet, toute variable définie dans une fonction est par
définition locale ce qui fait que si on essaie de redéfinir une variable globale à
l’intérieur d’une fonction on ne fera que créer une autre variable de même nom
que la variable globale qu’on souhaite redéfinir mais qui sera locale et bien
distincte de cette dernière.
Cela est possible en Python. Pour faire cela, il suffit d’utiliser le mot
clef global devant le nom d’une variable globale utilisée localement afin d’indiquer
à Python qu’on souhaite bien modifier le contenu de la variable globale et non pas
créer une variable locale de même nom.
Nous connaissons déjà bien les fonction print() et type() qui permettent respectivement
d’afficher des données ou de connaitre le type d’une donnée Python.
Python ne contient pas énormément de fonctions prédéfinies -seulement celles
qui s’avèrent le plus utiles- et la plupart d’entre elles sont donc très régulièrement
utilisées.
Vous trouverez dans la suite de cette leçon quelques définitions de fonctions qui
pourront vous servir par la suite.
La fonction str() retourne une chaine de caractères à partir d’une donnée qu’on va lui
passer en argument ;
La fonction int() retourne un entier à partir d’un nombre ou d’une chaine contenant un
nombre qu’on va lui passer en argument ;
La fonction float() retourne un nombre décimal à partir d’un nombre ou d’une chaine
contenant un nombre qu’on va lui passer en argument ;
La fonction complex() retourne un nombre complexe à partir d’un nombre ou d’une
chaine contenant un nombre qu’on va lui passer en argument ;
La fonction bool() retourne un booléen à partir d’une donnée qu’on va lui passer en
argument ;
La fonction list() retourne une liste à partir d’une donnée itérable (une donnée dont on
peut parcourir les valeurs) ;
La fonction tuple() retourne un tuple à partir d’une donnée itérable ;
La fonction dict() crée un dictionnaire à partir d’un ensemble de paires clef = “valeur” ;
La fonction set() retourne un ensemble (set) à partir d’une donnée itérable.
Nous allons ici étudier les fonctions range(), round(), sum(), min() et max().
La fonction range() renvoie une séquence de nombres. On peut lui passer jusqu’à 3
arguments mais 1 seul est obligatoire.
Le nombre de décimales par défaut est 0, ce qui signifie que la fonction retournera
l’entier le plus proche.
La fonction sum() permet de calculer une somme. On peut lui passer une liste de
nombres en arguments par exemple. On peut également lui passer une valeur “de
départ” en deuxième argument qui sera ajoutée à la somme calculée.
La fonction max() retourne la plus grande valeur d’une donnée itérable, c’est-à-
dire d’une donnée dont on peut parcourir les différentes valeurs.
On peut lui passer autant d’arguments qu’on souhaite comparer de valeurs. Notez
qu’on peut également comparer des chaines même si max() est peu souvent
utilisée pour faire cela.
La fonction dir(), lorsqu’elle est utilisée sans argument, renvoie la liste des
variables et des fonctions (ou plus exactement des objets et des méthodes)
disponibles dans l’espace de portée courant. Nous étudierons ce que sont les objets
et méthodes par la suite.
Si on lui passe une donnée en argument, elle renverra la liste des méthodes
disponibles pour ce type de donnée.
Dans cette nouvelle partie, nous allons découvrir une autre facette du langage Python qui en fait
un langage à la fois très puissant, modulable et évolutif : l’utilisation de modules. Nous allons
notamment étudier le fonctionnement de quelques modules prédéfinis qu’il convient de savoir
manipuler.
Les modules standards qui ne font pas partie du langage en soi mais sont intégrés
automatiquement par Python ;
Les modules développés par des développeurs externes qu’on va pouvoir utiliser ;
Les modules qu’on va développer nous mêmes.
Dans tous les cas, la procédure à suivre pour utiliser un mode sera la même. Nous
allons commencer par décrire cette procédure puis nous étudierons dans la suite
de cette partie quelques modules standards qu’il convient de connaitre.
Ensuite, enregistrez le dans le dossier Python que vous devriez avoir créé au début
de ce cours et qui devrait se trouver sur votre bureau.
Dès que tout cela est fait, on peut retourner dans le terminal ou l’invite de
commande. Ne lancez pas l’interpréteur pour le moment et pensez bien à définir
le dossier Python comme dossier de référence pour la recherche de fichiers
Python si ça n’a pas été fait au début de ce cours.
Pour cela, vous pouvez utiliser la commande cd (pour “change directory”) suivie du
chemin du dossier qui doit être le dossier de référence (Desktop/Python pour Mac
par exemple).
On peut ensuite lancer l’interpréteur Python. Ici, il faut imaginer que notre
terminal / invite de commande représente le script principal de notre
programme. On va importer notre module dans ce script principal grâce à
l’instruction import bonjour.
Lorsque l’interprète rencontre une instruction import, il importe le module s’il est
présent dans le path (le chemin de recherche). Pour rappel, le path ou chemin de
recherche est une liste de répertoires dans lesquels l’interpréteur cherche avant
d’importer un module. Pour être tout à fait précis, lorsqu’on importe un module,
l’interpréteur Python le recherche dans différents répertoires selon l’ordre suivant
:
1. Le répertoire courant ;
2. Si le module est introuvable, Python recherche ensuite chaque répertoire listé dans la
variable shell PYTHONPATH ;
3. Si tout échoue, Python vérifie le chemin par défaut. Sous UNIX, ce chemin par défaut est
normalement /usr/local/lib/python/.
Dès que notre module est importé, on va pouvoir accéder tout simplement aux
variables et fonctions de notre module depuis notre script en préfixant le nom des
éléments du module par le nom du module et un point comme ceci :
On peut utiliser le mot clef as pour renommer un module ou plutôt pour créer un
alias de nom. Cela peut permettre d’obtenir des scripts plus courts et plus clairs
dans le cas où le nom du module est inutilement long ou s’il est peu descriptif.
Note : on ne peut importer un module qu’une fois dans un script. Si vous testez le
code ci-dessus et si vous aviez déjà importé le module précédemment, il faudra
que vous quittiez l’interpréteur et que vous le relanciez pour que tout fonctionne.
Pour quitter l’interpréteur, vous pouvez utiliser l’instruction quit().
Parfois, nous n’aurons besoin que de certains éléments précis dans un module. On
va alors pouvoir se contenter d’importer ces éléments en particulier. Pou cela, on
va utiliser l’instruction from nom-du-module import un-element.
Pour faire cela, on peut utiliser la fonction dir() qui renvoie la liste de toutes les
fonctions et variables d’un module.
Comme vous pouvez le voir, tout fichier Python possède par défaut des éléments
de configuration.
Comme je vous l’ai dit au début de cette leçon, nous importerons bien souvent des
modules créés par d’autres développeurs ou des modules mis à notre disposition
par Python lui même.
Pour importer un module Python, nous allons à nouveau tout simplement utiliser
une instruction import comme si on importait l’un de nos modules.
Dans cette leçon, nous allons passer en revue rapidement les trois modules Python
standards math, random et statistics et découvrir leurs fonctionnalités les plus utilisées.
Le module random nous fournit des outils pour générer des nombres pseudo-
aléatoires de différentes façons.
Le module random est très riche et contient de nombreuses fonctions qui vont
nous permettre de générer des nombres pseudo aléatoires de différentes manières
et pour différentes situations. Je vous invite à les découvrir en détail dans
la documentation.
Le module statistics nous fournit des outils nous permettant d’effectuer des
calculs de statistiques peu complexes, comme des calculs de moyenne, de médiane
ou de variance.