Cours D'introduction À La Programmation II - 082952
Cours D'introduction À La Programmation II - 082952
Cours D'introduction À La Programmation II - 082952
A la découverte de Python
1
Institut Supérieur Technique du Sankuru
Aide Python
Python est l’un des langages de programmation les plus utilisés au monde. Grâce à sa
syntaxe sèche et puissante, et à son support multiplateforme, il est utilisé pour de nombreux
types d’applications, de la mise en réseau au Web, en passant par l’apprentissage
automatique. Ce guide complet et pratique part des bases du langage, pour apprendre même
les fonctionnalités les plus complexes.
2
Institut Supérieur Technique du Sankuru
Idées
3
Institut Supérieur Technique du Sankuru
4
Institut Supérieur Technique du Sankuru
5
Institut Supérieur Technique du Sankuru
6
Institut Supérieur Technique du Sankuru
7
Institut Supérieur Technique du Sankuru
8
Institut Supérieur Technique du Sankuru
Pour vérifier que tout a réussi, nous démarrons l’invite de commande (Start -> Run ->
cmd) et tapons :
echo %PATH%
9
Institut Supérieur Technique du Sankuru
Si Python a été installé avec succès, vous verrez un court message indiquant la
version de l’interpréteur python, suivi de l’invite ().>>>
Sur le site officiel, il existe également un guide d’installation et d’utilisation de
Python sur Windows.
3.4. Installer Python sur Linux
Dans les systèmes Linux, Python est souvent déjà présent dans la configuration de
base. Vous pouvez toujours vérifier s’il y en a et quelles versions sont présentes. Pour ce
faire, nous tapons à partir du shell ce qui suit :
$ python
Ou
$ python3
Si les deux commandes échouent, Python n’est pas installé. Si python démarre
seulement Python2 c’est que la commande python3 n’est pas présente, seul Python 2 est
installé. Si, au contraire, la commande python ou python3 démarre Python 3 alors Python 3
est installé.
Dans le cas où Python 3 n’est pas installé, vous devrez l’installer en utilisant le
gestionnaire de paquets pour les systèmes Linux : apt pour les distributions basées sur
10
Institut Supérieur Technique du Sankuru
Debian, rmp pour les distributions basées sur RedHat. Vous pouvez également télécharger et
compiler manuellement des sources Python.
Plus en détail, selon votre système, vous pouvez démarrer l’une des commandes
suivantes :
Commander Description
$ yum install python3 Pour les distributions basées sur des paquets rpm, tels que
Red Hat, Fedora, Centos
$ apt-get install python3 Pour les distributions basées sur Debian, telles que
Ubuntu
Tout d’abord, nous devons vérifier la dernière version des sources du site, puis nous
lançons les commandes suivantes :
$ cd /tmp
$ wget http://www.python.org/ftp/python/3.x/python-3.x.tar.bz2
Ce faisant, nous avons téléchargé une archive .tar.bz2 contenant les sources Python.
Maintenant, extrayons le contenu :
$ tar -xjf python-3.x.tar.bz2
$ cd python-3.x
vim ~/.bash_profile
11
Institut Supérieur Technique du Sankuru
python script.py
Il est intéressant d’ouvrir une petite parenthèse sur ce qui se passe lorsque vous
exécutez un script, en entrant un peu plus dans les détails.
Chaque fois que la commande
python
est appelée, le code écrit est analysé à la recherche de token (jetons), chacun d’entre eux étant
analysé dans une arborescence logique qui représente le programme. Pareille structure est
finalement transformée en bytecode (fichiers avec l’extension .pyc ou .pyo). Pour pouvoir
exécuter ces bytecodes, un interpréteur spécial connu sous le nom de machine virtuelle
Python en anglais Python Virtual Machine (PVM) est utilisé.
Sorgente (file.py) -> Bytecode (file.pyc) -> Runtime (PVM)
12
Institut Supérieur Technique du Sankuru
13
Institut Supérieur Technique du Sankuru
En lançant IDLE, une fenêtre apparaîtra avec l’invite de commande Python désormais
bien connue (>>>), et les éléments de menu que vous avez l’habitude de voir dans d’autres
applications similaires.
14
Institut Supérieur Technique du Sankuru
Vous pouvez également personnaliser l’IDE en fonction de vos besoins. Pour ce faire,
il suffit de sélectionner le menu : Options -> Configure IDLE.
À partir de cet écran, vous pouvez choisir le type et la taille de la police, ainsi que la
largeur de l’indentation (dont nous parlerons plus tard). Vous pouvez également
15
Institut Supérieur Technique du Sankuru
personnaliser les couleurs des mots-clés et de divers autres éléments en modifiant les
paramètres accessibles via l’onglet Mise en surbrillance.
5.1. Print
Nous avons déjà vu, dans les leçons passées, la fonction « print », qui sert à imprimer
en sortie (généralement à l’écran, mais aussi sur des fichiers ou d’autres flux) la valeur d’une
variable ou d’une expression.
>>> a = 12
>>> b = 3
>>> print(a, b, a-b)
12 3 9
>>>
>>> c = 'Hello'
>>> print(c, 'World!')
Hello World!
On peut noter que la fonction print prend en entrée un nombre variable d’arguments
(même de types différents), les convertit en chaînes (string) et les affiche dans des sorties
séparées par un espace et suivies d’un caractère de retour à la ligne (\n). Il vous permet
également de spécifier le séparateur, le caractère de fin, le flux et d’autres paramètres.
Lorsque vous travaillez à partir de l’interpréteur interactif, vous n’avez pas besoin
d’utiliser print pour voir la valeur d’une variable ou d’une expression, mais il vous suffit de
la taper directement :
>>> x = 10
>>> x
10
>>> x * 2
20
16
Institut Supérieur Technique du Sankuru
5.2. Input
La fonction input est utilisée pour permettre à l’utilisateur d’entrer les données du
clavier, qui seront ensuite utilisées par le programme. input accepte un seul argument
facultatif : une chaîne qui s’affiche à l’écran avant de lire la valeur tapée. Une fois que
l’utilisateur a tapé une valeur et appuyé sur la touche Entrée, il renvoie la valeur sous forme
de chaîne, comme le montre l’exemple suivant :
La fonction float est utilisée pour convertir rayon (qui est de type chaîne) en une
valeur numérique avec la virgule affectée à la variable r ;
Les deux variables (rayon et r) sont imprimées pour montrer que la première est une
chaîne (donc représentée entre guillements simples ‘...’) tandis que la seconde est un
nombre ;
17
Institut Supérieur Technique du Sankuru
r est ensuite utilisé pour calculer la Surface du cercle (** est l’opérateur d’élévation à la
puissance) et la fonction print est utilisée pour imprimer la chaîne Surface et le résultat
de l’expression 3.14 * r**2 ;
r est également utilisé pour calculer la circonférence et print pour imprimer la chaîne
Circonference et le résultat de l’expression 2 * 3.14 * r ;
Remarque : Dans Python 2.x, il y avait deux fonctions d’entrée différentes : raw_input et
input. La première est équivalente à input de Python 3.x, tandis que la seconde (qui
effectuait une étape supplémentaire de conversion d’entrée implicite) a été supprimé de
Python 3.x. Comme nous l’avons vu dans le deuxième exemple, dans Python 3.x, il est
possible convertir explicitement les valeurs reçues en input.
Chapitre 6. Indentation
Dans ce chapitre, nous verrons plus en détail l’un des aspects fondamentaux de la
programmation avec Python : l’indentation.
Contrairement à d’autres langages qui délimitent des blocs de code avec des crochets
de graphe (tels que C, C ++ et Java) ou avec des mots réservés comme begin / end, Python
utilise l’indentation. Le retrait de code est une pratique courante dans tous les langages, car
il facilite la lecture du code et la compréhension de sa structure. Au lieu d’utiliser deux
mécanismes distincts pour les compilateurs/interpréteurs (parenthèses ou mots-clés) et les
personnes (indentation), python a choisi d’utiliser l’indentation pour les deux. Ce choix
comporte plusieurs aspects positifs, notamment :
Cela signifie que, dans Python, l’indentation est importante et qu’une indentation
incorrecte peut entraîner un comportement de programme incorrect ou des erreurs. Voyons
un exemple simple. Ci-dessous, nous utilisons la construction if , que nous approfondirons un
peu plus loin.
18
Institut Supérieur Technique du Sankuru
Il est donc très important de faire attention à l’indentation, car elle est toujours
évaluée dans le processus d’analyse du programme. Vous trouverez ci-dessous un exemple
d’erreur due à une indentation incorrecte :
6.2. Conventions
Pour avoir un code plus cohérent, la Python Software Foundation a mis à disposition
un document appelé PEP 8 (acronyme qui signifie Python Enhancement Proposal), qui
rassemble différentes conventions et directives. PEP 8 comprend également une section sur
l’indentation, qui suggère entre autres de :
- utiliser toujours 4 espaces par niveau d’indentation ;
- éviter l’utilisation de caractères de tabulation ;
- Ne jamais mélanger l’utilisation de tabulations et d’espaces.
Bien que PEP 8 suggère de suivre ces conventions, il est possible (bien que fortement
déconseillé) d’utiliser des tabulations ou un nombre différent d’espaces en lieu et place de 4.
Tant que les niveaux d’indentation sont cohérents, le programme fonctionnera toujours.
Il y a cependant quelques exceptions. Si vous travaillez sur un code qui utilise une
convention différente, il est préférable de vous y adapter ou, alternativement, d’adapter tout le
code existant à PEP 8. De plus, il est toujours possible (et parfois recommandé) d’utiliser
plus ou moins d’espaces pour aligner des éléments dans une liste, ou des arguments dans un
appel de fonction :
lista = [0, 1, 2, 3, 4,
19
Institut Supérieur Technique du Sankuru
5, 6, 7, 8, 9]
funzione(arg1, arg2,
arg3, arg4)
nombre = 10
string = "Python"
liste = [1, 2, 3]
Comme vous pouvez le voir, en Python, il n’est pas nécessaire de définir des variables avant
de les utiliser, ni de spécifier leur type.
7.2. Différences avec d’autres langages
Dans les langages tels que C, les variables font référence à des emplacements de
mémoire spécifiques dont la taille dépend de leur type (pour cela, vous devez spécifier le type
lors de la déclaration d’une variable). En Python, en revanche, les objets ont un type
spécifique (nombre, chaîne, liste, etc.), et les variables ne sont que des « étiquettes » qui font
référence à un certain objet.
Pour mieux comprendre ce concept fondamental, nous pouvons le voir dans un
exemple simple :
/* Code C */
int x;
x = 10;
x = 20;
Dans ce code C :
1. Il y est définie une variable x de type int (c’est-à-dire suffisamment grand pour
contenir un nombre entier) ;
2. La valeur 10 est enregistrée dans l’emplacement mémoire associé à x ;
3. La valeur 20 est enregistrée dans l’emplacement de mémoire associé à x, en
remplaçant, par le même fait, le 10.
# code Python
x = 10
x = 20
20
Institut Supérieur Technique du Sankuru
Bien que ce code Python puisse sembler très similaire, ce qui se passe est différent :
1. L’objet 10 est créé et l’opération d’affectation fait de sorte que la variable x se réfère
à cet objet ;
2. L’objet 20 est créé et la variable/étiquette x est « déplacée » de 10 vers 20 ;
3. Comme il n’y a plus de variables qui référencent l’objet 10, le garbage collection1 le
supprimera automatiquement.
Dans ces deux exemples, la valeur finale associée à la variable x sera 20.
Comme nous l’avons dit précédemment, en Python, les variables n’ont pas de type et
peuvent faire référence à n’importe quel type d’objet. Le code suivant est donc parfaitement
valide en Python :
x = 10
x = "Python"
x = [1, 2, 3]
Dans cet exemple, la variable/étiquette x est « déplacée » de l’entier 10, vers la chaîne
“Python”, et enfin vers la liste [1, 2, 3].
Types de données
Python possède à la fois les types de données classiques, communs à la plupart des
langages de programmation, mais aussi plusieurs types plus puissants et flexibles. Voici un
tableau répertoriant certains des types de données les plus courants en Python :
1 Pour la gestion de la mémoire, deux principes fondamentaux sont pris en compte par le garbage collection :
Rechercher des objets précédemment créés par un programme auquel vous n’avez plus besoin
d’accéder ;
Récupérez les ressources utilisées par ces objets.
21
Institut Supérieur Technique du Sankuru
Dans les prochaines leçons, nous aborderons plus en détail ces types de données et
verrons leurs caractéristiques.
Une possibilité unique offerte par Python est représentée par plusieurs affectations, ce
qui vous permet d’initialiser plusieurs variables directement sur la même ligne de code. Pour
comprendre ce dernier concept, il suffit de regarder l’exemple suivant :
22
Institut Supérieur Technique du Sankuru
>>> c
5
En Python, vous pouvez utiliser le caractère dies (#) pour ajouter des commentaires à
votre code. Chaque ligne de commentaire doit être précédée d’un (#), et vous pouvez
également ajouter des commentaires à la suite des instructions comme dans les lignes
suivantes :
Nous avons également vu qu’il est possible d’utiliser l’interpréteur interactif comme
calculatrice et comment convertir différents types de données. Vous pouvez également
définir des entiers à l’aide de notations binaires, octales et hexadécimales :
>>> 6 + 4*3
18
>>> 9 / 2 # la division entre deux nombres entiers renvoie un float
4.5
>>> 2j * 2j # multiplication entre les nombres complexes
(-4+0j)
>>> int(10.6) # conversion explicite à partir du type float vers le type int
10
>>> float(20) # conversion explicite à partir du type int vers le type float
20.0
>>> 0b11111111 # entier en notation binaire (préfixe 0b)
255
>>> 0o377 # entier en notation octale (préfixe 0o)
255
23
Institut Supérieur Technique du Sankuru
Remarque :
Dans Python 2, il y avait deux types d’entiers : int et long. Dans Python 3, ces deux
types ont été unifiés, et le type int de Python 3 est capable de représenter des entiers de taille
arbitraire (comme c’est le cas du type long de Python 2).
Remarque :
Dans Python 2, la division entre deux ints renvoyait un int, dans Python 3, elle
renvoyait un float. Dans Python 2, vous pouvez obtenir le même comportement que dans
Python 3 en ajoutant, au début du programme, la ligne from __future__ import division.
Python prend également en charge les opérateurs de comparaison, qui renvoient True
ou False :
24
Institut Supérieur Technique du Sankuru
En Python, chaque objet est soit true (nombres autres que 0, la constante True, ou
conteneurs contenant au moins un élément), soit false (c’est-à-dire le nombre 0, les
constantes False et None ou les conteneurs vides). Vous pouvez vérifier si un objet est vrai
ou faux à l’aide de bool(objet).
Comme dans d’autres langages de programmation, également en Python, les
opérateurs and et or travaillent de sorte que, si le premier opérande est suffisant pour
déterminer le résultat, le second n’est pas évalué. En d’autres termes, les deux opérateurs
renvoient toujours l’un des deux opérandes.
Opérateur Description
x << n Exécute un déplacement à gauche de n positions des bits de x
x >> n Exécute un déplacement à droite de n positions des bits de x
x&y exécute un and entre les bits de x et de y
x|y exécute un or entre les bits de x et de y
x^y exécute un or exclusif entre les bits de x et de y
~x inverse les bits de x
25
Institut Supérieur Technique du Sankuru
Les chaînes, ainsi que les listes ou les tuples, sont un type particulier de séquence et
prennent donc en charge toutes les opérations communes aux séquences. Voyons quelques-
uns d’entre eux.
>>> s = 'Python'
>>> s[0] # élément en position 0 (le premier)
'P'
>>> s[5] # élément en position 5 (le cinquième)
'n'
>>> s[-1] # élément en position -1 (le dernier)
'n'
>>> s[-4] # élément en position -4 (le quatrième élément en commençant par la fin)
't'
26
Institut Supérieur Technique du Sankuru
9.2. Container
Les opérateurs in et not in peuvent être utilisés pour vérifier si un élément fait partie
d’une séquence ou non. Dans le cas des chaînes, vous pouvez également vérifier si une sous-
chaîne est contenue dans une chaîne
>>> s = "Python
>>> 'P' in s # vérifie si le caractère 'P' est contenu dans la chaîne s
True
>>> 'x' in s # le caractère 'x' n'est pas dans s, donc renvoie False
False
>>> 'x' not in s # "not in" effectue l'opération inverse
True
>>> 'Py' in s # vérifie si la sous-chaîne 'Py' est contenue dans la chaîne s
True
>>> 'py' in s # la vérification est sensible à la casse (case-sensitive), donc elle renvoie False
False
Vous pouvez utiliser l’opérateur + pour concaténer les séquences et * pour répéter les
séquences :
La fonction intégrée len() peut être utilisée pour obtenir le nombre d’éléments dans une
séquence :
>>> len('Python')
6
>>> s = 'Precipitevolissimevolmente'
>>> len(s)
26
9.4. Fonctions et méthodes
27
Institut Supérieur Technique du Sankuru
Avant de continuer, il est nécessaire de faire une brève parenthèse pour expliquer la
différence entre les fonctions et les méthodes.
Nous avons déjà vu certaines fonctions telles que len(). Les fonctions acceptent 0 ou
plusieurs arguments et peuvent être utilisées avec des objets de différents types, selon cette
syntaxe : fonction(arguments) :
Les méthodes sont similaires aux fonctions mais sont liées au type de l’objet et ont
une syntaxe différente : objet.methode(arguments). En plus des fonctions, les méthodes
peuvent accepter 0 ou plusieurs arguments :
>>> s = 'Python'
>>> s.upper() # la méthode upper retourne une nouvelle ... tout en majuscules
'PYTHON'
>>> s.lower() # la méthode lower renvoie une nouvelle... tout en minuscules
'python'
Dans cet exemple, vous pouvez voir deux méthodes fournies par le type str, qui ne
sont pas disponibles pour d’autres types.
9.4. help() et dir()
Deux outils particulièrement utiles pour travailler avec des fonctions et des méthodes
sont les fonctions intégrées help et dir. help(objet) renvoie une brève explication de l’objet
passé en argument. dir(objet) renvoie une liste de méthodes et d’attributs d’objet.
>>> len # len est une fonction built-in (fonction intégrée)
<built-in function len>
>>> help(len) # on peut passer len à help() pour voir une brève explication
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.
>>> dir(str) # restitue une liste de méthodes et attributs de str (càd chaine de caractères)
[..., 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs',
'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper',
'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind',
'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
28
Institut Supérieur Technique du Sankuru
Ces outils vous permettent d’explorer de manière interactive les fonctions et les
méthodes et de comprendre leur fonctionnement :
>>> help(str.replace) # visualise l'help par la méthode str.replace
Help on method_descriptor:
replace(...)
S.replace(old, new[, count]) -> str
Return a copy of S with all occurrences of substring
old replaced by new. If the optional argument count is
given, only the first count occurrences are replaced.
>>> 'Python'.replace('thon', 'Py') # remplace 'thon' par 'Py' in 'Python'
'PyPy'
>>> s = 'Python, Python, Python!'
>>> s.replace('thon', 'Py', 2) # comme au-dessus, mais maximum 2 remplacements
'PyPy, PyPy, Python!'
29
Institut Supérieur Technique du Sankuru
En plus de convertir les arguments en chaîne et de les remplacer par des espaces
réservés, str.format(), vous permet de contrôler la sortie en spécifiant certaines options
(telles que le nombre de décimales, l’alignement, etc.) entre le {}. La documentation officielle
comprend une section avec de nombreux exemples d’utilisation de str.format().
Vous remarquerez peut-être que cette méthode %f utilise comme espace réservé au
lieu de {}. En plus de (pour les float), il existe également d’autres types d’espaces réservés,
tels que pour les entiers ou les chaînes. La documentation officielle comprend une section qui
explique les différents types d’espaces réservés et les options supplémentaires.
L’opérateur qui définit les tuples est la virgule (,) bien que pour éviter toute
ambiguïté, les séquences d’éléments soient souvent placées entre crochets ronds. Dans
certaines expressions, où les virgules ont déjà une signification différente (par exemple,
séparer les arguments d’une fonction), des parenthèses sont nécessaires.
30
Institut Supérieur Technique du Sankuru
Pour créer un tuple d’un élément, vous devez toujours utiliser une virgule, tandis que
pour créer un tuple vide, vous avez juste besoin de parenthèses :
Les tuples sont un type de séquence (comme les strings) et prennent en charge les
opérations communes à toutes les séquences, telles que l’indexation, le tranchage, le
confinement (container), la concaténation et la répétition :
Les tuples sont immuables, donc une fois créés, vous ne pouvez pas ajouter,
supprimer ou modifier des éléments :
31
Institut Supérieur Technique du Sankuru
Vous pouvez également utiliser des fonctions et des méthodes communes à toutes les
séquences : len() pour compter les éléments, min() et max() pour trouver l’élément le plus
petit/le plus grand (tant que les types d’éléments sont comparables), index() pour trouver
l’index d’un élément, et count() pour compter combien de fois un élément est présent dans le
tuple :
Les listes sont définies en listant entre crochets ([]) une série d’objets séparés par des
virgules (,). Vous pouvez créer une liste vide en utilisant des crochets sans aucun élément à
l’intérieur.
32
Institut Supérieur Technique du Sankuru
Comme les tuples et les chaînes, les listes sont également un type de séquence, et
prennent donc en charge les opérations communes à toutes les séquences, telles que
l’indexation, le découpage, le confinement, la concaténation et la répétition :
Les listes prennent également en charge des fonctions et des méthodes communes à
d’autres séquences : len() pour compter les éléments, min() et max() pour trouver l’élément
le plus petit/le plus grand (tant que les types d’éléments sont comparables), .index() pour
trouver l’index d’un élément et .count() pour compter combien de fois un élément est présent
dans la liste :
>>> letters = ['a', 'b', 'c', 'b', 'a']
>>> len(letters) # nombre des éléments
5
>>> min(letters) # élément plus petit (alphabétiquement dans le cas de strings)
'a'
>>> max(letters) # élément plus grand
'c'
>>> letters.index('c') # indice de l’élément 'c'
2
>>> letters.count('c') # nombre d’occurrences de 'c'
1
>>> letters.count('b') # nombre d’occurrences de 'b'
2
33
Institut Supérieur Technique du Sankuru
Contrairement aux tuples et aux chaînes qui sont immuables, les listes peuvent être
modifiées. Vous pouvez ensuite attribuer une nouvelle valeur aux éléments, supprimer des
éléments à l’aide du mot clé del ou modifier les éléments à l’aide de l’une des méthodes
supplémentaires des listes :
- liste.append(elem) : ajoute elem à la fin de la liste ;
- liste.extend(seq) : étend, prolonge la liste en ajoutant à la fin les éléments de seq ;
- liste.insert(indice, elem) : ajoute elem à la liste dans la position indice ;
- liste.pop() : supprime et renvoie le dernier élement de la liste ;
- liste.remove(elem) : trouve et supprime elem de la liste ;
- liste.sort() : ordonne les éléments de la liste du plus petit au plus grand ;
- liste.reverse() : inverse l’ordre des éléments de la liste ;
- liste.copy() : crée et renvoie une copie de la liste ;
- liste.clear() : supprime tous les éléments de la liste ;
34
Institut Supérieur Technique du Sankuru
['e', 'b']
>>> letters.clear() # supprime tous les éléments restés dans la liste
>>> letters
[]
Certaines de ces méthodes acceptent également des sujets supplémentaires que vous
pouvez voir en utilisant help(list.metodo) ou en consultant la documentation officielle sur
les listes.
Comme les tuples sont immuables, leur longueur est fixe, et généralement chaque
élément du tuple a un rôle spécifique. Ces éléments, qui peuvent être de différents types, sont
généralement lus par indexation (tuple[indice]).
Les listes, en revanche, sont modifiables, de sorte que leur longueur est variable (des
éléments peuvent être ajoutés ou supprimés). Cela signifie que les éléments individuels n’ont
pas un rôle précis et sont généralement lus par itération (par exemple en utilisant un for), et
doivent donc également être du même type.
Une autre façon de comprendre la différence est de penser à un tableau d’une base de
données, telle que :
Prénom Nom Age
John Smith 20
Jane Johnson 30
Jack Williams 28
Mary Jones 25
Marc Brown 23
Chaque ligne du tableau peut être représentée par un tuple (par exemple (’John’,
‘Smith’, 20)) de 3 éléments hétérogènes (longueur fixe) (chaînes ou strings et entiers)
auxquels on peut accéder par indexation (par exemple t[1] pour le nom de famille). Chaque
colonne peut être représentée par une liste (par exemple ['John', 'Jane', 'Jack', ...]) de
longueur variable (les personnes peuvent être ajoutées ou supprimées) et d’éléments
homogènes (la colonne du nom n’a que des chaînes, celle de l’âge uniquement des nombres)
35
Institut Supérieur Technique du Sankuru
auxquels on accède par itération (par exemple imprimer la liste des noms de famille à l’aide
d’une boucle).
Vous pouvez également combiner les deux types et représenter le tableau entier sous la forme
d’une liste de tuples :
[('John', 'Smith', 20),
('Jane', 'Johnson', 30),
('Jack', 'Williams', 28),
...]
Dans le prochain chapitre, nous verrons un autre type de données intégrées : les
dictionnaires.
Les dictionnaires sont implémentés à l’aide de tables de hachage qui vous permettent
d’obtenir très efficacement la valeur correspondant à la clé, quel que soit le nombre
d’éléments dans le dictionnaire. La plupart des langages contiennent une structure de données
similaire, bien qu’appelée différemment : le type de hachage en Perl, Hashtable en Java ou
C#, les cartes MFC pour Visual C++, les tableaux (array) associatifs en PHP, etc.
Les dictionnaires sont définis en listant entre accolades ({}) une série d’éléments
séparés par des virgules ( , ), où chaque élément se compose d’une clé et d’une valeur séparée
par un deux-points ( : ). Vous pouvez créer un dictionnaire vide à l’aide d’accolades sans
aucun élément à l’intérieur.
Dans cet exemple, nous pouvons voir qu’il s’agit d’un dictionnaire qui contient 3
éléments formés par une clé et une valeur. ‘a’, ‘b’ et ‘c’ sont les clés, tandis que 1, 2 et 3 sont
les valeurs. Nous pouvons également voir comment l’ordre des éléments est arbitraire,
puisque les dictionnaires ne sont pas ordonnés.
36
Institut Supérieur Technique du Sankuru
>>> d
{'a': 1}
>>> type(d) # vérifions que le type soit "dict"
<class 'dict'>
>>> d = {} # dictionnaire vide
>>> d
{}
Les clés d’un dictionnaire sont généralement des chaînes (strings), mais vous pouvez
également utiliser d’autres types, à condition qu’elles soient « hashables » (les types
immuables le sont généralement). Les valeurs peuvent être de n’importe quel type.
>>> d = {20: ['Jack', 'Jane'], 28: ['John', 'Mary']} # int comme clé, liste comme valeurs
>>> d
{28: ['John', 'Mary'], 20: ['Jack', 'Jane']}
>>> d = {[0, 10]: 'premier intervalle'} # les listes ne sont pas hashables, ne sont pas
# des clés valides
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> d = {(0, 10):'premier intervalle'} # les tuples oui
>>> d
{(0, 10): 'premier intervalle'}
Une fois qu’on a créé un dictionnaire, on peut obtenir la valeur associée à une clé à
l’aide de la syntaxe : dictionnaire[clé].
Si une clé inexistante est spécifiée, Python renvoie un KeyError. Toutefois, il est
possible d’utiliser les opérateurs in (ou not in) pour vérifier si une clé est présente dans le
dictionnaire :
37
Institut Supérieur Technique du Sankuru
KeyError: 'x'
>>> 'x' in d # la clé 'x' n’est pas présente dans d
False
>>> 'x' not in d # la clé 'x' n’est pas présente dans d
True
>>> 'b' in d # la clé 'b' est présente
True
>>> d['b'] # la valeur associée à la clé 'b' est 2
2
38
Institut Supérieur Technique du Sankuru
Il existe également d’autres méthodes qui sont utilisées plus rarement, et qui peuvent
être consultées en utilisant dir(dict) et help(dict.metodo) ou en consultant la documentation
officielle sur les dictionnaires.
Dans le chapitre suivant, nous verrons un autre type de données intégrées : les
ensembles.
En plus des listes, des tuples et des dictionnaires, Python fournit deux autres
conteneurs intégrés : set et frozenset. Les set (collections) sont utilisés pour représenter un
39
Institut Supérieur Technique du Sankuru
ensemble non ordonné d’objets uniques. Cette séquence est mutable dans le cas des set, et
immuable dans le cas des frozenset (Collections ou Ensembles figés).
13.1. Définir des set (ensembles ou collections) et des frozenset
Les set (collections ou ensembles) sont définis en listant entre accolades ({}) une série
d’objets séparés par des virgules (,). Bien que les set et les dictionnaires utilisent des
accolades, Python est capable de les distinguer car les dictionnaires contiennent des clés et
des valeurs séparées par les deux points. Étant donné que la syntaxe est déjà utilisée pour
définir un dictionnaire vide, il n’y a pas de syntaxe disponible pour créer un set (ensemble)
vide, mais elle peut être définie à l’aide de set(). De plus, pour le frozenset, il n’y a pas de
syntaxe dédiée, mais il est possible d’utiliser frozenset(...).
Nous avons vu que les éléments des set doivent être uniques : s’ils ne le sont pas,
Python supprimera automatiquement les doublons. Les éléments d’un set, ainsi que les clés
d’un dictionnaire, doivent également être hashables. En outre, set() et frozenset() ils
acceptent en entrée (input) tout ce qui est itérable (comme des chaînes ou des listes), et il est
possible ensuite de créer un nouveau set contenant les éléments uniques à partir d’un autre
objet.
>>> {1, 2, 3, 2, 1} # les éléments sont uniques, les doublures sont supprimées
{1, 2, 3}
>>> set('abracadabra') # trouve l'ensemble des lettres dans la string 'abracadabra'
{'d', 'b', 'a', 'c', 'r'}
>>> frozenset('abracadabra')
frozenset({'d', 'b', 'a', 'c', 'r'})
40
Institut Supérieur Technique du Sankuru
Parmi ces méthodes, seule copy() est prise en charge par frozenset, puisque les autres
méthodes modifient le set.
41
Institut Supérieur Technique du Sankuru
42
Institut Supérieur Technique du Sankuru
>>> {1, 2, 3}.isdisjoint({4, 5, 6}) # sont disjoints, ils n’ont pas d’éléments en commun
True
>>> {1, 2, 3}.isdisjoint({3, 4, 5}) # ont un élément en commun (le 3)
False
>>> {2, 4} >= {1, 2, 3, 4} # le premier est un sous-ensemble du second
True
>>> {2, 4} > {1, 2, 3, 4} # il est aussi un sous-ensemble propre
True
>>> {1, 2, 3} >= {1, 2, 3} # le premier est un sous-ensemble du second
True
>>> {1, 2, 3} > {1, 2, 3} # mais ce n’est pas un sous-ensemble propre
False
>>> {1, 2, 3} | {2, 3, 4} | {3, 4, 5} # union de tous les éléments
{1, 2, 3, 4, 5}
>>> {1, 2, 3} & {2, 3, 4} & {3, 4, 5} # intersection (éléments communs)
{3}
>>> {1, 2, 3, 4, 5} - {1, 2} - {2, 3} # différence
{4, 5}
>>> {1, 2, 3, 4} ^ {3, 4, 5, 6} # éléments non communs
{1, 2, 5, 6}
>>> s1 = {1, 2, 3}
>>> s1 |= {2, 3, 4} | {3, 4, 5} # ajoute à s1 les éléments des 2 autres set
>>> s1
{1, 2, 3, 4, 5}
Pour plus d’informations sur les set et les frozenset, il est possible consulter la
documentation officielle sur les set.
43
Institut Supérieur Technique du Sankuru
Dans les précédents chapitres, nous avons vu plusieurs types intégrés disponibles dans
Python. Ces types seront très utiles dans diverses situations et il est donc essentiel
d’apprendre à les utiliser de la manière la plus appropriée. Dans ce chapitre, nous allons le
résumer, en offrant un aperçu de tous les types disponibles en Python.
14.1. Tableau récapitulatif
Dans les leçons précédentes, nous avons vu que les types de données peuvent être
immuables ou mutables. Les nombres (int , float , complex , bool), chaînes (str), les bystes
et les frozenset sont immuables ; les listes (list), les ensembles (set) et les dictionnaires
(dict) sont, par contre, modifiables.
La plupart de ces types peuvent être définis à l’aide de littéraux (en anglais literals),
c’est-à-dire d’une syntaxe dédiée qui peut être vue dans le tableau sous la colonne «
Exemples ». Cependant, il existe des exceptions : il n’y a pas de forme littérale pour définir
des set ou ensembles vides (vous pouvez utiliser set()) et frozenset (vous pouvez les créer à
partir d’autres types, tels que frozenset({1, 2, 3})).
Il est également possible de créer de nouveaux objets "en appelant" les types
répertoriés dans la deuxième colonne du tableau. Si aucun argument n’est passé pendant
l’appel, la valeur renvoyée sera 0 dans le cas de nombres ou un objet vide dans d’autres cas :
par exemple, float() renverra 0.0 et list() retournera [ ].
14.2. Conversion entre les types
44
Institut Supérieur Technique du Sankuru
Cette opération peut être effectuée en passant l’objet que nous voulons convertir au
type vers lequel nous voulons le convertir. Par exemple, si nous voulons convertir une liste en
un set (ensemble), nous pouvons utiliser : set(lista) :
Si nous voulons, à la place, convertir une chaîne en nombre, nous pouvons procéder
comme suit :
Chaque type accepte des différentes entrées input, mais ce ne sont pas toutes les
conversions qui sont possibles. Par exemple, il n’est pas de convertir une liste en entier int ou
un int en liste. Si nous passons un objet qui ne peut pas être converti, Python renverra un
message de type : TypeError ou ValueError.
>>> int('un milione') # str est un type valide, mais la valeur ne peut pas être converti
Traceback (most recent call last):
File "", line 1, in
45
Institut Supérieur Technique du Sankuru
ValueError: invalid literal for int() with base 10: 'un milione'
>>> int([1, 2, 3]) # list ne pas un type valide, donc un TypeError sera renvoyé
Traceback (most recent call last):
File "", line 1, in
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Vous pouvez également créer des copies d’un objet sans modifier son type. Par
exemple :
Tous les types répertoriés dans le tableau au début de ce chapitre sont intégrés, c’est-
à-dire qu’ils sont toujours disponibles sans qu’il soit nécessaire d’importer quoi que ce soit.
En plus de ces types de données intégrés, il existe également plusieurs autres types non
intégrés qui peuvent être importés à partir de modules de bibliothèque standard, notamment :
- le module decimal définit un type Decimal qui vous permet de travailler avec des
nombres à virgule flottante avec précision, en surmontant certaines limitations de
nombres float ;
46
Institut Supérieur Technique du Sankuru
Par exemple, pour calculer la valeur absolue d’un nombre, nous pouvons procéder
comme suit :
Dans ce cas, le bloc de code en retrait sous le if (c’est-à-dire n = -n) n’est exécuté que
si le nombre est négatif. Si le nombre est positif, le programme procède à l’exécution de
l’instruction qui suit le if, c’est-à-dire le print(). En ajoutant un else suivi de deux-points (:),
nous pouvons également spécifier un bloc de code exécuté lorsque la condition de l’if est
fausse (false) :
if condition:
# groupe d’instructions exécutées
# si la condition est vraie true
else:
# groupe d’instructions exécutées
# si la condition est fausse false
47
Institut Supérieur Technique du Sankuru
Dans ce cas, le programme effectuera l’un des deux print() : le premier si le nombre
entré par l’utilisateur est négatif, le second s’il est positif.
Enfin, vous pouvez ajouter 1 ou plusieurs elif, chacun suivi d’une condition, deux-
points (:) et d’un bloc de code en retrait qui ne s’exécute que si la condition est vraie. Vous
pouvez également ajouter un simple else à la fin qui s’exécute ssi toutes les conditions ci-
dessus sont fausses :
if condition1:
# groupe d’instructions exécutées
# si la condition 1 est vraie
elif condition2:
# groupe d’instructions exécutées
# si la condition 2 est vraie
elif conditionN:
# groupe d’instructions exécutées
# si la conditionN est vraie
else:
# groupe d’instructions exécutées
# si les conditions sont fausses
Notez qu’un seul de ces blocs est exécuté : si l’une des conditions est vraie, le bloc
correspondant est exécuté ; si, en revanche, toutes les conditions sont fausses et que un else
est présent, seul le bloc de l’else est exécuté. Dans le cas où il y a plus de conditions vraies,
seul le bloc correspondant à la première condition vraie sera effectué.
48
Institut Supérieur Technique du Sankuru
Dans ce premier exemple, le else a le même niveau d’indentation que le second if, et
est ensuite exécuté lorsque cond1 est vraie et cond2 est fausse :
if cond1:
print('cond1 est vraie)
if cond2:
print('cond1 est vraie, cond2 est vraie')
else:
print('cond1 est vraie, cond2 est fausse')
Dans cet autre exemple, le else a le même niveau d’indentation que le premier if, et il
est ensuite exécuté lorsque cond1 est fausse. Dans l’exemple suivant, voyons comment il est
possible d’utiliser plusieurs if-else pour obtenir le même résultat qu’un if-elif-else :
n = int(input('Insère un nombre: '))
if n == 0:
# si le nombre est zéro
print(n, 'est zéro')
else:
# si le nombre n’est pas zéro
if n > 0:
print(n, 'est positif')
else:
print(n, 'est négatif')
49
Institut Supérieur Technique du Sankuru
case 0:
printf('zéro\n');
break;
case 1:
case 2:
printf('un o deux\n');
break;
case 3:
printf('trois\n');
break;
default:
printf('nombre différent de 0, 1, 2, 3\n');
break;
}
50
Institut Supérieur Technique du Sankuru
// hexadécimal
case 'x':
res = hex(num);
break;
default:
printf('Conversion non valide');
break;
}
Cet exemple :
- Demande à l’utilisateur d’insérer num et conv,
- Définit un dictionnaire funcs qui mappe les lettres b/o/x aux fonctions de conversion
correspondante,
- Vérifie si la conversion spécifiée est valide ou non,
- Si c’est le cas, il obtient la fonction correspondant (func) à la lettre (conv) et l’utilise
pour convertir le nombre,
- Si ce n’est pas le cas, imprimez un message d’erreur.
Dans le chapitre suivant, nous verrons comiment utiliser les cycles.
51
Institut Supérieur Technique du Sankuru
La boucle for nous permet d’itérer sur tous les éléments d’un itérable et d’exécuter
un certain bloc de code. Un itérable est tout objet qui peut renvoyer tous les éléments les uns
après les autres, tels que des listes, des tuples, des ensembles, des dictionnaires (clés de
retour), etc. Voyons un exemple simple d’un cycle for :
>>> # imprime le carré de chaque nombre de seq
>>> seq = [1, 2, 3, 4, 5]
>>> for n in seq:
... print('Le carré de', n, 'est', n**2)
...
Le carré de 1 est 1
Le carré de 2 est 4
Le carré de 3 est 9
Le carré de 4 est 16
Le carré de 5 est 25
52