Rappels de 1ère

En classe de première, nous avons vu l'import des modules et les docstrings, ce n'est pas pour rien que votre enseignant a insisté dessus... Revoyons cela en détail :

RappelLes fonctions

Il existe 3 types de fonctions :

  • les fonctions natives au langages Python, telles que print ou input, elles sont directement utilisables,

  • les fonctions personnelles que vous créez lorsque vous codez,

  • les fonctions développées et testées par différents programmeurs mais qui ne sont pas directement utilisables.

    Ces dernières fonctions, procédures ou encore classes (en POO) peuvent être regroupées par thèmes dans des fichiers séparés alors appelé module qui peuvent être groupés en packages.

Remarque

  • Les fonctions crées au sein de classes en programmation orientée objet deviennent des méthodes.

  • Il est possible d'écrire son propre module, ce que nous allons faire dans ce chapitre !

ExempleExemples de modules

  • le module math contient de nombreuses fonctions mathématiques usuelles comme la racine carrée (sqrt, round), ...

  • le module random contient de nombreuses fonctions modélisant le hasard comme l'obtention d'un nombre entier aléatoire compris entre deux nombres entiers a et b (randint(a,b)), ...

  • le module matplotlib.pyplot permet de réaliser des graphiques, des tracés de courbes, ...

RappelImportation des modules

Certains modules Python sont installés par défaut et d'autres peuvent être ajoutées en utilisant des outils comme pip. Le dépôt Pypi (Python package index) référence la plupart des modules tiers.

Voici les différentes variantes pour importer un module, notamment random.

Méthode 1 :

On importe le module random, les fonctions du module doivent être préfixées du nom du module :

1
import random
2
a = random.randint(1, 10)

Si on ne préfixe pas, voici l'erreur :

1
NameError: name 'randint' is not defined

Méthode 2 :

On importe le module random et on le renomme en rd (le nouveau nom donnée est généralement plus court) :

1
import random as rd
2
a = rd.randint(1, 10)

Méthode 3 :

On importe uniquement la fonction randint du module random, plus besoin de préfixe mais seule la fonction randint est disponible :

1
from random import randint
2
a = randint(1, 10)

On peut importer une ou plusieurs fonctions :

1
from random import randint, choice
2
a = randint(1, 10)
3
couleurs = ['bleu', 'vert', 'rouge']
4
b = choice(couleurs)

AttentionAttention à import *

Toutes les variantes contenant des * dans la ligne d'importation visent à rendre disponibles des fonctions sans avoir à les préfixer, ce qui peut paraître efficace pour le programmeur débutant.

En réalité, il n'en n'est rien : on ne maîtrise plus la liste exacte de ce qui est importé dans l'espace de noms principal, ce qui peut être source de bugs complexes à découvrir.

De plus, en reprenant plus tard son travail ou en le distribuant, on n'aura plus de trace simple de l'endroit où se trouvent les fonctions et classes utilisées, rendant la maintenance difficile.

import * est à bannir !

FondamentalLister toutes les fonctions d'un module

Une fois que vous avez importé le module, vous pouvez simplement faire :

help(nom_module)

... ce qui permet d'obtenir la documentation sur toutes les fonctions en même temps, de manière interactive.

On peut aussi utiliser :

dir(nom_module)

... pour lister simplement les noms de toutes les fonctions et variables définies dans le module.

La documentation

Mais comment est renseigné cette documentation ?

Que l'on écrive ou qu'on utilise une fonction ou un module, la documentation est centrale pour que le travail soit réutilisable.

Parmi les différents mécanismes, l'un des plus simple est la docstring qui peut être attachée à une fonction, à une méthode, à une classe, à un module ou à un package.

Dans tous les cas, c'est une chaîne de caractères qui doit figurer au début de l'entité qu'elle documente.

Cette documentation est ensuite consultable à l'aide de la commande help que nous avons vu au dessus.

ExempleUne docstring exemplaire

1
def somme_nb_entiers(n):
2
    """
3
    n - int, entier strictement positif
4
    Sortie: int - somme des n premiers entiers
5
    >>> somme_nb_entiers(0)
6
    0
7
    >>> somme_nb_entiers(1)
8
    0
9
    >>> somme_nb_entiers(4)
10
    6
11
    """
12
    somme = 0
13
    for i in range(n-1):
14
        somme = somme + i
15
    return somme