Accueil

Traduction

Tutoriel Python - sommaire

Sommaire partiellement masqué - faites défiler !

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Distribuer vos programmes

Dans ce chapitre je vais tenter de vous montrer comment améliorer vos programmes et comment distribuer ensuite votre production : création d'exécutables.

De bonnes pratiques

Les bonnes pratiques de programmation Python sont proposées dans le cadre du PEP (Python Enchancement Proposal : propositions d'améliorations de Python)

Indentation

Vous savez qu'un bloc d'instruction appelé par un while OU un if OU un else OU elif doit être décalé par rapport à l'instruction d'appel.

Longueur maximale d'une ligne d'instruction

Une ligne ne doit pas dépasser 79 caractères.
Pour indiquer qu'une instruction n'est pas terminée il faut rajouter en fin de ligne la barre oblique inverse. On peut aussi ouvrir une parenthèse (qui est fermée dans la ligne suivante).

Directives d'importation

Syntaxe déconseillée :

Cette instruction est déconseillée car peu lisible
Il est conseillé d'écrire plutôt :

Utilisez des alias pour les modules ayant un nom très long ou qui doit respecter une certaine casse.
Les importations doivent se trouver en début de programme.

Attention à la casse

Python fait la différence entre majuscule et minuscule. On dit qu'il tient "compte de la casse".
Exemple :

Il y a une exception (erreur) puisque "machaine" (sans C majuscule) n'existe pas.

Les espaces

Évitez les espaces au coeur des parenthèses, crochets et accolades.
Pas d'espaces autour du signe "=".

Nommer les variables et fonctions

Le premier caractère ne peut être un chiffre, pas de lettres accentuées.
Évitez les lettres majuscules. À défaut au début de chaque mot composé. Exemple : maListe (notation en "CamelCase")

Donnez des noms logiques à vos variables. Si une variable sert de compteur appelez la "compteur" ; si elle doit contenir le score d'une partie appelez la "score".
Je rappelle qu'un mot réservé ne peut être employé pour nommer une variable ou fonction.
Pas de trait d'union dans un nom de variable mais le trait de soulignement("tiret bas").
Pour les variables dont le nom ne comprend qu'un seul caractère il ne faut pas employer : O (o majuscule), l( L minuscule) et I(i majuscule). En effet avec certaines polices le o majuscule peut être confondu avec zéro, le L minuscule avec 1 et I majuscule avec l.
L'usage veut qu'une variable contenant un indice de séquence soit stocké dans une variable "i" (i minuscule).
Les constantes doivent être écrites en majuscules avec des traits de soulignement si le mot est composé.
L'affectation doit se faire avec un tuple.
Exemple :

Les commentaires

Les commentaires peuvent être écrits sur plusieurs lignes à condition d'être encadrés par des guillemets triples (""").

Les messages

Évitez les fautes d'orthographe. Si les messages dans les fonctions input() & print() sont délimités par des guillemets doubles vous pouvez utilisez les apostrophes dans ces chaines.

Évitez les exceptions

Dans le chapitre 12 nous avons abordé la "gestion des exceptions" ; en d'autres termes, les erreurs de saisie.
Personnellement je trouve que la syntaxe correspondant à la gestion des exceptions est lourde.
Gérer les exceptions c'est bien, faire en sorte qu'elles ne puissent survenir c'est encore mieux.

Exemple : programme sur le cercle

Reprenons le programme qui calcule la circonférence et l'aire du cercle à partir du rayon ; le cercle est dessiné.

Le code

Notez aussi que la première fonction retourne deux valeurs. d'où l'instruction : circonference, aire = cercle1(rayon)

Exécution du programme

L'utilisateur a mal lu les consignes et il saisit "100 cm". Il y alors un plantage !
la fenêtre d'exécution de l'IDLE affiche :

La méthode eval() ne peut convertir une chaine en nombre qu'à la condition que ladite chaine ait un format numérique (des chiffres et éventuellement un point parmi les chiffres).

La solution

Plutôt que gérer l'erreur de saisie, nous allons faire en sorte qu'elle ne puisse plus se produire. Nous allons donc mettre en place un contrôle de saisie efficace.
Dans le programme principal il suffit de remplacer l'instruction input() par trois instructions :

La méthode de chaine isdigit() retourne VRAI si ladite chaine ne comprend que des chiffres.
Donc on boucle tant que la variable "rayon" comprend autre chose que des chiffres.
N'oubliez pas de créer la variable "rayon" avant l'instruction "while not rayon isdigit()" sinon vous aurez un "plantage" avec le message: "NameError: name 'rayon' is not defined"

Remarque

Et si l'on veut saisir en guise de rayon un nombre décimal ?

Essayez, tapez en guise de rayon le nombre décimal "50.5". Vous ne quittez pas la boucle de saisie puisque la condition dans le WHILE retourne toujours True.
Il faut trouver une solution pour que l'on puisse saisir en guise de rayon un nombre décimal !

Il manque une méthode de classe permettant de vérifier si une chaine a un format décimal (un point entouré de chiffres).
Peut-être dans une version prochaine de Python ...

La solution

Une astuce que j'ai trouvée sur la "toile" et qui est basée sur la méthode replace().

Avant de tester avec la méthode isdigit() il suffit de remplacer dans "rayon" le point décimal par "".

Nous pouvons aller plus loin dans le contrôle de saisie. Il y a des utilisateurs vraiment étourdis qui peuvent saisir des espaces avant et après le nombre. Il faut donc tester une chaine débarassée du point mais aussi d'éventuels espaces.

J'ai donc chainé cette fois trois méthodes : replace(), strip(), isdigit()

Solution plus classique

On pourrai aussi utiliser une expression régulière.
Le concept d'expression régulière existe, en effet, dans tous les langages et a été évoquée dans un chapitre précédent.

Nouveau version du programme (extraits):

Ne pas oublier d'importer le module re (comme "regular expression").
Je définis un gabarit de saisie dans la variable "gabarit". Les caractères autorisés sont les chiffres et le point ; au moins un caractère.
Tant que la valeur saisie dans "rayon" ne correspond pas à ce gabarit, je boucle pour recommencer la saisie.

Trace d'exécution du programme :

Exercice

À vous de bosser un peu. Ainsi vous verrez si vous avez assimilé toutes ces notions.
Vous devez créer un programme structuré qui calcule le périmètre et la surface d'un rectangle et dessine ledit rectangle.
Comme dans l'exemple prévoyez un programme principal contenant deux procédures (dont une fonction) qui retourne deux valeurs.
Dans le programme principal il y a deux saisies (longueur et largeur). Sachant que les dimensions peuvent être des nombres décimaux, prévoyez un contrôle de saisie efficace, toujours en vous inspirant de l'exemple.

Je vous communique la trace d'exécution du programme :

Encore un programme amélioré

Vous vous souvenez du petit programme qui consistait par essais successifs à trouver un entier généré de façon aléatoire.

Le code du programme

La fonction retourne le score d'une partie d'où l'instruction : score_partie = unepartie()