Variables#
Qu'est-ce qu'une variable ?#
Le premier concept fondamental que nous allons aborder en programmation est celui de variables. On peut décrire une variable comme étant une case mémoire de votre ordinateur possédant un nom et étant capable de stocker une valeur. De manière plus imagée. on peut visualiser une variable comme étant une boîte à chaussures contenant un objet et sur laquelle est collée une étiquette nommant son contenu. Une variable permet alors d'enregistrer des informations dans un programme.On peut par exemple imaginer un programme dans lequel le prénom et l'âge de l'utilisateur devraient être enregistrés. Ce programme devrait alors contenir deux variables qui peuvent être représentées comme ceci :

Nous avons ici en effet une boîte étiquetée nom contenant un nom de famille, et une boîte avec l'étiquette age contenant une valeur correspondante. Il est important de noter qu'une variable ne peut contenir qu'une seule valeur, et que, pour enregistrer deux informations différentes, il faut alors deux variables. En Python, on peut créer une variable en suivant la syntaxe suivante :
nom_de_la_variable = valeur
Ainsi, en Python, on peut créer ces deux variables de la manière suivante :
nom = "Jan"
age = 32
Recopiez ce petit programme dans Thonny et exécutez-le. Vous devriez alors voir, dans la fenêtre Variables, que les deux variables ont été créées avec leur valeur correspondante. De cette manière, vous avez bien pu stocker deux valeurs dans la mémoire de l'ordinateur. En réalité, à la fin de l'exécution du programme, toutes les variables créées par le programme sont effacées. Ainsi, nom et age n'existent déjà plus, mais cette interface de Thonny vous permet encore de visualiser ce que le programme a fait.
Types de valeur#
Les deux variables que nous venons de créer ont chacune un type différent. En effet, l'une contient du texte, alors que l'autre contient un nombre entier. En Python, on distingue 4 types de données primitifs.
int. De son nom complet integer, le typeintpermet de représenter les nombres entiers. Par exemple :1,2,3,999,-10, ou-376.float. Les flottants représentent les nombres réels. Par exemple :3.14,4.5,-8.555, ou1000.001. Attention, vous avez sûrement l'habitude en français d'appeler les réels des nombres à virgules. Pourtant, en Python, il ne faut pas mettre une virgule pour séparer les unités des décimales, mais bien un point.str. Signifiant en anglais string, le typestrpermet de représenter des chaînes de caractères, ou, dit plus simplement, du texte. Les chaînes de caractères doivent toujours être entourées d'une paire de guillemets doubles ou simples. Par exemple :"Bonjour",’Ceci est une chaîne de caractères’, ou"QUOI ???".bool. Le type booléen n'a que deux valeurs possibles :TrueetFalse. Ce type de valeur est utilisé lorsque l'information que vous souhaitez enregistrer ne peut avoir que deux états. Intuitivement, on peut utiliser le typeboollorsque cette information peut être vraie ou fausse (par exemple une variablereponsequi aurait la valeurTruesi la réponse à une question est vraie, etFalsesinon). Toutefois, n'importe quelle information à deux états peut être représentée de cette manière : c'est alors au programmeur de décider quel état estTrueet lequel estFalse. On peut s'imaginer une variableetat_portequi estTruelorsque la porte est ouverte, et qui estFalsequand la porte est fermée.
Le programme ci-dessous permet ainsi de créer des variables de chacun de ces types.
code_postal = 1700
latitude = 46.80237
ville = "Fribourg"
est_un_chef_lieu = True
Ordre d'exécution des instructions#
En programmation, l'ordre d'écriture des instructions est extrêmement important. En effet, que se passe-t-il lorsque l'on exécute le programme suivant :
autorisation = True
autorisation = False
À la fin de l'exécution de ce programme, vous pouvez constater, dans la fenêtre Variables, que la valeur de autorisation est False. Les instructions des programmes que vous écrivez sont en effet exécutées séquentiellement. C'est-à-dire que l'exécution du programme commence à la première ligne en haut et que chaque ligne est ensuite exécutée l'une après l'autre. Ainsi, dans l'exemple ci-dessus, la variable autorisation est d'abord initialisée à True, mais la ligne suivante modifie ensuite sa valeur. Cet exemple montre également que réutiliser plusieurs fois le même nom de variable ne crée pas une deuxième variable, mais permet de modifier sa valeur.
Expressions#
Pour le moment, nous avons assigné des valeurs littérales à nos variables. C'est-à-dire que nous avons directement écrit la valeur finale lui sera attribuée. Nous pouvons toutefois faire d'autres opérations plus intéressantes et assigner aux variables le résultat de calculs. En programmation, nous ne les appelons toutefois pas calculs, mais expressions. De plus, on ne dit pas que l'on résout une expression, mais on l'évalue. En Python, les opérateurs arithmétiques que l'on peut utiliser dans les expressions sont les suivants.
Opérateur d'addition +
Entre deux
intoufloat, les deux nombres sont additionnés. Par exemple10 + 6.15est évalué à16.15.Entre deux
str, les deux chaînes de caractères sont concaténées, c'est-à-dire qu'elles sont collées ensemble. Par exemple"Bonjour" + "Au revoir"est évalué à"BonjourAu revoir".
Opérateur de soustraction - : soustrait un
intou unfloatà un autre. Par exemple,99.9 - 10.9est évalué à89.0.Opérateur de multiplication
Entre deux
intoufloat, les deux nombres sont multipliés. Par exemple,2.5 * 4est évalué à10.0.Entre un
stret unintla chaîne de caractères est répétée autant de fois que le nombre donné. Par exemple,"AB" * 3est évalué à"ABABAB".
Opérateur de division / : Divise un
intou unfloatpar un autre. Par exemplte5 / 2est évalué à2.5.Opérateur d'exponentiation ** : Elève un
intoufloatà la puissance d'un autre. Par exemple,3 ** 3est évalué à27.Opérateur modulo % : donne le reste de la division entière entre deux
intoufloat. Ainsi11 % 2est évalué à 1, car la division entière de 11 par 2 donne 5 et il reste 1.
De plus, au lieu d'utiliser des valeurs littérales dans les expressions, on peut également utiliser des variables préalablement définies. Voici ci-dessous un exemple d'un programme Python utilisant plusieurs expressions. Sans l'exécuter sur Thonny et sans lire l'explication qui suit, essayez de réfléchir à son déroulement et à deviner le contenu de chaque variable à la fin de son exécution.
prix = 3 * 2 + 4
nombre = 12 - 2 ** 3 - 2
total = prix * nombre
nombre = nombre + 1
txt = "?" * nombre
Tableau d'états#
Pour comprendre le résultat du programme précédent, on peut utiliser un tableau d'états. Il s'agit d'un tableau où chaque colonne correspond à une variable et chaque ligne à l'état de la mémoire après chaque modification de variable. Celui-ci se construit étape par étape de la manière suivante :
Etape 0
prix |
nombre |
total |
txt |
|---|---|---|---|
En inspectant rapidement le programme, on constate qu'il contient 4 variables différentes. Ainsi, le tableau initial contient ces 4 colonnes.
Etape 1
prix |
nombre |
total |
txt |
|---|---|---|---|
10 |
|||
La première ligne du programme est exécutée. En respectant la priorité des opérations, l'expression est évaluée à 10, et cette valeur est alors stockée dans la variable prix.
Etape 2
prix |
nombre |
total |
txt |
|---|---|---|---|
10 |
|||
10 |
2 |
||
À la 2ème ligne du programme, l'expression est évaluée à 2 et cette valeur est stockée dans la variable nombre. La valeur de prix n'ayant pas changé, celle-ci est également reportée sur cette ligne pour représenter l'état exact de la mémoire à ce point du programme.
Etape 3
prix |
nombre |
total |
txt |
|---|---|---|---|
10 |
|||
10 |
2 |
||
10 |
2 |
20 |
|
Pour évaluer l'expression prix * nombre, il faut tout d'abord lire la valeur de ces variables. Ainsi, cette expression équivaut à 10 * 2 et la valeur 20 est alors enregistrée dans la variable total.
Etape 4
prix |
nombre |
total |
txt |
|---|---|---|---|
10 |
|||
10 |
2 |
||
10 |
2 |
20 |
|
10 |
3 |
20 |
|
À la 4ème ligne du programme, il faut commencer par évaluer l'expression nombre + 1. En lisant la valeur de nombre, on constate qu'il s'agit de 2. Ainsi, cette expression équivaut à 2 + 1 et s'évalue à 3. Cette valeur est finalement stockée dans nombre. Attention, ce n'est pas parce que nombre a changé de valeur que celle de total doit être modifiée. En effet, la 3ème ligne a déjà été exécutée et ceci avec les valeurs en mémoire à ce moment-là. Des modifications de la mémoire n'impactent pas les instructions exécutées précédemment.
Etape 5
prix |
nombre |
total |
txt |
|---|---|---|---|
10 |
|||
10 |
2 |
||
10 |
2 |
20 |
|
10 |
3 |
20 |
|
10 |
3 |
20 |
??? |
La valeur de nombre étant maintenant 3, l'expression de la 5ème ligne équivaut à "?" * 3 et la valeur "???" est alors stockée dans txt.
Ainsi, le tableau d'état final après l'étape 5 nous permet de connaître avec certitude la valeur de chaque variable durant l'exécution de notre programme. Il s'agit d'un outil d'analyse très pratique, dont l'utilité sera multipliée lorsque de nouvelles structures de programmation seront introduites dans les prochains chapitres.
Messages d'erreur#
L'exemple précédent permet d'observer à nouveau l'importance de l'ordre d'exécution séquentiel des instructions. En particulier, on remarque qu'il est impératif qu'une variable soit d'abord créée avant d'être utilisée. Dans l'exemple précédent, cela signifie que nombre et prix doivent avoir été créés avant d'être utilisés dans l'expression prix * nombre. Si vous ne respectez pas cette règle, votre programme ne fonctionnera pas. Voici un exemple d'un programme erroné, avec le message d'erreur qui s'affiche lorsque l'on tente de l'exécuter.
prix = 15
total = prix * nombre
nombre = 4
Fichier ".../variables.py", line 2, in <module>\\
total = prix * nombre\\
NameError: name 'nombre' is not defined
Lorsque vous rencontrez des messages d'erreur, il faut absolument prendre le temps de les lire. En effet, même si ceux-ci peuvent paraître cryptiques à première vue, ils vous donnent de très précieuses informations sur ce qui ne fonctionne pas dans votre programme. Grâce au message d'erreur ci-dessus, on comprend que notre programme contient une erreur à la deuxième ligne. De plus, on voit que l'erreur est en rapport avec la variable nombre, car celle-ci n'a pas été définie. Cette erreur vient bien du fait que cette variable est utilisée dans une expression avant d'avoir été créée. Pour corriger ce bug, il faut donc inverser l'ordre des deux dernières lignes.\
Il est tout à fait normal, même pour un programmeur professionnel et expérimenté, d'écrire du code comportant des bugs. Ce qui distingue un bon d'un mauvais développeur est la capacité à corriger ces bugs en lisant les messages d'erreur. Ainsi, prenez bien le temps de les lire et de les comprendre à chaque fois que vous les rencontrez. Même s'ils vous paraissent compliqués au début, vous allez rapidement les apprivoiser et gagner en temps et en efficacité dans votre pratique de programmeur.
Opérateurs d'affectation combinée#
Lorsque l'on crée une variable, le signe d'égalité que l'on utilise est appelé opérateur d'affectation. Cet opérateur peut être utilisé non seulement lors de la création d'une variable, mais aussi, comme nous l'avons vu, pour modifier sa valeur plus tard. Dans l'exemple ci-dessous, on assigne la valeur "Bonjour" à la variable salutations et on lui ajoute la suite plus tard. De manière similaire, la variable prix est initialisée à 8.5 et sa valeur est doublée par la suite.
salutations = "Bonjour"
prix = 8.5
salutations = salutations + ",comment allez-vous ?"
prix = prix * 2
Ce genre d'instruction permettant de modifier la valeur de variables est très courant en programmation. De ce fait, même si ces lignes ne sont pas très compliquées, la flemmardise des programmeurs a donné naissance à une manière plus courte de les écrire en utilisant des opérateurs d'affectation combinée. Ceux-ci permettent de modifier la valeur d'une variable sans recopier son nom deux fois. Pour chaque point de la liste suivante, imaginons que nous avons une variable n contenant la valeur 10.
Opérateur d'incrémentation += : Ajoute une valeur à la variable. Après avoir exécuté l'instruction
n += 5, alorsncontiendra la valeur15.Opérateur de décrémentation -= : Retire une valeur à la variable. Après avoir exécuté l'instruction
n -= 3, alorsncontiendra la valeur7.Opérateur = : Multiplie la variable par une valeur. Après avoir exécuté l'instruction
n *= 2, alorsncontiendra la valeur20.Opérateur /= : Divise la variable par une valeur. Après avoir exécuté l'instruction
n /= 5, alorsncontiendra la valeur2.Opérateur *= : Mets la variable à la puissance d'une valeur. Après avoir exécuté l'instruction
n **= 2, alorsncontiendra la valeur100.Opérateur %= : Remplace le contenu de la variable par le reste de la division entière entre sa valeur et une autre. Après avoir exécuté l'instruction
n %= 3, alorsncontiendra la valeur1.
Ainsi, le précédent exemple peut se réécrire de la manière suivante
salutations = "Bonjour"
prix = 8.5
salutations += ", comment allez-vous ?"
prix *= 2
(exo_var=)
Exercices#
Exercice 1#
Ce code Python déclare 5 variables, mais contient une erreur par ligne. Trouvez ces erreurs et corrigez-les.
6 = age
message = Je suis absent
note = 4,5
porte_ouverte = false
nombre de voitures = 10
Solution
age = 6
message = "Je suis absent"
note = 4.5
porte_ouverte = False
nombre_de_voitures = 10
A la création d'une variable, le nom doit toujours être à gauche du signe égal, et la valeur à droite.
Une valeur de type
strdoit être entourée de guillemets.Une valeur de type
floats'écrit non pas avec une virgule mais avec un point.Une valeur de type
boolprend une majuscule àTrueetFalse.Les noms de variables ne peuvent pas contenir d'espaces. Généralement, en Python, on les remplace alors par des tirets en bas.
Exercice 2#
Déterminez la valeur de chacune des variables de ce programme en créant un tableau d'états.
x = 10
y = 2
z = y * x
y = z + x
x = y - z / 2
z = z * 2
y = 5
Solution
x |
y |
z |
|---|---|---|
10 |
||
10 |
2 |
|
10 |
2 |
20 |
10 |
30 |
20 |
20 |
30 |
20 |
20 |
30 |
40 |
20 |
5 |
40 |
Exercice 3#
Déterminez la valeur de chacune des variables de ce programme en créant un tableau d'états.
nombre_habitants = 150 + 25 * 2
cout = 100
prix = nombre_habitants * cout
cout = cout / 2
nombre_habitants = nombre_habitants - 100
prix = prix + nombre_habitants * cout
nombre_habitants = 400
prix = prix + nombre_habitants * cout
Solution
nombre_habitants |
cout |
prix |
|---|---|---|
200 |
||
200 |
100 |
|
200 |
100 |
20000 |
200 |
50 |
20000 |
100 |
50 |
20000 |
100 |
50 |
25000 |
400 |
50 |
25000 |
400 |
50 |
45000 |
Exercice 4#
Complétez le programme ci-dessous de manière à ce qu'il permette de calculer la moyenne des notes principales dans la variable du même nom. La note de math est de 4 et demi, la note de français de 6 et la note d'allemand de 5 et demi.
math =
francais =
allemand =
moyenne =
Solution
math = 4.5
francais = 6
allemand = 5.5
moyenne = (math + francais + allemand) / 3
Pour calculer la moyenne, on additionne toutes les notes avant de les diviser par 3. Comme la division a la priorité sur l'addition, il ne faut pas oublier de régler la priorité des opérations avec une paire de parenthèses
Exercice 5#
Écrivez un petit programme en Python permettant de calculer le volume \(V\) d'un cylindre en fonction de son rayon et de son hauteur. Votre programme contiendra les lignes suivantes :
Créer une variable
picontenant la valeur3.14.Créer une variable
hauteurcontenant la valeur30Créer une variable
rayoncontenant la moitié de 11Créer une variable
aire_disquecontenant le résultat de \(\pi \cdot r^2\)Créer une variable
volumecontenant le résultat de l'aire du disque multiplié par la hauteur.
Au terme de l'exécution de ce programme, la variable volume devrait
contenir la valeur 2849.55
Solution
pi = 3.14
hauteur = 30
rayon = 11 / 2 #ou rayon = 5.5
aire_disque = pi * rayon ** 2
volume = aire_disque * hauteur
Exercice 6#
Écrivez un programme Python contenant une variable x initialisée à 10.
Puis, complétez ce programme pour que celui-ci effectue les opérations
suivantes
Ajoute 3 à
xRetire 8 à
xMultiplie
xpar 10Divise
xpar 5Élève
xà la puissance 3
A la fin de l'exécution de ce programme, la variable x devrait
contenir la valeur 1000
Solution
x = 10
x += 3
x -= 8
x *= 10
x /= 5
x **= 3
Exercice 7 (difficile)#
Lisez attentivement le programme ci-dessous et expliquez, en français, ce qu'il fait (vous n'avez pas besoin d'évaluer les expressions). Veillez à bien expliquer à quoi correspondent les variables h1, h2, et total.
CHF_par_h1 = 32.5
CHF_par_h2 = 40
heure_debut = 20
temps_de_travail = 8.5
h1 = (heure_debut + temps_de_travail)
h2 = temps_de_travail - h1
total = h1 * CHF_par_h1 + h2 * CHF_par_h2
Solution
Ce programme permet de calculer et stocker le salaire d'un employé dans la variable total. De toute évidence, cet employé travail de nuit comme il a commencé à 20h et a travaillé durant 8 heures et demie. La variable h1 contient le nombre d'heures passées après minuit (en effet, le reste de la division entière de 28.5 par 24 nous donne 4.5, et l'employé a bien fini de travailler à 4 heure et demie). Ainsi, en soustrayant h1 aux nombres d'heures travaillées au total, h2 contient le nombre d'heures travaillées avant minuit. Ces deux variables permettent de calculer le salaire total avec les taux corrects.