TD — Fonctions avancées, portée des variables et environnement de développement
1. Fonctions avancées
Exercice 1
Écrire une fonction moyenne(a, b) qui retourne la moyenne de deux nombres.
Exercice 2
Écrire une fonction prix_final(prix, remise=0) qui retourne le prix après remise
(en pourcentage). Si aucune remise n’est précisée, le prix reste inchangé.
prix_final(100) # 100
prix_final(100, 20) # 80
2. Portée des variables (scope)
Exercice 3
Que va afficher le code suivant ? Répondre avant d’exécuter.
x = 10
def f():
x = 5
return x
print(f())
print(x)
Exercice 4
Le code suivant provoque une erreur. Identifier laquelle, l’expliquer, puis corriger.
compteur = 0
def incrementer():
compteur = compteur + 1
incrementer()
print(compteur)
3. Environnement virtuel (venv)
Exercice 5
- Créer un environnement virtuel nommé
envdans votre dossier de travail, puis l’activer (vérifier que l’invite de commande indique bien que l’environnement est actif). - Installer la librairie
requestset vérifier l’installation avecpip show requests. - Écrire un script
test_requests.pyqui importerequests, fait une requête GET surhttps://api.github.com, et afficheresponse.status_code. - Générer un fichier
requirements.txtlistant les dépendances du projet, et identifier la ligne correspondant àrequests.
Exercice 6 — Isolation entre deux environnements
- Créer deux dossiers de projet distincts :
projet_aetprojet_b. - Dans
projet_a, créer et activer un environnement virtuel, puis installerrequests==2.31.0. - Désactiver cet environnement, puis dans
projet_b, créer et activer un second environnement virtuel, puis installerrequests==2.25.1. - Dans chaque environnement (activé séparément), vérifier la version installée avec
pip show requests. - Que se passe-t-il si vous essayez d’utiliser
requestssans avoir activé l’un des deux environnements ?
4. Journalisation (logging)
Exercice 7
Reprendre votre fonction carre(x) de la séance 1. Ajouter :
- une ligne
logger.infojuste avant lereturn, indiquant la valeur reçue et le résultat calculé - une configuration
logging.basicConfigen tête de script, aveclevel=logging.INFO
Exécuter avec plusieurs valeurs et vérifier que les messages s’affichent.
Exercice 8
Écrire une fonction diviser(a, b) qui :
- retourne
a / b - si
b == 0, logue une erreur aveclogger.error(...)(sans faire planter le programme) et retourneNone
diviser(10, 2) # 5.0, aucun log
diviser(10, 0) # None, un message d'erreur loggé
Exercice 9
Créez un module qui charge un fichier CSV. Loggez chaque étape (ouverture, succès, erreur).
Indice : configurez le
loggingavant d’ouvrir le fichier. Loguez les étapes clés : début, succès, erreur.
Exercice 10 — Lecture de logs
Voici un extrait de fichier app.log généré par un programme que vous n’avez pas
écrit :
2026-09-22 10:03:11 - INFO - Connexion à la base de données réussie
2026-09-22 10:03:12 - DEBUG - Chargement de 42 enregistrements
2026-09-22 10:03:14 - WARNING - Enregistrement #17 incomplet, ignoré
2026-09-22 10:03:15 - INFO - Traitement terminé : 41 enregistrements traités
2026-09-22 10:03:20 - ERROR - Échec de la sauvegarde : connexion perdue
2026-09-22 10:03:20 - CRITICAL - Arrêt du programme
Sans exécuter aucun code, répondre aux questions suivantes à partir de ce seul extrait :
- Dans quel ordre les événements se sont-ils produits ? Combien de temps s’est écoulé entre le début et la fin ?
- Le programme a-t-il réussi à traiter toutes les données ? Justifier avec la ligne correspondante.
- Quelle est la cause probable de l’arrêt du programme ?
- Si vous deviez ne garder que les messages
WARNINGet plus graves, combien de lignes resteraient ?
Exercice 11 — Log incomplet
Le programme suivant plante avec une erreur, mais son fichier de log ne contient qu’une ligne :
2026-09-22 11:15:02 - INFO - Démarrage du traitement
def traiter(valeurs):
logger.info("Démarrage du traitement")
total = 0
for v in valeurs:
total += 100 / v
return total
traiter([5, 2, 0, 8])
- Pourquoi le log ne contient-il qu’une seule ligne alors que le programme a planté plus loin ?
- Ajouter les lignes de
loggingnécessaires (avec le bon niveau) pour que le fichier permette de comprendre, sans relancer le programme, ce qui s’est passé.
5. Pour aller plus loin (optionnel)
À faire uniquement si vous avez terminé les exercices précédents. Pas de correction prévue en classe pour cette partie.
Exercice 12 — pre-commit
- Installer
pre-commit(pip install pre-commit). - Créer un fichier
.pre-commit-config.yamlavec au moins le hooktrailing-whitespace. - Créer un fichier Python contenant des espaces en fin de ligne, faire
git commit, et observer ce quepre-commitcorrige automatiquement.
Exercice 13 — Poetry
- Installer Poetry.
- Initialiser un projet avec
poetry init. - Ajouter
requestscomme dépendance avecpoetry add requests. - Comparer le fichier généré (
pyproject.toml) avec lerequirements.txtde l’exercice 5 : quelles différences remarquez-vous ?