Introduction à Python.

Pour un premier article concernant l’informatique, il me semble opportun de commencer par Python. D’abord, parce que la syntaxe de ce langage est simple et convient à des programmeurs débutants. Ensuite, parce que cette simplicité ne grève aucunement les possibilités offertes. Enfin, parce que justement, les possibilités sont très nombreuses et dans des domaines d’applications très différents (Web, jeux vidéo, applications scientifiques, science des données…).

Je vais donc ici aborder les points les plus importants à connaître lors des premiers contacts avec ce langage. Cette introduction est à destination des débutants en python, qui connaissent tout de même des rudiments d’algorithmie et dans un second temps, de langage objet. si vous vous sentez en terre inconnue, laissez un commentaire en décrivant votre difficulté ou en posant votre question, j’y répondrai.

Les captures d’écran sont issues d’une formation que j’ai donnée il y a quelques années en utilisant la version 3.3, un peu ancienne aujourd’hui, de Python. Mais les instructions et les principes sont parfaitement valables pour la version actuelle (3.9).

Tous les fichiers d’exemple sont téléchargeables, les liens sont dans le corps de l’article. Afin d’être le plus accessible, cet article se basera sur une installation sous Windows, ce qui n’aura d’importance que pour l’installation et le lancement.

Installation, lancement et premiers pas.

Allez, on plonge! Et on commence par l’installation: Python est un langage qui fonctionne sur Linux, Windows, et Mac OS notamment. La procédure d’installation est décrite ici. Mais, si vous avez pas envie de lire la page en anglais, vous pouvez aussi télécharger directement python ici et lancer l’installation en suivant en double-cliquant sur le fichier téléchargé (le lien concerne la version Windows, pour Linux c’est tout simple avec le gestionnaire de paquets de votre distribution favorite et pour Mac OS je vous laisse vous pommer tout seul).

Une fois python installé, vous avez deux possibilités (voir captures d’écran ci-dessous): Soit lancer IDLE, ou Python lui-même, soit passer par l’invite de commandes et lancer « python ».

Voilà, nous sommes prêts à commencer. Un programme informatique passe une grande partie de son temps à manipuler des valeurs (des chiffres à ajouter, des caractères à afficher …). Ces valeurs sont stockées dans des « variables » (dans la capture suivante, n1 , msg , n2 sont les variables et 4, 7, « Coucou » sont les valeurs prises par ces variables). Comme on ne peut pas, par exemple, ajouter des chaînes de caractères et des entiers ces variables sont « typées » implicitement par le langage.

Ce typage implicite signifie deux choses: Une fois que vous assignez une valeur à une variable, elle est considérée comme appartenant à un type (entier, chaîne de caractères dans notre exemple) et doit se conformer à ce qu’il est possible de faire avec ce type (par exemple, on ne peut pas ajouter une variable de type entier et une variable de type caractère). La seconde chose, qui donne son nom « implicite » à ce typage, est que vous n’avez pas besoin de déclarer de quel type est une variable, python l’affecte automatiquement (« implicitement ») au bon type en fonction de ce que vous y stockez. Ce qui n’est pas le cas pour d’autres langages comme le C par exemple.

Concrètement, voilà ce que ça donne:

Ce typage est qualifié de « dynamique » puisque vous pouvez, comme dans la capture ci-dessus, changer « à la volée » le contenu d’une variable avec un contenu d’un type différent et python adaptera le type de la variable elle-même à son nouveau contenu.

Les bases des chaînes de caractères

Les chaînes de caractères sont comme des tableaux, que l’on peut manipuler en indiquant à quel élément du tableau nous souhaitons accéder. Voici quelques manipulations de chaînes de caractères, dans la capture en dessous.

Charger des fichiers, utiliser des fonctions

Le module introduction est téléchargeable ici.

Dans un « shell » (une invite de commandes) aussi bien que dans un programme python, il est possible d’importer un autre programme, on parle alors plus volontiers de « module ». Ici, le module introduction (son nom complet est introduction.py) est chargé dans le shell par l’instruction « import introduction », en omettant l’extension .py du module. En suivant ce chargement, nous avons accès à toutes les fonctions définies dans le module dit.

Mais, qu’est-ce qu’une fonction déjà? Ici, la fonction « fonction_intro » sera notre exemple. Une fonction est un ensemble d’instructions qui seront exécutées par le programme lorsque la fonction, justement, qui les contient sera elle-même appelée. Cela évite d’avoir à répéter, dans le code, une suite d’instruction dont on se sert souvent. On définit cette suite d’instruction une bonne fois, on la met dans une fonction et lorsqu’on en a besoin, on appelle simplement cette fonction. Ici, fonction_intro comprend deux instructions: on affecte un contenu à une variable puis on affiche la dite variable. Cette fonction est reconnue en tant que telle grâce à trois éléments:

  • le mot-clé « def » précédent son nom
  • les (): suivant son nom (nous verrons plus tard le rôle de ces parenthèses)
  • les indentations (espaces blancs) précédant les instructions qui composent la fonction elle-même

L’accès à cette fonction se fait par un appel utilisant le_nom_du_module ». »le_nom_de_la_fonction. Nous voyons que si le com du module est omis, la fonction n’est pas reconnue. Il y a des moyens de faire différemment, mais nous ne les aborderons pas dans un article d’introduction.

Structures conditionnelles

Le module « iffor » est téléchargeable ici.

C’est ici que les rudiments d’algorithmie que j’évoquais en introduction vont devenir utiles. Si vous ne savez pas ce que sont des boucles ou des structures conditionnelles, ce qui suit risque de vous demeurer obscur. Dites-le dans les commentaires si vous voulez un article sur la question. Si vous êtes à l’aise avec ça, ou que vous n’avez même pas peur, on continue.

Il faut noter, comme spécifié sur la capture ci-dessus, que les indentations font partie du langage. Si vous indentez (« alignez ») incorrectement vos blocs, python les considérera comme appartenant à un bloc différent. Suivant les cas, cela créera une erreur (pas trop grave, on corrige) ou bien une confusion avec un bloc différent (beaucoup plus désagréable à détecter et corriger). Vous pouvez essayer en alignant les « print » sous les « if » dans l’exemple ci-dessus, vous verrez tout de suite.

Ce comportement est parfois considéré comme une faiblesse du langage, je fais partie de ceux qui pensent que c’en est une force. En effet, lire un code mal indenté est désagréable, difficile et source d’erreurs. Avec python, ce risque-là disparaît par nature puisqu’un code mal indenté ne fonctionne pas.

le module bouclefor est téléchargeable ici.

D’autres types de données

Commençons par les listes. Elles sont déclarées en utilisant les crochets: maliste = [] crée une liste vide. Elles peuvent contenir des éléments hétérogènes (des listes mêlant booléens, chaînes de caractères, entiers etc. sont possibles). L’instruction « sort » permet de les trier, mais exige alors des listes homogènes. Les listes sont modifiables, on peut ajouter des éléments, les réorganiser, les supprimer.

Les tuples ne sont pas modifiables, illustration:

Les dictionnaires sont probablement, pour moi en tout cas, le type de données le plus génialement chouette de l’univers connu. Comme leur nom l’indique, ils agissent comme des entrées (des clés, « key » du point de vue de certaines opérations techniques en python) liées à des contenus (des valeurs, « values »).

Ici on déclare trois clés, trois contenus de type différent (char, float, list). Le module « ptilarousse » est téléchargeable ici.

Notez la facilité de parcours du dictionnaire: « for cle in dico ». Tant qu’il y a des clés à explorer, on les explore. la fonction str(x) prend le contenu de x et le trasforme en châine de caractères (sinon, le contenu de la clé « pi » qui vaut 3.14 ne pourrait pas être affiché dans l’instruction print telle qu’elle est employée dans notre exemple).

Arguments de fonctions, accès aux fichiers

Python utilise la fonction open() pour accéder aux fichiers sur disque. Cette fonction prend des arguments, c’est-à-dire des indications sur son comportement et sur les « valeurs d’entrée » de la fonction. Ces arguments sont définis à l’intérieur des parenthèses suivant le nom de la fonction (je vous avais bien dit qu’on y reviendrait!) et passés lors de l’appel à la fonction.

Pour la fonction open(), les paramètres sont le nom du fichier à ouvrir et le mode d’ouverture. Il y a plusieurs modes d’ouverture, les plus communs sont:

  • w -> Ecriture. On accède aux droits en ecriture sur le fichier, et les écritures effaceront le contenu précédent du fichier.
  • a -> « append », on ajoute au contenu du fichier ce que l’on y écrit.
  • r -> lecture, on a uniquement le droit de lire dans le fichier.

Ces droits peuvent se cumuler, par exemple ‘wr’ donne les droits en lecture et en écriture.

La fonction « write » prend en argument une chaîne de caractères et écrit dans le fichier cette chaîne. Mais, on voit que le fichier dans lequel écrire n’est pas indiqué dans les arguments de la fonction. Alors, comment sait-on dans quel fichier on écrit? La réponse est toute simple.

Lors de l’appel à la fonction open, on affecte le résultat de cette ouverture à une variable (« f » dans l’exemple). Puis, c’est en passant f.write() que la fonction « write » sait dans quel fichier elle doit écrire: dans « f », qui est ce que l’on appelle un « handler ». Nous avons déjà utilisé ce mécanisme en appelant les fonctions d’un module, et nous allons les généraliser lors de notre passage à la programmation objet. C’est le même mécanisme qui est utilisé lors de l’appel à f.close() qui ferme le fichier dont le handler est « f ».

Le module « litfichier » est disponible ici.

Outre les différents droits d’accès (lecture, écriture…), il est également possible de parcourir le fichier suivant différentes modalités.

  • Pour lire d’un seul coup toutes les lignes, on fait appel à la fonction « readlines ». Toujours à partir du handler retourné par la fonction open. Cette fonction retourne une liste de valeurs, dont chaque élément est une ligne du fichier. Il faut ensuite parcourir la liste pour avoir accès aux lignes.
  • Pour lire le fichier ligne par ligne, on utilise « readline » (sans « s »). Chaque appel à readline fait passer à la ligne suivante.
  • On peut aussi passer par une boucle « for » sur le même principe que celui utilisé pour parcourir un dictionnaire.

Python objet

La dernière partie de cet article de découverte de python porte sur les concepts objet. Le but de cet article n’est pas de présenter les différents concepts (héritage, ploymorphisme, surcharge, constructeurs…) mais de voir comment les utiliser en python. Si ces concepts ne vous sont pas familiers et que vous voulez des explications, n’hésitez pas à utiliser les commentaires en fin d’article.

Les différents fichiers présentant les fonctionnalités sont téléchargeables ici, , et encore ici.

Nous commençons par un cas classique d’héritage. On définit de quelle classe (« classe parente ») hérite une classe (« classe héritière ») en passant la classe dont on hérite en argument de la seconde classe (« l’héritière »). Un de moyens d’exprimer le polymorphisme est simplement de redéfinir une méthode (rappel: en concepts objets, les fonctions définies à l’intérieur des classes sont appelées « méthodes »).

Le constructeur d’une classe est défini par la méthode __init__ (self):

Le « self » est un mot-clé renvoyant vers les valeurs prises dans l’instanciation de l’objet en cours d’utilisation, pas vers la classe à partir de laquelle il est instancié.

Il est possible de faire de l’héritage multiple, et ainsi d’avoir accès aux méthodes de toutes les classes dont on hérite. Mais attention dans ce cas, l’ordre dans lequel sont indiquées les classes dont on hérite n’est pas neutre: on ne passe que dans le premier constructeur rencontré.

Voilà pour cet article présentant rapidement les bases du langage python, s’il y a des points que vous aimeriez éclaircir ou des concepts sur lesquels vous voudriez des précisions, n’hésitez pas à le dire en commentaires.

Amusez-vous bien!