Table des matières
Variables et calculs de base
Les variables
Adresses mémoire
En cours de programme, on a besoin de faire des calculs et de conserver les résultats pour un usage ultérieur. On stocke donc les résultats dans la mémoire de la machine.
La mémoire peut prendre physiquement diverses formes : mémoire RAM, disque dur, mémoire cache… Le programme qui s'exécute n'a pas à se soucier de tout cela. Le système d'exploitation (SE) –Windows, Linux…– fournit un espace mémoire virtuel qui est comme une grille avec des cases, peu importe où se trouvent ces cases dans la mémoire réelle.
Dans la mémoire, toutes les cases sont numérotées par une adresse qui permet à la machine de les identifier. Imaginez ce que cela pourrait donner :
écrire 72 à l'adresse 45465474 écrire 45 à l'adresse 78521365 ajouter le contenu à l'adresse 45465474 au contenu à l'adresse 78521365 afficher le contenu à l'adresse 78521365
Cette façon de faire a deux gros défauts :
- C'est peu lisible,
- la gestion de la mémoire est quelque chose de compliqué et il vaudrait mieux que l'on n'ait pas à choisir nous-mêmes les adresses des cases utilisées.
Au lieu de cela on préfère
écrire 72 dans x écrire 45 dans y ajouter le contenu de x au contenu de y afficher le contenu de y
Et on laisse la machine décider automatiquement à quelle adresse se trouvera x et à quelle adresse se trouvera y. x et y sont alors de simples étiquettes qui évitent d'avoir à préciser une adresse.
La gestion de la mémoire, la façon dont on demande au système d'exploitation de donner une case mémoire, de la supprimer quand on n'en pas plus besoin, etc. Cela fait partie des automatismes des différents langages de programmation. Certains langages sont meilleurs que d'autres et cela constitue un critère de choix important pour les programmeurs. Un langage qui gère mal la mémoire risque d'être délaissé par les programmeurs.
Comme nous parlons de cases mémoires dont le contenu est susceptible de changer au gré du programme, on parle de variables.
Affectation
Le pseudo-code précédent écrit en Python produit le code
x = 72 y = 45 y = x + y print(y)
Le = n'a pas du tout le sens mathématique.
x = 72 signifie « Écrire 72 dans la case mémoire étiquetée par x ».
Si on veut savoir si x est égal à 72, alors il faut écrire x == 72.
Adresse ou contenu ?
On a dit que x servait à éviter de mentionner l'adresse d'une case mémoire. Alors,
xreprésente l'adresse ?xreprésente le contenu stocké à cette adresse ?
Eh bien un peu les deux, mais plutôt le second.
Quand on écrit y = x + y, on commence par le calcul à droite x + y, et il faut comprendre “le contenu de la mémoire x plus le contenu de la mémoire y”. Ensuite on exécute y = ce qui signifie que l'on écrit le résultat dans la mémoire y.
Les types de base
Le programme a besoin d'écrire différents types de choses en mémoire : du texte, des nombres, des listes de nombres…
Pour l'instant, on se contente des cas les plus simples.
Entiers : int
>>> x = 2 >>> type(x) <class 'int'>
décimaux : float
>>> y = 3.5 >>> type(y) <class 'float'>
chaînes de caractères : str
>>> t = "bonjour" >>> type(t) <class 'str'>
Les chaînes sont compliquées, on y reviendra. On travaille pour l'instant sur les nombres.
Python est très accommodant : normalement, la taille en mémoire d'un nombre est fixée et on ne peut pas l'agrandir autant que l'on veut. Mais pour les entiers (int) Python adapte automatiquement l'espace utilisé en mémoire. Par exemple, il n'est pas du tout dérangé par un calcul comme 2**1000.
>>> 2**1000 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Calculs élémentaires
Les 3 premiers se passent de commentaires.
+addition-soustraction*multiplication/division, le résultat est toujours unfloat(voir exemple ci-dessous)
La puissance est notée ** ce qui diffère de beaucoup de langages – en général on rencontre plutôt ^ pour la puissance.
>>> 4**2 16 >>> 4/2 2.0 >>> 10/31 0.3225806451612903
Opérateurs arithmétiques
Les calculs sur les nombres entiers ont beaucoup d'applications et les deux opérateurs suivants sont particulièrement utiles.
//division entière. Le résultat est toujours unint.%modulo, c'est à dire reste lors de la division entière
# 100 = 7*14 + 2 et donc : >>> 100 // 7 14 >>> 100 % 7 2
Si je partage 100 bonbons entre 7 personnes, chacune aura 14 bonbons et il en restera 2.
