Variables
Progression
#Variables et types
Les variables permettent de nommer des valeurs pour les réutiliser et les composer dans vos programmes. En Python, un nom de variable référence un objet qui contient à la fois une valeur et un type, plutôt qu'un emplacement mémoire fixe comme dans d'autres langages. Cette distinction a des conséquences importantes sur la mutabilité, la différence entre identité et égalité, et la portée des noms selon la règle LEGB.
Objectifs d'apprentissage
- Comprendre que les noms référencent des objets (valeurs + types) plutôt que des emplacements mémoire fixes.
- Manipuler les types de base (nombres, chaînes, booléens) et effectuer des conversions simples entre eux.
- Expliquer la résolution des noms selon la règle LEGB et éviter les pièges courants liés aux portées.
1x = 32y = 2.53nom = "Ada"4vrai = True5print(x + y, nom.upper(), vrai)Les noms de variables doivent être explicites et suivre la convention snake_case en Python. Il est important de comprendre que les affectations lient un nom à une valeur plutôt qu'à un emplacement mémoire : l'instruction a = b copie une référence vers l'objet, pas l'objet lui-même.
#Identité vs égalité, mutabilité
Python distingue l'égalité de valeurs et l'identité d'objets. L'opérateur == compare les valeurs de deux objets, tandis que l'opérateur is vérifie s'il s'agit du même objet en mémoire (même adresse logique).
Les types se divisent en deux catégories : les types immuables comme int, str et tuple ne peuvent pas être modifiés une fois créés, et toute opération crée un nouvel objet. À l'inverse, les types mutables comme list, dict et set peuvent être modifiés en place, ce qui peut créer des effets de bord si plusieurs noms référencent le même objet.
1xs = [1,2]; ys = xs2ys.append(3)3print(xs) # [1, 2, 3] (même objet)#Portée des noms (LEGB)
La résolution des noms en Python suit la règle LEGB : Local, Enclosing, Global, Builtins. Python cherche d'abord dans la portée locale (variables de la fonction courante), puis dans les portées englobantes (closures), ensuite dans la portée globale (module), et enfin dans les noms intégrés. Il est recommandé d'éviter les mots-clés global et nonlocal sauf dans des cas pédagogiques spécifiques, et de privilégier le retour de valeurs explicites.
#Nombres et opérateurs
Python propose des opérateurs arithmétiques standard pour manipuler les nombres : addition +, soustraction -, multiplication *, division /, division entière //, modulo %, et exponentiation **. Les opérateurs de comparaison incluent ==, !=, <, <=, >, >=, tandis que les opérateurs logiques sont and, or et not.
1a, b = 7, 32print(a // b, a % b, a ** b)#Chaînes de caractères
Les chaînes de caractères peuvent être concaténées avec l'opérateur +, mais l'interpolation avec les f-strings (f"{variable}") est généralement plus lisible et performante. Python offre de nombreuses méthodes utiles pour manipuler les chaînes : .strip() retire les espaces en début et fin, .split() découpe une chaîne en liste, et .join() assemble une liste en chaîne.
1prenom, age = 'Ada', 362msg = f"{prenom} a {age} ans"3print(msg, msg.split())#Playground
#Exercices
Ces exercices vous permettront de pratiquer la manipulation des types de base et des conversions :
- Écrivez un programme qui convertit un nombre de secondes en format
HH:MM:SS. - Demandez un nom à l'utilisateur et affichez un message de bienvenue en majuscules.
- Calculez l'IMC (Indice de Masse Corporelle) à partir d'un poids et d'une taille saisis, puis affichez la catégorie approximative.
- Manipulez des dates et heures : calculez le nombre de jours entre deux dates données.
#Solutions (exemples)
#À retenir
- Nommer les variables clairement (snake_case).
- Préférer l'interpolation (f-strings) aux concaténations.
- Connaître les types de base et conversions simples.
- Confondre
'2' + 2(erreur de type) avec2 + 2. - Réutiliser un nom de fonction builtin (ex:
list,str) comme variable. - Oublier que l'affectation crée/rebinde une référence (les listes sont mutables).
Copier une référence (ex: ys = xs) lie deux noms au même objet. Pour copier les données: xs.copy() (superficiel) ou copy.deepcopy si nécessaire.
#Quiz rapide
#Animation: portée et résolution des noms (LEGB)
len seulementx = "global" # Global
def outer():
# (pas de x ici)
def inner():
x = "local"
print(x) # LEGB
inner()
outer()