• Aucun résultat trouvé

Exemple d’affichage d’une page Web

Dans le document TP Python (Page 56-64)

Le travail à faire est simplement d’initialiser une chaîne Unicode, html = u""

de lui concaténer tout ce que l’on veut afficher dans la page (examiner la documentation ci-tée plus haut), et de la passer en premier paramètre à la fonction d’affichage (affichage_web).

FIG. 5.5 – Exemple d’affichage d’une page Web.

C

Q

F

R

+ savoir gérer les fichiers textuels ; + savoir gérer les exceptions ;

+ avoir assimilé la notion de programme piloté par des événe-ments.

F

BC v1.3 - 47 - 2007 - 2008

NOTION d’IHM & FICHIERS TP no5

C

Q

F

P

H le passage des arguments des fonctions ;

H comprendre l’algorithme de la droite des moindres carrées.

Chapitre 6

Les fonctions (suite)

(. . . ) la méthode est bonne.

C’est brutal, c’est maussade, mais c’est simple comme bonjour, inratable.

Georges DUHAMEL(Chronique des Pasquier)

Objectifs :

– approfondir le passage des arguments : – Documenter les fonctions et les modules.

Fichier(s) à produire :TP6_1.py

6.1 Manip

6.1.1 Approfondir le passage des arguments

Jusqu’à maintenant, nos fonctions était définies avec un nombre fixe (éventuellement zéro) d’arguments que nous étions obligés de tous utiliser, dans l’ordre, à l’appel. Dans la défini-tion d’une foncdéfini-tion, il est possible (et souvent souhaitable) de préciser unevaleur par défaut pour certains paramètres. On obtient ainsi une fonction qui peut être appelée avec une par-tie seulement des arguments attendus.

Essayez et commentez l’exemple suivant :

def init_port(vitesse=9600, parite="paire", nb_bits=8, nb_stop=1):

print "Initialisation à", vitesse, "bits/s"

print " Parité :", parite

print " ", nb_bits, "bits de données"

print " ", nb_stop, "bits d'arrêt"

init_port()

init_port(parite="nulle", vitesse=28800) init_port(2400, "impaire", 7, 2)

LES FONCTIONS (suite) TP no6

Il est aussi possible, et souvent très utile, d’utiliser un nombre d’arguments arbitraire. C’est la forme*argument. Commentez, par exemple, le code suivant :

def somme(*nombres):

6.1.2 Documenter les fonctions et les modules

On l’a déjà dit, documenter ses scripts est important. Mais Python offre beaucoup plus1. Par exemple :

def ras():

"""Cette fonction est bien documentée mais ne fait presque rien.

"""

print "rien à signaler"

if __name__ == '__main__':

help(ras) ras()

À faire :un modulemodule_m.pysur ce modèle, comprenant : – deux fonctions avec leur documentation,y1=3x+1 ety2=27x; – et dans le test du__main__, pour chaque fonction :

– un affichage de la documentation ;

– un appel àverif()2pour tester une valeur significative.

Attention



Donc, dorénavant, vous êtes priés d’ajouter :

– une documentation intégrée3à toutes les fonctions que vous écrirez ; – un « auto-test »4à tous vos modules.

1Batteries included !

2cf. page 33

3appelée « docstring » en patois. . .

4if __name__ == '__main__'

TP no6 LES FONCTIONS (suite)

6.2 Programmation

6.2.1 Programme TP6_1.py : droite de régression

Introduction

On rappelle que si un nuage de points donné a une formeallongéeil existe différentes mé-thodes pour créer l’équation d’une droite représentantau mieuxce nuage. En fait, suivant la méthode, on obtient des droites différentes, à moins que les points ne soient parfaitement alignés, auquel cas toutes les méthodes se valent et donnent toutes l’équation de la droite sur laquelle sont les points du nuage.

On va envisager ici la méthode desmoindres carrés.

Cette méthode consiste à calculer la somme des carrés des écarts entre les points du nuage et les points d’une droiteestiméeet à choisir comme meilleure droite celle pour laquelle la somme des carrés des écarts est minimum.

Il reste alors à choisir la façon de calculer lesécartset il y a deux choix possibles classiques : – soit pour chaque point du nuage on utilise la différence entre l’ordonnée de ce point et

celle du point de la droite qui aurait la même abscisse ;

– soit pour chaque point du nuage on utilise la différence entre l’abscisse de ce point et celle du point de la droite qui aurait la même ordonnée.

En utilisant la première méthode, on obtient la droite de régression de y en x, et en utilisant la deuxième la droite de régression de x en y.

Remarque

+

Le programme à créer doit permettre à l’utilisateur de trouver par approximations suc-cessives quelle est lameilleuredroite de régression de y en x pour un nuage de points choisi de façon aléatoire.

Droite de régression de y en x

Il est tout d’abord nécessaire destructurerles données manipulées en utilisant au mieux les ressources de notre langage.

Unedroitepeut être représentée par deux informations : a son coefficient directeur ;

b son terme constant

Un tuple Python, contenant les deux réels dans cet ordre fera l’affaire. Par exemple la droite y=7x2 est représentée par le tuple :(7.0, -2.0).

De même, unpointest un tuple ordonnée de ses deux coordonnées, abscisse et ordonnée.

Enfin unnuagesera représenté par une liste de points, c’est-à-dire une liste de tuples.

Notations utilisées

Nous allons manipuler trois objets :

BC v1.3 - 51 - 2007 - 2008

LES FONCTIONS (suite) TP no6

choix la droite que vous allez choisir dans le programme principal (aussi proche que pos-sible de la « meilleure » droite), enregistrée dans le fichierchoix.dat;

mc la droite des moindres carrées, que vous allez calculer, enregistrée dans le fichiermc.dat; nuage un nuage de points enregistré dans le fichiernuage.dat.

Conception du module de fonctions

Il faut maintenantconcevoir un module contenant les différentes fonctions utiles au pro-gramme1:

creeNuage(): fonction qui reçoit un nombre de points et qui renvoie unnuage. Son rôle est de générernbPtspoints aléatoires (dans certaines limites. . . ) et de les stocker dans le fichier textuelnuage.datdans votre répertoire de travail. Elle vous est fournie ci-dessous2;

ecartOrdo(): fonction qui reçoit un nuage et ladroite choisie. Cette fonction renvoie un float: la somme des carrés des écarts entre les ordonnées des points du nuage et des points de la droite choisie ;

pointMoyen(): fonction qui reçoit unnuage. Elle renvoie unpointqui représente l’abscisse moyenne et l’ordonnée moyenne du nuage ;

variance() fonction qui reçoit unnuageet le point moyen du nuage et qui renvoie le tuple (v arx,v ary) ;

coVariance(): fonction qui reçoit un nuage et le point moyen du nuage et qui renvoie covx y;

ecritDroites(): fonction qui reçoit unnuageet le point moyen du nuage, la covariance, la variance enxet ladroitechoisie. Elle ne renvoie rien mais écrit dans le fichier textuel mc.datlesnbPtspoints de la droite calculée (la droite des moindres carrées) et dans choix.datlesnbPtspoints de la droite choisie.

def creeNuage(nbPts):

"""Création et stockage d'un nuage de <nbPts> points aléatoires.

"""

seed() # initialise le générateur de nombres aléatoires

print "(le nuage est choisi par l'ordinateur et est stocké dans 'nuage.dat')"

f = open("nuage.dat", "w")

a, b = uniform(-2.01, 2.01), uniform(-25.01, 25.01) n = [] # initialise la liste des points du nuage for i in xrange(nbPts):

x = i + uniform(-0.1, 0.1) y = a*x + b + uniform(-2.0, 2.0)

n.append((x, y)) # on ajoute un nouveau tuple à n[]

f.write("%.3f %.3f\n" % (x, y)) f.close()

return n # le nuage

1Voir le rappel de statistique page 54.

2Cette fonction utilisexrange, identique àrangemais plus rapide dans unfor.

TP no6 LES FONCTIONS (suite)

Méthode de développement du moduleTP6_1_m.py

Écrire votre module en respectant la méthodologie suivante : 1. écrirecreeNuage;

2. dans le test du module :

– choisir le nombre de points du nuage – appeler la fonctioncreeNuage

– afficher le nuage à l’aide de la fonctionplot_Fic

3. toujours dans le test, choisir une droite de test (par exemple la droite y =2x+1 et un « petit nuage » de test à 3 points (par exemple(1.0, 3.0),(2.0, 5.0)et(3.0, 7.0)) ;

4. pour chaque fonction : – coder la fonction

– la tester numériquement à l’aide deverifen utilisant le nuage et la droite de test 5. enfin écrire le programme principal détaillé ci-dessous.

Le programme principal

Voici quelques indications pour écrire le programme principal (fichierTP6_1.py) :

depuis le moduleeasyguiB, importezintegerbox,floatbox,boolboxetmsgbox;

importeztoutle moduleTP6_1_m.py;

depuis le moduleplot_m, importezplot_Fic1;

enfin importez la fonctionsqrt()depuis le modulemath;

saisissez le nombre de points du nuage (integerbox, entre 10 et 100) ;

appelez la fonctioncreeNuage();

affichez le nuage grâce à l’appel :plot_Fic("'nuage.dat' w p");

vous devez maintenant choisir les paramètres de votre droitechoix. Vous pouvez pour cela utiliser la fonctionchoix_ab()qui vous est fournie ci-dessous ;

calculez le point moyen, les variances et la covariance ;

enregistrez les deux droites,mcetchoix, par un appel àecritDroites();

enfin affichez (dans unemsgbox) l’équation de la droite des moindres carrées ainsi que l’équation de votre droite et son coefficient de corrélation.

Pour visualisez vos choix, faites un dernier appel :

plot_Fic("'mc.dat' w l, 'choix.dat' w l, 'nuage.dat' w p")

F

1Utilisez le module de la page 32.

BC v1.3 - 53 - 2007 - 2008

LES FONCTIONS (suite) TP no6

a = floatbox("Coefficient directeur :", title, a, -2.0, 2.0) b = floatbox("Terme constant :", title, b, -25.0, 25.0) d = (a, b)

nouveau = ecartOrdo(nuage, nbPts, d)

msg = "Somme des écarts à l'ordonnée : %.2f" % nouveau if ancien > 0.0:

msg += "\n(avant : %.2f)" % (ancien) msg += "\n\n\tOn change de droite ?"

ancien = nouveau

fini = boolbox(msg, "", ["Oui", "Non"]) return d

Rappels de statistique :

Pour un ensemble de pointsMi(xi,yi) où i varie de 0 à (N1), on appelle point moyenle point de coordonnées :

x=

On appelle varianced’une suite de réels xi (respectivement yi), où i varie de 0 à N−1, les réels :

Équation de la droite des moindres carrées : ˆ

y=covx y

v arx x+(y−xcovx y v arx )

Lecoefficient de corrélationest enfin le réel :

corx y= vu

ut cov2x y v arxv ary

TP no6 LES FONCTIONS (suite)

Dans le document TP Python (Page 56-64)

Documents relatifs