Chappython
Chappython
Programmation en Python
Vincent Picard
1
Les bases
Python comme calculatrice
L'interprète Python peut être utilisé comme une calculatrice qui évalue des ex
pressions.
>>> (4 + 5) * 4
36
>>> 2 ** 10
1024
>>> 3.14 * 2
6.28
>>> True or False
True
Les types de base sur lesquels Python sait travailler sont les entiers (int), les
flottants (float) et les booléens (bool).
1/40
Les entiers
Le type int permet de manipuler les entiers relatifs.
Addition, multiplication
>>> (7 + 2) * (-3)
-27
Puissance
>>> 3 ** 4
81
Division euclidenne de 𝑎 par 𝑏 : a // b donne le quotient et a % b donne le reste
>>> 27 // 10
2
>>> 27 % 10
7
>>> -27 // 10
-3
>>> -27 % 10
3
2/40
Les flottants
Le type float permet de manipuler les nombres à virgule.
Puissance
>>> 3.0 ** 4
81.0
>>> 17.2 ** 0.5
4.147288270665544
3/40
Le calcul flottant n'est pas exact
Les flottants sont codés sur 64 bits (norme IEEE 754), il n'y a que 264 valeurs flottantes
possibles et il est impossible de représenter ℝ.
Le calcul flottant implique donc des erreurs d'approximation qui peuvent poser problème.
Erreurs d'arrondis
>>> 0.1 + 0.2
0.30000000000000004
Dépassement de capacité
>>> 1e+309
inf
>>> 1e-324
0.0
Absorption
>>> (1.0 + 2.0 ** 53) - 2.0 ** 53
0.0
>>> 1.0 + (2.0 ** 35 - 2.0 ** 35)
1.0 # L'addition n'est pas associative
4/40
Les booléens
Le type bool permet de manipuler les valeurs de vérité True et False.
6/40
2
Les structures de contrôle
Les structures de contrôle
Un programme est constitué d'une suite d'instructions qui sont exécutées séquen
tiellement par l'interprète dans l'ordre.
c. les fonctions
7/40
Les instructions conditionnelles
Les instructions conditionnelles permettent d'exécuter des portions de code en
fonction du résultat de l'évaluation d'un test
8/40
Instructions conditionnelles avec elif
Lorsque le test de la première condition vaut False il est possible d'effectuer
d'autres tests à l'aide du mot-clé elif (sinon si) :
9/40
La boucle for
La boucle for permet de répéter l'exécution d'un corps de boucle un nombre
prédéterminé de fois :
n = 10
somme = 0
for k in range(1, n+1):
somme += k
print(somme)
10/40
Il est possible de ne pas donner de valeur pour 𝑎 dans le range, dans ce cas cela
signifie qu'on part de 𝑎 = 0.
x = 5
for u in range(7):
x = x + u
x = 2 * x
print(x)
Cela est particulièrement utile lorsqu'on veut répéter un bloc d'instructions 𝑛 fois
:
for _ in range(n):
print("Bonjour !")
11/40
La boucle while
La boucle while permet de répéter l'exécution d'un corps de boucle un nombre
indéterminé de fois :
while test:
#corps de boucle
n = 35
k = 2
while (n % k != 0):
k += 1
print("Le premier diviseur de", n, "est", k)
12/40
Les fonctions
Une fonction est un sous-programme qui pourra être exécuté à chaque fois qu'on le
souhaite. Une fonction doit d'abord être définie :
def afficher_ligne():
print("*****")
for k in range(3):
afficher_ligne() # <- appel de la fonction
13/40
Les fonctions : paramètres
Le corps d'une fonction peut dépendre de certaines valeurs appelées paramètres
: ils sont listés entre les parenthèses après le nom de fonction.
Lors de l'appel de fonction il faut alors préciser la valeur de chacun des paramètres
(ces valeurs sont appelés arguments)
>>> afficher_ligne('#', 7)
#######
>>> afficher_ligne('*', 4)
****
14/40
Les fonctions : valeur de retour
Une fonction peut avoir un résultat qui est retourné à l'appelant à l'aide de l'in
struction return.
15/40
Attention à ne pas confondre :
Erreur classique :
def valeur_absolue(x):
if x < 0:
print(-x)
print(x)
>>> valeur_absolue(-7) + 2
7
-7
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
16/40
Variables globales, variables locales
Les variables définies en dehors des fonctions sont des variables globales.
Les variables définies à l'intérieur des fonctions sont des variables locales.
a = 3 # global
b = 2 # global
def f():
c = 5 # local
a = 4 # local qui masque le a global
print(a + b + c)
f() # -> 11
print(a + b) # -> 5
print(a + b + c) # -> erreur
17/40
Fonctions prédéfinies
Pour nous faciliter la vie, certaines fonctions sont prédéfinies en Python, c'est le
cas de la valeur absolue :
>>> abs(-7) + 3
10
Certaines fonctions prédéfinies sont regroupées dans des modules qu'il est néces
saire d'importer avant de pouvoir utiliser la fonction. Un module utile est le mod
ule math :
18/40
Il est possible de donner un alias à un module importé pour facilier l'écriture des
appels de fonctions :
Il est aussi possible de n'importer que certaines fonctions d'un module avec le
mot-clé from :
Dans ce cas, on remarque qu'on ne précise plus le nom du module dans l'appel
de fonction.
19/40
3
Les listes
Les listes
Lorsqu'on veut représenter des données complexes, les types de base ne suffisent
plus.
Une solution est de composer plusieurs valeurs (de même type ou non) en une
seule à l'aide d'une structure de donnée linéaire.
Dans une liste ℓ chaque élément est repéré par sa position dans la structure ap
pelée indice. En Python, le premier élément a pour indice 0 et le dernier |ℓ| − 1.
La valeur de l'élément d'indice 𝑖 est obtenu avec la syntaxe ℓ[𝑖].
>>> l = [45, 3, 7]
>>> l[0] + l[2]
52
20/40
La longueur d'une liste ℓ est son nombre d'éléments, il est possible d'obtenir cette
valeur avec la fonction len :
l = [5, 4, 3, 2, 1, 0]
for i in range(0, len(l)):
print(l[i])
>>> u = [1, 2, 3]
>>> v = [4, 5, 6, 7]
>>> w = u + v + [8, 9, 10]
>>> print(w)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [42] * 3
[42, 42, 42]
l = ["Pentagone", 5, False]
21/40
Construction de liste par compréhension
Python permet de créer des listes par compréhension comme ceci :
Exemple
22/40
Extraction de tranche
Python permet aussi de créer une liste en prenant les valeurs d'une partie, appelée
tranche, des valeurs d'une liste déjà existante.
Si ℓ est une liste alors la syntaxe ℓ[𝑎 : 𝑏] construit une nouvelle liste dont les valeurs
sont celles de ℓ entre les indices 𝑎 inclus et 𝑏 exclu.
Exemple
23/40
Les listes sont modifiables
En Python, les listes sont modifiables : il est possible de changer la valeur d'un
élément à l'aide l'opérateur d'affectation = :
>>> u.append(21)
>>> u
[1, 1, 2, 3, 42, 8, 13, 21]
On peut également supprimer une valeur repérée par son indice à l'aide de del
>>> del u[4]
>>> u
[1, 1, 2, 3, 8, 13, 21]
Remarque : si on modifie une liste ℓ alors les listes obtenues précédemment par
extraction de tranches sur ℓ ne sont pas modifiées.
24/40
Parcours de liste
Parcourir une liste consiste à itérer une ou des actions sur chacune des valeurs de
la liste. Cela peut être réalisé à l'aide d'une boucle for
Les parcours de listes étant fréquents, Python propose une syntaxe simplifiée à
cet effet :
25/40
Les listes pour les piles
Les listes Python sont un moyen naturel d'implémenter la structure de données
de pile.
>>> pile = []
Insertion d'éléments dans la pile
>>> pile.append(3)
>>> pile.append(4)
>>> pile.append(5)
Extraction d'éléments dans la pile
>>> pile.pop()
5
>>> pile
[3, 4]
>>> pile.pop() + 10
14
26/40
Les listes pour les matrices
On peut utiliser des listes de listes pour représenter des matrices. Par exemple
pour la matrice :
1 2 3
𝐴= 4 5 6
( 8 9)
7
A = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
Ainsi chaque élément de cette liste correspond à une ligne de la matrice. L'ex
pression A[i] est une liste représentant la ligne 𝑖.
27/40
Pour accéder à la case 𝐴𝑖, 𝑗 il suffit d'utiliser un double indicage :
>>> A[1][2]
6
>>> trace = A[0][0] + A[1][1] + A[2][2]
>>> trace
15
On peut déterminer le format d'une matrice avec une bonne utilisation de len :
>>> B = [[1, 2, 3], [4, 5, 6]]
>>> n = len(B)
>>> m = len(B[0])
>>> print(n, m)
2 3
28/40
Matrices par compréhension
Il est possible d'utiliser la syntaxe de construction de liste par compréhension pour
construire des matrices.
La matrice 𝐴 = (𝑎𝑖, 𝑗 ) de format 4 × 3 définie par 𝑎𝑖, 𝑗 = 𝑖𝑗 peut être définie ainsi :
1 2 3
2 4 6
𝐴=
3 6 9
(4 8 12 )
29/40
Les structures modifiables sont piégeuses
Le fait de pouvoir modifier les listes est pratique mais implique certaines diffi
cultés.
Tout semble s'être bien passé, cependant si on modifie une case de la matrice
>>> A[0][1] = 5
>>> A
[[0, 5, 0], [0, 5, 0], [0, 5, 0]]
30/40
4
Autres structures linéaires
Les tuples
Les tuples servent à représenter des 𝑛-uplets de valeurs. Il se comportent glob
alement comme les listes à quelques exceptions près :
Exemples
>>> triplet = (3, 4, 5)
>>> triplet
(3, 4, 5)
>>> len(triplet)
3
>>> triplet[0] ** 2 + triplet[1] ** 2
25
>>> triplet + (6, 7, 8)
(3, 4, 5, 6, 7, 8)
>>> date = (12, "septembre", 2024)
31/40
Fonctions avec plusieurs résultats
Les tuples sont utiles lorsqu'on souhaite écrire une fonction retournant 2 (ou plus)
résultats : il suffit de retourner un couple.
32/40
Chaînes de caractères
Les chaînes de caractères (str) servent à représenter des données textuelles.
Elles se comportent globalement comme les listes de caractères. L'élément d'in
dice 𝑖 est le 𝑖-ème caractère du texte.
Exemples
>>> invite = 'Bonjour '
>>> prenom = "Antoine"
>>> msg = invite + prenom
>>> print(msg)
Bonjour Antoine
33/40
5
Les dictionnaires
Qu'est-ce qu'un dictionnaire ?
Un dictionnaire est une structure de données qui permet de représenter un en
semble de couples (clé, valeur).
Les clés sont uniques : elles ne peuvent qu'apparaître qu'une seule fois dans la
structure.
Dans cet exemple, les clés sont des châines de caractères et les valeurs des flottants.
34/40
Utilisation d'un dictionnaire
Lecture de valeurs
35/40
Ajout d'une nouvelle asssociation clef-valeur
36/40
Parcours d'un dictionnaire
Les clés d'un dictionnaire peuvent être parcourues à l'aide de la méthode keys :
On peut aussi parcourir toutes les associations (clef, valeur) à l'aide de la méthode
items :
s = 0
for article in prix.keys():
s += prix[article]
print(s)
37/40
Comment ça fonctionne ? Les tables de hachage !
('macatia', 1.10)
'baguette' hachage ℎ
('croissant', 1.30)
7
('baguette', 1.05)
38/40
Les tables de hachage sont efficaces
La fonction de hachage est choisie de manière
à bien répartir les clés sur l'ensemble des alvéoles disponibles : pour éviter les
collisions
Différentes stratégies efficaces peuvent être mises en œuvre pour gérer les éventuelles
collisions.
En conclusion, on considère que toutes les opérations sur les dictionnaires (lec
ture, modification, ajout, suppression) sont de complexité 𝑂(1) en pratique.
39/40
Les clés ne doivent pas être modifiables
Pour que la table de hachage fonctionne, la fonction de hachage doit toujours re
tourner la même valeur pour une clé donnée.
40/40
6
Lecture et écriture dans un fichier