Les variables

Ce contenu est obsolète. Il peut contenir des informations intéressantes mais soyez prudent avec celles-ci.

Nous savons donc effectuer des opérations mathématiques avec Python. Mais nos résultats se perdent à la fin de chaque calcul sauf si on les affiche. Et même dans ce cas, nous ne pouvons pas récupérer le résultat pour le réutiliser. C'est ici qu'intervient la notion de variable.

Présentation

Mettons tout cela en contexte. Votre ordinateur possède de la mémoire où il stocke des informations. Nous pouvons représenter la mémoire comme un ensemble de cases, chacune contenant une valeur différente. Lorsque nous créons une variable, nous lui assignons un nom, qui sera tel une étiquette que l’ordinateur collera sur cette case.

Les variables en Python

Voyons comment tout ceci se traduit en Python. D'abord, du code :

1
a = 5

Ici, a est une variable. Comment ça c'est tout ? Oui, on vient de dire à Python que la variable a correspond à la valeur 5. C'est une déclaration (on a créé une variable) suivi d'une affectation (on a modifié sa valeur).

Je peux mettre ce que je veux comme nom de variable ?

Presque. Il y a quelques règles à suivre :

  • Vos noms de variable ne commenceront pas par un chiffre.
  • Vos noms de variable peuvent avoir des lettres, en minuscule ou majuscule et des chiffres.
  • Vos noms de variable ne seront pas un mot-clé réservé par Python.

Les points suivant sont d'avantages de l'ordre de la recommandation :

  • Vos noms de variable peuvent contenir _ (un « underscore ») mais éviterons d'autres caractères spéciaux (accents compris).
  • Vos noms de variable éviteront d'être le nom d'une fonction prédéfinie de Python.
  • Vos noms de variable seront si possible en anglais (afin que votre code soit facilement compréhensible par le plus grand nombre).

Voici la liste des mots-clés réservés par Python :

and

del

from

None

True

as

elif

global

nonlocal

try

assert

else

if

not

while

break

except

import

or

with

class

False

in

pass

yield

continue

finally

is

raise

async

def

for

lambda

return

await

async et await ne seront des mots reservés qu'à partir de la version 3.5. Prenez néanmoins l'habitude de ne pas les utiliser si possible.

Ainsi bon_Jour1 est un nom valide alors que 1.bonJour ne l'est pas. Il faut également noter que Python fait la différence entre les majuscules et les minuscules : vous pouvez donc avoir une variable bonjour et une autre bonJour de valeurs différentes.

De manière générale, préférez des noms de variables clairs, évocateurs et pas trop longs. Vous serez bien content quand vous commencerez à cumuler les variables de pouvoir vous y retrouver facilement.

Vous avez peut-être essayé de faire un print de cette ligne. Python vous a alors renvoyé une erreur de type TypeError. Vous comprendrez mieux pourquoi plus tard, mais pour l’instant, représentez-vous ceci : print affiche un résultat, mais l'affectation de la variable se contente de stocker, elle n'a rien à nous dire. En réalité, il s'agit d'un problème de syntaxe que nous verrons plus loin.

Manipulons nos variables

Commençons :

1
2
3
4
5
a = 5
print(a) # Affiche 5

b = 8.2
print(a + b) # Affiche 13.2

Nous avons d'abord déclaré une variable puis affiché sa valeur. En effet, quand print reçoit le nom d'une variable, il va écrire la valeur de cette variable dans la console. Puis nous créons une deuxième variable. Nous tentons alors de faire une opération entre variables et d'afficher le résultat. Et tout se passe bien (pour une fois :-° ).

Détaillons un peu cette dernière ligne. Python a repéré l'opération entre les variables. Il est alors parti chercher les valeurs des variables. Il a ensuite effectué le calcul, puis il a affiché le résultat. Voyons comment modifions nos variables maintenant.

1
2
3
4
5
print(a) # Affiche 5
a = 10
print(a) # Affiche 10
a = b + 1
print(a) # Affiche 9.2

Comme vous le voyez, un simple égal suffit pour indiquer que l'on souhaite remplacer la valeur de la variable. Vous remarquerez au passage que a était un entier mais qu'il s'agit maintenant d'un nombre à virgule. La valeur peut être le résultat d'un calcul, pouvant impliquer d'autres variables, voir la variable que l'on modifie elle-même. Exemple :

1
2
c = 1
c = c + 3 # c vaut 4

Vous pouvez faire un print pour vous en convaincre. ;) Python a commencé par évaluer l'expression à droite du signe =, allant chercher l'ancienne valeur de c. Fort du résultat de son calcul, il l'a ensuite stocké dans la variable c. Ainsi, Python n'a eu aucun problème pour effectuer cette opération puisqu'il a commencé par calculer la nouvelle valeur avant de la stocker.

Un peu de sucre

Non, ce n'est pas encore l'heure du dessert. Quoique. Je vais ici vous donner quelques notations pour alléger votre code. Ces notations sont des raccourcis et leur action peut être effectuée avec les éléments vus précédemment. De tels raccourcis sont appelés sucre syntaxique.

Vous vous rendrez compte que l'on est souvent amené à écrire des instructions du type i = i + 1, par exemple pour compter le nombre de fois qu’une action est effectuée. Pour ne pas avoir à recopier le i deux fois, de nouveaux opérateurs ont été introduits :

Opérateur Équivalent
a += b a = a + b
a -= b a = a - b
a *= b a = a * b
a **= b a = a ** b
a /= b a = a / b
a //= b a = a // b
a %= b a = a % b

Comme vous le constatez, il ne s'agit que de raccourci, rien de véritablement nouveau. b représente une variable, mais une variable peut être le résultat d'un calcul quelconque. Vous pouvez donc remplacer b par ce calcul si vous le désirez, au lieu de passer par une autre variable.

Voyons maintenant un deuxième raccourci :

1
a, b = 4, 5.2 # a vaut 4 et b vaut 5.2

Vous pouvez mettre plus de deux variables/valeurs, séparées par des virgules. Ceci permet d'affecter plusieurs variables sur une ligne. Ainsi, la première variable de gauche, prend la première valeur de droite et ainsi de suite. Cette écriture présente un avantage supplémentaire : l'échange de valeur de variables.

Supposons que l'on souhaite intervertir les valeurs de a et b. La première idée qui pourrait surgir est :

1
2
a = b
b = a

Malheureusement, nous nous sommes peut-être un peu précipités. En effet, après la première ligne, a vaut la même valeur que b. A la ligne suivante, a et b ont donc la même valeur : nous avons perdu la valeur de a. La deuxième affectation ne changera donc rien. Pour contourner ce problème, il va falloir créer un troisième pour stocker la valeur de a le temps de l'échange.

1
2
3
c = a
a = b
b = c

Cette fois-ci, tout se passe bien car nous avons gardé la valeur de a en mémoire et à l'abri dans c. Cette écriture est néanmoins un peu lourde, surtout si vous voulez échanger plus de deux variables. Mais vous voyez peut-être un raccourci pointer le bout de son nez :

1
a, b = b, a

Ceci marche de façon similaire à a = a + b. La valeur à droite est d'abord calculée puis affectée, de sorte qu'il n'y ait aucun conflit. Dans ce cas, Python voit qu'il va devoir stocker le couple b, a. Il calcul donc ces valeurs, puis va les stocker dans le couple a, b et dans cet ordre. Cette méthode fonctionne également pour plus de deux variables.

Vous pouvez vous amuser et vous familiariser avec les différentes opérations vues dans ce chapitre. Il est d'ailleurs recommandé de faire des tests soi-même pour bien assimiler le concept. Encore une fois, n'hésitez à faire des print pour contrôler.

Manipuler des nombres c'est bien gentil, mais c'est tout ce que connait Python ? Non, et c'est ce que nous allons découvrir.

Les types de données

En réalité, nous avons manipulé déjà deux types différents : les entiers et les nombres à virgule. Nous n'avons pas vu de différence car Python sait passer d'un type à l'autre quand le calcul le nécessite. Pourquoi différencier deux types en apparence aussi proches ? Car ils ne sont pas stockés de la même façon en mémoire. Python doit donc savoir de quel type est la variable pour pouvoir lire correctement sa valeur. Je vous sens bien peu convaincu. Demandons au principal intéressé ce qu'il en pense :

1
2
print(type(1)) # Affiche <class 'int'>
print(type(1.0)) # Affiche <class 'float'>

La méthode type permet de récupérer le type de la variable tel que Python le voit. Voyons maintenant ce que nous apprend l'affichage de ce résultat. Dans un premier temps, l'information class ne nous concernera pas vraiment. Nous aborderons cette notion plus tard, quand nous aurons déjà un peu plus d'expérience. Vient ensuite l'information qui nous intéresse ici : int et float. Il y a donc bien deux types différents. Pour votre culture, int est un diminutif pour « integer » qui signifie entier en anglais. float est une abréviation de « floating », signifiant flottant. En effet, les nombres à virgule sont aussi appelés nombre à virgule flottante.

Je sens votre inquiétude grandissante : on avait dit autre chose que des nombres. :pirate: On y arrive, mais il est bon de se rendre compte que nous avons déjà manipulé plusieurs types et il est important de les connaitre.

Les chaînes de caractères

Python sait aussi manipuler du texte, sous forme de chaîne de caractères. Pour indiquer à Python qu'il s'agit d'une chaîne de caractère, il faut utiliser des délimiteurs. Il en existe trois : ', " et """. Les délimiteurs se placent de part et d'autre de la chaîne, comme ceci :

1
2
3
chaine = 'Et voilà du texte'
chaine2 = "Et encore du texte"
chaine3 = """Toujours plus de texte"""

Ces trois types de délimiteurs différents ont une utilité :

1
2
3
4
chaine = 'Aujourd'hui' # Erreur
chaine2 = "J'ai cassé Python"
chaine3 = """Demain,
je le réparerai"""

La première ligne va créer une erreur : en effet, l'apostrophe dans aujourd'hui est interprété comme la fin de la chaîne, et Python ne sait alors que faire de hui'. Ce problème est résolu dans la deuxième ligne car le délimiteur n'est plus ' mais ". Si on avait mis des guillemets, comme pour un dialogue, il aurait fallu utiliser ' pour ne pas gêner Python. Rassurez-vous, cela ne signifie pas que vous ne pouvez pas mettre des apostrophes et des guillemets simultanément. Il existe un caractère bien utile qui va nous sauver : le backslash \.

Le backslash indique à Python que le caractère qui le suit doit être échappé, c'est à dire qu'il fait partie du texte et non code. Ainsi :

1
2
chaine = 'Nous l\'avons'
chaine2 = "\"réparé\""

Aucune erreur ici, puisque Python sait maintenant qu'il ne s'agit en fait pas de la fin de la chaîne.

Le backslash peut, selon le caractère qui le suit, avoir une signification particulière. Par exemple, print('Bonjour,\nVisiteur') va afficher Bonjour, puis Visiteur sur une autre ligne. \n signifie donc « retour à la ligne » pour Python.

Si vous souhaitez juste afficher un backslah, il faudra alors utiliser \\ afin que Python sache qu'il doit échapper le second \, et le considérer comme du texte.

Venons-en à l'utilité du dernier délimiteur. Celui-ci permet contrairement à ses deux confrères d'écrire le texte de notre chaîne sur plusieurs lignes. De plus, si vous effectuez un retour à la ligne, vous n'avez pas besoin d'ajouter un \n pour que celui-ci s'affiche avec print.

Il existe d’autres types de données mais nous nous contenterons de cela pour l'instant. La manipulation des chaînes de caractères sera abordée dans un autre chapitre.

Conversion

Python est capable de convertir certains types de données. Voyons ceci avec un bout de code :

1
2
3
4
5
6
var = 10
print(type(var)) # Affiche <class 'int'>
var = str(var)
print(type(var)) # Affiche <class 'str'>
var = float(var)
print(type(var)) # Affiche <class 'float'>

Les conversions sont bien effectuées. Attention à ne pas demander des conversions improbables à Python non plus : par exemple int('a') va retourner une ValueError.

Une utilité ? Allez, je vais vous montrer un petit truc, mais le dites pas aux autres, ils vont être jaloux.

Poser des questions

Nous savons afficher des informations dans la console, voyons comment demander à l'utilisateur d'en saisir. Pour cela, on utilise input :

1
2
3
reponse = input() # Une ligne vide apparait et attend que l'utilisateur entre une information
age = input("Age : ") # "Age : " est affiché en début de ligne puis attend une information
# `age` et `reponse` contiennent ce que l'utilisateur a entré

Nous pouvons donc communiquer avec l'utilisateur. Cependant, les variables age et réponse sont de type str même si l'utilisateur a entré un nombre. Il ne sera donc pas possible, par exemple, de soustraire un nombre à l’âge récupéré. Ah moins que … ah bah si, il suffit de convertir age en un int. ;)


Prochaine étape, modifier le comportement de son programme en fonction de conditions.