Bases de programmation et du langage python

Auteurs :
  • François Brucker
  • Pierre Brucker

Nous montrerons dans ce cours les bases du codage en utilisant le langage de programmation python dont le site est : https://www.python.org/

Nous verrons comment est structuré un langage informatique et comment écrire puis exécuter du code.

Ce n'est pas un cours d'informatique proprement dit, nous ne ferons quasiment pas d'algorithmie par exemple et il n'y a aucun prérequis informatique à avoir. Le but est de pouvoir exécuter (de la façon la plus optimale possible) des lignes de code pour obtenir un résultat concret (qui n'aura souvent rien à voir avec de l'informatique).

Partie I : principes

Avant d'écrire des programmes en python, on commence par s'intéresser à ses mécanismes internes en comprenant ce qu'est une instruction python et ce que'on peut faire avec.

Écrire directement à l'interpréteur comme on l'a fait jusqu'à présent est faisable lorsque l'on a besoin de n'écrire qu'une ligne de python à la fois, mais lorsque l'on veut faire des choses plus compliquées comme créer des tests ou effectuer des boucles, il faut des outils plus perfectionnés.

Nous allons montrer deux outils pour faire cela : les notebooks et Spyder. Ce sont des solutions pratiques lorsque l'on veut exécuter rapidement un petit bout de code ou une série de bouts de codes plus ou moins indépendant : lorsque l'on utilise l'outil informatique pour faire des maths ou de la physique par exemple ; ou encore lorsque l'on fait de la data science.

Notebooks

C'est une manière plus conviviale que la console d'accéder à l'interpréteur python. L'utilisation des Notebooks est particulièrement adaptée pour rédiger et partager des comptes-rendus.

Spyder

Spyder est un éditeur lié à un interpréteur python. L'application est très utilisée lorsque l'on commence à apprendre la programmation. Et permet d'écrire des programmes tout en conservant un unique interpréteur accessible par une console.

TBD : un petit tuto.

Utiliser le module matplotlib

Installé avec la plupart des environnements fournissant un interpréteur, le module matplotlib est devenu un standard de fait (pour le meilleur et surtout le pire) pour représenter des graphiques.

Si vous avez le choix, je conseille plutôt d'utiliser le module seaborn pour dessiner vos graphique. Mais comme ce module est basé sur matplotlib, une connaissance minimale de matplotlib, comme le donne le tutoriel précédent est tout de même nécessaire.

Partie II : coder en python

Nous avons pour l'instant utilisé python pour exécuter des instructions ou des fonctions. Ceci permet déjà d'utiliser python mais va se révéler rapidement limitant lorsque l'on voudra effectuer des tâches plus complexes ou tout simplement non prévue par les modules.

Coder en python (ou en tout autre langage) ce cependant nécessiter des connaissances (un peu) plus poussées et des outils dédiées au code. Nous irons plus loin plus tard.

Installer et utiliser un interpréteur

Commençons par installer un interpréteur indépendant de l'application utilisée pour coder. Selon le système d'exploitation, la méthode d'installation est un peu différente :

sous Windows 11

Utilisez le Microsoft store.

sous Linux/Ubuntu

Python est installé par défaut, mais il ne contient pas le module pip permettant d'installer de nouveaux modules à python. Pour installer pip, tapez dans un terminal :

sudo apt install python3-pip

De plus, le python d'installé ne contient pas non plus le module Tkinter. Ceci pose des problèmes lorsque l'on veut utiliser le module turtle.

Pour installer une version de python avec Tkinter, tapez dans un terminal :

sudo apt install python3-tk

Enfin, la commande pour taper python est python3. Pour avoir le même comportement que sous windows où cette commande s'appelle juste python, vous pouvez installer :

sudo apt install python-is-python3

Vous pourrez uniquement taper python dans un terminal pour exécuter l'interpréteur python,

sous Macos

De même que sous Linux/Ubuntu, python est installé par défaut, mais pas le module Tkinter. Ceci pose des problèmes lorsque l'on veut utiliser le module turtle.

Il va falloir installer python avec brew puis. Dans un terminal tapez :

brew install python-tk

Enfin, la commande pour taper python est python3. Pour avoir le même comportement que sous windows où cette commande s'appelle juste python, vous pouvez taper dans un terminal :

echo "alias python=python3" >> ~/.zshrc

Une fois l'interpréteur installé, on va l'utiliser via un IDE. Il existe plusieurs choix possible, mais le plus utilisé actuellement est vscode :

Un interpréteur tout neuf vient presque nu. Il ne possède aucun des modules mis à disposition d'environnement tels que anaconda ou Spyder. Mais ce n'est pas grave, nous allons les installer nous même !

Structurer du code

Lorsque l'on veut plus que juste utiliser des méthodes et fonctions déjà existante, il faut structurer son code en parties utilisables indépendamment, que ce soit sous la forme de code (bloc, fonctions, modules).

Partie III : Conteneurs

Liste, ensembles et dictionnaire

Les conteneurs sont des objets contenant d'autres objets. Ils permettent de structurer ses données.

Mutable et non mutable

Les 5 type d'objets de base (int, float, complex, bool et str) sont non modifiables (python dira non mutables). Ceci signifie que les méthodes et opérations sur ces objets ne peuvent les modifier :

Les listes, ensembles et dictionnaires sont eux modifiables (python dira mutables), c'est à dire que leurs méthodes peuvent les modifier :

Il est crucial de comprendre cela car les variables ne sont que des associations à des objets, et plusieurs variables différentes peuvent être associée à un même objet. Vérifions cela avec la fonction id.

Si on crée deux listes, elles seront différentes, donc leur id le sera aussi, même si leur contenu est identique :

>>> x = [1, 2]
>>> y = [1, 2]
>>> id(x)
4381752640
>>> id(y)
4381751744

L'id sera certainement différent chez vous, mais les deux id seront différents.

En revanche, associer une liste à une variable ne change pas la liste :

>>> x = [1, 2]
>>> id(x)
4381803264
>>> y = x
>>> id(y)
4381803264

L'id sera certainement différent chez vous, mais il sera identique. Les variables x et y sont associées à la même liste :

>>> x.append('?')
>>> print(x)
[1, 2, '?']
>>> print(y)
[1, 2, '?']

En conclusion, il faut faire très attention lorsque l'on passe des listes en paramètres de fonction.

Si vous jouez avec la fonction id vous serez certainement surpris de constater que :

>>> x = 1
>>> y = 1
>>> id(x)
4378755312
>>> id(y)
4378755312

Ceci est une optimisation de l'interpréteur python. Comme les entiers sont non modifiables, on peut associer le même entier à plusieurs variables sans soucis.

La remarque précédente montre tout l'intérêt d'utiliser des objets non mutables. Il 'y aura jamais d'effet de bords lors de passage de paramètres. En revanche, à chaque modification, il faudra recréer un objet, ce qui peut être long. C'est un compromis à avoir : la sécurité vs la rapidité. C'est pourquoi par défaut :

Il existe des objets non modifiable pouvant être utilisé à la place des listes et des ensembles :

Il n'existe pas d'équivalent non mutable aux dictionnaires.

On peut alors utiliser des tuples et des frozenset comme éléments d'un ensemble ou comme clé de dictionnaires.

Par exemple l'ensemble de tous les sous-ensemble de ${1, 2}$ s'écrira :

>>> x = {frozenset(), frozenset([1]), frozenset([2]), frozenset([1, 2])}
>>> x
{frozenset(), frozenset({2}), frozenset({1}), frozenset({1, 2})}

Le tuple vide s'écrira (,) (ou tuple()) pour la différentier la notation () qui est la parenthèse vide.