Séance 4#
Objectifs
Fonctions natives python
Bibliothèques python : math, random, matplotlib
Quelques fonctions natives de python#
Python pré-intègre un certain nombre de fonctions (built-in functions). Nous en avons déjà vu certaines : print(), len(), range() par exemple. Nous allons en découvrir quelques autres ; pour une liste plus complète, voir ici : https://www.w3schools.com/python/python_ref_functions.asp
La fonction valeur absolue est notée abs() :
x = -1
print(abs(x))
1
La fonction de calcul d’arrondi est round() :
x = 1.4
print(round(x))
1
On peut obtenir le minimum et le maximum de plusieurs valeurs, ou même d’une liste, avec les fonctions min() et max() :
print(min(1, 2))
print(max(-3, 0, 0, -1))
L = [ -3, 7, 2, 0, -9, 7, 1 ]
print("le minimum de L est :", min(L))
print("le maximum de L est :", max(L))
1
0
le minimum de L est : -9
le maximum de L est : 7
On peut trier une liste avec la fonction sorted(). Cette fonction ne modifie pas la liste passée en paramètre ; elle retourne une version triée de cette liste.
L = [ -3, 7, 2, 0, -9, 7, 1 ]
M = sorted(L)
print(L)
print(M)
[-3, 7, 2, 0, -9, 7, 1]
[-9, -3, 0, 1, 2, 7, 7]
Bibliothèque math#
En python, on peut importer d’autres fonctions et d’autres objets qui ont été écrits dans des bibliothèques. Par exemple, la bibliothèque math contient de nombreuses fonctions et constantes mathématiques.
Pour importer cette bibliothèque, on utilise la syntaxe suivante :
import math
Puis, pour utiliser un objet de cette bibiothèque (par exemple la constante pi) on va utiliser la syntaxe math.<objet> :
math.pi
3.141592653589793
Remarque : il n’est pas utile de faire l’import à chaque cellule. Une fois la fonction importée dans python/jupyter, elle est à votre disposition.
Passons maintenant en revue quelques fonctions et objets de la bibliothèque math.
Fonctions classiques#
La fonction racine carrée s’écrit sqrt() :
print(math.sqrt(9))
print(math.sqrt(2))
3.0
1.4142135623730951
Observons que, même si la racine carrée de \(9\) est entière, la valeur de retour de sqrt() n’est pas un entier, mais un nombre « approché » (appelé aussi flottant).
Les fonctions exponentielle et logarithme népérien sont exp() et log().
print(math.exp(2))
print(math.log(2))
7.38905609893065
0.6931471805599453
Le nombre \(e\) est également accessible :
print(math.e)
print(math.e == math.exp(1))
2.718281828459045
True
Les fonctions partie entière inférieure et partie entière supérieure sont floor() et ceil() :
x = 1.4
print(math.floor(x), math.ceil(x))
1 2
Trigonométrie#
La bibliothèque math contient aussi des objets et fonctions trigonométriques. Les fonctions cosinus, sinus et tangente sont cos(), sin et tan et leur argument doit être exprimé en radians.
theta = math.pi/3
print(math.cos(theta))
print(math.sin(theta))
print(math.tan(theta))
0.5000000000000001
0.8660254037844386
1.7320508075688767
Leurs fonctions réciproques sont acos(), asin() et atan(). Enfin, les fonctions hyperboliques sont cosh(), sinh(), tanh(), et leurs réciproques acosh(), asinh(), atanh().
Arithmétique#
Le pgcd et le ppcm d’une séquence d’entiers peuvent être calculés via les fonctions gcd et lcm. Elles peuvent prendre \(2\) arguments ou davatange.
print(math.gcd(21, 49))
print(math.gcd(21, 49, 76))
print(math.lcm(21, 49))
print(math.lcm(21, 49) * math.gcd(21, 49) == 21 * 49)
7
1
147
True
Observons que ces fonctions retournent des entiers, et non des flottants.
La factorielle et le coefficient binomial peuvent être obtenus via les fonctions factorial et comb.
print(math.factorial(6))
print(math.comb(5, 2))
print(math.comb(10, 7) == math.factorial(10) // (math.factorial(7) * math.factorial(3)))
720
10
True
Avertissement
Remarque pour les utilisateur·ices des machines de l’université. Les fonctions lcm, factorial ou comb ne sont disponibles qu’à partir de la version 3.8 de python (datant de 2019), qui sont accessible en salle de cours, mais pas au bocal.
Tableau récapitulatif (bibliothèque math)
Fonction ou objet mathématique |
Syntaxe python |
|---|---|
racine carrée \(\sqrt{x}\) |
|
exponentielle \(e^x\) |
|
logarithme népérien \(\ln(x)\) |
|
cosinus \(\cos(a)\) |
|
sinus \(\sin(a)\) |
|
tangente \(\tan(a)\) |
|
partie entière (inférieure) \(\lfloor x \rfloor\) |
|
partie entière supérieure \(\lceil x \rceil\) |
|
pgcd de deux entiers \(n\) et \(m\) |
|
ppcm de deux entiers \(n\) et \(m\) |
|
factorielle \(n!\) |
|
coefficient binomial \(\binom{n}{k}\) |
|
nombre \(\pi\) |
|
nombre \(e\) |
|
Bibliothèque random#
En informatique, il est souvent utile de savoir tirer aléatoirement des valeurs, dans un certain ensemble et selon une certaine distribution. Par exemple, pour tirer un entier dans un intervalle \([a, b]\) selon la distribution uniforme, on peut utiliser la fonction randint de la bibliothèque random.
import random
n = random.randint(0, 1000)
print(n)
859
Par exemple, pour engendrer une liste de \(10\) entiers aléatoires entre \(-2\) et \(2\) :
L = [ random.randint(-2, 2) for i in range(10) ]
print(L)
[-1, -2, 0, 0, 2, -2, 2, -1, 1, 2]
Pour tirer un élément aléatoire dans une liste L, on peut tirer aléatoirement un indice \(i\) de la liste (avec randint), puis accéder à L[i]. Une autre manière est d’utiliser la fonction appropriée choice :
jours = [ "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche" ]
i = random.randint(0, len(jours)-1)
print(jours[i])
j = random.choice(jours)
print(j)
mercredi
dimanche
Tableau récapitulatif (bibliothèque random)
Fonction |
Syntaxe python |
|---|---|
tirage aléatoire uniforme d’un entier dans \([a, b]\) |
|
tirage aléatoire d’un élément d’une liste |
|
Bibliothèque matplotlib#
Python permet aussi de tracer des graphiques grâce à sa biblitothèque matplotlib. Cette bibliothèque contient de nombreux modules (regroupement de fonctions et d’objets à l’intérieur d’une bibliothèque), notamment le module pyplot qui nous sera utile.
Note
Nous verrons que Sagemath simplifie grandement la manière de tracer des fonctions et d’afficher graphiquement des objets. Néanmoins, si vous utilisez plus tard python sans Sagemath, il vous sera utile de connaître la bibliothèque matplotlib.
Il est d’usage d’importer le module pyplot avec la syntaxe suivante :
import matplotlib.pyplot as plt
Cette instruction crée un alias plt vers le module pyplot, qui nous donne accès à différentes fonctions de création et de manipulation de graphiques. Voyons des exemples simples d’utilisation ; pour plus de détails et d’exemples, suivre le lien https://matplotlib.org/stable/index.html . Également, un autre tutoriel plus complet : https://matplotlib.org/stable/tutorials/pyplot.html#sphx-glr-tutorials-pyplot-py
Avertissement
Remarque pour les utilisateur·ices des machines de l’université. Il est possible qu’une mise à jour récente de la bibliothèque numpy sur les machines de l’université provoque des erreurs d’exécution, notamment lors de l’import de la bibliothèque matplotlib. Pour régler ce problème, vous devez faire un « downgrade » (une « anti »-mise à jour) de cette bibliothèque. La procédure est la suivante : entrez dans le terminal la commande
pip install numpy==1.22.0
Cette procédure va donc désinstaller la version de numpy actuellement installée sur vos machines, et la remplacer par une plus ancienne. Pour ré-installer la plus récente, si besoin par exemple dans un autre cours, faites :
pip install numpy==2.0.0
Les fonctions plot et show de matplotlib.pyplot#
Les fonctions plot et show permettent de construire et d’afficher des données relatives à des points dans le plan. Plus précisément, si X = [x1, x2, ..., xn] et Y = [y1, y2, ..., yn] sont les listes des abscisses et des ordonnées des points à tracer, alors on peut exécuter l’instruction
plt.plot(X, Y)
pour placer ces points sur un graphique. Ensuite, pour afficher le graphique on utilise la fonction show :
plt.show()
Voici un exemple avec des données de températures annuelles en France entre 2011 et 2021 :
import matplotlib.pyplot as plt
annees = [i for i in range(2011, 2022) ]
temperatures = [13.6, 12.8, 12.4, 13.8, 13.6, 13.1, 13.4, 13.9, 13.7, 14.1, 12.9]
plt.plot(annees, temperatures)
plt.show()
Style#
Si le style d’affichage ne nous convient pas, on peut le changer avec certaines instructions. Quelques exemples.
Style des points. Pour changer le style des points à afficher, on peut utiliser le paramètre optionnel marker. Par exemple, pour avoir des points sous forme de petits cercles, on écrit :
plt.plot(annees, temperatures, marker='o')
plt.show()
Couleur. La couleur peut être choisie avec le paramètre optionnel color. Par exemple, pour obtenir un tracé rouge avec des points symbolisés par des petites croix, on écrira :
plt.plot(annees, temperatures, marker='+', color='red')
plt.show()
Épaisseur. Pour modifier l’épaisseur du trait, on utilise le paramètre linewidth :
plt.plot(annees, temperatures, linewidth=5)
plt.show()
Style de trait. Pour modifier le style du trait, c’est le paramètre linestyle. Par exemple pour avoir des tirets :
plt.plot(annees, temperatures, linestyle='dashed')
plt.show()
Pour n’afficher que des points (sans les relier avec une ligne), on donne la chaîne vide '' comme valeur à l’argument linestyle :
plt.plot(annees, temperatures, marker='+', linestyle='')
plt.show()
Enfin, pour revenir à un style de trait continu :
plt.plot(annees, temperatures, linestyle='-')
plt.show()
Allez voir https://matplotlib.org/3.5.3/api/_as_gen/matplotlib.pyplot.plot.html pour davantage de détails.
Superposition#
On peut également superposer des graphiques. Pour cela, l’idée est d’appeler successivement plot avec différentes données, puis de demander l’affichage avec show. Par exemple, si l’on souhaite afficher les températures annuelles à Paris et à Marseille sur un même graphique :
annees = [i for i in range(2010, 2022) ]
temperatures_paris = [11.8, 13.7, 12.7, 12.1, 13.6, 13.4, 12.9, 13.4, 13.8, 13.6, 14.3, 12.8]
temperatures_marseille = [14.8, 16.2, 15.8, 15.2, 16.8, 16.3, 16.4, 16.2, 17, 16.4, 16.5, 15.9]
plt.plot(annees, temperatures_paris, color='blue')
plt.plot(annees, temperatures_marseille, color='red')
plt.show()
Remarquons que si nous avions appelé la fonction show entre les deux appels à plot, nous aurions eu deux graphiques indépendants :
plt.plot(annees, temperatures_paris, color='blue')
plt.show()
plt.plot(annees, temperatures_marseille, color='red')
plt.show()
plt.show()
Ajouter des informations#
Enfin, il peut être utilise d’ajouter une légende ou des informations sur vos graphiques. C’est notamment le cas si vous souhaitez les utiliser pour des rapports ou des mémoires. Pour cela, listons quelques fonctions :
titlepour donner un titre au graphique (placé en haut par défaut)xlabeletylabelpour donner un nom aux axesaxispour définir les valeurs minimales et maximales pour l’affichage des axes x et y (par exemple, si l’on fournit[0, 10, -2, 2]en paramètre àaxis, cela signifie que l’on souhaite que l’axe des x commence à \(0\) et termine à \(10\), et que l’axe des y commence à \(-2\) et termine à \(2\))
annees = [i for i in range(2010, 2022) ]
temperatures_paris = [11.8, 13.7, 12.7, 12.1, 13.6, 13.4, 12.9, 13.4, 13.8, 13.6, 14.3, 12.8]
temperatures_marseille = [14.8, 16.2, 15.8, 15.2, 16.8, 16.3, 16.4, 16.2, 17, 16.4, 16.5, 15.9]
plt.plot(annees, temperatures_paris, color='blue')
plt.plot(annees, temperatures_marseille, color='red')
plt.xlabel('Année')
plt.ylabel('Température (°C)')
plt.title('Température annuelle moyenne à Paris et à Marseille, entre 2010 et 2021')
plt.axis([2009, 2022, 8, 20])
plt.show()
Tracer une fonction#
Pour tracer une fonction « usuelle » \(f : [a, b] \to \mathbb{R}\) avec matplotlib.pyplot, une idée est de calculer les valeurs de \(f(x)\) pour \(x\) parcourant \([a, b]\) avec un petit pas.
Par exemple, si on souhaite tracer la fonction \(f : x \mapsto x^2\) entre \(-2\) et \(2\), on va diviser l’intevalle en pas de \(0.01\), puis calculer les \(f(x)\) pour les valeurs \(x = -2\), \(x=-1.99\), \(x=-1.98\), …, \(x=1.99\), \(x=2\).
a, b = [-2, 2]
X = [a + 0.01 * i for i in range(401)]
Y = [x**2 for x in X]
plt.plot(X, Y)
plt.show()