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}\)

math.sqrt(x)

exponentielle \(e^x\)

math.exp(x)

logarithme népérien \(\ln(x)\)

math.log(x)

cosinus \(\cos(a)\)

math.cos(a)

sinus \(\sin(a)\)

math.sin(a)

tangente \(\tan(a)\)

math.tan(a)

partie entière (inférieure) \(\lfloor x \rfloor\)

math.floor(x)

partie entière supérieure \(\lceil x \rceil\)

math.ceil(x)

pgcd de deux entiers \(n\) et \(m\)

math.gcd(n, m)

ppcm de deux entiers \(n\) et \(m\)

math.lcm(n, m)

factorielle \(n!\)

math.factorial(n)

coefficient binomial \(\binom{n}{k}\)

math.comb(n, k)

nombre \(\pi\)

math.pi

nombre \(e\)

math.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]\)

random.randint(a, b)

tirage aléatoire d’un élément d’une liste L

random.choice(L)

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()
../_images/2f8e1ee7414d0d4d38c59be3f61638f0d3ac08f62c98211c30da01636ef8e1e9.png

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()
../_images/036c95e7fd50350c5799ba40abddb975088bdf97af0c7532b4af38cbc729cb43.png

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()
../_images/a7942d48cd298fa69610acff577b1841860a28d0a1a8fc826e382d38a73beb8c.png

Épaisseur. Pour modifier l’épaisseur du trait, on utilise le paramètre linewidth :

plt.plot(annees, temperatures, linewidth=5)
plt.show()
../_images/a569402a0f604cfbe1909280f10d8058a4fec62521b21e1c2a5a039ea1b5fdce.png

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()
../_images/6cbdb7410edb9c5315cba2d2268390669e9aa833b0fd9009247a9cd9be41a44d.png

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()
../_images/da6633e1a5bb4962b894ce8dc89cf439b04450eb3ac2e456a1076af15a8a9333.png

Enfin, pour revenir à un style de trait continu :

plt.plot(annees, temperatures, linestyle='-')
plt.show()
../_images/2f8e1ee7414d0d4d38c59be3f61638f0d3ac08f62c98211c30da01636ef8e1e9.png

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()
../_images/1a918371d9ac0e4f3f37136854f9ea0e05085851b85e82bd38021ec6a0ee8acc.png

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()
../_images/4cef72babaed3554b1e189e00e94f74bc2e5aedbd8b675093bc0002a2be7f73f.png ../_images/a124f59d5a31ed20efeb42d08b3cf1467580989977d489148c84d32de441c947.png

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 :

  • title pour donner un titre au graphique (placé en haut par défaut)

  • xlabel et ylabel pour donner un nom aux axes

  • axis pour 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()
../_images/7bebf0a24a517fb5beeb1b8f1c31684670e6823d283a0d8b857f8b89ab22aae9.png

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()
../_images/7894807f28366cd383086221eaa78fc451de4d07bfaf2ebe56078e0c75127768.png