Fasc Programmation Python 2022
Fasc Programmation Python 2022
Programmation Python
Licence
MAMADOU Diarra
13/05/2022
Table des
matières
1 Introduction à Python ..................................................................................................................... 5
1.1 Présentation de Python ........................................................................................................... 5
1.2 Installation et manipulation de Python ................................................................................... 5
1.2.1 Prise en main en mode interactif .................................................................................... 5
1.2.2 Ecrire, conserver, ouvrir, exécuter un programme ......................................................... 5
2 Présentation des outils de programmation .................................................................................... 7
2.1 Exécution d’un premier programme ....................................................................................... 7
2.2 Quelques bases rapides en Python ......................................................................................... 7
2.2.1 Utilisation en mode interactif ......................................................................................... 7
2.2.2 Premiers calculs ............................................................................................................... 8
2.2.3 L’opérateur /.................................................................................................................... 8
2.2.4 L’opérateur % .................................................................................................................. 8
2.2.5 Affectation ....................................................................................................................... 9
2.2.6 Affichage - la fonction print() .......................................................................................... 9
2.2.7 Fonction range() ............................................................................................................ 10
2.2.8 Accès aux éléments d’une liste ..................................................................................... 11
2.2.9 Fonction len() ................................................................................................................ 11
2.2.10 Lecture d’informations au clavier - la fonction input() ................................................. 12
2.2.11 Règles générales d’écriture ........................................................................................... 12
2.3 Tests (Instructions conditionnelles) ...................................................................................... 13
2.3.1 Bloc d’instructions - Indentation ................................................................................... 13
2.3.2 Instruction if .................................................................................................................. 13
2.3.3 Instruction if … else ....................................................................................................... 15
2.3.4 Opérateur logique and .................................................................................................. 17
2.3.5 Opérateur logique or ..................................................................................................... 17
2.4 Boucles .................................................................................................................................. 18
2.4.1 Boucles bornées et non bornées ................................................................................... 18
2.4.2 Boucle for ...................................................................................................................... 18
2.4.3 Boucle while .................................................................................................................. 20
2.4.4 Comment choisir entre boucle for et boucle while ....................................................... 21
2.4.5 Transformation d’une boucle for en une boucle while ................................................. 21
2.5 Les instructions break et continue, et la clause else dans les boucles.................................. 21
2.5.1 Instruction break ........................................................................................................... 21
2.5.2 Remarque : équivalent du do…while (faire…tant que) ................................................ 22
2.5.3 Instruction continue ...................................................................................................... 22
2.5.4 Clause else dans une boucle.......................................................................................... 23
2.6 Principaux types de données................................................................................................. 24
2.6.1 Fonction type() .............................................................................................................. 24
2.6.2 Type int (entier) ............................................................................................................. 25
2.6.3 Type float (flottant) ....................................................................................................... 25
2.6.4 Type str (chaîne de caractères) ..................................................................................... 25
2.6.5 Type bool (booléen) ...................................................................................................... 26
2.6.6 Type list (liste) ............................................................................................................... 26
2.6.7 Type complex (complexe) ............................................................................................. 35
2.7 Tuples en Python ................................................................................................................... 36
2.8 Dictionnaires en Python ........................................................................................................ 39
2.9 Comment créer un dictionnaire python? .............................................................................. 39
2.10 Comment ajouter des valeurs dans un dictionnaire python? ............................................... 40
2.11 Comment récupérer une valeur dans un dictionnaire python? ............................................ 40
2.12 Comment vérifier la présence d'une clé dans un dictionnaire python? ............................... 40
2.13 Comment supprimer une entrée dans un dictionnaire python? .......................................... 40
2.14 Comment récupérer les clés d'un dictionnaire python par une boucle? .............................. 41
2.15 Comment récupérer les valeurs d'un dictionnaire python par une boucle? ........................ 41
2.16 Comment récupérer les clés et les valeurs d'un dictionnaire python par une boucle? ........ 41
2.17 Comment utiliser des tuples comme clé dans un dictionnaire python? ............................... 42
2.18 Comment créer une copie indépendante d'un dictionnaire python?................................... 42
2.19 Comment fusionner des dictionnaires python ? ................................................................... 43
3 Fonctions en Python ...................................................................................................................... 43
3.1 Définition d’une fonction - def .............................................................................................. 43
3.2 Fonction sans paramètre ....................................................................................................... 44
3.3 Fonction avec paramètre ...................................................................................................... 45
3.4 Utilisation d’une variable comme argument......................................................................... 46
3.5 Fonction avec plusieurs paramètres ..................................................................................... 47
3.6 Variables locales, variables globales ..................................................................................... 47
3.7 Utilisation d’une variable globale - global ............................................................................. 48
3.8 « Vraies » fonctions et procédures........................................................................................ 49
3.9 Valeurs par défaut pour les paramètres ............................................................................... 49
3.10 Arguments avec étiquettes ................................................................................................... 50
3.11 Utilisation des fonctions dans un script ................................................................................ 51
3.12 Modules et importations ....................................................................................................... 53
3.13 Package .................................................................................................................................. 56
4 Python et maths ............................................................................................................................ 58
4.1 Quelques bibliothèques ........................................................................................................ 58
4.2 Quelques fonctions mathématiques ..................................................................................... 60
4.3 Courbes.................................................................................................................................. 60
4.3.1 Utilisation de plot()........................................................................................................ 60
4.3.2 Définition du domaine des axes - xlim() et ylim().......................................................... 61
4.3.3 Ajout d’un titre - title() .................................................................................................. 62
4.3.4 Ajout d’une légende - legend() ...................................................................................... 63
4.3.5 Labels sur les axes - xlabel() et ylabel() ......................................................................... 64
4.3.6 Affichage de plusieurs courbes ..................................................................................... 65
4.3.7 Exemple avec un légende .............................................................................................. 66
4.3.8 Formats de courbes ....................................................................................................... 67
4.3.9 Style de ligne ................................................................................................................. 68
4.3.10 Symbole (« marker ») .................................................................................................... 69
4.3.11 Couleur .......................................................................................................................... 70
4.3.12 Largeur de ligne ............................................................................................................. 70
4.3.13 Tracé de formes ............................................................................................................. 71
4.3.14 L’instruction axis("equal") ............................................................................................. 72
4.3.15 Tracé d’un cercle ........................................................................................................... 73
4.3.16 Tracé de diagrammes en bâtons et histogrammes ....................................................... 75
4.3.17 Affichages de nuages de points ..................................................................................... 80
4.3.18 Tracé multiples .............................................................................................................. 82
4.3.19 Tutoriel sur mplot3d ...................................................................................................... 83
4.4 Tableaux et calcul matriciel ................................................................................................. 108
4.4.1 Tableaux - numpy.array() ....................................................................................... 108
4.4.2 Tableaux bidimensionnels (2D) ................................................................................... 109
4.4.3 La fonction numpy.size() ............................................................................................. 109
4.4.4 Fonction numpy.shape().............................................................................................. 109
4.4.5 Produit terme à terme................................................................................................. 109
4.4.6 Produit matriciel - numpy.dot()................................................................................... 110
4.4.7 Transposé .................................................................................................................... 110
4.4.8 Complexe conjugué - numpy.conj()............................................................................. 110
4.4.9 Transposé complexe conjugué .................................................................................... 111
4.4.10 Tableaux et slicing ....................................................................................................... 111
4.4.11 Slicing des tableaux 2D ................................................................................................ 111
4.4.12 Tableaux de 0 - numpy.zeros() .................................................................................... 112
4.4.13 Tableaux de 1 - numpy.ones() ..................................................................................... 112
4.4.14 Matrice identité - numpy.eye() ................................................................................... 112
4.4.15 Déterminant - numpy.linalg.det()................................................................................ 112
4.4.16 Inverse - numpy.linalg.inv() ......................................................................................... 113
4.4.17 Résolution d’un système d’équations linéaires - numpy.linalg.solve() ....................... 113
4.4.18 Valeurs propres et vecteurs propres - numpy.linalg.eig() ........................................... 113
4.4.19 Changement de la taille d’un tableau ......................................................................... 114
4.4.20 Obtention d’un tableau 2D ligne ou colonne .............................................................. 114
5 Programmation orientée objet en python / classes.................................................................... 115
5.1 Classes ................................................................................................................................. 115
5.2 Objets .................................................................................................................................. 115
5.3 Attributs de classe ............................................................................................................... 115
5.4 Méthodes ............................................................................................................................ 116
5.5 Propriétés ............................................................................................................................ 117
5.6 La fonction dir...................................................................................................................... 118
5.7 Attribut spécial __dict__ ..................................................................................................... 119
5.8 Héritage de classe................................................................................................................ 119
5.9 Polymorphisme / surcharge de méthode............................................................................ 120
5.10 Conventions ......................................................................................................................... 123
6 Bibliographie................................................................................................................................ 124
1 Introduction à Python
1.1 Présentation de Python
Le langage de programmation Python a été créé en 1989 par Guido van Rossum, aux Pays-Bas.
Python présente de nombreuses caractéristiques :
Il est multiplateforme. C’est-à-dire qu’il fonctionne sur de nombreux systèmes d’exploitation
;
Il est gratuit. Vous pouvez l’installer sur autant d’ordinateurs que vous voulez (même sur votre
téléphone !) ;
C’est un langage de haut niveau. Il demande relativement peu de connaissance sur le
fonctionnement d’un ordinateur pour être utilisé ;
C’est un langage interprété. Un script Python n’a pas besoin d’être compilé pour être exécuté,
contrairement à des langages comme le C ou le C++ ;
Il est orienté objet.
Il est relativement simple à prendre en main.
il est très utilisé dans de nombreux domaines : bioinformatique, analyse de données, imagerie,
3D, web, réseau, matériels, etc.
une fenêtre d’enregistrement s’ouvre alors. Choisissez dans l’arborescence le dossier dans
lequel vous voulez enregistrer le programme, puis dans le champ d’enregistrement du fichier
saisissez le nom du programme suivi de l’extension .py, puis cliquez sur enregistrer :
Pour ouvrir un programme python, il suffira de sélectionner Open dans le menu File de
l’environnement IDLE puis de chercher dans vos dossiers le fichier python à ouvrir
Exécution du programme : Pour exécuter le programme, il suffit de sélectionner « Run Module
» dans le menu Run (si une modification du script a été effectuée, on vous proposera
d’enregistrer le script modifié avant de l’exécuter).
print("valeur :", i)
print("Fin")
valeur : 0
valeur : 1
valeur : 2
Fin
Dans Spyder, on dispose d’une zone de fenêtre pour l’interpréteur de commandes IPython.
Son invite de commande est différente de celle de l’interpréteur Python standard (qui
est >>>). Elle se présente de la façon suivante :
In [1]:
Out[1]: 12
In [2]: 5 + 2
Out[2]: 7
Les parties qui débutent par In et Out correspondent aux entrées et sorties respectivement.
>>> 4 + 5
>>> (6 + 3) * 2
>>> 5**2
2.2.3 L’opérateur /
Avertissement
L’opérateur / ne donne pas les mêmes résultats suivant les versions de Python. En Python 2,
il réalise par défaut une division euclidienne, aussi appelée division entière (c’est-à-dire une
division dont le résultat est un entier). En Python 3, il réalise une division décimale standard
comme sur une calculatrice. En Python 2.7, on peut obtenir le même comportement qu’en
Python 3 grâce à l’instruction from __future__ import division.
Exemple
>>> 7 / 2
3.5
>>> 7 // 2
2.2.4 Opérateur %
L’opérateur % (appelé opérateur modulo) fournit le reste de la division entière d’un nombre
par un autre.
Exemple
>>> 7 % 2
>>> 6 % 2
2.2.5 Affectation
>>> a = 2
>>> a
>>> b = a + 3
>>> b
>>> print("bonjour")
bonjour
>>> a = 5
>>> print(a)
Il est possible de réaliser plusieurs affichages à la suite. Pour cela, on sépare les éléments par
des virgules.
>>> a = 5
a vaut 5
Avertissement
En Python 2, on ne mettait pas de parenthèses.
Pour ne pas aller à la ligne et continuer sur la même ligne lors du prochain print :
Il est possible avec Python 2.7 d’utiliser la syntaxe de Python 3 pour la fonction print grâce à
l’instruction from __future__ import print_function.
>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Le nombre de fin qui lui est passé n’est jamais dans la liste générée. Par exemple, range(10)
génère 10 valeurs, exactement les indices des éléments d’une séquence de longueur 10. Il
est possible de faire commencer l’intervalle à un autre nombre, ou de spécifier un incrément
différent (même négatif) :
[5, 6, 7, 8, 9]
De manière générale, on a :
Le pas peut être positif ou négatif. La valeur de la borne de fin (maximale ou minimale) n’est
jamais atteinte.
Exercice
>>> a = list(range(1,10,2))
>>> a
[1, 3, 5, 7, 9]
>>> a[0]
>>> a[2]
Pour accéder à un élément d’une liste, on indique entre crochets [] l’indice de l’élément.
Avertissement
En Python, l’indice du premier élément d’une liste est 0 (ceci est à distinguer d’autres
langages).
>>> a = list(range(7,10))
>>> a
[7, 8, 9]
>>> len(a)
3
2.2.10 Lecture d’informations au clavier - la fonction input()
Par défaut, la fonction input() renvoie une chaîne de caractères. Il faut donc utiliser la
fonction int() qui permet d’obtenir un entier.
Autre exemple de programme
n=3
for i in range(n):
if x > 0:
else:
print("Fin")
for i in range(n):
bloc d'instructions
if x > 0:
else:
Un identificateur est une suite de caractères servant à désigner les différentes entitées
manipulées par un programme : variables, fonctions, classes…
Les mots réservés par le langage Python (if, for, etc.) ne peuvent pas être utilisés comme
identificateurs.
Les commentaires
Commentaires usuels :
2.3.2 Instruction if
Syntaxe
if condition:
Instruction A
condition est une expression booléenne, c’est-à-dire une expression qui prend pour
valeur True (Vrai) ou False (Faux).
L”instruction A n’est exécutée que si la condition est vérifiée (c’est-à-dire si elle prend pour
valeur True).
x = 15
if x > 10:
print("Fin")
Fin
x=3
if x > 10:
print "Fin"
x=5
if x > 0:
print("Fin")
Dans cet exemple, le bloc après le if contient deux instructions. L’instruction print("Fin") ne
fait pas partie du bloc car elle n’est pas indentée.
Fin
x = -2
if x > 0:
print("Fin")
Fin
Instruction A
else:
Instruction B
x=5
if x > 0:
else:
print("Fin")
Fin
x = -2
if x > 0:
else:
Fin
Opérateur Signification
x == y x est égal à y
x != y x est différent de y
>>> 3 < 4
True
>>> 3 > 4
False
True
False
True
>>> 2 < 3 or 3 > 4
True
2.4 Boucles
Les boucles s’utilisent pour répéter plusieurs fois l’exécution d’une partie du programme.
En général, quand on sait combien de fois doit avoir lieu la répétition, on utilise une boucle for.
i a pour valeur 0
i a pour valeur 1
i a pour valeur 2
i a pour valeur 3
L’instruction for est une instruction composée, c’est-à-dire une instruction dont l’en-tête se
termine par deux-points :, suivie d’un bloc indenté qui constitue le corps de la boucle.
On dit que l’on réalise une itération de la boucle à chaque fois que le corps de la boucle est
exécuté.
Dans l’en-tête de la boucle, on précise après le mot-clé for le nom d’une variable (i dans
l’exemple ci-dessus) qui prendra successivement toutes les valeurs qui sont données après le
mot-clé in. On dit souvent que cette variable (ici i) est un compteur car elle sert à numéroter
les itérations de la boucle.
Il est possible d’obtenir le même résultat sans donner la liste des valeurs, mais en utilisant la
fontion range().
for i in range(4):
print("i a pour valeur", i)
Pour parcourir les indices d’une liste, il est possible de combiner range() et len() comme ci-
dessous :
for i in range(len(c)):
>>> len(c)
Dans l’exemple suivant, nous allons illustrer que la variable indiquée après for parcourt
toutes les valeurs de la liste donnée après in :
for i in c:
print("i vaut", i)
>>>
i vaut Marc
i vaut est
i vaut dans
i vaut le
i vaut jardin
Syntaxe :
while condition:
Instruction A
Exemple de programme :
x=1
x=x*2
print("Fin")
x a pour valeur 1
x a pour valeur 2
x a pour valeur 4
x a pour valeur 8
Fin
Le mot-clé while signifie tant que en anglais. Le corps de la boucle (c’est-à-dire le bloc
d’instructions indentées) sera répété tant que la condition est vraie.
Dans l’exemple ci-dessus, x sera multiplié par 2 tant que sa valeur reste inférieure à 10.
Remarque : Si la condition est fausse au départ, le corps de la boucle n’est jamais exécuté. Si
la condition reste toujours vraie, alors le corps de la boucle est répété indéfiniment.
Remarque : Il est toujours possible de remplacer une boucle for par une boucle while.
for i in range(4):
i=0
while i < 4:
i=i+1
2.5 Les instructions break et continue, et la clause else dans les boucles
L’instruction break permet de « casser » l’exécution d’une boucle (while ou for). Elle fait
sortir de la boucle et passer à l’instruction suivante.
Exemple
for i in range(10):
print("debut iteration", i)
print("bonjour")
if i == 2:
break
print("fin iteration", i)
print("apres la boucle")
bonjour
fin iteration 0
debut iteration 1
bonjour
fin iteration 1
debut iteration 2
bonjour
apres la boucle
Remarque : Dans le cas de boucles imbriquées, l’instruction break ne fait sortir que de la
boucle la plus interne.
Dans de nombreux langages, il existe une instruction do…while qui permet de créer une
boucle pour laquelle on ne connaît pas à l’avance le nombre de répétition, mais qui doit
s’exécuter au moins une fois. Cette instruction n’existe pas en Python, mais on peut facilement
reproduire son fonctionnement de la façon suivante :
while True:
if n > 0:
break
print("reponse correcte")
L’instruction continue permet de passer prématurément au tour de boucle suivant. Elle fait
continuer sur la prochaine itération de la boucle.
Exemple
for i in range(4):
print("debut iteration", i)
print("bonjour")
if i < 2:
continue
print("fin iteration", i)
print("apres la boucle")
debut iteration 0
bonjour
debut iteration 1
bonjour
debut iteration 2
bonjour
fin iteration 2
debut iteration 3
bonjour
fin iteration 3
apres la boucle
La clause else dans un boucle permet de définir un bloc d’instructions qui sera exécuté à la fin
seulement si la boucle s’est déroulée complétement sans être interrompue par un break.
Contrairement aux instructions présentes après la boucle, qui s’exécutent dans tous les cas
(avec ou sans interruption par un break), le bloc d’instructions défini dans la clause else ne
s’exécutera pas lors de l’interruption par un break. Après l’interruption, on passera
directement aux instructions après la boucle.
Autrement dit, le bloc de la clause else est exécuté lorsque la boucle se termine par
épuisement de la liste (avec for) ou quand la condition devient fausse (avec while), mais pas
quand la boucle est interrompue par un break. Ceci est illustré dans la boucle suivante, qui
recherche des nombres premiers :
if n % x == 0:
break
else:
4 egale 2 * 2.0
6 egale 2 * 3.0
Exemples :
>>> type(15)
int
>>> a = 15
>>> type(a)
int
>>> a = "toto"
>>> type(a)
str
>>> type(128)
int
Exemples :
>>> a = 14.5
>>> type(a)
float
>>> a = 11.
>>> type(a)
float
>>> a
11.0
>>> a = 3.25e7
>>> type(a)
float
>>> a
3.25e+7
>>> type(a)
str
>>> b = "Bonsoir"
>>> type(b)
str
>>> a = True
>>> type(a)
bool
>>> b = not(a)
>>> b
False
Remarque : la fonction not est un opérateur logique qui renvoie l’opposé de la valeur
booléenne transmise. Pour True, on obtient False. Réciproquement, il renvoie False quand
on lui transmet True.
>>> liste = []
>>> liste
<type 'list'>
>>> liste
[1, 2, 3]
Ou les ajouter après la création de la liste avec la méthode append (qui signifie "ajouter" en
anglais):
>>> liste = []
>>> liste
[]
>>> liste.append(1)
>>> liste
[1]
>>> liste.append("ok")
>>> liste
[1, 'ok']
On voit qu'il est possible de mélanger dans une même liste des variables de type différent. On
peut d'ailleurs mettre une liste dans une liste.
>>> liste[0]
'a'
>>> liste[2]
'm'
Le premier item commence toujours avec l'index 0. Pour lire la premier item on utilise la valeur
0, le deuxième on utilise la valeur 1, etc.
>>> liste[0]
'a'
>>> liste[2]
'm'
>>> liste
>>> liste
['a', 'c']
>>> liste.remove("a")
>>> liste
['b', 'c']
2.6.6.6 Inverser les valeurs d'une liste
Vous pouvez inverser les items d'une liste avec la méthode reverse .
>>> liste.reverse()
>>> liste
>>> len(liste)
>>> liste.count("a")
>>> liste.count("c")
>>> liste.index("b")
3
2.6.6.10 Manipuler une liste
Voici quelques astuces pour manipuler des listes:
>>> liste[0]
500
[]
...
d
m
Si vous voulez en plus récupérer l'index, vous pouvez utiliser la fonction enumerate .
...
(0, 'a')
(1, 'd')
(2, 'm')
>>> x = [1,2,3]
>>> y = x
Or si vous changez une valeur de la liste y , la liste x sera elle aussi affectée par cette
modification:
>>> x = [1,2,3]
>>> y = x
>>> y[0] = 4
>>> x
[4, 2, 3]
En fait cette syntaxe permet de travailler sur un même élément nommé différemment
>>> x = [1,2,3]
>>> y = x[:]
>>> y[0] = 9
>>> x
[1, 2, 3]
>>> y
[9, 2, 3]
Pour des données plus complexes, vous pouvez utiliser la fonction deepcopy du module copy
>>> x = [[1,2], 2]
>>> y = copy.deepcopy(x)
>>> x
[[1, 2], 2]
>>> y
>>> ma_chaine.split(":")
>>> ":".join(liste)
'Olivier:ENGEL:Strasbourg'
>>> 3 in liste
True
>>> 11 in liste
False
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x = [1, 2, 3, 4]
>>> y = [4, 5, 1, 0]
>>> x.extend(y)
>>> print x
[1, 2, 3, 4, 4, 5, 1, 0]
2.6.6.18 Permutations
La permutation d'un ensemble d'éléments est une liste de tous les cas possibles. Si vous avez
besoin de cette fonctionnalité, inutile de réinventer la roue, itertools s'en occupe pour vous.
>>> from itertools import permutations
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
2.6.6.20 Astuces
Afficher les 2 premiers éléments d'une liste
>>> liste[:2]
[1, 2]
>>> liste[-1]
>>> liste[-3]
>>> liste[-3:]
[4, 5, 6]
Vous pouvez additionner deux listes pour les combiner ensemble en utilisant l'opérateur + :
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> x + y
[1, 2, 3, 4, 5, 6]
>>> x = [1, 2]
>>> x*5
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
>>> [0] * 5
[0, 0, 0, 0, 0]
Exemples :
>>> a = 2 + 3j
>>> type(a)
complex
>>> a
(2+3j)
>>> b = 1 + j
b=1+j
>>> b = 1 + 1j
>>> a * b
(-1+5j)
>>> 1j**2
(-1+0j)
Un exemple de type construit est le tuple. Il permet de créer une collection ordonnée de
plusieurs éléments. En mathématiques, on parle de p-uplet. Par exemple, un quadruplet est
constitué de 4 éléments.
Les tuples ressemblent aux listes, mais on ne peut pas les modifier une fois qu’ils ont été
créés.
>>> a = (3, 4, 7)
>>> type(a)
<class 'tuple'>
Parfois, les tuples ne sont pas entourés de parenthèses, même s’il s’agit quand même de
tuples.
>>> b, c = 5, 6
>>> b
5
>>> c
Cette syntaxe avec plusieurs variables à gauche du signe = peut aussi être utilisée avec une
variable unique à droite si celle-ci contient un tuple.
>>> a = (3, 4)
>>> u, v = a
>>> u
>>> v
Il est très facile de créer une fonction qui renvoie un tuple. Il suffit d’indiquer ce tuple
après return.
def test():
return 3, 4
>>> a = test()
>>> a
(3, 4)
>>> b, c = test()
>>> b
>>> c
4
Remarque : Après return, il aurait été possible d’utiliser une notation avec des parenthèses
pour le tuple, par exemple return (3, 4).
Comment itérer sur les éléments d’un tuple ?
Comme une liste, il est possible de parcourir un tuple avec une boucle for.
for i in a:
print(i)
Résultat
La valeur d’un élément du tuple est obtenue en utilisant la même syntaxe que pour une liste.
>>> a[0]
>>> a[1]
>>> a = (3)
>>> a
>>> type(a)
int
En effet, les parenthèses sont alors considérées comme celles d’une expression
mathématique, comme par exemple dans 3*(4+1).
Pour créer un tuple contenant un seul élément, il faut donc utiliser une syntaxe spécifique
qui contient une virgule.
>>> b = (3,)
>>> b
(3,)
>>> type(b)
<class 'tuple'>
Si on veut récupérer l’unique valeur présente dans le tuple, on va pouvoir utiliser les
approches suivantes :
Première approche
>>> c = b[0]
>>> c
Deuxième approche
>>> d, = b
>>> d
La deuxième approche avec une virgule d, = b est plus légère que la syntaxe qui utilise des
crochets c = b[0].
Il est possible d’utiliser la syntaxe nom_de_variable, = aussi avec une liste à un élément.
>>> u = [5]
>>> v, = u
>>> v
>>> a = {}
ou
>>> a = dict()
>>> a = {}
>>> a
Vous pouvez utiliser des clés numériques comme dans la logique des listes .
>>> data.get("name")
'Wayne'
'Adresse inconnue'
>>> a.has_key("nom")
True
>>> a
{'prenom': 'Bruce'}
2.14 Comment récupérer les clés d'un dictionnaire python par une boucle?
Pour récupérer les clés on utilise la méthode keys .
...
nom
prenom
2.15 Comment récupérer les valeurs d'un dictionnaire python par une boucle?
Pour cela on utilise la méthode values .
...
Wayne
Bruce
2.16 Comment récupérer les clés et les valeurs d'un dictionnaire python par une boucle?
Pour récupérer les clés et les valeurs en même temps, on utilise la méthode items qui retourne
un tuple .
...
nom Wayne
prenom Bruce
2.17 Comment utiliser des tuples comme clé dans un dictionnaire python?
Une des forces de python est la combinaison tuple/dictionnaire qui fait des merveilles dans
certains cas comme lors de l'utilisation de coordonnées.
>>> b = {}
>>> b[(32)]=12
>>> b[(45)]=13
>>> b
>>> e = d
>>> e
Pour créer une copie indépendante vous pouvez utiliser la méthode copy :
>>> e = d.copy()
>>> a.update(b)
>>> print(a)
3 Fonctions en Python
Nous avons déjà rencontré diverses fonctions prédéfinies : print(), input(), range(), len().
Lorsqu’une tâche doit être réalisée plusieurs fois par un programme avec seulement des
paramètres différents, on peut l’isoler au sein d’une fonction. Cette approche est également
intéressante si la personne qui définit la fonction est différente de celle qui l’utilise. Par
exemple, nous avons déjà utilisé la fonction print() qui avait été définie par quelqu’un d’autre.
bloc d'instructions
Vous pouvez choisir n’importe quel nom pour la fonction que vous créez, à l’exception des
mots-clés réservés du langage, et à la condition de n’utiliser aucun caractère spécial ou
accentué (le caractère souligné « _ » est permis). Comme c’est le cas pour les noms de
variables, on utilise par convention des minuscules, notamment au début du nom (les noms
commençant par une majuscule seront réservés aux classes).
Corps de la fonction
Comme les instructions if, for et while, l’instruction def est une instruction composée. La ligne
contenant cette instruction se termine obligatoirement par un deux-points :, qui introduisent
un bloc d’instructions qui est précisé grâce à l’indentation. Ce bloc d’instructions constitue
le corps de la fonction.
def compteur3():
i=0
while i < 3:
print(i)
i=i+1
print("bonjour")
compteur3()
compteur3()
bonjour
En entrant ces quelques lignes, nous avons défini une fonction très simple qui compte jusqu’à
2. Notez bien les parenthèses, les deux-points, et l’indentation du bloc d’instructions qui suit
la ligne d’en-tête (c’est ce bloc d’instructions qui constitue le corps de la fonction proprement
dite).
Il est également possible de sauvegarder ce programme en tant que script au sein d’IDLE.
Après avoir exécuté ce script, pour utiliser à nouveau la fonction que nous venons de définir,
il suffit de l’appeler par son nom au niveau du shell. Ainsi :
>>> compteur3()
provoque l’affichage de :
Nous pouvons maintenant réutiliser cette fonction à plusieurs reprises, autant de fois que
nous le souhaitons.
def compteur3():
i=0
while i < 3:
print(i)
i=i+1
def double_compteur3():
compteur3()
compteur3()
print("bonjour")
double_compteur3()
Une première fonction peut donc appeler une deuxième fonction, qui elle-même en appelle
une troisième, etc.
Créer une nouvelle fonction offre l’opportunité de donner un nom à tout un ensemble
d’instructions. De cette manière, on peut simplifier le corps principal d’un programme, en
dissimulant un algorithme secondaire complexe sous une commande unique, à laquelle on
peut donner un nom explicite.
Une fonction est donc en quelque sorte une nouvelle instruction personnalisée, qu’il est
possible d’ajouter librement à notre langage de programmation.
i=0
print(i)
i=i+1
compteur(4)
compteur(2)
Pour tester cette nouvelle fonction, il nous suffit de l’appeler avec un argument.
Exemple
def compteur(stop):
i=0
print(i)
i=i+1
a=5
compteur(a)
0
1
Avertissement
Dans l’exemple ci-dessus, l’argument que nous passons à la fonction compteur() est le
contenu de la variable a. A l’intérieur de la fonction, cet argument est affecté au
paramètre stop, qui est une tout autre variable.
Notez donc bien dès à présent que :
Le nom d’une variable que nous passons comme argument n’a rien à voir avec le
nom du paramètre correspondant dans la fonction.
Ces noms peuvent être identiques si vous le voulez, mais vous devez bien
comprendre qu’ils ne désignent pas la même chose (en dépit du fait qu’ils puissent
contenir une valeur identique).
La fonction suivante utilise trois paramètres : start qui contient la valeur de départ, stop la
borne supérieure exclue comme dans l’exemple précédent et step le pas du compteur.
i = start
print(i)
i = i + step
compteur_complet(1, 7, 2)
A chaque fois que nous définissons des variables à l’intérieur du corps d’une fonction, ces
variables ne sont accessibles qu’à la fonction elle-même. On dit que ces variables sont
des variables locales à la fonction. Une variable locale peut avoir le même nom qu’une
variable de l’espace de noms global mais elle reste néanmoins indépendante.
Les contenus des variables locales sont stockés dans l’espace de noms local qui est inaccessible
depuis l’extérieur de la fonction.
Les variables définies à l’extérieur d’une fonction sont des variables globales. Leur contenu est
« visible » de l’intérieur d’une fonction, mais la fonction ne peut pas le modifier.
Exemple
def test():
b=5
print(a, b)
a=2
b=7
test()
print(a, b)
25
27
def test():
global b
b=5
print(a, b)
a=2
b=7
test()
print(a, b)
25
25
def cube(w):
return w**3
>>> cube(3)
27
>>> a = cube(4)
>>> a
64
>>> politesse("Dupont")
Lorsque l’on appelle cette fonction en ne lui fournissant que le premier argument, le second
reçoit tout de même une valeur par défaut. Si l’on fournit les deux arguments, la valeur par
défaut pour le deuxième est tout simplement ignorée.
Python autorise cependant une souplesse beaucoup plus grande. Si les paramètres annoncés
dans la définition de la fonction ont reçu chacun une valeur par défaut, sous la forme déjà
décrite ci-dessus, on peut faire appel à la fonction en fournissant les arguments
correspondants dans n’importe quel ordre, à la condition de désigner nommément les
paramètres correspondants.
Exemple :
>>> oiseau()
Le développeur doit être très prudent avec la récursivité car il peut être assez facile de se glisser dans
l'écriture d'une fonction qui ne se termine jamais, ou qui utilise des quantités excessives de mémoire
ou de puissance de processeur. Cependant, lorsqu'elle est écrite correctement, la récursivité peut être
une approche de programmation très efficace et mathématiquement élégante.
Dans cet exemple, recur_factoriel() est une fonction que nous avons définie pour s'appeler elle-même
.
Pour un nouveau développeur, cela peut prendre un certain temps pour comprendre comment cela
fonctionne exactement, la meilleure façon de le savoir est de le tester et de le modifier.
#Fonction recursive
def recursive_fibonacci(n):
if n <= 1:
return n
else:
return(recursive_fibonacci(n-1) + recursive_fibonacci(n-2))
n_terms = 10
V=43πR3V=43πR3
Exemple :
import numpy as np
def cube(n):
return n**3
def volume_sphere(r):
Notez bien que les deux parties du programme ont été disposées dans un certain ordre :
Cette disposition est nécessaire, parce que l’interpréteur exécute les lignes d’instructions du
programme l’une après l’autre, dans l’ordre où elles apparaissent dans le code source. Dans
le script, la définition des fonctions doit donc précéder leur utilisation.
Pour vous en convaincre, intervertissez cet ordre (en plaçant par exemple le corps principal
du programme au début), et prenez note du type de message d’erreur qui est affiché lorsque
vous essayez d’exécuter le script ainsi modifié.
En fait, le corps principal d’un programme Python constitue lui-même une entité un peu
particulière, qui est toujours reconnue dans le fonctionnement interne de l’interpréteur sous
le nom réservé __main__ (le mot « main » signifie « principal », en anglais. Il est encadré par
des caractères « souligné » en double, pour éviter toute confusion avec d’autres symboles).
L’exécution d’un script commence toujours avec la première instruction de cette entité
__main__, où qu’elle puisse se trouver dans le listing. Les instructions qui suivent sont alors
exécutées l’une après l’autre, dans l’ordre, jusqu’au premier appel de fonction. Un appel de
fonction est comme un détour dans le flux de l’exécution : au lieu de passer à l’instruction
suivante, l’interpréteur exécute la fonction appelée, puis revient au programme appelant pour
continuer le travail interrompu. Pour que ce mécanisme puisse fonctionner, il faut que
l’interpréteur ait pu lire la définition de la fonction avant l’entité __main__, et celle-ci sera
donc placée en général à la fin du script.
Dans notre exemple, l’entité __main__ appelle une première fonction qui elle-même en
appelle une deuxième. Cette situation est très fréquente en programmation. Si vous voulez
comprendre correctement ce qui se passe dans un programme, vous devez donc apprendre à
lire un script, non pas de la première à la dernière ligne, mais plutôt en suivant un
cheminement analogue à ce qui se passe lors de l’exécution de ce script. Cela signifie
concrètement que vous devrez souvent analyser un script en commençant par ses dernières
lignes !
Nous allons donc voir à présent comment définir des fonctions dans un module et faire en
sorte qu’un utilisateur puisse appeler ces fonctions dans son programme.
Par exemple, nous allons créer un fichier nommé rect.py qui va définir 2 fonctions
: perimetre(long, larg) et surface(long, larg). Un tel fichier est appelé un module et il va pouvoir
être importé dans un autre fichier, et en particulier dans le fichier qui contient le programme
principal.
#fonction surface
def surface(long,larg):
return(long*larg)
#fonction perimetre
def perimetre(long,larg):
return(2*(long+larg))
Il est maintenant possible d’utiliser dans un programme principal les fonctions qui ont été
définies dans le module puissance.py. Pour cela, il faut importer les fonctions à partir du
module.
a=5
b=10
p = perimetre(a, b)
Avertissement
Le fichier rect.py doit être dans le même répertoire que le programme principal (ou bien se
trouver dans le « path » de Python).
a=5
b=10
u = perimetre(a, b)
v = surface(a, b)
a=5
b=10
u = perimetre(a, b)
v = surface(a, b)
Avertissement
L’importation de toutes les fonctions avec * est fortement déconseillée. En effet, elle ne
permet pas d’avoir une vision claire des fonctions qui ont été importées. Ceci est donc une
source potentielle d’erreurs.
import rect
a=5
b=10
u = perimetre(a, b)
v = surface(a, b)
import puissance as pu
a=5
u = pu.carre(a)
v = pu.cube(a)
Il est aussi possible de donner un alias à une fonction comme dans l’exemple suivant :
u = ca(a)
3.14 Package
Quand on a un grand nombre de modules, il peut être intéressant de les organiser dans des
dossiers. Un dossier qui rassemble des modules est appelé un package (paquetage en
français). Le nom du package est le même que celui du dossier. Par exemple, on crée un
dossier package1 dans lequel on place le fichier module1.py suivant :
def fonction1(a):
return a**2
import package1.module1
u = package1.module1.fonction1(3)
print("u vaut", u)
Remarque : Il est aussi possible d’avoir des dossiers imbriqués, c’est-à-dire des dossiers qui
contiennent d’autres dossiers.
Complément
Dans la documentation de Python, il est fait une distinction entre script et module. Voici
quelques précisions sur cette distinction.
En Python, lorsqu’on crée un fichier qui rassemble des instructions au lieu de les taper une à
une dans l’interpréteur, on appelle ce fichier un script et on le sauvegarde avec une
extension .py, par exemple essai.py.
Quand on est amené à travailler sur un programme long, il est utile de séparer le programme
en plusieurs fichiers. Certaines parties peuvent alors être réutilisées par d’autres programmes.
Il est par exemple possible d’effectuer la définition des fonctions dans un fichier séparé pour
ensuite les utiliser dans un script ou dans l’interpréteur. Le fichier qui contient ces définitions
a aussi une extension .py, mais on appelle ce fichier un module.
Les modalités pour importer un module sont expliquées plus haut dans cette page.
A l’intérieur d’un module, le nom du module (en tant que chaîne de caractères) peut être
obtenu grâce à la variable globale __name__. Par exemple, si on utilise le
module puissance.py défini précédemment, on a dans l’interpréteur :
>>> puissance.__name__
'puissance'
Un même fichier .py peut jouer le rôle de script ou de module suivant son utilisation.
Quand on utilise un fichier en tant que script, la variable globale __name__ prend pour
valeur '__main__'. Ceci permet d’avoir dans le fichier un bloc d’instructions qui sera exécuté
uniquement lorsque le fichier est lancé en tant que script.
def carre(valeur):
resultat = valeur**2
return resultat
if __name__ == "__main__":
a=3
On peut lancer une exécution directe en tant que script et on obtient alors :
le carre vaut 9
Ou bien on peut importer puissance2 en tant que module, par exemple dans le fichier suivant
:
b=4
le carre vaut 16
4 Python et mathématiques
4.1 Quelques bibliothèques
Numpy, Scipy et Matplotlib
Numpy : Un package incontournable pour commencer à faire du calcul scientifique sous Python
Matplotlib : le package permettant de faire des visualisations 2D (mais pas que ...) de très haute
qualité, facilement et avec de très bonnes performances.
Normalement, si un module approprié est déjà installé, l’installer à nouveau n’aura aucun
effet. La mise à jour de modules existants doit être demandée explicitement :
Installation de numpy
Installation de matplotlib
Installation de scipy
Autres bibliothèques
tensorflow
xgboost
seaborn
bokeh
plotly
pydot
il suffit de faire :
Exemple 1
Syntaxe « PyLab »
x = array([1, 3, 4, 6])
y = array([2, 3, 5, 1])
plot(x, y)
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 3, 4, 6])
y = np.array([2, 3, 5, 1])
plt.plot(x, y)
import numpy as np
import matplotlib.pyplot as plt
xlim(xmin, xmax)
ylim(ymin, ymax)
Exemple 1
Syntaxe « PyLab »
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
plt.show()
(Source code)
Syntaxe « PyLab »
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
plt.show()
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 30)
y = np.cos(x)
plt.plot(x, y, label="cos(x)")
plt.legend()
plt.show()
Avertissement
Pour faire afficher le label, il ne faut pas oublier de faire appel à l’instruction legend().
4.3.5 Labels sur les axes - xlabel() et ylabel()
Des labels sur les axes peuvent être ajoutés avec les fonctions xlabel() et ylabel().
Syntaxe « PyLab »
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
plt.show()
4.3.6 Affichage de plusieurs courbes
Pour afficher plusieurs courbes sur un même graphe, on peut procéder de la façon suivante :
Syntaxe « PyLab »
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
Syntaxe « PyLab »
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
Chaîne Effet
- ligne continue
-- tirets
: ligne en pointillé
-. tirets points
Avertissement
Si on ne veut pas faire apparaître de ligne, il suffit d’indiquer un symbole sans préciser un style
de ligne.
Exemple
Syntaxe « PyLab »
import numpy as np
import matplotlib.pyplot as plt
Chaîne Effet
. point marker
, pixel marker
o circle marker
v triangle_down marker
^ triangle_up marker
1 tri_down marker
2 tri_up marker
3 tri_left marker
4 tri_right marker
s square marker
p pentagon marker
Chaîne Effet
* star marker
h hexagon1 marker
H hexagon2 marker
+ plus marker
x x marker
D diamond marker
d thin_diamond marker
| vline marker
_ hline marker
4.3.11 Couleur
Les chaînes de caractères suivantes permettent de définir la couleur :
g green vert
r red rouge
c cyan cyan
m magenta magenta
y yellow jaune
k black noir
w white blanc
import numpy as np
import matplotlib.pyplot as plt
x = array([0, 1, 1, 0, 0])
y = array([0, 0, 1, 1, 0])
plot(x, y)
xlim(-1, 2)
ylim(-1, 2)
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
x = np.array([0, 1, 1, 0, 0])
y = np.array([0, 0, 1, 1, 0])
plt.plot(x, y)
plt.xlim(-1, 2)
plt.ylim(-1, 2)
plt.show()
Syntaxe « PyLab »
x = array([0, 1, 1, 0, 0])
y = array([0, 0, 1, 1, 0])
plot(x, y)
axis("equal")
show()
Syntaxe « standard »
import numpy as np
import matplotlib.pyplot as plt
x = np.array([0, 1, 1, 0, 0])
y = np.array([0, 0, 1, 1, 0])
plt.plot(x, y)
plt.axis("equal")
plt.show()
Il est aussi possible de fixer le domaine des abscisses en utilisant xlim().
Syntaxe « PyLab »
import numpy as np
import matplotlib.pyplot as plt
x = np.array([0, 1, 1, 0, 0])
y = np.array([0, 0, 1, 1, 0])
plt.plot(x, y)
plt.axis("equal")
plt.xlim(-1, 2)
plt.show()
Syntaxe « PyLab »
import numpy as np
import matplotlib.pyplot as plt
theta = np.linspace(0, 2*np.pi, 40)
x = np.cos(theta)
y = np.sin(theta)
plt.plot(x, y)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
theta = np.linspace(0, 2*np.pi, 40)
x = np.cos(theta)
y = np.sin(theta)
plt.plot(x, y)
plt.axis("equal")
plt.show()
4.3.16 Tracé de diagrammes en bâtons et histogrammes
On peut tracer assez facilement à partir de séries statistiques des diagrammes en bâtons et
des histogrammes. Voici un exemple de chaque :
import numpy as np
x = [3, 5, 6, 7]
y = [4, 1, 3, 4]
plt.bar(x,y)
plt.show()
Il est également possible de créer un graphique à l'aide de variables catégorielles. Matplotlib vous
permet de transmettre des variables catégorielles directement à de nombreuses fonctions de traçage.
Par exemple:
Bar Chart
• Les coordonnées x du côté gauche des barres sont transmises avec les hauteurs des barres.
• vous pouvez également donner un nom aux coordonnées de l'axe x en définissant tick_labels
Histogramme
filter_none
edit
play_arrow
brightness_4
Pie-chart
import numpy as np
plt.hist(liste,11)
plt.show()
4.3.17 Affichages de nuages de points
import numpy as np
x = [ 1, 3, 2, 1]
y = [ 2, 3, 1, 3]
plt.scatter(x,y)
plt.show()
Il peut être intéressant de modifier la couleur selon que les coordonnées vérifient une
condition ou pas. Pour cela, on peut fournir en plus une liste de couleur pour chaque point
avec l'argument c= liste_couleurs. On peut modifier la taille des points avec l'argument s=.
Voici un nuage de 5000 points pris au hasard. On a coloré en rouge ceux qui vérifient la
condition y<x².
Nuage de points
import numpy as np
def donner_couleur(x,y):
couleurs=[]
for i in range(len(x)):
if y[i]<x[i]**2 : couleurs.append("r")
else : couleurs.append("b")
return couleurs
plt.scatter(x,y,s=1,c=donner_couleur(x,y))
plt.show()
Representation en 3D
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
fig = figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot')
show()
Un objet Axes3D est créé comme tout autre axe en utilisant le mot clé projection='3d'. Créez une
nouvelle figure matplotlib.figure.figure et ajoutez-lui un nouvel axe de type Axes3D :
Dans sa nouvelle version 1.0.0: cette approche est préférable pour créer des courbes en 3D
axes.
Note
Prior to version 1.0.0, the method of creating a 3D axes was different. For those using older
versions of matplotlib, change ax = fig.add_subplot(111, projection='3d') to ax = Axes3D(fig).
Line plots
Argument Description
zs z value(s), either one for all points or one for each point.
zdir Which direction to use as z (‘x’, ‘y’ or ‘z’) when plotting a 2D set.
import numpy as np
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.legend()
plt.show()
Scatter plots
zdir Which direction to use as z (‘x’, ‘y’ or ‘z’) when plotting a 2D set.
Returns a Patch3DCollection
'''
==============
3D scatterplot
==============
'''
import numpy as np
'''
'''
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 100
# For each set of style and range settings, plot n random points in the box
for c, m, zlow, zhigh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
ys = randrange(n, 0, 100)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()
Wireframe plots
The rstride and cstride kwargs set the stride used to sample the input data to
generate the graph. If either is 0 the input data in not sampled along this direction
producing a 3D line plot rather than a wireframe plot. The stride arguments are
only used by default if in the ‘classic’ mode. They are now superseded
by rcount and ccount. Will raise ValueError if both stride and count are used.
cstride for default sampling method for wireframe plotting. These arguments will
determine at most how many evenly spaced samples will be taken from the input data
to generate the graph. This is the default sampling method unless using the ‘classic’
style. Will raise ValueError if both stride and count are specified. If either is zero, then
the input data is not sampled along this direction, producing a 3D line plot rather than
a wireframe plot. Added in v2.0.0.
Argument Description
Returns a Line3DCollection
''' =================
3D wireframe plot
=================
'''
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
plt.show()
Surface plots
By default it will be colored in shades of a solid color, but it also supports color mapping
by supplying the cmap argument.
The rstride and cstride kwargs set the stride used to sample the input data to generate
the graph. If 1k by 1k arrays are passed in, the default values for the strides will result
in a 100x100 grid being plotted. Defaults to 10. Raises a ValueError if both stride and
count kwargs (see next section) are provided.
The rcount and ccount kwargs supersedes rstride and cstride for default sampling
method for surface plotting. These arguments will determine at most how many evenly
spaced samples will be taken from the input data to generate the graph. This is the
default sampling method unless using the ‘classic’ style. Will raise ValueError if both
stride and count are specified. Added in v2.0.0.
Argument Description
''' ======================
======================
Also demonstrates using the LinearLocator and custom formatting for the
'''
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
plt.show()
''' ========================
========================
'''
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Make data
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
# Plot the surface
ax.plot_surface(x, y, z, color='b')
plt.show()
''' =========================
3D surface (checkerboard)
=========================
'''
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
# Make data.
X = np.arange(-5, 5, 0.25)
xlen = len(X)
Y = np.arange(-5, 5, 0.25)
ylen = len(Y)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# Create an empty array of strings with the same shape as the meshgrid, and
for y in range(ylen):
for x in range(xlen):
# Plot the surface with face colors taken from the array we made.
ax.set_zlim(-1, 1)
ax.w_zaxis.set_major_locator(LinearLocator(6))
plt.show()
Tri-Surface plots
Axes3D.plot_trisurf(*args, **kwargs)
Argument Description
plot_trisurf(triangulation, ...)
plot_trisurf(X, Y, ...)
plot_trisurf(X, Y, triangles, ...)
plot_trisurf(X, Y, triangles=triangles, ...)
in which case a Triangulation object will be created. See Triangulation for a explanation
of these possibilities.
plot_trisurf(..., Z)
where Z is the array of values to contour, one per point in the triangulation.
Exemples :
''' ======================
Triangular 3D surfaces
======================
'''
import numpy as np
n_radii = 8
n_angles = 36
# Make radii and angles spaces (radius r=0 omitted to eliminate duplication).
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
# Compute z to make the pringle surface.
z = np.sin(-x*y)
fig = plt.figure()
ax = fig.gca(projection='3d')
plt.show()
''' ===========================
===========================
second sets a Triangulation object's mask and passes the object directly
to plot_trisurf.
'''
import numpy as np
fig = plt.figure(figsize=plt.figaspect(0.5))
#============
# First plot
#============
u, v = np.meshgrid(u, v)
u, v = u.flatten(), v.flatten()
# triple
tri = mtri.Triangulation(u, v)
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.set_zlim(-1, 1)
#============
# Second plot
#============
n_radii = 8
min_radius = 0.25
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()
z = (np.cos(radii)*np.cos(angles*3.0)).flatten()
triang = mtri.Triangulation(x, y)
xmid = x[triang.triangles].mean(axis=1)
ymid = y[triang.triangles].mean(axis=1)
triang.set_mask(mask)
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.plot_trisurf(triang, z, cmap=plt.cm.CMRmap)
plt.show()
New in version 1.2.0: This plotting function was added for the v1.2.0 release.
''' ======================
Triangular 3D surfaces
======================
'''
import numpy as np
n_radii = 8
n_angles = 36
# Make radii and angles spaces (radius r=0 omitted to eliminate duplication).
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)
fig = plt.figure()
ax = fig.gca(projection='3d')
plt.show()
Contour plots
Argument Description
Z
Argument Description
Returns a contour
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
plt.show()
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
plt.show()
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
Argument Description
Returns a contourf
Changed in version 1.1.0: The zdir and offset kwargs were added.
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
plt.show()
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
Polygon plots
2D collection types are converted to a 3D version by modifying the object and adding z
coordinate information.
Supported are:
PolyCollection
LineColleciton
PatchCollection
import numpy as np
Note
Dans la syntaxe « standard », on importe la totalité du module numpy et on lui donne un alias
pour alléger ensuite l’écriture de l’appel des fonctions. L’alias qui est le plus couramment utilisé
est np. Pour en savoir plus sur l’importation et la création d’un alias, vous pouvez consulter la
page Modules et importations.
4.4.1 Tableaux - numpy.array()
Pour créer des tableaux, nous allons utiliser numpy.array().
Pour créer un tableau 1D, il suffit de passer une liste de nombres en argument
de numpy.array(). Un liste est constituée de nombres séparés par des virgules et entourés de
crochets ([ et ]).
>>> a = np.array([4,7,9])
>>> a
array([4, 7, 9])
On constate que ce type est issu du package numpy. Ce type est différent de celui d’une liste.
>>> a = np.array([2,5,6,8])
>>> np.size(a)
4
>>> b = np.array([[1, 2, 3],
[4, 5, 6]])
>>> np.size(b)
6
>>> a = np.array([2,5,6,8])
>>> np.shape(a)
(4,)
>>> b = np.array([[1, 2, 3],
[4, 5, 6]])
>>> np.shape(b)
(2, 3)
Le produit d’une matrice de taille n x m par une matrice m x p donne une matrice n x p.
4.4.7 Transposé
>>> a.T
array([[1, 4],
[2, 5],
[3, 6]])
>>> np.conj(u).T
array([[ 0.-2.j, 2.-5.j, 3.+0.j],
[ 4.-3.j, 5.+0.j, 6.-2.j]])
Dans la tranche [n:m], l’élément d’indice n est inclus, mais pas celui d’indice m. Un moyen
pour mémoriser ce mécanisme consiste à considérer que les limites de la tranche sont définies
par les numéros des positions situées entre les éléments, comme dans le schéma ci-dessous :
>>> a[1:]
array([25, 34, 56, 87])
>>> a[:3]
array([12, 25, 34])
>>> a[:]
array([12, 25, 34, 56, 87])
Avertissement
a[:,n] donne un tableau 1D correspondant à la colonne d’indice n de a. Si on veut obtenir un
tableau 2D correspondant à la colonne d’indice n, il faut faire du slicing en utilisant a[:,n:n+1].
>>> a[:,1:2]
array([[2],
[5]])
>>> np.zeros(3)
array([ 0., 0., 0.])
>>> np.zeros((2,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.ones(3)
array([ 1., 1., 1.])
>>> np.ones((2,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.eye(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Les colonnes de V sont les vecteurs propres de A associés aux valeurs propres qui apparaissent
dans D.
Exercice : Vérifier que les colonnes de V sont bien des vecteurs propres de A
>>> a = np.arange(1, 6)
>>> a
array([1, 2, 3, 4, 5])
>>> a.shape = (1, np.size(a))
>>> a
array([[1, 2, 3, 4, 5]])
>>> a.shape = (np.size(a), 1)
>>> a
array([[1],
[2],
[3],
[4],
[5]])
5.1 Classes
Une classe regroupe des fonctions et des attributs qui définissent un objet. On appelle par
ailleurs les fonctions d'une classe des " méthodes ".
# coding: utf-8
class Voiture:
def __init__(self):
self.nom = "Ferrari"
Notre classe Voiture est une sorte d'usine à créer des voitures.
self.nom est une manière de stocker une information dans la classe. On parle d'attribut de
classe. Dans notre cas, on stock le nom dans l'attribut nom .
5.2 Objets
Un objet est une instance d'une classe . On peut créer autant d'objets que l'on désire avec
une classe .
>>> ma_voiture.nom
'Ferrari'
Et le lire ainsi:
>>> ma_voiture.modele
'250'
5.4 Méthodes
# coding: utf-8
class Voiture:
def __init__(self):
self.nom = "Ferrari"
def donne_moi_le_modele(self):
return "250"
>>> ma_voiture=Voiture()
>>> ma_voiture.donne_moi_le_modele()
'250'
5.5 Propriétés
Quelque soit le langage, pour la programmation orientée objet il est de préférable de passer
par des propriétés pour changer les valeurs des attributs. Alors bien que cela ne soit pas
obligatoire, il existe une convention de passer par des getter (ou accesseur en francais) et
des setter ( mutateurs ) pour changer la valeur d'un attribut. Cela permet de garder une
cohérence pour le programmeur, si je change un attribut souvent cela peut également
impacter d'autres attributs et les mutateurs permettent de faire cette modification une fois
pour toute.
# coding: utf-8
class Voiture(object):
def __init__(self):
self._roues=4
def _get_roues(self):
return self._roues
self._roues = v
roues=property(_get_roues, _set_roues)
>>> ma_voiture=Voiture()
>>> ma_voiture.roues=5
Changement du nombre de roues
>>> ma_voiture.roues
class Voiture(object):
def __init__(self):
self._roues=4
@property
def roues(self):
return self._roues
@roues.setter
self._roues = v
Parfois il est intéressant de decortiquer un objet pour résoudre à un bug ou pour comprendre
un script.
>>> dir(ma_voiture)
Cet attribut spécial vous donne les valeurs des attributs de l'instance:
>>> ma_voiture.__dict__
{'nom': 'Ferrari'}
L'héritage est un concept très utile. Cela permet de créer de nouvelles classes mais avec une
base existante.
class Voiture:
roues = 4
moteur = 1
def __init__(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
On a indiqué que VoitureSport a hérité de classe Voiture , elle recupère donc toutes ses
méthodes et ses attributs.
>>> ma_voiture=Voiture()
>>> ma_voiture.nom
'A déterminer'
>>> ma_voiture.roues
4
Instancions maintenant la classe VoitureSport :
>>> ma_voiture_sport=VoitureSport()
>>> ma_voiture_sport.nom
'Ferrari'
>>> ma_voiture_sport.roues
On remarque tout d'abord que l'attribut roues a bien été hérité. Ensuite on remarque que la
méthode __init__ a écrasé la méthode de la classe Voiture . On parle alors de surcharge de
méthode.
Comme nous l'avons vu plus haut si une classe hérite d'une autre classe, elle hérite les
méthodes de son parent .
Exemple:
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat:
La voiture démarre
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
def allumer(self):
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat:
La voiture de sport démarre
Enfin dernier point intéressant: il est possible d'appeler la méthode du parent puis de faire la
spécificité de la méthode. On peut d'ailleurs appeler n'importe quelle autre méthode.
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
def allumer(self):
class VoitureSport(Voiture):
def __init__(self):
self.nom = "Ferrari"
def allumer(self):
Voiture.allumer(self)
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Le résultat:
La voiture démarre
5.10 Conventions
Prenez l'habitude de nommer votre classe uniquement avec des caractères alphanumériques
et commençant par une majuscule. Et à l'inverse l'instance peut être nommée sans majuscule.
voiture_sport = VoitureSport()
6 Bibliographie
Ouvrages :
Martelli, Alex, Martelli Ravenscroft, Anna, Ascher, David, Python par l'exemple, O'Reilly, 2006.
Lutz, Mark et Bailly, Yves, Python précis et concis, O'Reilly, 2 édition, 2005.
Sites web :
www.python.org
pypi.python.org/pypi
code.google.com/p/pythonxy/wiki/Downloads
matplotlib.org