Syntaxe de base et modèle objet de Python
Le code Python combine des expressions, qui produisent des valeurs, et des instructions, qui affectent des noms, choisissent le code à exécuter ou définissent des fonctions et des classes. Dans l’exemple ci-dessous, temperature_c < 0 est une expression dont le résultat détermine la branche du if à exécuter. Les lignes indentées constituent le bloc de chaque branche ; la ligne qui introduit un bloc se termine par :.
temperature_c = 21.5
if temperature_c < 0:
state = "frozen"
else:
state = "liquid"
Les noms désignent des objets
Une affectation lie un nom ; elle ne déclare pas une boîte de stockage et ne copie pas la valeur :
first = [1, 2]
second = first
second.append(3)
assert first == [1, 2, 3]
Utilisez .copy(), une tranche ou une stratégie de copie plus profonde lorsqu'un état mutable indépendant est requis. La mutation dépend du type et de l'API de l'objet.
Familles de valeurs intégrées
- numériques :
int,float,complex,bool; - texte et binaire :
str,bytes,bytearray; - séquences :
list,tuple,range; - associations et ensembles :
dict,set,frozenset; - sentinelle d'absence :
None.
Ces catégories impliquent des protocoles différents. Une chaîne est par exemple immuable, une liste mutable et les clés d'un dictionnaire doivent être hachables.
Opérateurs et comparaisons
/ effectue une division réelle, // une division avec arrondi vers le bas et % donne le reste correspondant. Utilisez == pour l'égalité des valeurs et is pour l'identité, généralement avec des singletons comme None :
if result is None:
handle_missing_result()
La conversion est une frontière
Les constructeurs comme int(text), float(text) et str(value) demandent une conversion et peuvent lever une exception. Ne supposez pas qu'une entrée utilisateur ou un fichier possède déjà la forme voulue :
try:
quantity = int(raw_quantity)
except ValueError as error:
raise ValueError("quantity must be an integer") from error
Espaces de noms et imports
Les imports lient des modules ou certains noms dans l'espace courant :
from pathlib import Path
config_path = Path("config.json")
Préférez les imports explicites et évitez les imports génériques ; la responsabilité et l'origine des noms doivent rester visibles.
Exécuter le code et vérifier les conversions
Ces notes utilisent Python 3.10 ou une version ultérieure. Enregistrez le code dans
example.py, puis lancez python3 example.py (ou py -3 example.py sous Windows).
L'interpréteur interactif affiche automatiquement les expressions ; dans un script,
utilisez print. Indentez de quatre espaces par niveau, sans mélanger tabulations
et espaces. Hors d'une chaîne, # commence un commentaire. Des parenthèses permettent
d'étendre une expression sur plusieurs lignes.
Les types numériques intégrés emploient ici deux directions d'arrondi différentes :
assert -7 // 3 == -3
assert -7 % 3 == 2
assert -7 == (-7 // 3) * 3 + (-7 % 3)
assert int(-2.9) == -2 # troncature vers zéro
assert int(" 12 ") == 12
assert bool("False") is True
input() renvoie du texte. int("2.9") lève ValueError, tandis que int(None)
lève TypeError : un contenu invalide diffère d'un type d'entrée non accepté.
bool(text) teste si la chaîne est vide, sans analyser des mots comme "False".
Les entiers Python ont une précision arbitraire limitée par la mémoire ; les flottants
binaires ne représentent pas exactement la plupart des fractions décimales :
0.1 + 0.2 != 0.3. Pour une comparaison approchée, utilisez math.isclose avec des
tolérances adaptées au problème, plutôt que des arrondis qui masquent les erreurs.
Un nom peut être lié à un objet d'un autre type, mais le type de l'objet détermine
les opérations permises : 3 + "4" lève TypeError. Après l'exemple précédent,
second = [] ne modifie pas first. Une copie superficielle ne sépare que le
conteneur extérieur ; les objets mutables imbriqués peuvent rester partagés.