Prérequis : Complétez Séminaire 0a (Python Setup from Scratch) avant ce séminaire.
Note de configuration : La configuration de l’environnement est entièrement couverte dans le Séminaire 0a ; ce séminaire commence directement par les notions de base en Python.
Objectifs d’apprentissage¶
À la fin de ce séminaire, vous serez capable de :
Comprendre les types de données de base de Python :
int,float,str,bool,listetdictUtiliser
print(),input()et les f-strings pour les entrées/sortiesAppliquer les conventions de style PEP-8
Partie 1 : Théorie¶
Remarque : Ceci n’est pas un cours complet de Python — nous couvrons le minimum nécessaire avant de passer à l’algorithmique. Si vous pouvez déjà cocher en toute confiance toutes les cases ci-dessus, passez directement à la Partie 2.
Vous avez des difficultés avec Python ? C’est tout à fait normal. Ces trois premiers séminaires existent pour vous fournir cette base. Si vous souhaitez un accompagnement vidéo en parallèle de ce notebook, ces ressources gratuites couvrent exactement le même contenu :
🎥 CS50P Lecture 0 — Functions & Variables (~1.5 hrs — covers
input, f-strings)🎥 CS50P Lecture 1 — Conditionals (~1 hr)
📖 Python official tutorial — introduction — concise written reference
Comment utiliser ce notebook :
Lisez la courte explication dans chaque section.
Exécutez la cellule de code en dessous avec
Shift + Enteret regardez la sortie.Changez une valeur et exécutez-la de nouveau — c’est la manière la plus rapide d’apprendre.
Puis essayez l’exercice de la section.
⚠️ Important — exécutez les cellules dans l’ordre, de haut en bas. Si vous en sautez une et voyez une
NameError, revenez en arrière et exécutez d’abord les cellules supérieures. Chaque cellule peut dépendre de variables définies dans les cellules précédentes.Ressource : Ce cours suit librement la Python track on roadmap.sh et la Data Structures & Algorithms track. N’hésitez pas à approfondir à votre rythme.
Référence rapide : lire les cellules de code¶
Deux choses apparaissent dans presque toutes les cellules de code :
Les lignes commençant par
#sont des commentaires — Python les ignore complètement. Elles existent uniquement pour expliquer le code à vous et, plus tard, à d’autres personnes.Pour décommenter une ligne (la faire exécuter par Python), retirez simplement le
#et l’espace au début de cette ligne.print(...)affiche la sortie sous la cellule lorsque vous l’exécutez.
1.1 Variables et types de données fondamentaux¶
Python est dynamically typed : vous ne déclarez pas explicitement un type — l’interpréteur l’infère à partir de la valeur.
Cependant, être dynamically typed ne signifie pas que Python est permissif sur les types. Python est aussi strongly typed : il ne convertira jamais silencieusement un type en un autre pour vous. Si vous essayez de mélanger des types incompatibles, Python lève immédiatement une erreur — il n’y a pas de surprises.
Comparez ceci à JavaScript, qui est weakly typed et convertit silencieusement des valeurs de manières qui produisent souvent des résultats inattendus et difficiles à déboguer :
// JavaScript (weakly typed) — all of these run without any error:
console.log("5" + 3); // → "53" (number silently converted to string!)
console.log("5" - 3); // → 2 (string silently converted to number!)
console.log(true + true); // → 2 (booleans silently treated as integers!)En Python, les opérations équivalentes lèvent un TypeError immédiatement, ce qui rend les bugs beaucoup plus faciles à repérer. Exécutez la cellule de code juste en dessous pour voir cela en action.
Types scalaires fondamentaux en Python¶
| Type | Exemple | Description |
|---|---|---|
int | 42, -7, 0 | Entier à précision arbitraire |
float | 3.14, -0.001, 1e6 | Virgule flottante 64-bit IEEE 754 |
str | 'hello', "world" | Séquence immuable de caractères Unicode |
bool | True, False | Sous-classe de int (True == 1, False == 0) |
list | [1, 2, "hi"] | Séquence ordonnée mutable de n’importe quel type |
dict | {"name": "Alex"} | Mappage mutable de paires clé–valeur |
⭐ À retenir aujourd’hui :
int,float,str,bool. Les listes (list) et les dictionnaires (dict) sont présentés ici pour compléter — vous les utiliserez beaucoup à partir du séminaire 2. Ne vous inquiétez pas s’ils vous semblent encore étrangers.
Coercion et conversions de type¶
Python ne convertit pas implicitement entre les types (contrairement à JavaScript). Utilisez les constructeurs explicites : int(), float(), str(), bool().
Exécutez la seconde cellule de code ci-dessous, puis essayez de modifier une valeur (par ex. student_count = 100) et réexécutez-la pour voir comment la sortie change.
# ============================================================
# ⭐ CORE — Python is strongly typed
# ============================================================
# These lines raise a TypeError — uncomment them one at a time to see.
# (To uncomment: remove the '#' and the space at the start of the line)
# "5" + 3 # → TypeError: can only concatenate str (not "int") to str
# "5" - 3 # → TypeError: unsupported operand type(s) for -: 'str' and 'int'
# What you must do instead — convert explicitly:
print("5" + str(3)) # → "53" (int converted to str explicitly)
print(int("5") - 3) # → 2 (str converted to int explicitly)
print(int("5") + 3) # → 8
# Python always tracks the type of every variable:
x = 42
y = "hello"
print(f"\ntype(x) = {type(x)}") # <class 'int'>
print(f"type(y) = {type(y)}") # <class 'str'>
# Mixing incompatible types always fails loudly — uncomment to see:
# print(x + y) # → TypeError: unsupported operand type(s) for +: 'int' and 'str'# ============================================================
# ⭐ CORE — run this cell, read the output, then modify values
# ============================================================
# --- Integers ---
student_count = 42 # whole number
negative_temp = -7 # negative integer
print("=== Integers ===")
print(f"student_count = {student_count}, type = {type(student_count)}")
print(f"negative_temp = {negative_temp}")
# --- Floats ---
pi = 3.14159
scientific = 6.022e23 # Avogadro's number (scientific notation)
print("\n=== Floats ===")
print(f"pi = {pi}")
print(f"scientific = {scientific:.3e}") # formatted as scientific notation
# ⚠️ Classic gotcha — float arithmetic is not always exact:
print(f"\n0.1 + 0.2 = {0.1 + 0.2}") # Not 0.3!
print(f"Round fix: {round(0.1 + 0.2, 10)}")
# --- Strings ---
name = "Alice"
city = 'Geneva' # single or double quotes both work
print("\n=== Strings ===")
print(f"name = '{name}', length = {len(name)}")
print(f"Uppercase: {name.upper()}")
print(f"Slicing name[1:3]: {name[1:3]}") # characters at index 1 and 2 → 'li'
# --- Booleans ---
is_enrolled = True
has_submitted = False
print("\n=== Booleans ===")
print(f"is_enrolled = {is_enrolled}")
print(f"bool(0) = {bool(0)}") # 0 is falsy
print(f"bool('') = {bool('')}") # empty string is falsy
print(f"bool('hello') = {bool('hello')}") # non-empty string is truthy
# --- Lists ---
grades = [85, 92, 78, 95]
names = ["Alice", "Bob", "Carol"]
print("\n=== Lists ===")
print(f"grades = {grades}")
print(f"grades[0] = {grades[0]}") # first element (index starts at 0)
print(f"grades[-1] = {grades[-1]}") # last element
grades.append(88)
print(f"after append = {grades}")
print(f"length = {len(grades)}")
# --- Dicts ---
student = {"name": "Alice", "age": 21, "enrolled": True}
print("\n=== Dicts ===")
print(f"student = {student}")
print(f"student['name'] = {student['name']}")
student["grade"] = 92
print(f"after adding key = {student}")
print(f"keys = {list(student.keys())}")
# ============================================================
# 💡 OPTIONAL — other integer formats and curiosities
# ============================================================
# big_number = 1_000_000 # underscores for readability (Python 3.6+)
# in_binary = 0b1010 # binary literal → 10
# in_hex = 0xFF # hexadecimal → 255
# multiline = """This string
# spans multiple lines."""
# Boolean quirk: True is literally the integer 1
# print(f"True + True = {True + True}") # = 2 (legal but unusual)
# print(f"int(True) = {int(True)}") # = 1# ============================================================
# ⭐ CORE — explicit type conversion
# ============================================================
age_str = "21" # This is a string — you cannot do arithmetic on it yet
age_int = int(age_str) # Convert to int
age_float = float(age_str) # Convert to float
print(f"'21' as int: {age_int + 1}") # 22 — now we can do arithmetic
print(f"'21' as float: {age_float}") # 21.0
# type() tells you what type a variable is
x = 42
print(f"\ntype(42): {type(x)}")
print(f"type('hello'): {type('hello')}")
# --- What happens with an invalid conversion? ---
try:
int("hello") # This raises a ValueError — "hello" is not a number
except ValueError as e:
print(f"\nValueError: {e}")
print("You cannot convert a non-numeric string to int!")
# isinstance() checks whether a value belongs to one or more types.
# It is preferred over type() in production code because it also handles
# subclasses (e.g. bool is a subclass of int, so isinstance(True, int) is True).
print(f"\nisinstance(42, (int, float)): {isinstance(x, (int, float))}")
# → True: 42 is an int, and int is one of the types listed1.2 Entrée et sortie¶
print() — sortie¶
print() est la fonction intégrée de Python pour afficher une sortie. Elle écrit du texte sur la console — la fenêtre du terminal lorsque vous exécutez un fichier .py, ou la zone de sortie sous la cellule dans Jupyter. Chaque fois que vous voulez que votre programme affiche quelque chose à l’utilisateur, vous utilisez print().
print(*objects, sep=' ', end='\n', file=sys.stdout)Vous pouvez passer plusieurs valeurs séparées par des virgules, et contrôler comment elles sont jointes avec
sepet comment la ligne se termine avecend.
input() — entrée¶
input() est le pendant de print(). Il affiche un message d’invite dans la console, puis met le programme en pause et attend que l’utilisateur tape quelque chose et appuie sur Entrée. C’est ainsi que l’on construit des programmes interactifs en ligne de commande où l’utilisateur fournit des données à l’exécution — par exemple, demander le nom de quelqu’un ou un nombre à traiter.
Retourne toujours une chaîne de caractères, quelle que soit l’entrée de l’utilisateur — pensez à convertir si vous avez besoin d’un nombre.
Dans les notebooks Jupyter,
input()ouvre un champ de texte interactif sous la cellule.
f-strings (littéraux de chaîne formatés)¶
Introduits dans Python 3.6, les f-strings sont la manière moderne et lisible d’imbriquer des expressions dans des chaînes :
name = "Alice"
score = 95.7
print(f"Student {name} scored {score:.1f}%")
# → Student Alice scored 95.7%⭐ Patron central : préfixez une chaîne par
f, puis placez une variable ou une expression entre{ }. Ajoutez:.2faprès un nombre pour contrôler le nombre de décimales. C’est tout ce dont vous avez besoin pour les exercices.
Les spécificateurs de format après : contrôlent l’affichage des valeurs :
| Spécificateur | Signification | Exemple de sortie |
|---|---|---|
.2f | 2 décimales (float) | 3.14 |
d | entier | 42 |
e | notation scientifique | 6.02e+23 |
>10 | aligner à droite sur 10 caractères | Alice |
<10 | aligner à gauche sur 10 caractères | Alice |
, | séparateur de milliers | 1,000,000 |
💡 Optionnel : les spécificateurs d’alignement (
>,<,^) et le remplissage par zéro (03d) ne sont nécessaires que pour l’Exercice 4. Skip them for now and come back when you get there.
Exécutez les cellules de code ci-dessous. Après la première, changez name et score et réexécutez.
# ============================================================
# ⭐ CORE — print() and basic f-strings
# ============================================================
# --- print() basics ---
print("Hello, World!")
print("Alice", "Bob", "Carol") # multiple args → joined with a space by default
print("Alice", "Bob", "Carol", sep=" | ") # sep= changes the character between each value
# '\n' is the newline character — it moves output to the next line.
# By default print() adds a '\n' at the end, so each print() starts on a fresh line.
print("Line 1", end=" ") # end="" replaces the default '\n' — no line break here
print("(still on the same line)") # this continues on the same line as "Line 1"
# --- f-strings: the essential pattern ---
name = "Alice"
score = 95.666
print(f"\nStudent: {name}") # \n at the start adds a blank line before the output
print(f"Score: {score:.2f}%") # :.2f = show exactly 2 decimal places
# Any Python expression works inside { }
a, b = 7, 3
print(f"\n{a} + {b} = {a + b}")
print(f"Name uppercase: {name.upper()}")
# Debug trick (Python 3.8+): add = after the variable name inside { }
# to print both the variable name and its value — very handy when debugging!
x = 42
print(f"{x=}") # prints: x=42
# ============================================================
# 💡 OPTIONAL — alignment and padding (useful for Exercise 4)
# ============================================================
rank = 1
population = 8_100_000_000
print(f"\nRank: {rank:03d}") # 03d: pad integer with zeros to width 3 → 001
print(f"World population: {population:,}") # , adds thousands separators → 8,100,000,000
print(f"Right-aligned: {'hello':>15}") # >15: right-align in a field of 15 characters
print(f"Left-aligned: {'hello':<15}|") # <15: left-align (the | shows where the field ends)
print(f"Centered: {'hello':^15}|") # ^15: center
print(f"Pi approx: {3.14159265:.4f}")⚠️ La cellule ci-dessous utilise
input()et nécessite votre interaction. Exécutez-la avecShift + Enter, puis tapez votre réponse dans le champ de texte qui apparaît et appuyez sur Entrée pour confirmer. Ne faites pas de Run All — cela bloquerait en attendant une entrée qui ne viendra jamais.
# --- input() example ---
# Run this cell — a text field will appear below it in Jupyter.
# Type your name, press Enter, then type your age and press Enter again.
name = input("Enter your name: ")
age_str = input("Enter your age: ")
age = int(age_str) # input() always returns a string — convert to int for arithmetic
print(f"Hello, {name}! You are {age} years old.")
print(f"In 10 years you will be {age + 10}.")1.3 PEP-8 : le guide de style Python¶
PEP-8 est le guide de style officiel pour le code Python. Le suivre rend le code plus lisible et maintenable — particulièrement important dans les projets d’équipe.
💡 Vous n’avez pas besoin de tout mémoriser maintenant. Concentrez-vous sur seulement deux règles aujourd’hui : indentation de 4 espaces et noms de variables en snake_case. Ce sont celles que vous rencontrerez à chaque séance. Le reste vous deviendra familier avec le temps, et Ruff (voir ci-dessous) les détectera automatiquement de toute façon.
Règles clés en un coup d’œil¶
| Règle | Mauvais | Bon |
|---|---|---|
| Indentation | 2 espaces ou tabulations | 4 espaces |
| Longueur de ligne | >79 caractères | ≤79 caractères |
| Noms de variable | MyVar, myvar, MYVAR | my_var (snake_case) |
| Noms de classe | my_class, myclass | MyClass (PascalCase) |
| Constantes | maxSpeed | MAX_SPEED (UPPER_CASE) |
| Fonctions | CalcArea() | calc_area() (snake_case) |
| Espaces autour des opérateurs | x=1+2 | x = 1 + 2 |
| Lignes vides | Aucune entre les fonctions | 2 lignes vides entre définitions au niveau supérieur |
| Imports | import os, sys | Un import par ligne |
Application automatique : linting et formatage¶
Le linting est le processus d’analyse automatique du code source pour détecter les violations de style, les bugs potentiels et les problèmes de qualité de code — sans exécuter le code. Le formatage consiste à réécrire automatiquement votre code pour le conformer à un style cohérent (indentation, espaces, longueur de ligne, etc.). Ensemble, ils vous évitent d’avoir à retenir chaque règle PEP-8 par cœur.
Un outil qui fait les deux est Ruff — un linter et formateur Python rapide.
Installez Ruff dans votre environnement virtuel :
pip install ruffVérifiez votre code (linting) :
ruff check main.py # or . for all files in the current directoryFormatez automatiquement votre code :
ruff format main.py # or . for all files in the current directory# ============================================================
# PEP-8 VIOLATIONS vs. CORRECT CODE — side-by-side comparison
# ============================================================
# --- BAD: poor naming, no spaces, mixed style ---
# (This is commented out because it's intentionally bad style)
# def CalcArea(r):
# PI=3.14159
# return PI*r*r
# myResult=CalcArea(5)
# print(myResult)
# --- GOOD: PEP-8 compliant ---
import math # standard library imports at the top
def calculate_circle_area(radius: float) -> float:
"""Return the area of a circle given its radius."""
# Use math.pi for the most accurate value
return math.pi * radius ** 2
# Constants in UPPER_SNAKE_CASE
MAX_RADIUS = 1000
# Variable names in snake_case
test_radius = 5.0
area_result = calculate_circle_area(test_radius)
print(f"Area of circle with radius {test_radius}: {area_result:.4f}")
print(f"Maximum allowed radius: {MAX_RADIUS}")
# --- Spaces around operators ---
x = 10
y = 20
total = x + y # good: spaces around +
product = x * y # good
# Exception: no space around = in keyword arguments
print(f"Total: {total}", end="\n") # 'end' has no spaces around =
# --- Boolean comparisons ---
items = []
# BAD: if items == []: or if len(items) == 0:
# GOOD:
if not items:
print("The list is empty (Pythonic check)")
value = None
# BAD: if value == None:
# GOOD:
if value is None:
print("Value is None (use 'is', not '==', for None)")Partie 2 : Exercices¶
Travaillez ces exercices individuellement ou par binômes. Demandez de l’aide si vous bloquez — c’est fait pour ça les séminaires !
Exercice 1 : Script de salutation¶
Écrivez un script qui :
Demande à l’utilisateur son nom et son âge (avec
input())Affiche une salutation personnalisée qui inclut son nom
Calcule et affiche l’année approximative de naissance (supposez que l’année courante est 2026)
Vérifie s’il est mineur (moins de 18 ans) ou majeur et affiche un message approprié
Sortie attendue (exemple) :
Enter your name: Alice
Enter your age: 21
Hello, Alice! Welcome to the Algorithmics course.
You were born in approximately 2005.
You are an adult.💡 L’étape 4 nécessite une instruction
if/else— cela est traité formellement au séminaire 2, mais la structure vous est fournie ci-dessous. Votre tâche est de compléter la condition et les deux messages.
if age < 18:
print("...") # message for minors
else:
print("...") # message for adults# Exercise 1 — Your solution here
# Hint: use input(), int(), and f-strings.
Exercice 2 : Corriger les violations PEP-8¶
La cellule de code ci-dessous contient des violations PEP-8 intentionnelles. Votre tâche :
Identifiez chaque violation (il y en a 11)
Corrigez-les dans la cellule qui suit
Vérifiez que la version corrigée produit toujours la même sortie
Violations à rechercher : mauvais nommage, mauvaise indentation, espaces manquants, style d’import incorrect, lignes trop longues, syntaxe de comparaison incorrecte.
# ================================================
# BROKEN CODE — do NOT run this cell as-is
# (it will run, but the style is terrible)
# ================================================
import math,os # violation 1: multiple imports on one line
def CalcRectArea(W,H): # violation 2: PascalCase for function; violation 3: no spaces after commas
area=W*H # violation 4: 2-space indent; violation 5: no spaces around =
return area
MyWidth=10 # violation 6: PascalCase for variable
MyHeight=5 # violation 7: same
Result=CalcRectArea(MyWidth,MyHeight) # violation 8: PascalCase; violation 9: no space after comma
if Result == None: # violation 10: use 'is None' not '== None'
print( "No result") # violation 11: extra space inside print()
else:
print("Area =",Result)# Exercise 2 — Fixed PEP-8-compliant version
# Write your corrected code here.Exercice 3 : Conversions de type¶
Les fonctions intégrées de Python int(), float(), str() et bool() permettent de convertir entre les types. Cela est important chaque fois que vous lisez une entrée utilisateur (qui est toujours une chaîne) ou que vous préparez des données pour l’affichage.
Partie A — Explorer les conversions : exécutez chaque ligne et notez le résultat dans un commentaire.
Partie B — Pratique : écrivez un court script qui :
Lit un nombre depuis l’utilisateur avec
input()(comme chaîne)Le convertit en float
Affiche son carré et sa racine carrée (utilisez
** 0.5)Indique s’il est positif, négatif ou nul
Exemple d’exécution :
Enter a number: 9
Square: 81.0
Square root: 3.0
The number is positive.# Exercise 3 — Type Conversions
# ── Part A: explore conversions (fill in the expected results) ──
print(int("42")) # → ?
print(int(3.99)) # → ? (truncates, does not round)
print(float("3.14")) # → ?
print(str(100)) # → ?
print(bool(0)) # → ?
print(bool("")) # → ?
print(bool("hello")) # → ?
print(bool([])) # → ?
print(bool([0])) # → ? (non-empty list — truthy even if it holds 0)
# ── Part B: YOUR CODE HERE ──────────────────────────────────────
# 1. Read a number from the user
# 2. Convert to float
# 3. Print square and square root
# 4. Print positive / negative / zero
Exercice 4 : Formatage avec f-strings¶
Les f-strings (littéraux de chaîne formatés) permettent d’imbriquer des expressions directement dans des chaînes et de contrôler leur mise en forme avec des spécificateurs :
| Specifier | Signification | Exemple |
|---|---|---|
{x:<12} | aligner à gauche sur 12 caractères | 'Alice ' |
{x:>5} | aligner à droite sur 5 caractères | ' 21' |
{x:.1f} | float avec 1 décimale | '87.0' |
{x:,} | séparateur de milliers | '1,000,000' |
Tâche : en utilisant la liste d’étudiants ci-dessous, affichez un tableau formaté qui ressemble exactement à ceci :
Name Age Grade
-----------------------------
Alice 21 87.0%
Bob 19 73.5%
Chiara 22 95.0%
Dmitri 20 61.3%Indice : affichez d’abord l’en-tête et le séparateur, puis remplissez le corps de la boucle.
💡 Les boucles (
for) sont traitées correctement au séminaire 2 — pour l’instant, la structure de la boucle vous est fournie. Votre tâche est d’écrire la ligneprint(...)à l’intérieur en utilisant les spécificateurs d’alignement des f-strings.
# Exercise 4 — f-string Formatting
students = [
("Alice", 21, 87.0),
("Bob", 19, 73.5),
("Chiara", 22, 95.0),
("Dmitri", 20, 61.3),
]
# Step 1: print the header line and the separator
# YOUR CODE HERE
# Step 2: the loop unpacks each row into (name, age, grade) for you.
# Replace the 'pass' with a single print() using f-string specifiers.
for name, age, grade in students:
pass # ← replace with: print(f"...")Résumé¶
Dans ce séminaire, vous avez abordé :
| Thème | Point clé |
|---|---|
| Types de données | int, float, str, bool, list, dict — convertissez explicitement |
| E/S | print() avec f-strings ; input() retourne toujours un str |
| PEP-8 | Un style cohérent = code lisible et maintenable |
Vous êtes maintenant prêt à commencer le développement en Python. Lors de la prochaine séance, nous verrons les commandes Python de base.