
Dans cette leçon vidéo, l'instructeur explique le concept de module en Python, pourquoi ils sont utiles pour réutiliser du code à travers plusieurs fichiers, et décrit les trois catégories de modules : les modules natifs (standard library), les modules tiers disponibles sur le web, et les modules personnalisés créés par l'utilisateur. Il montre comment importer un module avec les différentes syntaxes (import, from … import, alias avec as) et comment n'importer que les fonctions nécessaires. Des exemples concrets sont présentés : utilisation du module natif random pour générer des nombres aléatoires et créer un code de six caractères majuscules via les codes ASCII, utilisation du module math pour sqrt et log10, et inspection du chemin de recherche des modules grâce à la variable d'environnement PYTHONPATH et au module sys. L'instructeur décrit ensuite la création d'un module personnalisé (monmodule.py) contenant les fonctions sep et Note, son importation dans le script principal, et l'usage d'un alias pour raccourcir le préfixe. Enfin, il rappelle que les modules tiers s'installent en suivant leur documentation. La vidéo se conclut par une invitation à la prochaine leçon.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon sur le langage de programmation Python. Aujourd'hui, nous allons voir les modules. Dans la leçon consacrée aux fonctions, nous avons vu que ces dernières permettent de factoriser un code redondant dans le programme. Par conséquent, les fonctions permettent de réutiliser à la demande un même code plusieurs fois dans un même programme, ce qui réduit la taille de celui-ci, le rendant ainsi plus clair et lisible. En plus, si on souhaite modifier le comportement de ce code-là, on sera tenu de le faire dans un seul endroit qui est le corps de la fonction. Ainsi, ces changements s'étendront automatiquement à tous les endroits où on l'a appelée. Or, un projet de développement est très souvent constitué de plusieurs fichiers qui contiennent du code. Dans notre cas, il s'agit du code Python, ce qui sous-entend qu'on aura peut-être besoin de réutiliser une même fonction dans d'autres fichiers et non pas seulement dans le fichier où il a été déclaré. Afin d'éviter de redéfinir la même fonction dans les autres fichiers, on va plutôt faire appel au module. La notion de module est présente dans la plupart des langages de programmation, mais avec des noms différents, c'est-à-dire qu'elles servent à faire la même chose: rendre un code accessible dans tout le projet afin de le réutiliser à la demande. Un module n'est rien d'autre qu'une collection de variables et fonctions déclarées dans un fichier séparé. Ce fichier-là sera ensuite invoqué dans d'autres fichiers qui contiennent le code principal. Et qui aura accès à toutes les variables et fonctions du module. En Python, on peut distinguer 3 catégories de modules: D'abord, il y a les modules natifs au langage, c'est-à-dire qu'ils sont présents par défaut dans le langage Python mais qu'ils ne sont pas chargés automatiquement, donc c'est à nous de le faire au besoin. On va voir des exemples juste après. Il y a aussi les modules développés par d'autres personnes et rendus accessibles sur le web. Ces modules sont souvent hébergés dans des serveurs appelés des dépôts Ou les Processories. Donc, au lieu de recoder la même chose, on pourrait télécharger ces modules-là et les réutiliser dans notre projet si on veut. Ces modules sont souvent accompagnés de documentation afin de savoir comment les utiliser. Enfin, il y a les modules personnalisés et sur mesure, que nous développons nous-mêmes selon notre besoin spécifique. Sachez que quelle que soit la catégorie à laquelle appartient le module, il est invoqué et utilisé de la même façon. Imaginez que dans notre code, nous avons besoin de générer des nombres aléatoires afin de produire un mot de passe ou un code de sécurité, ou simplement pour développer un petit jeu de hasard. En Python, il existe un module natif appelé random. Ce module permet de générer tous les types de nombres aléatoires entiers ou réels. À titre d'info, on parle dans ce cas de nombres pseudo-aléatoires et non pas de nombres aléatoires. Je ne vais pas entrer dans les détails qui nécessitent d'invoquer des concepts un peu avancés. Mais dites-vous que du moment où vous voulez générer un nombre aléatoire pour votre programme, n'hésitez pas à invoquer ce module. Pour charger le module, on utilise le mot-clé import suivi du nom de celui-ci. Désormais, toutes les fonctions incluses dans ce module sont disponibles dans le programme et on peut les appeler à volonté. Par exemple, la fonction qui génère un nombre aléatoire entier s'appelle randint. Il y a aussi la fonction randrange, mais dont l'usage est légèrement différent. Donc on va surtout utiliser randint. randint accueille 2 arguments qui délimitent l'intervalle des nombres que l'on veut générer. Par exemple, l'intervalle signifie que les nombres qui pourraient être générés aléatoirement sont 1, 2, 3 et 4. Donc les extrémités de l'intervalle sont incluses aussi. Notez qu'il faut appeler la fonction à travers le module importé comme ceci. Si on veut générer un nombre aléatoire réel alors on fait appel à la fonction random, sans argument, qui produit un nombre compris entre 0 et 1. Notez que 1 est exclu. Ou bien la fonction uniform qui accueille 2 arguments qui marquent l'intervalle. Figurez-vous qu'il reste encore plein de fonctions disponibles dans le module random, et elles ont toutes été chargées lors de l'importation de ce module-là. Afin d'optimiser le programme et n'importer que les fonctions dont on a vraiment besoin, Alors on spécifie l'instruction d'importation comme ceci. Cela indique explicitement à l'interpréteur qu'il doit charger uniquement la fonction randint présente dans le module random. Pour utiliser la fonction, on invoque cette fois son nom sans la préfixer par le nom du module. Si en plus vous voulez importer la fonction uniforme, alors on va juste la spécifier aussi, en séparant les fonctions par une virgule. Faisons un exemple sur la génération d'un code aléatoire constitué de 6 caractères alphabétiques majuscules. Il y a de nombreuses méthodes pour faire ceci, mais je vais opter cette fois pour l'utilisation du code ASCII. On commence par importer la fonction randint du module random. On initialise la variable identifiée par code avec une chaîne vide. C'est cette variable qui contiendra notre code final constitué de 6 caractères. On programme une boucle qui s'exécute 6 fois. Ensuite, on affecte par concaténation une lettre aléatoire à la variable code. Notez qu'on va générer un nombre aléatoire compris entre 65 et 90. Cela représente l'intervalle des codes ASCII de l'alphabet majuscule. Je vous renvoie vers ma vidéo sur le code ASCII pour plus de détails. Le code ASCII généré aléatoirement sera passé comme argument à la fonction chr qui retourne le caractère associé. En guise de rappel, si vous voulez faire l'inverse, c'est-à-dire connaître le code ASCII associé à un caractère, alors on utilise la fonction ord. À la fin de la boucle, on aura notre code qu'on va simplement afficher. Bien sûr, à chaque exécution on aura un code différent. L'un des modules les plus utilisés aussi s'appelle math. D'après son nom, il fournit la liste de fonctions mathématiques usuelles. Par exemple, si on veut calculer la racine carrée d'un nombre, on fait appel à la fonction sqrt du module math. Si on veut calculer le logarithme de base 10, on invoque la fonction log10, etc. Bien entendu, on aurait pu importer seulement les 2 fonctions voulues au lieu d'importer le module entier. Il existe d'innombrables modules natifs en Python, et tout ce que vous avez à faire, c'est voir la documentation si vous cherchez un module particulier. Vous vous demandez peut-être comment l'interpréteur connaît l'emplacement où se trouvent les modules que l'on souhaite charger. En effet, c'est grâce à une variable nommée PYTHON_PATH. Cette variable n'est pas une variable ordinaire comme celles que nous utilisons dans nos programmes. Mais il s'agit d'une variable d'environnement utilisée par l'interpréteur, aux côtés d'autres variables d'environnement bien entendu, afin de lui renseigner des informations sur l'environnement d'exécution comme le chemin qui contient les modules dans notre cas. Vous aurez l'occasion de voir la notion de variables d'environnement dans d'autres langages de programmation ou même des systèmes d'exploitation. Pour ma part, je leur ai consacré une leçon dans la série où j'ai traité le langage PHP. Pour avoir une idée sur le ou les chemins susceptibles de contenir les modules, on va faire appel à un module système nommé sys. On affiche la variable PYTHON_PATH abrégée simplement en PATH comme ceci. On obtient une liste qui contient tous les chemins possibles, c'est-à-dire les chemins qui seront explorés par l'interpréteur un à un jusqu'à ce qu'il trouve le module à invoquer. On affiche ces chemins dans des lignes à part avec la méthode join, ou par des itérations si vous voulez. Maintenant, imaginez que l'on veut créer notre propre module. Là non plus, il n'y a rien de sorcier. On commence par créer un fichier Python que j'appellerai monmodule.py. Il s'agit d'un programme Python, donc il faut que l'extension soit correcte. Pour simplifier, j'ai enregistré ce fichier dans le même emplacement que le programme principal. Dedans, nous allons définir une première fonction nommée sep qui va simplement tracer un séparateur qui est une forme de trait constitué de tirets. Maintenant, on va se rendre dans le programme principal et on invoque notre module. Il s'agit simplement du nom du fichier qui contient notre fonction sans l'extension .py. Puis on appelle la fonction sep exactement comme on l'a fait pour les modules natifs. Ajoutons une autre fonction à notre module. On l'appellera Note. Il va par exemple retourner la chaîne de caractères qui lui est passée en argument en majuscule et placée entre deux parenthèses. Dans le programme principal, on va appeler la fonction Note en lui passant une chaîne de caractères de notre choix. Donc, vous avez vu qu'il s'agit d'une opération très simple, et on peut bien entendu spécifier juste la fonction que l'on veut appeler au moment de l'importation au lieu d'importer le module entier. Exactement comme pour les modules natifs. Or, vous avez probablement remarqué que le nom de notre module est un peu long, donc le fait de le placer comme préfixe de nos fonctions peut sembler un peu fastidieux. Heureusement, il est possible de renommer le module au moment de l'importation à l'aide du mot-clé as comme ceci: Dans ce cas, bien que le fichier qui contient notre module s'appelle MonModule, au moment de l'exécution du programme principal, nous avons demandé à l'interpréteur de le charger sous un autre nom, qui est M dans notre cas. Il faut par conséquent remplacer les préfixes MonModule par M et le tour est joué. Concernant les modules développés par d'autres programmeurs et que l'on souhaiterait utiliser dans notre projet, la méthode est la même. Il faudra juste télécharger ces modules-là en suivant les consignes qui se trouvent dans leur documentation. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









