C7.1 : Lisibilité du code

Les bonnes pratiques

Généralités

■ Un code lisible

Un code bien lisible doit contenir :

  • - des commentaires (ni trop peu, ni trop !) ;
  • - des noms de variables, des noms de fonctions... qui aident à la compréhension du programme ;
  • - des annotations de type pour les fonctions ;
  • - des docstrings pour les fonctions, pour les classes, pour les modules...

■ Un code structuré

Dans l'idéal, le code doit être structuré avec des fonctions. L'idée directrice est :

une action cohérente = une fonction

Annotations de type

Les annotations de type (typing hints, en anglais) permettent à l'utilisateur d'une fonction de savoir quels sont les types des paramètres et quel est le type de la valeur renvoyée, et ce de façon concise en écriture.

Remarque : les annotations de type ont été introduites dans la versions 3.5 de Python et sont encore en évolution.

Exemple

def maxi(l:list) -> float:
    if l == []:
        return None
    else:
        nb_max = l[0]
        for i in range(1, len(l)):
            if l[i] > nb_max:
                nb_max = l[i]
        return nb_max

Docstrings

■ Emplacement des docstrings

Voici un exemple de code d'un module avec l'emplacement des docstrings :

"""
Docstring du module lorsque le module est importé dans un autre fichier.
"""

class MaClasse:
    """
    Docstring de la classe (avec les informations sur les paramètres du constructeur de la classe)
    """
    def __init__(self, args):
        pass

    def methode_de_maclasse(self, args):
        """
        Docstring de la méthode de classe
        """
        pass


def ma_function():
    """
    Docstring de la fonction
    """
    pass

■ Contenu de la docstring d'une fonction

Question 1 : Rappeler la structure de la docstring d'une fonction.

■ Utilisation d'une docstring

Question 2 : Comment peut-on, en ligne de commande, afficher le contenu de la docstring d'un module, d'une classe ou d'une fonction ?

Applications

Application 1 (sur papier)

Améliorer le code suivant :

def f(t):
    a = 0
    for i in range(len(t)):
        a = a + t[i]
    return a

Application 2 (sur papier)

Écrire le code de la fonction dont la docstring est la suivante :

'''
Calcule et renvoie la moyenne (avec deux chiffres après la virgule) des valeurs d'un tableau de nombres
Parameters:
    t : (list) Liste de nombres
Returns:
    (float) Moyenne arrondie à 2 chiffres après la virgule
'''

Application 3 (sur ordinateur)

Quels sont les premiers mots de la docstring du module random ?

Application 4

Améliorer la lisibilité du code ci-dessous (entre autre, en utilisant des fonctions).

Li = [[1, 1, 1, 0, 1, 1, 1], [1, 0, 1, 0, 0, 0, 1], [1, 0, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 0, 1, 1, 1], [1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 0, 1, 1, 1]]
for i in range(len(Li)):
    x = ""
    for j in Li[i]:
        if j:
            x = x + "• "
        else:
            x = x + "  "
    print(x)