Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Séminaire 1 : Notions de base en Python


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, list et dict

  • Utiliser print(), input() et les f-strings pour les entrées/sorties

  • Appliquer 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 :

Comment utiliser ce notebook :

  1. Lisez la courte explication dans chaque section.

  2. Exécutez la cellule de code en dessous avec Shift + Enter et regardez la sortie.

  3. Changez une valeur et exécutez-la de nouveau — c’est la manière la plus rapide d’apprendre.

  4. 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

TypeExempleDescription
int42, -7, 0Entier à précision arbitraire
float3.14, -0.001, 1e6Virgule flottante 64-bit IEEE 754
str'hello', "world"Séquence immuable de caractères Unicode
boolTrue, FalseSous-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 listed

1.2 Entrée et 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 sep et comment la ligne se termine avec end.

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 :.2f aprè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écificateurSignificationExemple de sortie
.2f2 décimales (float)3.14
dentier42
enotation scientifique6.02e+23
>10aligner à droite sur 10 caractères Alice
<10aligner à gauche sur 10 caractèresAlice
,séparateur de milliers1,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 avec Shift + 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ègleMauvaisBon
Indentation2 espaces ou tabulations4 espaces
Longueur de ligne>79 caractères≤79 caractères
Noms de variableMyVar, myvar, MYVARmy_var (snake_case)
Noms de classemy_class, myclassMyClass (PascalCase)
ConstantesmaxSpeedMAX_SPEED (UPPER_CASE)
FonctionsCalcArea()calc_area() (snake_case)
Espaces autour des opérateursx=1+2x = 1 + 2
Lignes videsAucune entre les fonctions2 lignes vides entre définitions au niveau supérieur
Importsimport os, sysUn 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 ruff

Vérifiez votre code (linting) :

ruff check main.py   # or . for all files in the current directory

Formatez 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 :

  1. Demande à l’utilisateur son nom et son âge (avec input())

  2. Affiche une salutation personnalisée qui inclut son nom

  3. Calcule et affiche l’année approximative de naissance (supposez que l’année courante est 2026)

  4. 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 :

  1. Identifiez chaque violation (il y en a 11)

  2. Corrigez-les dans la cellule qui suit

  3. 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 :

  1. Lit un nombre depuis l’utilisateur avec input() (comme chaîne)

  2. Le convertit en float

  3. Affiche son carré et sa racine carrée (utilisez ** 0.5)

  4. 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 :

SpecifierSignificationExemple
{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 ligne print(...) à 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èmePoint clé
Types de donnéesint, float, str, bool, list, dict — convertissez explicitement
E/Sprint() avec f-strings ; input() retourne toujours un str
PEP-8Un 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.