L'interpréteur Python

Notion de machine informatique

Il faut comprendre l'expression machine informatique comme un concept théorique qui permet de saisir les principes de fonctionnement aussi bien d'une machine physique (ordinateur au sens large) que d'un programme particulier qui s'éxécute sur une machine physique.

  • Une machine informatique est reliée au monde extérieur à travers des canaux de communication qui permettent l'échange d'information.

  • Ces informations se présentent sous la forme de flux de caractères.

  • Pour une machine physique l'alphabet contient seulement deux caractères désignés conventionnellement par 0 et 1 et propagés par des signaux physiques dont la nature exacte n'importe pas pour notre propos.

  • On distingue les flux d'entrée et les flux de sortie. Les flux d'entrée provoquent des modifications de l'état de la machine et induisent l'émission de flux de sortie d'une façon totalement déterministe selon des règles propres à la machine.

  • Pour les êtres humains, les flux de caractères ont une signification. Ils représentent une information (image, son, ordre de mouvement du bras d'un robot, ...).

  • Le lien entre une information (la chanson Perfect Day de Lou Reed) et la suite de caractères (le texte) qui la représente est totalement arbitraire. Ce lien s'appelle le codage de l'information. Il faut connaître les règles du codage pour interpréter correctement la signification du texte. Le texte seul n'a aucune signification en soi.

  • Pour les êtres humains, une machine informatique lit des informations sur des canaux d'entrée, traite cette information, et écrit de nouvelles informations sur des canaux de sortie. Il y a une logique entre les informations qui sont lues et celles qui sont écrites. Cette logique a été implémentée par l'être humain qui a créé cette machine informatique. Cette logique est appelée l'algorithme de la machine.

L'interpréteur Python

  • L'interpréteur Python est un programme qui peut être installé et ensuite exécuté sur un ordinateur. L'interpréteur Python est donc une machine informatique.

  • Le comportement de l'interpréteur Python n'est pas figé dans le marbre. Il s'agit d'une machine informatique programmable. Son comportement est décrit dans un texte qui suit des règles de syntaxe précises. L'ensemble de ces règles constitue le langage Python. Un texte qui s'y conforme est appelé un programme Python.

  • L'interpréteur Python lit le flux d'entrée qui contient le texte du programme et exécute les actions décrites dans ce texte.

  • Une action élémentaire de l'interpréteur consiste :

    • à lire un certain flux d'entrée,
    • ou bien à écrire sur un certain flux de sortie,
    • ou bien à changer son propre état interne.
  • Le pouvoir expressif du langage Python confère à l'interpréteur Python la qualité de machine informatique programmable universelle. L'interpréteur Python peut se comporter comme n'importe quelle machine informatique particulière. Il suffit pour cela d'écrire le programme Python qui permet de simuler ce comportement.

Les deux modes de l'interpréteur Python

Lorsqu'on exécute l'interpréteur Python on lui indique généralement le fichier qui contient le texte du programme Python. Par exemple, pour invoquer l'interpréteur à partir du shell on saisira dans le terminal :

$ python3 racine.py 47

L'interpréteur lit le contenu du fichier racine.py et s'attend à y trouver un texte écrit dans le langage Python. Il exécute alors les instructions de ce texte, ce qui peut le conduire à lire les caractères 47 si le texte le prévoit. Cette façon d'invoquer l'interpréteur est appelée le mode script. Le script est le fichier qui contient le programme python.

Il est également possible d'exécuter l'interpréteur Python sans lui donner de programme.

$ python3

L'interpréteur entre alors dans le mode interactif. Il affiche les caractères >>> pour indiquer qu'il attend une instruction. Il faut alors saisir un court texte qui respecte la syntaxe du langage Python. L'appui sur la touche ENTRÉE provoque l'interprétation du texte.

Les concepts de l'interpréteur Python

La communication avec un autre suppose que l'on partage des concepts en commun et que l'on dispose d'un langage pour véhiculer ces concepts. Si le langage est suffisamment expressif, il peut permettre d'enrichir l'ensemble des concepts partagés. Il faut cependant qu'il existe au départ de concepts primitifs pour amorcer la pompe.

Pour tous les concepts manipulés par l'interpréteur Python, il convient de bien distinguer :

  • la manière dont nous désignons ce concept dans un programme Python.
  • la façon dont l'interpréteur Python mémorise ce concept en interne.
  • lorsqu'il est en mode interactif, la forme sous laquelle l'interpréteur nous restitue le concept.

En interne, l'interpréteur Python manipule des valeurs. Toute valeur appartient à un certain type. Un type correspond à un concept.

Les types primitifs de l'interpréteur Python

Le type int

Dans un programme Python un entier est représenté par son écriture en chiffres décimaux : 42. Il est cependant possible de désigner un entier par son écriture en base deux : 0b101010, ou bien également en base seize : 0x2A. En interne, l'entier est représenté en base deux avec une convention particulière pour les entiers négatifs. En mode interactif, l'interpréteur nous restitue un entier selon son écriture décimale.

Le type float

La nature discrète c'est-à-dire non continue des ordinateurs ne leur permettent pas de représenter de façon exacte l'ensemble des nombres réels. Seul un sous-ensemble fini des réels est représentable. Ces réels sont appelés les nombres flottants.

Exemples de notations pour désigner un flottant dans un programme Python :

3.14    3.0    1e18    5.2e-12

Le type bool

Un booléen représente une valeur de vérité qui peut signifier soit vrai soit faux. Pour l'interpréteur Python il s'agit d'un type qui ne possède que deux valeurs distinctes. Dans un programme Python ces valeurs sont désignées par True et False.

Le type str

Le concept de texte est aussi un concept primitif de l'interpréteur Python. Comment désigner un texte dans un programme Python ? Comment désigner par exemple le texte formé des quatre chiffres 1234 ? Il faut en particulier le distinguer de l'entier 1234. La solution retenue est d'encadrer le texte par des guillemets simples '1234' ou doubles "1234".

Le type list

Une valeur de type list est une valeur container. C'est une liste ordonnée de plusieurs valeurs. Des crochets permettent de désigner une valeur de type list dans un programme Python :

[2, 3, 5, 7, 11]    [3.14, "bonjour", 42, True]    []    [1e4]

Opérations sur les valeurs

Une opération est un calcul effectué sur une ou plusieurs valeurs et dont le résultat est une valeur. Les opérations possibles dépendent du type des valeurs. Voici quelques exemples :

2 + 2           9 - 2           3 * 6           17 // 5         17 % 5         2 ** 3
3.14 + 1.3      8.2 - 3         5.2 * 2e6       17 / 5          2.5 ** 0.5
True and True          True and False       True or False       not True
2 == 3          2 == 2.0        "bonjour" != "hello"            True != False
2 > 3           2 <= 2          1e-3 < -1      "bonjour" < "hello"         1 < 2 < 3 
"hello" + "bonjour"             "hello" * 3
"hello"[0]     "hello"[1]       "hello"[-1]
['hello', 36, False][0]         ['hello', 36, False][1]

Pour plus de détails, voir ici.

Les liaisons nom-valeur

Une valeur peut être liée à un nom. Ceci permet de mémoriser cette valeur pour un usage ultérieur. Dans un programme Python une liaison est réalisée en écrivant l'instruction :

<nom> = <expression>

Le texte situé à gauche du caractère '=' doit être un nom valide, c'est-à-dire une suite de caractères parmi les lettres, les chiffres et le caractère '_', avec la restriction supplémentaire que le premier caractère ne doit pas être un chiffre. Le texte situé à droite du caractère '=' doit être une expression Python valide.

Lorsque l'interpréteur Python exécute l'instruction, il évalue tout d'abord l'expression puis il associe la valeur de l'expression au nom. Ce type d'instruction est appelée une affectation. Les affectations modifient l'état de l'interpréteur.

Fonctions

La notion de fonction est un concept mathématique. Par exemple, la fonction carré est le concept d'association entre un nombre et le produit de ce nombre par lui-même. Ce concept peut être représenté par l'écriture :

$$x\longrightarrow x\times x$$

L'interpréteur Python peut manipuler le concept de fonctions. La notation lambda permet de désigner une fonction dans un programme Python. La fonction carré peut ainsi être désignée par le texte :

lambda x : x * x

L'évaluation de cette expression crée une valeur de type function. Comme toute valeur, celle-ci peut être liée à un nom :

carre = lambda x : x * x

La principale opération que l'on peut effectuer sur une valeur de ce type est de calculer la fonction sur une autre valeur appelée argument :

carre(5)

On construit ainsi une nouvelle valeur (ici bien sûr 25).

De nombreuses fonctions préexistent déjà dans des modules que l'on peut importer. Par exemple, pour importer le module math on écrit dans le programme Python l'instruction :

import math

Les fonctions disponibles dans le module sont alors accessibles en les prefixant par math. Par exemple math.cos pour la fonction cosinus.

Des fonctions, appelées built-in, sont disponibles au démarrage de l'interpréteur sans qu'il soit nécessaire de les importer explicitement. Par exemple len, sum, abs, max, min, round.

La liste complète des fonctions built-in peut être consultée ici.

Actions sur les valeurs

Il est possible d'exécuter des actions spécifiques sur des valeurs. Les actions possibles dépendent du type de la valeur. Exemples :

  • "hello".upper() Convertit les lettres minuscules en majuscules
  • "11 septembre 2016".split() Produit une liste de mots

Ces actions ressemblent fortement à des fonctions avec une syntaxe particulière.