Vous devez m'envoyer (en dépôt sur le cahier de texte d'Ecole Directe) un fichier compressé dont le nom sera NOM_Prenom_TP_PEP8_docstring_doctest.zip avec NOM et Prenom votre nom et votre prénom.
Ce fichier compressé devra contenir les fichiers sources Python suivant :
PEP est un acronyme pour Python Enhancement Proposals, Proposition d'Amélioration Python.
Les PEP sont des proposition d’amélioration du code python qui permettent une meilleure lecture, compréhension, fonctionnement etc…. Ce n’est pas obligatoire mais cela permet de rendre le code plus lisible et plus compréhensible.
La Pep8
La PEP8 définit un guide de style de codage. Elle consiste à rendre le texte plus lisible.
Voici les principales recommandations de ce guide :
Plusieurs moyens de vérifier si un code Python vérifie les recommandations de la PEP8. On peut citer :
Voici le code source d'un programme python.
from random import *
def ma_fonction(n):
if n<2:
return \
False
fact = 2
while fact * fact <= n:
if n % fact == 0:
return False
else:
fact += 1
return True
for loop in range(100):
n = randint(1, 100000)
print(n, ma_fonction(n))
Etudiez ce code source et décrire ce que retourne la fonction ma_fonction(n)
.
Tester si ce code vérifie les recommandations de la PEP8 à partir du site en ligne : Python 3 Style Checker for beginners
Donnez le code modifié en sorte que les recommandations de la PEP8 soient respectées sous le nom d'un programme nommé PEP8.py
.
La documentation du code python
La PEP257 définit une convention nommée docstring, qui permet de définir la manière de documenter les fonctions en Python.
Les docstrings sont des chaînes de commentaires qui doivent être placées juste en dessous des définitions de fonction ou de classe, ou bien tout en haut d'un module.
L'intérêt, c'est que les docstrings sont récupérables dynamiquement via l'attribut __doc__
, ou grâce à la fonction primitive
Voici un exemple de fonction Python documentée en utilisant les docstrings.
def maFonction(a, b):
"""
Cette fonction est une fonction de test
Elle sert a calculer a + b
:param a : Valeur 1
:param b : Valeur 2
:return : Somme des Valeur 1 et Valeur 2
"""
return(a + b)
print(maFonction(1, 2))
Editez ce programme sous Repl.it, exécutez.
Saisissez dans la console de Repl.it, les commandes suivantes et observez les résultats obtenus :
help(maFonction)
print(maFonction.__doc__)
Vous devez écrire le code d'une fonction Python nommée liste_diviseurs_entier(n)
qui :
n
passé en paramètre.Ecrivez le code de cette fonction et sauvegardez le fichier sous le nom docstrings.py
.
Pour valider un programme informatique, il est important de prévoir de nombreux tests. On peut réaliser ces tests manuellement et au coup par coup.
Mais il existe des bibliothèques de tests dits unitaires plus performants en Python (et dans de nombreux autres langages d'ailleurs).
Les deux bibliothèques Python les plus connues sont doctest
et pytest
.
Nous allons étudier doctest
dans ce TP.
doctest
import doctest
def ma_fonction(a, b):
"""
Cette fonction est une fonction de test
Elle sert a calculer a + b
:param a : Valeur 1
:param b : Valeur 2
:return : Somme des Valeur 1 et Valeur 2
>>> ma_fonction(1,2)
3
"""
return a + b
doctest.testmod()
Explications :
doctest
au début.
>>> ma_fonction(1,2)
3
La première ligne commence par les 3 chevrons >>> de la console Python et on appelle la fonction testée avec un jeu de test : ici les valeurs 1 et 2 pour a et b.
La deuxième ligne donne le résultat attendu tel qu'il serait affiché après l'éxécution de la ligne de code ma_fonction(1,2)
dans la console Python.
testmod()
avec la ligne de code doctest.testmod()
.
Il est bien sûr recommander de prévoir plusieurs jeux de tests pour chaque fonction de vos programmes Python.
Il n'est plus nécessaire si on utilise cette bibliothèque de tests unitaires de "truffer" son programme d'instructions print()
pour tester les fonctions développées.
Il est même recommandé de prévoir les jeux de tests de chaque fonction d'un programme avant d'avoir écrit le corps de ces fonctions.
Voici écrit en pseudo-code la fonction qui permet de rendre la monnaie pour un distributeur de boissons (vous avez étudié cet algorithme en classe de Première).
fonction rendu_pieces(somme,S) ind = 0 pieces_rendues = liste vide tant que somme est différent de 0 Faire tant que S[ind] <= somme Faire ajouter S[ind] à la fin de pieces_rendues somme = somme - S[ind] si somme est différent de 0 alors si ind = longueur(S) - 1 alors Retourner "Rendu impossible" sinon ind = ind + 1 retourner pieces_rendues
Les paramètres d'entrée de la fonction rendu_pieces
sont :
somme
: la somme à rendre;S
: un tuple contenant les différentes pièces du système monétaire triées par ordre décroissant.Exemple :
rendu_pieces(19,(500,200,100,50,20,10,5,2,1))
retourne [10, 5, 2, 2]
Comment se nomme ce type d'algorithme étudié en Première.
Vous devez écrire le code de cette fonction en Python :
doctest
.Vous sauvegardez votre programme Python sous le nom rendu_pieces.py