Aller au contenu principal

Fonctionnel

Progression

#Fonctionnel

À quoi ça sert ?

À quoi ça sert: écrire des transformations claires et testables en limitant les effets de bord. Comment: fonctions pures, immutabilité, composition et usage mesuré de map/filter/reduce; comprendre le coût mémoire et les gains de lisibilité.

Objectifs d’apprentissage

  • Favoriser fonctions pures et immutabilité; réduire les effets de bord.
  • Utiliser map/filter/reduce/comprehensions avec parcimonie et lisibilité.
  • Appliquer la composition de fonctions et les closures pour structurer le code.

#Exemple (map/filter/reduce en Python)

Chargement de l’éditeur...

Purs vs impurs: viser des fonctions déterministes sans effets de bord, pour tester et composer.

#Pièges fréquents

  • Abus de lambda/magie: préférer des fonctions nommées et claires.
  • Copier des structures immuables volumineuses à chaque étape: mesurer et amortir (persistence structurelle si dispo).
  • Mélanger styles: effets de bord (logs, I/O) dans du code supposé pur.

#Mini‑quiz

Une fonction « pure » signifie:
Une fonction « pure » signifie:

#Exercice : Pipeline de traitement de données

Implémentez une pipeline de traitement de données en utilisant des fonctions pures et la composition pour transformer une liste de dictionnaires représentant des utilisateurs.

#Instructions

  1. Créez des fonctions pures pour chaque étape de transformation :
    • filter_adults(users): Filtrer les utilisateurs de 18 ans et plus.
    • normalize_names(users): Normaliser les noms (capitaliser la première lettre).
    • add_age_group(users): Ajouter un groupe d'âge ('young', 'adult', 'senior').
    • sort_by_name(users): Trier par nom.
  2. Implémentez une fonction compose pour composer plusieurs fonctions en une seule.
  3. Appliquez la pipeline à une liste d'utilisateurs.

#Exemple de code

pythonpython
1def filter_adults(users):2    return [user for user in users if user['age'] >= 18]3 4def normalize_names(users):5    return [{'name': user['name'].capitalize(), 'age': user['age']} for user in users]6 7def add_age_group(users):8    def get_age_group(age):9        if age < 30:10            return 'young'11        elif age < 60:12            return 'adult'13        else:14            return 'senior'
Chargement de l’éditeur...