Python L1, TD/TP 04.02

Révisez les exercices de la semaine dernière. Tout dedans doit être connu, en particulier la construction des fonctions récursives.


Attention, en accord avec le calendrier de F.L., le dernier exercice en TP aujourd'hui est obligatoire, et sera à rendre par mail à mon adresse, et évalué.
Votre sujet n'est pas encore accessible, il sera dévoilé 15 minutes avant la fin des TP. (Soit en bas de cette page, ou sur une autre).


Exercices

Exercice 1.

... En particulier...


Autres programmes...

Exercice 2.

Manipulation des "données temporelles" composites. Qu'un tuple $(h,m,s)$, par ex. (3,30,51), avec les éléments entiers, représente un intervalle temporel, ou un moment dans le temps : heures, minutes, secondes, à partir d'un moment conventionnel (0,0,0).
Écrire une fonction qui normalise cette donnée : l'heure peut un nombre quelconque, mais les minutes et les secondes sont obligatoirement restreints à l'intervalle $0 : 59$. On peut "emprunter" une (ou plus !) minute si les secondes sont négatives, ou ajouter des minutes si elles dépassent 60. La même chose concerne minutes/heures. Le temps : (2,-72,222) devra être normalisé à (0,51,42).

Écrire deux fonctions, une qui ajoute, l'autre qui soustrait deux données de ce type.


Exercice 3.

Construire une fonction qui prend un triple "temps" (h,m,s), et qui affiche l'horloge, comme à gauche. Utilisez Matplotlib, à travers l'interface standard :
from pylab import * .
Cette librairie, distribuée avec tout Python "scientifique", et disponible dans nos salles de TP, est un dispositif graphique universel, infiniment plus commode que tkinter. Tout d'abord, vous disposez d'un espace cartésien dont les coordonnées vous définissez vous-mêmes, pas besoin de penser aux "pixels", à la taille physique de vos fenêtres, etc. Par exemple, vous définissez
ax = axes(aspect=1); axis([0,1,0,1])
et vous aurez un espace cartésien vide, un carré (régulier, l'aspect : le rapport entre la hauteur et la largeur, gère cela), entre 0 et 1. Si vous préférez avoir l'espace centré au milieu, pourquoi pas : axis([-1,1,-1,1]), ou toute autre spécification axis([xmin,xmax,ymin,ymax]).

Le procédé d'affichage se décompose en deux étapes. La première est la construction de vos données d'affichage, par ex. un cercle de rayon R, centré sur le point (x,y) dans vos coordonnées "virtuelles", à vous. Je répète, ne pensez pas aux coordonnées pixel ! Ou, une ligne entre $(x_0,y_0) \to (x_1,y_1)$. Vous faites les calculs appropriés, et vous construisez les objets graphiques :

cir1 = Circle((x,y), radius=R, fc='None',ec='b',lw=8)
lin1 = Line2D([x0,x1],[y0,y1],color='k',lw=4)
Ici lw ou linewidth est la largeur de la ligne. Attention, cette largeur est en pixels ! Ceci est une des rares occasions de voir dans Matplotlib des dimensions pixel, "rigides". Presque tout le reste est "virtuel", conventionnel.
fc est "face colour", ec : "edge colour". (Parfois il y a un peu de confusion entre les attributs fc et color... Vous n'échapperez pas à la nécessité de lire la doc de temps en temps). Les codes couleurs pour bleu, rouge, jaune, vert et noir, sont : b,r,y,g,k (blacK), comme les noms en anglais. Sinon, on peut utiliser les codes numériques, lisez la doc. Notez que les paramètres de la ligne ne soint pas "point0" et "point1", mais d'abord tous les x, ensuite tous les y. [[Depuis 6 ans, toujours au moins un étudiant en L1 ou L2 dans mon groupe se trompe, et ne peut trouver l'erreur...]]

Ces objets graphiques sont des structures de données invisibles, qui peuvent être transformées, dupliquées, etc. La seconde étape du processus est leur affichage. Vous ajoutez ces objets aux "axes", à votre système géométrique courant.
ax.add_patch(cir1)
ax.add_line(lin1)

et en principe c'est tout. Si vous utilisez une console standard, un terminal, ou Idle, il faut encore exécuter show() afin de visualiser la fenêtre. Pour que le programme fasse quelque chose d'autre, il faut fermer la fenêtre graphique, ce qui arrête la commande show(). Si vous utilisez IPython, ou Spyder, avec la console IPython, cette dernière commande est inutile, l'affichage se fait interactivement.

On peut créer une ligne (ou autre chose) et changer ses propriétés plus tard, par ex. lin1.set_color('b'); lin1.set_lw(10).

Exercice supplémentaire. Si vous voulez, vous pourrez afficher sur le cadran les 12 "tics", ou les chiffres ; dans ce cas, utiliser ax.text(...), voir la doc. ... et un exercice futur : animer votre horloge. Pour l'instant vous ne savez pas comment, mais si le temps nous permet, on en parlera. Ceci n'est pas difficile.


Nombres pseudo-aléatoires

Tirage aléatoire, histogrammation. Vous avez appris en cours qu'après le chargement du module random : from random import * vous disposez de la fonction random() qui retourne un nombre pseudo-aléatoire réel entre 0 et 1 (1 exclu). Aussi, plusieurs autres, par ex. randint(n1,n2), qui retourne un nombre aléatoire entier entre n1 et n2 inclus. (Vous verrez encore d'autres, comme seed, choice, randrange, sample, gauss, etc.)

Nombres aléatoires engendrés par l'ordinateur sont très utiles pour la modélisation statistique, pour la génération des données - tests, pour la simulation des systèmes dynamiques (la Nature EST assez aléatoire, non?...). Vous avez l'intérêt à maîtriser ce domaine.

Exercice 4.

La moyenne $\langle r \rangle$ d'une distribution aléatoire (probabiliste) de la variable $r$, peut être estimée par la somme d'un grand nombre $N$ d'échantillons (par ex. 10000), divisée par $N$.

Exercice 5.

Construisez l'histogramme : le graphique de la statistique de nombre d'occurrences (ou de la fréquence) de la distribution aléatoire engendrée par random(). On engendre un grand nombre d'échantillons, et vérifie combien de valeurs tombe dans un sous-intervalle spécifié.


Listes

Vous avez déja eu un peu d'expérience avec les séquences modifiables – listes en Python. On travaillera dessus en permanence, ce sont des structures auxiliaires utiles partout (comme les tuples, sauf que l'on peut les modifier).

Exercice 6.


Exercice à rendre : attendez le sujet...


Semaine dernière
Semaine suivante
Retour à l'index