• Aucun résultat trouvé

TP Python

N/A
N/A
Protected

Academic year: 2022

Partager "TP Python"

Copied!
79
0
0

Texte intégral

(1)

TP Python

MESURES PHYSIQUES

(2)

Informatique :

Rencontre de la logique formelle et du fer à souder.

Maurice N

IVAT

B o b

(3)
(4)

Avant-propos

Il ne faut pas se fier aux apparences sinon on n’aurait jamais mangé d’oursin. . . Anonyme

Structure des TP

Les TP qui accompagnent le cours d’« informatique scientifique en Python » se composent de huit séances de 4h (la 9eest consacrée au partiel). Ils sont tous organisés de la même façon : Manip : expérimentation du thème de la séance ;

Programmation : écriture de scripts.

En-tête du TP

Chaque TP définit desobjectifs, c’est-à-dire des points particuliers à étudier dans la séance.

L’en-tête définit également les fichiers à produire. Leurs noms sont normalisés afin d’être aisément reconnus : ils sont ainsi plus faciles à stocker, à consulter et. . . à corriger !

Texte du TP

Minutieusement écrit et typographié, il est à lire attentivement ! Le texte précise les notions à comprendre et expérimenter, les algorithmes à mettre en jeu et les sources à développer.

On y trouve aussi des copies d’écran illustrant les sorties des programmes, des notes de bas de pages, des encarts, des rappels mathémathiques. . .

Résumés du TP

Enfin deux doubles encadrés, bien visibles avec les sigles

C

Q

F

R (Ce Qu’il Faut Retenir !) et

C

Q

F

P (Ce Qu’il Faut Préparer !), résument les connaissances expérimentées au cours du TP et préparent les acquis indispensables pour aborder la séance suivante.

(5)

Comment faire son compte-rendu de TP ?

Chaque binôme doit rendre en fin de séance un compte-rendu de TP.

Où mettre vos fichiers ?

À chaque séance :

– créez, dansMes Documents, un répertoire nommé :TPn-XX-YY, oùnest le numéro du TP en cours etXX-YYsont les initiales de votre binôme ;

– enregistrez dans ce répertoire votre « manip » et vos scripts (voir détails ci-dessous) ; – en fin de manip, après avoir imprimé et sauvé votre répertoire, effacez-le ;

– enfin, videz la corbeille.

Le compte-rendu de la partie « Manip »

Ouvrez deux fenêtres : l’EDIPyScripteret l’éditeurWordPad. Enregistrez votre fichierWord- Padsous le nomTPn_manip.rtfdans votre répertoire de travail. Ajouter en début de votre compte-rendu une partie d’identification (nom, prénom et groupe du binôme et date). Copier- coller périodiquement votre travail et mettez en forme le texte : quelques lignes vides de pré- sentation, les titres de chapitre du poly pour structurer votre travail, effacer vos erreurs ou vos tâtonnements etc.

Attention



Ne pas oublier le plus important :ajoutez des commentaires, vous serez notés sur leur pertinence. . .

FIG. 1 – Modèle de compte-rendu de manip

Le compte-rendu de la partie « Programme »

Il est constitué par les impressions de vos scripts.

(6)

Table des matières

Avant-propos III

1 La calculatrice Python 1

1.1 Manip . . . 1

1.1.1 Interpréteur sous DOS . . . 1

1.1.2 Interpréteur sous Windows . . . 2

1.1.3 Notions de données, de variables et d’affectation . . . 4

1.1.4 Les chaînes de caractères . . . 5

1.1.5 Notions sur les séquences . . . 7

1.2 Programmation . . . 8

1.2.1 ProgrammeTP1_1.py . . . 9

1.2.2 ProgrammeTP1_2.py . . . 9

1.2.3 ProgrammeTP1_3.py . . . 10

1.2.4 ProgrammeTP1_4.py . . . 10

2 Les structures de contrôle 11 2.1 Manip . . . 11

2.1.1 Notions sur les dictionnaires . . . 11

2.1.2 Le type complexe . . . 12

2.1.3 Le type booléen . . . 12

2.1.4 Retour sur l’affectation . . . 13

2.1.5 Les modules d’extension . . . 14

2.1.6 Les structures de contrôle . . . 14

2.2 Programmation . . . 16

2.2.1 ProgrammeTP2_1.py . . . 16

2.2.2 ProgrammeTP2_2.py . . . 17

2.2.3 ProgrammeTP2_3.py . . . 17

2.2.4 ProgrammeTP2_4.py . . . 18

3 Les fonctions 21 3.1 Manip . . . 21

3.1.1 Les méthodes et fonctions prédéfinies . . . 21

3.1.2 Définition des fonctions . . . 23

3.2 Programmation . . . 24

3.2.1 ProgrammeTP3_1.py . . . 24

V

(7)

TABLE DES MATIÈRES TABLE DES MATIÈRES

3.2.2 ProgrammeTP3_2.py . . . 25

3.2.3 ProgrammeTP3_3.py . . . 25

4 Mise au point et modules 29 4.1 Manip . . . 29

4.1.1 La portée des variables, les espaces de nom . . . 29

4.1.2 Les modules . . . 30

4.1.3 Apprendre àdéboguer . . . 33

4.2 Programmation . . . 34

4.2.1 ProgrammeTP4_1.py . . . 34

4.2.2 ProgrammeTP4_2.py . . . 34

4.2.3 ProgrammeTP4_3.py . . . 36

5 Notions d’IHM et fichiers 39 5.1 Manip . . . 39

5.1.1 Les fichiers textuels . . . 39

5.1.2 Gestion des exceptions . . . 41

5.1.3 Notion d’IHM avec Tkinter . . . 42

5.2 Programmation . . . 45

5.2.1 ProgrammeTP5_1.py . . . 45

5.2.2 ProgrammeTP5_2.py . . . 46

5.2.3 ProgrammeTP5_3.py . . . 46

6 Les fonctions (suite) 49 6.1 Manip . . . 49

6.1.1 Approfondir le passage des arguments . . . 49

6.1.2 Documenter les fonctions et les modules . . . 50

6.2 Programmation . . . 51

6.2.1 ProgrammeTP6_1.py: droite de régression . . . 51

7 Introduction à la POO 57 7.1 Manip . . . 57

7.1.1 Expérimenter les classes . . . 57

7.1.2 Un module de classes . . . 59

7.2 Programmation . . . 59

7.2.1 ModuleTP7_1_m.py . . . 59

7.2.2 ModuleTP7_2_m.py . . . 59

8 La POO graphique 63 8.1 Programmation . . . 63

8.1.1 Définition de la classeWave: moduleTP8_1_m.py . . . 63

8.1.2 Ajout d’une méthode d’addition de deux ondes . . . 64

8.1.3 Ajout d’une méthode graphique . . . 64

8.1.4 Ajout d’opérateurs . . . 66

8.1.5 Ajout d’une représentation . . . 67

8.1.6 ProgrammeTP8_1.py . . . 67

(8)

TABLE DES MATIÈRES TABLE DES MATIÈRES

Bibliographie 69

Colophon 70

BC v1.3 -VII- 2007 - 2008

(9)

Table des figures

1 Modèle de compte-rendu de manip . . . IV

1.1 Python sous DOS . . . 2

1.2 PyScripter . . . 3

1.3 Le bloc d’en-tête . . . 8

1.4 Exemple d’affichage . . . 9

2.1 Notion de référence : affectation de différents types . . . 13

2.2 Un octogone tracé « à la tortue » ! . . . 17

2.3 Nombre de façons de faire une saisie avec deux dés . . . 17

2.4 Interface de saisie d’un entier . . . 17

3.1 Empilage/dépilage de 4! . . . 26

4.1 Suite de Syracuse : exemple d’affichage des résultats . . . 34

4.2 Méthode desrectangles . . . 35

4.3 Approximation dee par dichotomie . . . 37

5.1 Le fichier à obtenir . . . 41

5.2 Organisation générale d’un programme . . . 44

5.3 La « calculette minimaliste » . . . 44

5.4 Un compteur de clics . . . 46

5.5 Exemple d’affichage d’une page Web. . . 47

6.1 Exemple de résultat . . . 55

7.1 Tests du module de la classeFraction . . . 60

8.1 Essai de la méthodeplot() . . . 65

8.2 Tests de la classeWave . . . 67

8.3 Exemple de fichierwaves.datet synthèse du créneau correspondant . . . 68

(10)

Chapitre 1

La calculatrice Python

Le plus long des voyages commence par le premier pas.

Lao-Tseu

Objectifs :

– utilisation des « Environnements de Développement Intégré » ; – utilisation des nombres, chaînes de caractères et des séquences ; – utilisation des variables et de l’affectation.

Fichier(s) à produire :TP1_1.py TP1_2.py TP1_3.py TP1_4.py

1.1 Manip

Python est uninterpréteuret on peut l’utiliser facilement pour expérimenter le langage.

Attention



Conventions de nommage : Pour stocker leurs programmes, tous les étudiants utilisent le même répertoire, ce qui impose des contraintes. On demande donc que vos fichiers aient des noms normalisés : «TPn_s.py», oùnentre 1 et 9, est le numéro de la séance, suivi d’un souligné puis des, numéro du script du TP en cours. Le premier script de ce TP doit donc s’appeler :TP1_1.py, le deuxièmeTP1_2.py, etc.

1.1.1 Interpréteur sous DOS

Ouvrir une fenêtre de commande DOS et tapez :pythonpuis<Entrée>. L’interpréteur af- fiche un message puis une invite (on dit aussi un « prompt ») :>>>. Il attend qu’on lui sou- mette des commandes comme sur la figure 1.1. Remarquez que les commentaires sont in- troduits par le caractère#et s’étendent jusqu’à la fin de la ligne.

(11)

EDI & CALCULATRICE PYTHON TP no1

FIG. 1.1 – Python sous DOS

Pour sortir de l’interpréteur, tapez ^Z, c’est-à-dire Ctrl+Z, puis <Entrée>. Fermez cette fenêtre de commande.

1.1.2 Interpréteur sous Windows

L’environnement Python offre un bien meilleur EDI (Environnement de Développement In- tégré) :PyScripter (voir figure 1.2). Pour la partie « Manip », nous utiliserons la fenêtre infé- rieure dePyScripter, celle qui s’intitule «Python Interpreter»

Remarque

+

Dans cette première séance, nous allons surtout utiliser Python comme unecalculatrice.

Les nombres entiers

– Utilisez les quatre opérations de base (’+’, ’-’, ’*’, ’/’) sur des entiers relatifs ; – utilisez la variable prédéfinie ’_’ pour rappeler le dernier résultat ;

– bien remarquer le résultat de, par exemple :

>>> 20 / 3

Qu’en concluez-vous ?

– la hiérarchie des opérateurs. Essayez :

>>> 7 + 3 * 4

>>> (7 + 3) * 4 Concluez.

Attention



Les erreurs sont immédiatement indiquées par l’interpréteur.

Essayez :

>>> 18 @ 3

>>> 15 / 0

(12)

TP no1 EDI & CALCULATRICE PYTHON

FIG. 1.2 – PyScripter

Les entierslong

Les entiers que vous avez utilisés précédemment ne pouvaient pas prendre des valeurs (ab- solues) trop grandes. Au delà d’une certaine limite (en fait 4 octets), python utilise automa- tiquement un autre type d’entier, ditlong, et suffixéL.

Essayez :

>>> 1 * 1000 Puis plusieurs fois :

>>> _ * 1000

Que constatez-vous ?

Si vousvoulezutiliser des entierslong, indiquez-les explicitement :

>>> 3 * 72L

BC v1.3 - 3 - 2007 - 2008

(13)

EDI & CALCULATRICE PYTHON TP no1

Les flottants

Ils sont indiqués par un point décimal « . » ou une notation exponentielle :

>>> 2.718

>>> 3e8

Les opérateurs arithmétiques sont les mêmes que ceux déjà vus, mais notez :

>>> 20.0 / 3

Comparez avec la division entière.

Autres opérateurs

Expérimentez : que font ces opérateurs ? Fonctionnent-ils avec les autres types déjà vus ?

>>> 20.0 // 3

>>> 20 % 3

>>> 2.0 ** 10

>>> 5 ** 2 % 3 # ici, quel est l'opérateur prioritaire ?

>>> 5 % 2 ** 3 # et là ?

1.1.3 Notions de données, de variables et d’affectation

L’ordinateur, on vient de le voir, manipule des données de différents types. On peut donner un nom à ces données en utilisant unnom de variable. Pour l’ordinateur, il s’agit d’une ré- férence désignant une adresse mémoire (un emplacement précis dans la mémoire vive). À cette adresse est stockée une valeur bien déterminée et bien typée.

Choix des noms de variable Essayez :

>>> a = 2

>>> 2a = 2 * a

>>> uneVariable = 5

>>> try = 2

Où sont les problèmes ? L’affectation

Onaffecte(ouassigne) une valeur à une variable en utilisant le signe égal.

Attention



Cela n’arien à voiravec l’opérateur mathématique d’égalité.

En écrivant :

>>> n = 7

(14)

TP no1 EDI & CALCULATRICE PYTHON

il faut comprendre que l’on relie uncontenu(la valeur 7) à uncontenant(la variablen).

Tapez ces exemple :

>>> n = 7 # affectation d'un entier

>>> msg = "Quoi de neuf ?" # affectation d'un string

>>> pi = 3.14159 # affectation d'un flottant

Affichage et ré-affectation

Pour afficher la valeur d’une variable sous l’interpréteur, il suffit d’entrer son nom :

>>> a = 3 * n

>>> a # appuyez sur <Entrée>

21

Remarque

+

Une variable (comme son nom l’indique) peut changer de valeur au cours de sa vie, grâce à une ré-affectation.

Affichez les nouvelles valeurs dea:

>>> a = 2

>>> a = a + 1 # une "incrémentation", opération très fréquente

>>> a = a - 1 # une "décrémentation"

À faire :calcul de l’aire d’un rectangle.

Affectez deux variableslargeuretlongueur;

affectez à la variableairela valeurlargeur*longueur;

affichez l’aire.

1.1.4 Les chaînes de caractères

Les chaînes de caractères se représentent entourées soit de : – guillemets1:"spam","l'eau vive",""2;

– apostrophes3:'eggs','une "beauté"';

– triple guillemets ou triple apostrophe ce qui permet d’écrire des chaînes sur plusieurs lignes.

Problème des accents :

>>> b = 'écho' # produit un affichage déplaisant

Pour le moment, n’utilisez pas les caractères accentués, on réglera ce problème durant la prochaine période.

1permet d’inclure des apostrophes.

2une chaîne vide.

3permet d’inclure des guillemets.

BC v1.3 - 5 - 2007 - 2008

(15)

EDI & CALCULATRICE PYTHON TP no1

Les opérateurs de base des chaînes de caractères Testez ces différents opérateurs.

Lalongueurd’une chaîne :

>>> c1 = 'abc'

>>> len(c1)

Laconcaténationde chaînes :

>>> c2 = 'defg'

>>> c3 = c1 + c2 # affichez c3 Larépétition:

>>> c4 = 'Fi!'

>>> c5 = c4 * 3 # affichez c5

>>> c6 = (c1 + c4) * 3 # affichez c6

>>> c7 = c1 + c4 * 3 # affichez c7

L’indiçageet l’extraction. On peut afficher ou extraire un caractère d’une chaîne en indi- quant sa position par un indice.

Attention



Le premier caractère est à l’indice 0.

>>> c2[0]

>>> c3[5]

Attention



Les chaînes de caractèresne sont pas modifiables.

Essayez :

>>> s = 'spam & eggs' # en fait, on voudrait obtenir : 'Spam & Eggs'

>>> s[0] = 'S'

Pour résoudre ce problème, on utilise l’extraction par tranche, appelée « découpage »1. Auparavant, commentez les différentes notations sur cet exemple :

>>> s2 = "abcdefghijk"

>>> s2[1:3]

>>> s2[1:]

>>> s2[:1]

>>> s2[:]

>>> s2[::2]

>>> s2[-1]

>>> s2[-3]

Donc, pour résoudre le problème précédent, que faut-il écrire ? Comment affichez :'Spam and Eggs'à partir des? (indication : utilisez concaténation et découpage)

1slicingen anglais

(16)

TP no1 EDI & CALCULATRICE PYTHON

Leformatage.

Essayez et commentez :

>>> "S'il vous plait, %d %s et %d cafes !" % (1, 'deca', 4.2)

>>> "S'il vous plait, %d %s et %f cafes !" % (1, 'deca', 4.2)

>>> n = 100

>>> "%d en base 10 : %d" % (n, n)

>>> "%d en base 8 : %o" % (n, n)

>>> "%d en base 16 : %x" % (n, n)

1.1.5 Notions sur les séquences

Lesséquencesregroupent les types dont les éléments sont ordonnés séqentiellement et sont accessiblesviades indices. Python connaît 3 types de séquence :

– leschaînes(déjà vues) ; – leslistes;

– lestuples.

Les séquences admettent l’indiçage, le découpage et quelques opérations prédéfinies.

Les listes (première approche)

Les listes sont des tableaux dynamiques, objets très utiles qu’il faut absolument maîtriser.

Ses éléments sont séparés par des virgules et la liste est entourée de crochets.

>>> liste_vide = []

>>> len(liste_vide) # à vérifier

>>> couleur = ['bleu', 'rouge', 'vert']

>>> len(couleur)

>>> couleur[1] # indiçage

>>> couleur[0:1] # découpage

>>> couleur[1] = 'jaune' # une liste est modifiable, et

>>> couleur[2] = 1.414 # peut contenir des types différents...

>>> c = [1, 3, couleur] # ... par exemple des listes !

>>> a = [0, 1, 2]

>>> b = [3, 4, 5]

>>> c = [a, b] # affichez c (liste de listes)

>>> c[0][2]

>>> c[1][0]

>>> c[1][3] # Attention...

Les tuples

Les tuples s’utilisent comme les listes. Ils sont notés entre parenthèses, mais surtout, comme les chaînes,ne sont pas modifiables1:

>>> monTuple = ('bleu', 'rouge', 'vert')

>>> monTuple[0] # affiche son premier élément

>>> monTuple[0] = 'jaune' # que ce passe-t-il ?

1immutableen anglais

BC v1.3 - 7 - 2007 - 2008

(17)

EDI & CALCULATRICE PYTHON TP no1

1.2 Programmation

Dans cette troisième période, on va enregistrer les commandes Python dans un fichier (que l’on appelle souvent un « script »). Pour cela on utilise la fenêtre supérieure droite dePyScrip- ter.

– OuvrirPyScripter; – tapez votre script

– cliquez surFile/Save As...(ou Ctrl+Shift+S) et indiquezTP1_1.py(rappelez-vous les conventions de nommage) ;

– votre fichier doit commencer par les 6 lignes suivantes (voir figure 1.4) :

FIG. 1.3 – Le bloc d’en-tête Explication du bloc d’en-tête :

ligne 1 : ce commentaire spécial (leshebang) assure que vos scripts fonctionneront aussi sous Linux (vous pouvez utiliser votre compte dans la salleChablispour programmer en Python) ;

ligne 2 : ce commentaire spécial définit l’encodage, il permet d’utiliser tous les accents ha- bituels du français ;

ligne 3 : chaîne de documentation du script ;

ligne 4 : nom de votre script (indispensable pour l’impression) ; ligne 5 : nom du binôme (indispensable pour l’impression) ; ligne 7 : commentaire indiquant le début de votre code.

Donc commencez votre programme en ligne 8.

Toutes les instructions que vous avez expérimentées durant la deuxième période sont va- lables dans un script, sauf l’affichage qui s’indique explicitement par la commandeprint. Donc la commande :

(18)

TP no1 EDI & CALCULATRICE PYTHON

print "a :"

produira à l’écran : a :

De plus, pour saisir une valeur (opération inverse de l’affichage, c’est uneaffectation pro- grammée), on emploie la commandeinput():

a = input("> ") # à l'ordinateur affiche le prompt et attend une saisie

1.2.1 Programme TP1_1.py

Vous devez saisir deux valeurs entières dans deux variablesaetbet imprimez leur somme, différence, produit et rapport.

Améliorez l’affichage pour produire par exemple (bien vous rappeler le rôle de la virgule dans l’affichage) :

Somme de a et b = 17

Utilisez maintenant l’affichage formaté(les %).

FIG. 1.4 – Exemple d’affichage

1.2.2 Programme TP1_2.py

Calcul de la division euclidienne.

Saisir deux entiers positifsaetb;

calculez le quotientqet le rester;

affichez la division euclidienne. Avec par exemple 45 et 11, on doit obtenir : Division euclidienne : 45 = 11*4 + 1

BC v1.3 - 9 - 2007 - 2008

(19)

EDI & CALCULATRICE PYTHON TP no1

1.2.3 Programme TP1_3.py

Somme de deux résistances.

Saisir deux résistancesr1etr2en indiquant l’unité ;

affichage formaté (deux chiffres significatifs) de leur somme en série et en parallèle.

N’oubliez pas l’unité.

1.2.4 Programme TP1_4.py

Calcul sur des grands nombres.

Saisissez une distanceden mètres dans l’intervalle 10186d61022et calculez sa valeur en kiloparsec, sachant qu’un parsec vaut 3.26 année-lumière.

Remarque

+

Récupération de votre travail : Pour sauvegarder votre travail tout au long des TP, il est fortement conseillé de posséder une clé USB, sur laquelle vous enregistrerez tous vos sources, c’est-à-dire tous les fichiers avec l’extension «.py», et votre « manip » avec l’exten- sion «.rtf».

C

Q

F

R

+ les différents types numériques : – entier :int

– entier long :long – flottant :float

+ l’utilisation des chaînes de caractères ; + la notion de variable et d’affectation ;

+ les opérations sur les nombres et sur les chaînes ; + le type liste ;

+ l’indiçage des séquences.

C

Q

F

P

H les dictionnaires : H les booléens ; H les complexes ;

H la structure de sélection ; H les structures de boucle.

(20)

Chapitre 2

Les structures de contrôle

Ce que l’on conçoit bien s’énonce clairement, Et les mots pour le dire arrivent aisément.

Nicolas Boileau (l’Art poétique)

Objectifs :

– notion sur les dictionnaires ; – les types booléen et complexe ;

– utilisation des fonctions prédéfinies sur les séquences ; – retour sur l’affectation ;

– les structures de contrôle.

Fichier(s) à produire :TP2_1.py TP2_2.py TP2_3.py TP2_4.py

2.1 Manip

2.1.1 Notions sur les dictionnaires

Un dictionnaire est un tableau associatif. C’est une liste d’éléments formée de couplesclé- valeur(séparés par un deux-point) et entourée d’une paire d’accolades. Comme les listes, les dictionnaires sont modifiables mais par contre ses éléments ne sontpas ordonnés. Nous pourront accéder à n’importe quelle valeur grâce à sa clé. Cette clé peut être alphabétique, numérique. . .

Essayez l’exemple suivant :

>>> dico = {} # un dictionnaire vide

>>> dico['computer'] = 'ordinateur'

>>> dico['mouse'] = 'souris'

>>> dico['keyboard'] = 'clavier'

>>> print dico # l'ordre n'est pas celui de la saisie !

(21)

STRUCTURES de CONTRÔLE TP no2

{'computer': 'ordinateur', 'keyboard': 'clavier', 'mouse': 'souris'}

Pour extraire une valeur d’un dictionnaire nous utilisons sa clé :

>>> print dico['mouse']

souris

Les dictionnaires sont desobjets, notion que l’on détaillera plus tard. Un objet possède géné- ralement desméthodesqui lui sont associées, c’est-à-dire des sortes de fonctions intégrées à cet objet. Notons simplement que l’on applique une méthode à un objet en reliant les deux à l’aide d’un point. Par exemple :dico.keys()

On peut appliquer aux dictionnaires un certain nombre de fonctions et de méthodes spéci- fique :

Testez et commentez :

>>> invent = {'pommes':430, 'bananes':312, 'oranges':274, 'poires':137}

>>> del invent['pommes'] # affichez invent

>>> print invent.keys() # qu'affiche la méthode keys() ?

>>> print invent.values() # qu'affiche la méthode values() ?

>>> print invent.has_key('bananes') # méthode has_key()

>>> print invent.has_key('pommes') # pourquoi ?

>>> print invent.items() # qu'affiche la méthode items() ?

2.1.2 Le type complexe

Les nombres complexes sont représentés en cartésien par deux flottants, partie réelle et par- tie imaginaire. L’imaginaire est suffixé parj(ouJ).

Testez :

>>> z1 = 1j # affichez z1

>>> z2 = 2 + 1j # affichez z2

>>> z3 = 2 + 1j * 3 # affichez z3

>>> z4 = (2 + 1j) * 3 # affichez z4

>>> z5 = 2 - 1j

>>> z6 = z2 + z5 # affichez z6

>>> z7 = z2 * z5 # affichez z7

2.1.3 Le type booléen

Il n’accepte que deux valeurs prédéfinies :TrueetFalse. Essai de quelques opérateurs booléens :

>>> a = True

>>> b = not a # affichez b

>>> a or b

>>> a and b

En utilisant les opérateurs booléensand,or etnot, affichez la table de vérité duXOR(ou exclusif). Vérifiez que : a XOR b = (a OU b) ET (NON(a) OU NON(b))

(22)

TP no2 STRUCTURES de CONTRÔLE

2.1.4 Retour sur l’affectation

Nous avons déjà vu que l’affectation (ou assignation) utilise le signe égal et qu’il ne s’agissait en aucune façon d’une notion d’égalité. Alors de quoi s’agit-il ?

Dans l’exemple suivant :

>>> i = 1

>>> msg = "Quoi de neuf ?"

>>> e = 2.718

FIG. 2.1 – Notion de référence : affectation de différents types

les trois noms de variables sont desréférences, mémorisées dans une zone particulière de la mémoire que l’on appelleespace de noms, alors que les valeurs correspondantes sont si- tuées ailleurs, dans d’autres zones de la mémoire.

Les instructions d’affectation ci-dessus ont eu pour effet chacune de réaliser plusieurs opé- rations dans la mémoire de l’ordinateur :

– créer et mémoriser un nom de variable (le membre de gauche) dans l’espace de noms courant ;

– lui attribuer dynamiquement un type bien déterminé (respectivement un entier, une chaîne de caractères et un flottant) ;

– créer et mémoriser une valeur particulière (le membre de droite) ;

– établir un lien (par un système interne de pointeurs) entre le nom de la variable et l’em- placement mémoire de la valeur correspondante.

Dans le diagramme de la figure 2.1, les cercles grisés occupent un mêmeespace de noms alors que les rectangles représentent les valeurs (ouobjets) correspondants. Les flèches sym- bolisent lesréférences(appelées « pointeurs » dans d’autres langages).

Conséquences :

>>> liste1=['a', 'b', 'c']

>>> liste2=['d', 'e', 'f']

>>> liste3=[liste1, liste2]

>>> del liste1[1] # que fait cette instruction ?

>>> print liste3[0][2] # où est le problème ?

BC v1.3 - 13 - 2007 - 2008

(23)

STRUCTURES de CONTRÔLE TP no2

2.1.5 Les modules d’extension

Jusqu’à maintenant nous n’avons utilisé que des fonctions arithmétiques élémentaires. Bien sûr, Python fournit plus que cela ! Comme vous pouvez le voir dans la documentation1inté- grée, il existe beaucoup demodulespermettant des tâches très diverses.

Par exemple le module mathématique donne accès aux fonctions mathématiques clas- siques. Regardez sa documentation et essayez2:

>>> from math import pi, sin # importation depuis un module

>>> pi

>>> a = input("angle : ") # attention à l'unité...

>>> print sin(a)

Un module sympatique !

Une tâche difficile est de programmer des « IHM » (Interfaces Homme-Machine), ce sont des boîtes graphiques très communes dans les systèmes d’exploitation modernes. Il existe un petit module appelé « easygui », permettant d’utiliser simplement quelques IHM parmi les plus utiles3.

2.1.6 Les structures de contrôle

Importance de l’indentation

Toutes les structures de contrôles sont des instructions composées. Elles ont toutes la même structure : une ligne d’en-tête terminée par un double point, suivie d’une ou de plusieurs instructions indentées sous cette ligne d’en-tête.

La règle est très simple :

Toutes les instructions au même niveau d’indentation appartiennent au même bloc.

Attention



quelque soit l’éditeur utilisé,ne pasmélanger les espaces et les tabulations. Il est interdit de modifier son éditeur pour remplacer les tabulations par des espaces.

La sélection (if)

L’instruction conditionnelleifpermet d’aiguiller le déroulement du programme dans diffé- rentes directions, en fonction de la condition testée.

Tapez par exemple les instructions suivantes (sous forme d’un script) :

1Dans « Python manuals » cliquez surm, en haut à droite

2Ne pas oubliez que Python est un interpréteur : on peut sans problème saisir :pi/4.

3cf. la documentation « easygui.pdf ».

(24)

TP no2 STRUCTURES de CONTRÔLE

if a > 100: # n'oubliez pas le deux-point...

print "a dépasse la centaine" # ...ni l'indentation ! elif a == 100:

print "a vaut 100"

else:

print "a ne vaut pas cher !"

Faire un essai aveca = 150et un autre aveca = 50. Commentez.

Exercice :Calcul des racines réelles d’une équation du second degré.

Vous devez saisir trois réels correspondants aux coefficients du trinôme : ax2+bx+c=0

Remarque

+

Pour être sûr de bien saisir des flottants, employez l’instructionraw_input()(qui assure une saisie en mode texte) suivie d’un transtypage en flottant :

>>> a = raw_input("Entrez a : ")

>>> a = float(a)

En fonction du signe du discriminant∆, affichez les valeurs des racines. N’oubliez pas de bien commenter vos affichages1.

La répétition en boucle (while)

Comme on l’a vu en cours, l’instruction de répétition la plus fondamentale est la boucle while. Cette instruction composée répète le corps de la boucle tant que la condition est vraie:

>>> i = 7

>>> while i > 0: # n'oubliez pas le deux-point ! print i, # n'oubliez pas l'indentation ! i = i - 1 # qu'obtenez-vous ?

Exercice :Écrivez un programme qui affiche les 20 premiers termes de la table de multipli- cation par 7, en signalant au passage (à l’aide d’une astérisque) ceux qui sont des multiples de 3. Exemple : 7 14 21 * 28 35 42 * 49. . .

Le parcours de séquence (for)

L’instructionforest l’instruction idéale pour parcourir les éléments d’une séquence, par exemple d’une liste :

>>> slogan = ['Changez', 'le', 'Premier', 'Enarque', '!']

>>> for cri in slogan: # n'oubliez pas le deux-point ! print cri, # n'oubliez pas l'indentation !

1Ce calcul nécessite l’utilisation de la racine carrée. Cette fonction appartient évidemment au modulemath. Regardez sa syntaxe exacte dans la documentation.

BC v1.3 - 15 - 2007 - 2008

(25)

STRUCTURES de CONTRÔLE TP no2

Remarque

+

La fonctionrange()permet de créer très facilement des séquences de nombres.

Essayez :

>>> range(10)

>>> range(2, 10)

>>> range(2, 11, 2)

Il est alors très agréable de combiner leforet lerange()pour écrire par exemple :

>>> for i in range(10):

print i,

ou cet exemple de boucles imbriquées à bien comprendre (et donc à bien commenter !) :

>>> for i in range(6):

for j in range(6):

print i+j,

Pour illustrer agréablement les boucles, utilisons le moduleturtle. Il permet de réaliser des

« graphiques tortue », c’est-à-dire des dessins géométriques correspondant à la piste laissée derrière elle par une petite « tortue » virtuelle, dont nous contrôlons les déplacements sur l’écran de l’ordinateur à l’aide d’instructions simples1.

Écrivez un script avec les exemples suivants, en faisant varier les paramètres : from turtle import *

for i in range(4):

forward(100) left(90) reset() a = 0

while a <12:

a = a +1 forward(150) left(150)

Exercice :Tracez, à l’aide d’une bouclewhile(puis, dans un second temps, à l’aide d’une bouclefor) un octogone de 50 pixels de côté (cf. figure 2.2).

2.2 Programmation

2.2.1 Programme TP2_1.py

Vous jouez avec deux dés et vous voulez savoir combien il y a de façons de faire un certain nombre.

Faites, comme dans votre cours, une saisie filtrée (cf. figure 2.3) et calculez le nombre de- mandé (sûrement à l’aide de boucles. . . ).

1Voir la documentation intégrée du moduleTurtle/Tk.

(26)

TP no2 STRUCTURES de CONTRÔLE

FIG. 2.2 – Un octogone tracé « à la tortue » !

FIG. 2.3 – Nombre de façons de faire une saisie avec deux dés

Modifiez votre programme en remplaçant votre saisie filtrée par une boîte « integerbox » du moduleeasygui. La boîte de saisie devra être semblable à celle de la figure 2.4

FIG. 2.4 – Interface de saisie d’un entier

2.2.2 Programme TP2_2.py

Affichez la somme des 10 premiers entiers de trois façons différentes : – en utilisant la formule classique :s=n(n+1)2 ;

– en utilisant une bouclewhile; – en utilisant une bouclefor.

2.2.3 Programme TP2_3.py

Un ordinateur n’est qu’un automate programméfini. Il est sûr que l’on ne peut espérer ef- fectuer des calculs avec une précision infinie. Combien peut-on espérer ?

BC v1.3 - 17 - 2007 - 2008

(27)

STRUCTURES de CONTRÔLE TP no2

On va définir l’epsilon-machinecomme la plus grande valeurεtelle que1: 1+ε=1

Pour cela, initialisez une variabledxà la valeur1.0, puis dans une bouclewhile, divisezdx par2.0tant que la condition(1.0 + dx > 1.0)est vraie.

Combien trouvez-vous ?

2.2.4 Programme TP2_4.py

Écrire un programme qui saisit un entiern positif non nul et qui affiche la somme des in- verses des carrés des entiers de 1 àn.

C’est une quantitéréelle: utilisez desflottants.

En déduire une valeur approchée deπ, sachant que : X

n=1

1 n22

6

Pour cela vous avez besoin de la fonction « racine carrée » dont le nom en Python estsqrt() et qui est accessible depuis le modulemath. Calculez également l’erreur relative (en pour- centage) entre votre valeur et celle deπfournie par le modulemath.

C

Q

F

R

+ spécificité et utilité de la structure de données « diction- naire » ;

+ les types complexe et booléen ;

+ l’affectation stocke des références à des objets ; + les structures de contrôle :

if : la sélection, while : la répétition,

for : le parcours de séquence.

F

1Cette définition estconventionnellecar si on définit l’epsilon machine autour d’une valeur différente de 1 on trouve des valeurs légèrement différentes

(28)

TP no2 STRUCTURES de CONTRÔLE

C

Q

F

P

H les fonctions et méthodes prédéfinies sur : – les listes ;

– les chaînes de caractères ; – les dictionnaires ;

H la définition des fonctions.

BC v1.3 - 19 - 2007 - 2008

(29)
(30)

Chapitre 3 Les fonctions

Le style est une façon simple de dire des choses compliquées.

Jean COCTEAU

Objectifs :

– les fonctions et méthodes prédéfinies ; – définition des fonctions.

Fichier(s) à produire :TP3_1.py TP3_2.py TP3_3.py

3.1 Manip

Comme nous l’avons vu en cours, la notion de fonction est très importante. Dans un premier temps nous allons explorer quelques fonctions prédéfinies avant d’apprendre à écrire nos propres fonctions.

3.1.1 Les méthodes et fonctions prédéfinies

Sur les listes

Méthodes non modificatrices. Ces deux méthodes renvoie un résultat sans modifier la liste : Méthode Description

L.count(x) Renvoie le nombre d’occurrences dexdansL

L.index(x) Renvoie l’indice de la première occurrence dexdansL Exercices.Testez et commentez :

>>> # imprimez L et sa longueur

>>> L = list("anticonstitutionnellement")

>>> L.count('e')

>>> L.index('t')

(31)

LES FONCTIONS TP no3

Méthodes modificatrices. Toutes ces méthodes, saufpop()renvoient la valeurNone:

Méthode Description

L.append(x) Ajoute l’élémentxà la fin deL

L.extend(l) Ajoute tous les éléments de la listelà la fin deL L.insert(i, x) Insère l’élémentxà l’indiceidansL

L.remove(x) Supprime la première occurrence dexdansL

L.pop([i]) Renvoie la valeur de l’élément à l’indiceiet l’ôte deL; siiest omis, supprime et renvoie le dernier élément.

L.reverse() Renverse sur place les éléments deL

L.sort() Triesur placeles éléments deL(par défaut, tri croissant).

Exercices.À partir d’une liste que vous définirez, testez quelques méthodes modificatrices de liste données dans le tableau ci-dessus.

Sur les chaînes de caractères

• S.capitalize(): transforme le premier caractère deSen majuscule et les suivants en minuscules ;

• S.center(largeur [, remplissage]): centre la chaîne dans unelargeur donnée, en rajoutant si besoin est des espaces (ou le caractèreremplissage) à gauche ;

• S.count(sous_chaîne [, début [, fin]]) : compte le nombre d’occurrences de sous_chaîne dansSentredébut etfin (0 etlen(S)par défaut) ;

• S.find(sous_chaîne [, début [, fin]]): retourne la position de la première oc- currence desous_chaîne dansSentredébut etfin(0 etlen(S)par défaut) ;

• S.join(séquence): concatène une séquence de chaînes en une chaîne unique en in- sérantSentre chacune ;

• S.lower(): convertit toutes les lettres deSen minuscules ;

• S.strip([caractères]): supprime les blancs (ou tout caractère danscaractères) au début et à la fin deS;

• S.replace(ancienne, nouvelle [, nombre]): retourne une copie deSoù chaque occurrence de la sous-chaîneancienneest remplacée parnouvelle. Sinombreest donné, seules lesnombre premières occurrences sont remplacées ;

• S.upper(): convertit toutes les lettres deSen majuscules ;

• S.zfill(largeur): ajoute si nécessaire des zéros à gauche deSpour obtenir lalargeur demandée.

Rappel

i

Les chaînes de caractères ne sont pas modifiables et donc les méthodes qui transforment les chaînes en créent de nouvelles.

Exercices.Définissez une chaîne de caractère et testez quelques méthodes données dans la liste ci-dessus.

(32)

TP no3 LES FONCTIONS

De plus, on dispose des méthodes booléennes suivantes, dites « de test de contenu » : Méthode Catégorie

isalnum() Alphanumérique uniquement (chiffres ou lettres) isalpha() Lettres uniquement

isdigit() Chiffres uniquement

islower() Lettres minuscules uniquement isspace() Blancs uniquement

istitle() Forme de titre

isupper() Lettres majuscules uniquement Sur les dictionnaires

Méthodes non modificatrices. Les méthodesitems(),keys() etvalues()renvoient leur liste dans un ordre quelconque.

Méthode Description

copy.copy(D) Renvoie une copie de D (utilise le module copy, voir le cours)

D.has_key(k) RenvoieTruesikest une clé deD,Falsesinon

D.items() Renvoie une copie de la liste de tous les éléments (paires clé/valeur) deD

D.keys() Renvoie une copie de la liste de toutes les clés deD D.values() Renvoie une copie de la liste de toutes les valeurs deD D.iterkeys() Renvoie un itérateur sur toutes les clés deD

D.itervalues() Renvoie un itérateur sur toutes les valeurs deD

D.iteritems() Renvoie un itérateur sur tous les éléments (paires clé/va- leur) deD.

D.get(k[,x]) RenvoieD[k]sikest une clé deD; sinonx(ouNonesix n’est pas précisé)

Méthodes modificatrices :

Méthode Description

D.clear() Supprime tous les éléments deD

D.update(D1) Pour chaque clékdeD1, affecteD1[k]àD[k]

D.setdefault(k[,x]) RenvoieD[k]sikest une clé deD; sinon affectexàD[k]

et renvoiex

D.popitem() Supprime et renvoie un élément (paire clé/valeur) quel- conque deD

3.1.2 Définition des fonctions

Une fonction est définie par :

une ligne d’en-tête formée : – du mot-clédef

BC v1.3 - 23 - 2007 - 2008

(33)

LES FONCTIONS TP no3

– du nom de la fonction

– de la liste des arguments entre parenthèse – du caractère deux-points

Le corps de la fonction est ensuite indentée. Une fonction se termine grâce à une instruc- tionreturn, ou à défaut en fin de bloc, auquel cas elle renvoie la valeur particulièreNone. Exemple élémentaire :

>>> def doubler(x): # définition de la fonction return x*2

>>> doubler(7) # Pourquoi cet appel fonctionne-t-il avec un entier...

>>> doubler(7.2) # ... un flottant...

>>> doubler("bla") # ... ET un string ?

3.2 Programmation

On appelle suite de Syracuse toute suite d’entiers naturels vérifiant :

un+1=



un

2 siunest pair 3un+1 siunest impair Par exemple, la suite de Syracuse partant deu0=11 est :

11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, 4, 2, 1

En se bornant1à 1, on appelle cette suite finie d’entiers le volde 11. On appelle étapeun nombre quelconque de cette suite finie. Par exemple 17 est une étape du vol de 11. On remarque que la suite atteint une étape maximale, appeléealtitude maximaledu vol. Par exemple 52 est l’altitude maximale du vol de 11.

3.2.1 Programme TP3_1.py

Écrire une fonctionetapeSuivante()qui reçoit un entier et qui produit l’entier suivant dans la suite de Syracuse. Par exempleetapeSuivante(5)doit produire 16 etetapeSuivante(16) doit faire 8, etc.

Écrire un programme principal qui demande un entier initial à l’utilisateur (utilisez une integerbox entre 2 et 100) puis qui, en utilisant la fonctionetapeSuivante(), calcule et affiche les termes de la suite de Syracuse jusqu’à ce qu’on obtienne 1.

1On a constaté depuis longtemps que pour tous les entiers de départ testés, la suite atteint après un nombre de termes plus ou moins grand, la période 4, 2, 1, 4, 2, 1. . . Hélas ! pour l’instant tous ceux qui ont essayé de le prouver ont échoué : c’est un « problème ouvert » (uneconjecture).

(34)

TP no3 LES FONCTIONS

3.2.2 Programme TP3_2.py

Écrire un programme principal qui demande un entier initial à l’utilisateur puis qui calcule et affiche l’altitude maximale de ce vol.

Pour cela, écrire une fonctionaltMaxi()qui reçoit un entieri ni tet qui produise l’altitude maximale de la suite de Syracuse commençant paru0=i ni t. Par exemple, en partant de u0=7, la suite de Syracuse est : 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 et par conséquentaltMaxi(7)vaut 52.

3.2.3 Programme TP3_3.py

Notions de récursivité

La notion de récursivité en programmation peut être définie en une phrase : une fonction récursive peut s’appeler elle-même.

Une définition est récursive lorsqu’une partie du tout fait appel au tout. Par exemple, trier un tableau deN éléments par ordre croissant c’est extraire le plus petit élément puis trier le tableau restant àN−1 éléments.

Bien que cette méthode soit souvent plus difficile à comprendre et à coder que la méthode classique diteitérative, elle est dans certains cas l’application la plus directe de sa définition mathématique.

Voici l’exemple classique de définition par récurrence de la fonction factorielle : n!=

½ 1 si n=0 n(n1)! si n>1 Remarque

+

Son code est très exactement calqué sur sa définition mathématique :

def factorielle(n):

if n == 0:

return 1

elsereturn n*factorielle(n-1)

Dans cette définition, la valeur den! n’est pas connue tant que l’on n’a pas atteint la condi- tion terminale (ici n ==0). Le programme empile les appels récursifs jusqu’à atteindre la condition terminale puisdépileles valeurs. Ce mécanisme est illustré par la figure 3.1.

Pour dérouler un programme récursif, il suffit de dérouler tous les appels dans un tableau comme ci-dessous, jusqu’à atteindre la condition terminale sans appel (par exemple ici quand nvaut 0). Ensuite on fait remonter, à partir de la ligne du bas (sans appel), les valeurs de re- tour trouvées (3ecolonne) jusqu’en haut du tableau.

BC v1.3 - 25 - 2007 - 2008

(35)

LES FONCTIONS TP no3

fact(4)

4

* fact(3)

24 =

3

* fact(2)

* 2

* fact(1)

* 1

* fact(0)

* 1

*

FIG. 3.1 – Empilage/dépilage de 4!

Fonction Appels Valeur de retour

factorielle(n) n*factorielle(n-1) n*factorielle(n-1) = 24 factorielle(4) 4*factorielle(3)

24 factorielle(3) 3*factorielle(2)

6

factorielle(2) 2*factorielle(1)

2

factorielle(1) 1*factorielle(0)

1

factorielle(0) sans appel 1

FIBONACCI: une suite doublement récursive

On définit la suite de FIBONACCIde la façon suivante :



f i b0=0 f i b1=1

f i bn+1=f i bn+f i bn−1 À faire :

– dérouler le programme, comme expliqué dans le paragraphe précédent, avec 5 comme entrée, remplir et rendre le tableau ci-dessous ;

(36)

TP no3 LES FONCTIONS

– coder la suite de FIBONACCI dans le fichierTP3_3.py et vérifier les résultats obtenus (pour la saisie, utilisez uneintegerboxentre 2 et 20).

Fonction Appels Valeur de retour

fib(n) fib(n-1)+fib(n-2) fib(n-1)+fib(n-2) = fib(5) fib(4) + fib(3)

fib(4) fib(3) + fib(2)

fib(3) fib(2) + fib(1)

fib(2) fib(1) + fib(0)

fib(1) sans appel

fib(0) sans appel

C

Q

F

R

+ apprendre à utiliser une fonction ou une méthode ; + apprendre à définir une fonction ;

+ bien comprendre la structure d’un script : fonctions- programme principal ;

+ enfin comprendre la notion de récursivité.

F

C

Q

F

P

H les modules ;

H les espaces de nom.

BC v1.3 - 27 - 2007 - 2008

(37)
(38)

Chapitre 4

Mise au point et modules

Lorsque vous avez éliminé l’impossible, ce qui reste, même si c’est improbable, doit être la vérité.

A. Conan DOYLE(Le signe des quatre)

Objectifs :

– coder et utiliser un module ; – les espaces de nom ;

– apprendre àdéboguer.

Fichier(s) à produire :TP4_1.py TP4_2.py TP4_3.py

4.1 Manip

Durant cette partie, nous allons expérimenter quelques techniques du génie logiciel.

4.1.1 La portée des variables, les espaces de nom

Quand on utilise unnomdans un script, l’interpréteur Python le crée, le modifie ou le re- cherche dans une zone mémoire particulière : « l’espace de nom ». On sait qu’en Python les noms existent dès qu’on leur affecte une valeur : Python utilise l’affectation d’un nom pour l’associer à un espace de noms particulier correspondant à son type. Ce mécanisme se re- trouve à tous les niveaux, fonctions, classes, modules, packages.

Si, par exemple dans une fonction, on a besoin d’une variable de portée globale, on utilise l’instructionglobal.

(39)

MISE AU POINT & MODULES TP no4

Testez et commentez les instructions suivantes : x = "valeur globale"

def f1():

print "dans f1 :", x def f2():

x = "valeur locale"

print "dans f2 :", x def f3():

global x

x = "valeur modifiée"

print "dans f3 :", x print "au niveau global :", x f1()print "au niveau global :", x f2()print "au niveau global :", x f3()print "au niveau global :", x

Pour compléter l’exemple précédent, utilisez et expliquez la primitivedir().

4.1.2 Les modules

Jusqu’à maintenant, tous les scripts que nous avons écrits n’étaient constitués que d’un seul fichier. Or quasiment tous les langages proposent et préconisent le développement multi- fichiers. Quel en est l’intérêt ? En fait ils sont multiples :

– les sources sont plus petits, donc plus faciles à concevoir et à mettre au point ;

– on peut ainsi écrire des fonctionnalités qui seront réutilisables dans plusieurs programmes, c’est donc une bonne économie de moyens (on évite de réinventer la roue !) ;

– on peut aller plus loin et regrouper les différentes fonctionnalités dans des éléments sou- vent appelés bibliothèques.

Chaque langage possède ses propres outils, plus ou moins compliqués. Python propose une technique particulièrement simple : lemodule. L’étape suivante que nous n’explorerons pas est le regroupement de modules enpackagesformés d’arborescences de modules.

Comment faire un module ?

Créons par exemple un moduleaff_m.pycontenant une fonctionafficheur(). C’est tout simplement un fichier1Python contenant cette fonction :

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Module d'affichage."""

__file__ = "aff_m.py"

1par convention, on choisit de suffixer les modules Python par_m

(40)

TP no4 MISE AU POINT & MODULES

__author__ = "Bob Cordeau"

# fonctions def afficheur(x):

print x

Comment utiliser un module ?

Vous savez déjà le faire depuis le deuxième TP ! En effet, le module que vous venez d’écrire s’utilise de la même façon de ceux de la bibliothèque standard Python. Donc, si dans un script, j’ai besoin de la fonctionafficheur(), il me suffit de l’importer au préalable.

Plus précisément, Python propose deux techniques d’importations :

import aff_m Les objets du module devront êtrepleinement qualifiés, c’est-à-dire qu’il fau- dra écrire le nom du module suivi d’un point suivi du nom de l’objet. Par exemple :

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Utilisation d'un module (1)."""

__file__ = "test_module.py"

__author__ = "Bob Cordeau"

# imports import aff_m

y, z, s = 12, 2.718, "Salut !"

aff_m.afficheur(y) aff_m.afficheur(z) aff_m.afficheur(s)

from aff_m import afficheur Les objets du modules sont directement accessibles (mais peuvent générer des conflits dans l’espace de nom local. . .) :

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Utilisation d'un module (2)."""

__file__ = "test_module2.py"

__author__ = "Bob Cordeau"

# imports

from aff_m import afficheur y, z, s = 12, 2.718, "Salut !"

afficheur(y) afficheur(z) afficheur(s)

La seconde technique possède une variante utile pour certains cas : from aff_m import *

Pour la suite des TP, nous aurons besoin d’afficher des graphes de courbes. Un module GnuPlotnous permet de le fairedepuis un script. Afin d’améliorer la facilité d’utilisation,

BC v1.3 - 31 - 2007 - 2008

(41)

MISE AU POINT & MODULES TP no4

deux procédures utiles ont été incluses dans le module suivant qui vous sera utile dans les deux prochains TP. Ce module est présent dans le répertoireC:\python25.

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Module de plot."""

__file__ = "plot_m.py"

__author__ = "Bob Cordeau"

# imports

from Numeric import *

import Gnuplot, Gnuplot.funcutils

# fonctions

def plot_Fct(msg):

"""Plot de fonction(s) décrite(s) dans le string <msg>.

"""

g = Gnuplot.Gnuplot() g('set grid')

g.plot(Gnuplot.Func(msg))

raw_input(u"Tapez 'Entrée' pour continuer... ") def plot_Fic(msg):

"""Plot de fichier(s) nommé(s) dans le string <msg>.

"""

g = Gnuplot.Gnuplot() g('set grid')

g("plot " + msg)

raw_input(u"Tapez 'Entrée' pour continuer... ")

# Auto-test --- if __name__ == '__main__':

# test de la fonction plot_Fct() fct = '[-5:10] sin(20*x)*atan(x), 0' plot_Fct(fct)

# test de la fonction plot_Fic() f = open("data.dat", "w")

for i in xrange(201):

x = 0.1*i - 5.0 y = x**3 - 20*x**2

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

plot_Fic("'data.dat'")

Vous remarquerez la dernière partie qui commence par : if __name__ == '__main__':

Elle permet, si le module est exécuté, d’évaluer les lignes qui suivent. Cette construction est très utilisée pour mettre au point les modules et fournir ainsi des modules « auto-testables ».

Mais si on importe ce module cette partie est ignorée.

Un second module vous sera utile (à enregistrer également pour les futurs TP). Il ne com-

(42)

TP no4 MISE AU POINT & MODULES

porte qu’une seule fonctionverif(), dont vous ferez un usage fréquent pour tester vos fonc- tions. Ce module est lui-même auto-testé, ce qui vous en donne la syntaxe :

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Module de vérification."""

__file__ = "verif_m.py"

__author__ = "Bob Cordeau"

# imports

from sys import exit

# fonctions

def verif(entree, reference, precision=0, comment=""):

"""Vérifie que l'entrée est égale à la référence, à la précision près."""

print "%s[%s, %s]" % (comment, entree, reference), if abs(entree - reference) <= precision:

print ": ok"

else:

print "### ERREUR ! ###"

exit(1)

# Auto-test --- if __name__=='__main__':

verif(abs(-6/2), 3, comment="Teste la fonction 'abs' : ") pi = 3.142

verif(pi, 3.14, 1e-2, comment="à 1e-2 : ")

verif(pi, 3.14, 1e-3, comment="à 1e-3 : ") ### ERREUR ! ###

4.1.3 Apprendre à déboguer

La recherche d’erreurs (ledébogage) est une activité parfois difficile et toujours importante pour un programmeur. Plusieurs outils et techniques existent en Python.

Nous vous proposons d’expérimenter la technique de débogage avecPyScripter.

Utilisez ce petit script qui va nous servir d’exemple (à prendre dansC:\python25) :

#!/bin/env python

# -*- coding: Latin-1 -*-

"""Exercice de debug.

- Mettre le curseur sur la ligne 24

- Faire Run/Run To Cursor (Vous êtes alors sous l'enviromment debug) - Examiner les valeurs des variable en positionnant le curseur dessus - Avancer pas à pas par F8

Mettre fin au debug : Ctrl+Alt+F9

Recommencer en ayant mis en commentaire la ligne 24.

"""

__file__ = "debug.py"

__author__ = "Bob Cordeau"

BC v1.3 - 33 - 2007 - 2008

Références

Documents relatifs

L’accès aux archives de la revue « Nouvelles annales de mathématiques » implique l’accord avec les conditions générales d’utilisation ( http://www.numdam.org/conditions )..

La loi de formation de la l r e ligne est évidente; le signe est déterminé selon la règle de Cramer par le nombre des variations ; si ce nombre est pair le signe est positif, et il

Trace des droites qui passent par les points indiqués, puis repasse en couleur chaque segment formé :.. Trace la droite (a) qui passe par les points A

Ainsi, sur une droite quelconque, il y a quatre points imaginaires dont les trajectoires ont leurs centres de courbure à l'infini, et, par suite, dans un corps quelconque que

1 étape ère : déterminer les coefficients a et b de la droite de régression avec le tableur 1- Taper les données dans une feuille d’excel :. 2- Ensuite nous sélectionnons

Por otra parte, la polar de un punto cualquiera respecto de la circunferencia de inversión es la perpendicular a la recta trazada por el inverso de.. Esta propiedad es

Si le côté du tétraèdre mesure 2, on peut prendre pour coordonnées des sommets les valeurs indiquées sur le schéma ci dessus.. On voit ci-dessus le haut

Pour déterminer le point T,on trace la point A’ symétrique de A par rapport à P grâce au cercle de centre P et de rayon PA dont le 2 ème point d’intersection avec la ligne AB