Objectifs

Consignes

Présentation du code Python

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 :

Un premier programme

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 : pep8online

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 help(). Cela permet notamment de faire de la documentation autogénérée.

Voici un exemple définissant tous dans la fonction, son rôle, les entrées et la sortie.

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 :

Vous devez écrire le code d'une fonction Python nommée liste_diviseurs_entier(n) qui :

Ecrivez le code de cette fonction et sauvegardez le fichier sous le nom docstrings.py.

Tests unitaires en Python

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.

Un exemple d'utilisation de 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 :

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 :

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 :

Vous sauvegardez votre programme Python sous le nom rendu_pieces.py