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é env dans votre dossier de travail, puis l’activer (vérifier que l’invite de commande indique bien que l’environnement est actif).
  • Installer la librairie requests et vérifier l’installation avec pip show requests.
  • Écrire un script test_requests.py qui importe requests, fait une requête GET sur https://api.github.com, et affiche response.status_code.
  • Générer un fichier requirements.txt listant 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_a et projet_b.
  • Dans projet_a, créer et activer un environnement virtuel, puis installer requests==2.31.0.
  • Désactiver cet environnement, puis dans projet_b, créer et activer un second environnement virtuel, puis installer requests==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 requests sans 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.info juste avant le return, indiquant la valeur reçue et le résultat calculé
  • une configuration logging.basicConfig en tête de script, avec level=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 avec logger.error(...) (sans faire planter le programme) et retourne None
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 logging avant 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 WARNING et 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 logging né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.yaml avec au moins le hook trailing-whitespace.
  • Créer un fichier Python contenant des espaces en fin de ligne, faire git commit, et observer ce que pre-commit corrige automatiquement.

Exercice 13 — Poetry

  • Installer Poetry.
  • Initialiser un projet avec poetry init.
  • Ajouter requests comme dépendance avec poetry add requests.
  • Comparer le fichier généré (pyproject.toml) avec le requirements.txt de l’exercice 5 : quelles différences remarquez-vous ?

This site uses Just the Docs, a documentation theme for Jekyll.