Section 11.1.16 : Python — Boucles, conditions et fonctions
🎯 Objectif pédagogique
Maîtriser les structures de contrôle et les fonctions en Python. Vous serez capable d'écrire des programmes structurés avec de la logique conditionnelle, des boucles, et des fonctions réutilisables.
La logique de programmation
Marc avait l'habitude des formules Excel imbriquées (IF, VLOOKUP, SUMPRODUCT). Bonne nouvelle : la logique de programmation est la même — seule la syntaxe change. Et elle est beaucoup plus lisible en Python.
Conditions
# if / elif / else
age = 34
experience_years = 0
if age < 25 and experience_years == 0:
print("Junior débutant")
elif age >= 25 and experience_years == 0:
print("Reconversion professionnelle") # ← Marc
elif experience_years >= 5:
print("Senior")
else:
print("Intermédiaire")
# Conditions avec listes
skills = ["HTML", "CSS", "JavaScript", "Python"]
if "Python" in skills and len(skills) >= 4:
print("Prêt pour la data science !")
# Opérateur ternaire
status = "Prêt" if len(skills) >= 4 else "En cours"
Boucles
# for — itérer sur une séquence
technologies = ["HTML", "CSS", "JavaScript", "Python", "Git"]
for tech in technologies:
print(f"✅ \{tech\}")
# for avec range
for i in range(5): # 0, 1, 2, 3, 4
print(f"Itération \{i\}")
for i in range(1, 6): # 1, 2, 3, 4, 5
print(f"Semaine \{i\}")
# for avec enumerate (index + valeur)
for index, tech in enumerate(technologies, 1):
print(f"\{index\}. \{tech\}")
# while — tant que la condition est vraie
attempts = 0
max_attempts = 3
while attempts < max_attempts:
answer = input("Mot de passe : ")
if answer == "secret":
print("✅ Accès accordé")
break
attempts += 1
print(f"❌ Essai \{attempts\}/\{max_attempts\}")
else:
print("🔒 Compte bloqué")
# Compréhensions (très Pythonique)
# Liste
squares = [n**2 for n in range(10)]
# Avec filtre
even_squares = [n**2 for n in range(10) if n % 2 == 0]
# Dictionnaire
tech_lengths = \{tech: len(tech) for tech in technologies\}
# \{'HTML': 4, 'CSS': 3, 'JavaScript': 10, 'Python': 6, 'Git': 3\}
Fonctions
# Fonction basique
def greet(name):
return f"Bonjour \{name\} !"
print(greet("Marc")) # "Bonjour Marc !"
# Paramètres par défaut
def create_profile(name, age, role="Étudiant"):
return \{
"name": name,
"age": age,
"role": role
\}
marc = create_profile("Marc", 34, "Reconversion")
student = create_profile("Alice", 22) # role = "Étudiant"
# Retours multiples
def analyze_scores(scores):
return min(scores), max(scores), sum(scores) / len(scores)
minimum, maximum, average = analyze_scores([85, 92, 78, 95, 88])
print(f"Min: \{minimum\}, Max: \{maximum\}, Moyenne: \{average:.1f\}")
# *args et **kwargs
def log_activity(user, *actions, **metadata):
print(f"Utilisateur : \{user\}")
for action in actions:
print(f" - \{action\}")
for key, value in metadata.items():
print(f" [\{key\}] = \{value\}")
log_activity("Marc", "login", "view_module", "complete_quiz",
timestamp="2026-03-17", duration="45min")
Gestion des erreurs
# try/except — capturer les erreurs
def safe_divide(a, b):
try:
result = a / b
return result
except ZeroDivisionError:
print("❌ Division par zéro impossible")
return None
except TypeError:
print("❌ Types invalides")
return None
finally:
print("Opération terminée")
safe_divide(10, 0) # ❌ Division par zéro impossible
safe_divide(10, 3) # 3.333... + "Opération terminée"
# Application réelle : lecture de fichier
def read_config(filepath):
try:
with open(filepath, 'r') as f:
return f.read()
except FileNotFoundError:
print(f"Fichier \{filepath\} introuvable")
return None
with — le gestionnaire de contexte
with open() ouvre le fichier ET garantit qu'il sera fermé, même en cas d'erreur. C'est le pattern standard pour manipuler des fichiers, des connexions réseau, etc. Marc : "C'est comme verrouiller la porte en partant — automatiquement."
🏋️ Exercice pratique (25 minutes)
Créez un mini "tracker de bootcamp" en Python :
# bootcamp_tracker.py
def create_bootcamp():
return \{
"student": "Marc Dupont",
"weeks": 5,
"current_week": 1,
"skills_per_week": \{\},
"quizzes": []
\}
def add_skills(bootcamp, week, skills):
bootcamp["skills_per_week"][week] = skills
print(f"✅ Semaine \{week\} : \{', '.join(skills)\}")
def add_quiz_result(bootcamp, quiz_name, score, total):
bootcamp["quizzes"].append(\{
"name": quiz_name,
"score": score,
"total": total,
"percent": round(score / total * 100, 1)
\})
def show_dashboard(bootcamp):
print(f"\n\{'='*40\}")
print(f" BOOTCAMP TRACKER — \{bootcamp['student']\}")
print(f"\{'='*40\}")
# Progression
progress = bootcamp["current_week"] / bootcamp["weeks"]
bar = "█" * int(progress * 20) + "░" * (20 - int(progress * 20))
print(f"\n Progression : [\{bar\}] \{progress*100:.0f\}%")
# Skills
total_skills = sum(len(s) for s in bootcamp["skills_per_week"].values())
print(f" Skills totales : \{total_skills\}")
# Quiz moyenne
if bootcamp["quizzes"]:
avg = sum(q["percent"] for q in bootcamp["quizzes"]) / len(bootcamp["quizzes"])
print(f" Moyenne quiz : \{avg:.1f\}%")
print(f"\{'='*40\}")
# Utilisation
tracker = create_bootcamp()
add_skills(tracker, 1, ["HTML", "CSS", "JavaScript", "Python", "Git"])
add_quiz_result(tracker, "HTML Basics", 8, 10)
add_quiz_result(tracker, "CSS Flexbox", 7, 10)
add_quiz_result(tracker, "JS Variables", 9, 10)
show_dashboard(tracker)
Que fait la syntaxe 'for index, tech in enumerate(technologies, 1)' ?
Quel est le rôle du bloc 'finally' dans un try/except ?
Quelle est la manière 'pythonique' de créer une liste des carrés des nombres pairs de 0 à 9 ?