I. Variables
1.1 Pourquoi des variables ?
-
En Python, l'affectation d'une variable fonctionne ainsi :
- Une adresse mémoire est une chaîne hexadécimale (ex :
0x7ffd8a905a20) ; la variable (ex :a) est un surnom donné à cette adresse. Le programmeur n'a pas à retenir l'adresse, seulement le noma. - Quand on écrit
a = 1: Python crée ou trouve l'objet1en mémoire, et lie le nomaà son adresse.a« pointe » vers cette adresse. - Lorsqu'on affiche
a, Python suit le lien pour obtenir la valeur1.an'est qu'un alias. - Ensuite,
a = 2: Python délieade l'adresse de1et le lie à la nouvelle adresse de2. L'objet1reste inchangé.
- Une adresse mémoire est une chaîne hexadécimale (ex :
-
La variable est l'unité de base des programmes : type + nom + valeur. ```
Déclaration
a = 1 # int b = 2 # int b = 8 # réaffectation
print("a =", a, "type :", type(a)) print("b =", b, "type :", type(b))
-
Mémoire : Les valeurs sont stockées en mémoire (ex :
a = 10,b = 30).
1.2 Introduction aux variables
Étapes : définir (a = 60) puis utiliser (print(a)).
Attention : une variable doit être définie avant utilisation, sinon NameError.
1.3 Exemple rapide
nom = "Marie"
age = 25
note = 88.7
sexe = "F"
print("Informations :")
print(nom, age, sexe, note)
# La virgule ajoute un espace entre les valeurs.
print("Informations :", nom, age, sexe, note)
1.4 Formatage de sortie
1.4.1 Style % (traditionnel, issu du C)
Les symboles de format :
| Symbole | Description |
|---|---|
| %s | Chaîne |
| %r | Représentation brute (avec quotes) |
| %d | Entier décimal |
| %i | Identique à %d |
| %f | Flottant |
| %e | Notation scientifique (e minuscule) |
| %E | Notation scientifique (E majuscule) |
| %g | Choix automatique entre %f et %e |
| %x | Hexadécimal minuscule |
| %X | Hexadécimal majuscule |
| %o | Octal |
| %% | Échappement du pourcentage |
nom = "Alice"
age = 30
note = 92.3
# Valeur unique
print("Nom : %s" % nom) # Nom : Alice
# Plusieurs valeurs -> tuple
print("Nom : %s, Âge : %d, Note : %f" % (nom, age, note))
# %r avec guillemets
print("Repr brute : %r" % nom) # 'Alice'
# Échapper %
print("Progression : %.1f%%" % 87.5) # 87.5%
Contrôle de la largeur / précision : %[remplissage][alignement][largeur][.précision]type
nb = 42
pi = 3.14159
txt = "Python"
# Largeur 5, alignement droite (défaut)
print("%5d" % nb) # " 42"
# Alignement gauche
print("%-5d" % nb) # "42 "
# Remplissage avec zéros (chiffres uniquement)
print("%05d" % nb) # "00042"
# Flottant : largeur 8, 2 décimales
print("%8.2f" % pi) # " 3.14"
# Chaîne : tronquer à 3 caractères
print("%.3s" % txt) # "Pyt"
Bases et notation scientifique :
n = 255
print("Décimal : %d" % n) # 255
print("Hexa min : %x" % n) # ff
print("Hexa maj : %X" % n) # FF
print("Octal : %o" % n) # 377
f = 12345.6789
print("Sci e : %e" % f) # 1.234568e+04
print("Sci E : %E" % f) # 1.234568E+04
Formatage avec dictionnaire :
donnees = {'nom': 'Claire', 'age': 22, 'note': 91.0}
print("Nom : %(nom)s, Âge : %(age)d, Note : %(note).1f" % donnees)
Limitations : types stricts, tuple obligatoire, pas d'expression directe.
1.4.2 Méthode str.format() (Python ≥ 2.6)
Utilise des accolades {} comme placeholders.
# Positionnel
print("{} a {} ans.".format("Bob", 23)) # Bob a 23 ans.
# Index
print("{1} a {0} ans. {1} aime Python.".format(23, "Bob"))
# Nommé
print("{nom} a {age} ans.".format(nom="Alice", age=25))
# Mixte (positionnel d'abord)
print("{0} a {age} ans.".format("Charlie", age=28))
1.5 Opérateur +
- Addition entre nombres.
- Concaténation entre chaînes.
- Interdit : nombre + chaîne (TypeError).
note = 85.3
print(note + 10) # 95.3
print("Hello" + " there") # Hello there
print("100" + "98") # 10098
# print(100 + "98") Erreur
1.6 Types de données
| Type | Description |
|---|---|
| int | Entiers (ex : 1, -5, 2000) |
| float | Nombres à virgule (ex : 1.1, -4.5) |
| bool | True / False |
| str | Chaînes (guillemets simples ou doubles) |
Une variable est créée dès qu'on lui affecte une valeur. Le type est celui de l'objet pointé.
type(objet) donne le type.
1.7 Type entier (int)
Les entiers Python peuvent être très grands (théoriquement jusqu'à 4300 chiffres).
Représentations :
- Décimal :
123 - Hexadécimal :
0x1F - Octal :
0o77 - Binaire :
0b1101
Taille mémoire :
import sys
n1 = 0
n2 = 1
n3 = 2
n4 = 2**15
n5 = 2**30
n6 = 2**128
print(n1, sys.getsizeof(n1), type(n1))
print(n2, sys.getsizeof(n2), type(n2))
print(n3, sys.getsizeof(n3), type(n3))
print(n4, sys.getsizeof(n4), type(n4))
print(n5, sys.getsizeof(n5), type(n5))
print(n6, sys.getsizeof(n6), type(n6))
La taille augmente par paliers de 4 octets.
1.8 Type flottant (float)
Formes :
- Décimal :
5.12ou.512(0.512) - Scientifique :
5.12e2(512.0),5.12E-2(0.0512)
Limites :
print(sys.float_info.max) # 1.7976931348623157e+308
print(sys.float_info.min) # 2.2250738585072014e-308
Précision : utiliser Decimal pour des calculs exacts.
from decimal import Decimal
res = Decimal("8.1") / Decimal("3")
print(res) # 2.7
1.9 Type booléen (bool)
Valeurs : True et False. Utilisé pour la logique et le contrôle de flux.
a = 100
b = 200
resultat = a > b
print(resultat) # False
print(type(resultat)) # <class 'bool'>
Détails : True = 1, False = 0 en contexte numérique. Les valeurs non nulles sont considérées comme vraies.
1.10 Chaînes (str)
Créées avec '...' ou "...". Permet l'imbrication de guillemets opposés.
s1 = 'Il a dit : "Bonjour"'
s2 = "Elle a dit : 'Salut'"
Triple guillemets : '''...''' ou """...""" pour conserver la mise en forme.
Chaîne brute : r"..." annule l'interprétation des séquences d'échappement.
s3 = r"ligne1\nligne2" # affiche le \n littéral
Mécanisme d'internage : Python réutilise les chaînes identiques pour économiser la mémoire. Cela s'applique aux chaînes composées de [a-zA-Z0-9_], de longueur ≤ 1, ou constantes à la compilation.
c1 = "hello"
c2 = "hello"
print(id(c1) == id(c2)) # True (dans certains contextes)
1.11 Conversion de type
Python est à typage dynamique : la varible change de type selon l'affectation.
val = 10
print(type(val)) # int
val = 1.1
print(type(val)) # float
val = "salut"
print(type(val)) # str
Conversion implicite : lors d'opérations, le type le moins précis est converti vers le plus précis (int → float).
x = 10
y = 2.5
z = x + y
print(z, type(z)) # 12.5 float
Conversion explicite : utiliser les fonctions int(), float(), str(), bool(), list(), tuple(), set(), dict(), chr(), etc.
print(int("123")) # 123
print(float("3.14")) # 3.14
print(str(456)) # "456"
print(bool(0)) # False
Attention : une chaîne non convertible lève ValueError. La conversion ne modifie pas la variable d'origine.
II. Opérateurs
2.1 Introduction
Symboles spéciaux pour les opérations : arithmétiques, d'affectation, de comparaison, logiques, binaires.
2.2 Opérateurs arithmétiques
| Opérateur | Nom | Exemple | Résultat |
|---|---|---|---|
| + | Addition | 5+5 | 10 |
| - | Soustraction | 6-4 | 2 |
| * | Multiplication | 3*4 | 12 |
| / | Division (flottante) | 5/5 | 1.0 |
| % | Modulo (reste) | 7%5 | 2 |
| // | Division entière (troncature vers le bas) | 9//2, -9//2 | 4, -5 |
| ** | Puissance | 2**4 | 16 |
print(10/3) # 3.3333333333333335
print(9//2) # 4
print(-9//2) # -5
# Modulo : a % b = a - (a//b)*b
print(-10 % 3) # 2
print(10 % -3) # -2
2.3 Opérateurs de comparaison
| Opérateur | Exemple | Résultat |
|---|---|---|
| == | 4 == 3 | False |
| != | 4 != 3 | True |
| < | 4 < 3 | False |
| > | 4 > 3 | True |
| <= | 4 <= 3 | False |
| >= | 4 >= 3 | True |
| is | Identité d'objet | True/False |
| is not | Non identité | True/False |
is compare les références, == les valeurs.
2.4 Opérateurs logiques
and, or, not.
a = 10
b = 20
print(a and b) # 20 (retourne le dernier évalué)
print(a or b) # 10
print(not a > b) # True
Court-circuit : and s'arrête dès que False, or dès que True.
2.5 Opérateurs d'affectation
| Opérateur | Description | Équivalent |
|---|---|---|
| = | Affectation simple | c = a + b |
| += | Addition | c += a → c = c + a |
| -= | Soustraction | c -= a → c = c - a |
| *= | Multiplication | c *= a → c = c * a |
| /= | Division | c /= a → c = c / a |
| %= | Modulo | c %= a → c = c % a |
| **= | Puissance | c **= a → c = c ** a |
| //= | Division entière | c //= a → c = c // a |
Échange de variables : a, b = b, a.
2.6 Opérateur ternaire
Syntaxe : valeur_si_vrai if condition else valeur_si_faux.
max_val = a if a > b else b
# Maximum de trois nombres
a, b, c = 30, 50, -1
max1 = a if a > b else b
max2 = max1 if max1 > c else c
2.7 Priorité des opérateurs
| Priorité | Opérateurs |
|---|---|
| Élevée | (...) |
** |
|
*, @, /, //, % |
|
+, - |
|
>>, << |
|
& |
|
^ |
|
| |
|
in, not in, is, is not, <, <=, >, >=, !=, == |
|
not x |
|
and |
|
or |
|
| Basse | Affectations (=, +=, …) |
2.8 Règles et conventions de nommage (identifiants)
Règles : lettres (a-z, A-Z), chiffres, _ ; ne pas commencer par un chiffre ; ne pas utiliser les mots réservés ; sensible à la casse ; pas d'espaces.
Conventions :
- Variables en
snake_case, constantes enMAJUSCULES. - Fonctions en
snake_case, privées avec__. - Classes en
CamelCase(PascalCase).
2.9 Mots-clés
Mots réservés par Python (ex : if, else, while, def, class, …).
2.10 Saisie clavier
input(prompt) : affiche le prompt, attend une saisie, retourne une chaîne.
nom = input("Entrez votre nom : ")
age = int(input("Âge : "))
note = float(input("Note : "))
print(f"Bonjour {nom}, tu as {age} ans et ta note est {note}.")
III. Systèmes de numération
3.1 Représentations des entiers
- Binaire :
0bou0B(ex :0b1011) - Octal :
0oou0O(ex :0o77) - Décimal : normal
- Hexadécimal :
0xou0X(ex :0xFF)
print(0b111) # 7
print(0o111) # 73
print(0x111) # 273
3.2 Conversions
- Autre base → décimal : multiplier chaque chiffre par (base)^(position-1) et sommer.
- Décimal → autre base : divisions successives par la base, restes inversés.
- Binaire → octal : grouper par 3 bits à partir de la droite.
- Binaire → hexadécimal : grouper par 4 bits.
- Octal → binaire : chaque chiffre octal → 3 bits.
- Hexadécimal → binaire : chaque chiffre hex → 4 bits.
3.3 Nombres binaires et calculs
L'ordinateur utilise le binaire (0/1). Le bit de poids fort est le signe (0 = positif, 1 = négatif).
3.4 Codes : complément à 2 (two's complement)
- Positif : code identique pour signe, magnitude, complément.
- Négatif :
- Complément à 1 = inversion des bits (sauf signe).
- Complément à 2 = complément à 1 + 1.
- Tous les calculs sont faits en complément à 2.
# Exemple 1-3 (en utilisant 8 bits)
# 1 + (-3)
# 1 (complément à 2) : 0000 0001
# -3 (original) : 1000 0011
# -3 (complément à 1) : 1111 1100
# -3 (complément à 2) : 1111 1101
# Addition : 0000 0001 + 1111 1101 = 1111 1110 (complément à 2)
# Convertir en décimal : 1111 1110 - 1 = 1111 1101 (complément à 1), inverser : 1000 0010 = -2
3.5 Opérateurs bitwise
~: NON bitwise (inverse tous les bits)&: ET bitwise|: OU bitwise^: XOR bitwise<<: décalage à gauche (multiplication par 2^n)>>: décalage à droite (division entière par 2^n, conserve le signe)
a = 2 # 0010
b = 3 # 0011
print(a & b) # 2 (0010)
print(a | b) # 3 (0011)
print(a ^ b) # 1 (0001)
print(~a) # -3 (inversion)
print(a << 1) # 4 (0100)
print(a >> 1) # 1 (0001)