Python: généralités

Les algorithmes

Commençons par la définition du dictionnaire Larousse:

Un algorithme est un ensemble de règles opératoires dont l’application permet de résoudre un problème énoncé au moyen d’un nombre fini d’opérations. Un algorithme peut être traduit, grâce à un langage de programmation, en un programme exécutable par un ordinateur

Il y a d’autres définitions! Voire par exemple https://www.scriptol.fr/programmation/algorithme-definition.php.

On peut citer les caractéristiques attendues d’un algorithme, d’après Donald Knuth:

  • Finitude: “un algorithme doit toujours se terminer après un nombre fini d’étapes
  • Définition précise: “chaque étape d’un algorithme doit être définie précisément; les actions à transposer doivent être spécifiées rigoureusement et sans ambiguité pour chaque cas.”
  • Entrées: “…des quantités qui lui sont données avant qu’un algorithme ne commence. Ces entrées sont prises dans un ensemble d’objets spécifié.
  • Sorties: “…des quantités qui ont une relation spécifiée avec les entrées.”
  • Rendement: “… toutes les opérations que l’algorithme doit accomplir, doivent être suffisamment basiques pour pouvoir être en principe réalisées dans une durée finie par un homme utilisant du papier et un crayon.

Les fonctions

La notion de fonction est fondamentale en algorithmique. Un algorithme consiste souvent en la mise en oeuvre coordonnée d’un certain nombre de fonctions simples.

Une fonction est un mécanisme qui à une valeur ou une séquence de valeurs (issues d’ensembles bien spécifiés) associe une valeur dans un ensemble donné. Les valeurs transmises en entrée sont les arguments de la fonction, et on dit qu’elle renvoie un résultat. Celui-ci peut alors être réutilisé pour servir d’argument à une autre fonction. Une fonction peut également produire des “effets de bords” (on dit simplement des “effets“), en ce sens qu’elle peut modifier l’état matériel du système (écrire durablement en mémoire, écrire dans un fichier, afficher un message à l’écran, etc.).

En Python, les arguments sont transmis entre parenthèses et séparés par des virgules, par exemple: max(x,y).

Les valeurs et les expressions

Les valeurs sont les éléments d’information dont se nourrissent les fonctions, ou qui sont créés par les fonctions. Chaque valeur appartient à un type (de la même manière qu’en mathématique, on considère des éléments qui appartiennent à des ensembles).

Ces types peuvent être simples (ce sont en quelque sorte des atomes du langage, citons par exemple les entiers, ou les nombres flottants) ou structurés c’est-à-dire formés par des constructions sur des types simples (on rangera notamment dans cette catégorie les listes et les tableaux).

Les opérateurs binaires sont l’équivalent des signes opératoires en mathématique (l’addition, le produit, la composition des fonctions, etc.). Leur rôle est de combiner des valeurs entre elles.

Une valeur peut être le résultat de l’évaluation d’une expression. Une expression est une construction (syntaxiquement correcte) formée à partir de valeurs, de fonctions et d’opérateurs, et dont l’évaluation (en général immédiate) fournit à son tour une valeur.

La fonction intégrée type donne le type d’une valeur. Par exemple type(2018) renvoie int.

Voici les types simples en Python :

  • Les entiers relatifs (type int) : ils ne sont pas limités en taille.
  • Les flottants (type float): ils codent les nombres réels de façon approchée. Ils se reconnaissent à la présence d’un point décimal (par exemple 2018. ou 1234.56). On peut aussi utiliser la notation scientifique (par exemple 123e4 représente le flottant 123.*10^4).
  • Les nombres complexes (type complex): le nombre complexe i est représenté par l’écriture 1j. Si x est la partie réelle et y la partie imaginaire, le nombre x+iy s’écrit x+y*1j ou complex(x,y). On peut par exemple écrire 1j, 2+3j, 2+1j ou 4-1j, mais pas 2+j ou 4-j.
  • Les chaînes de caractères (type str): elles sont délimitées par des apostrophes ou des guillemets. Par exemple “bonjour” et ‘bonjour’ sont corrects, mais pas “bonjour’ ou ‘bonjour”. Si la chaîne contient une apostrophe, on alterne les deux possibilités, ou alors on utilise l’antislash \ comme caractère d’échappement: par exemple “c’est l”heure” ou ‘c”est l”heure’ sont deux chaînes identiques.
  • Les booléens (type bool): ils représentent le vrai et le faux. Il y a deux valeurs True et False (attention, ces mots commencent par une lettre majuscule!).
  • La valeur None: elle représente le rien, et c’est l’unique valeur du type NoneType.

Les variables, globales ou locales

Pour mémoriser des valeurs, on les associe (on les lie, on les affecte, on les assigne) à des identificateurs.

Quand une variable a été créée, et si on évalue une expression contenant l’identificateur correspondant, celui-ci est remplacé par la valeur de la variable au moment précis de l’évaluation (cette valeur peut bien sûr changer au cours du temps).

Le couple identificateur/valeur est appelé une variable.

Dans cette section, on considère des variables globales, c’est-à-dire dont la définition reste valable pendant toute la durée de la session de travail. On doit les distinguer des variables locales (on verra ça plus loin) qui sont plus volatiles et dont la définition n’est valable qu’à l’intérieur d’une fonction.

Les variables globales

L’opérateur d’affectation (d’une valeur à un identificateur) est le signe =

Par exemple, si on écrit x=2019, alors l’identificateur x devient synonyme de la valeur 2019 à partir de là (en tout cas jusqu’à ce qu’on décide de modifier ou de remplacer la valeur liée à x). Notons qu’un même identificateur peut être successivement lié à des valeurs de types différents (entiers, chaînes de caractère, etc.).

Pour tester l’égalité de deux valeurs (résultat True si oui, False si non), on utilisera l’opérateur ==

Le nom d’une variable peut être arbitrairement long, et Python différencie les majuscules des minuscules.

Python n’est pas un outil de calcul symbolique. Il faut donc initialiser une variable avant de l’utiliser dans une expression.

Il est possible d’effectuer simultanément plusieurs affectations de variables (de même type ou non):

On peut initialiser plusieurs variables avec une même valeur en utilisant des = successifs

L’affectation simultanée est un bon moyen d’échanger le contenu de deux variables: 

Attention à l’exemple suivant, où la chronologie a son importance:

Les variables locales

Une variable globale est visible (utilisable) partout (à partir du moment où elles est créée, bien sûr). Les variables locales, comme leur nom l’indiquent, ne sont définies que momentanément à l’intérieur d’une fonction (on verra ça plus tard), ou d’une expression.

Les arguments d’une fonction sont automatiquement placés dans des variables locales pour être disponible pendant le temps d’évaluation de cette fonction (et ces variables sont “libérées” à l’issue de cette évaluation).

La durée de vie d’une variable locale est celle du bloc (fonction, expression) à l’intérieur duquel elle est définie. L’intérêt de cette solution est multiple : on utilise au mieux les ressources de l’ordinateur, on limite les risques d’homonymie entre identificateurs et on cerne mieux le rôle et la spécificité des variables créées par l’utilisateur.

Considérons par exemple la définition de fonction Python suivante (dont le rôle, facile à deviner, est de calculer la somme des éléments d’une liste).

Cette fonction déclare trois variables locales:

  • la variable L, dont le rôle est de nommer (pendant la fonction somme la liste dont on veut calculer la somme;
  • la variable x, et dont le rôle est de nommer chaque élément de L à son tour;
  • La variable s, et dont le rôle est d’accumuler les sommes des éléments successifs x de L.

Ces trois variables n’existent que pendant l’exécution de la fonction somme. Sitôt après elles disparaissent. Supposons par exemple que l’utilisateur ait préalablement défini une variable globale x (en posant par exemple x=2019), puis qu’il appelle (exécute, lance,…) la fonction somme: alors la variable locale x va momentanément “faire écran” à la variable globale x (mais sans l’écraser). Sitôt terminée la fonction somme, la variable globale x retrouve sa valeur 2019.