#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def somme (a, b):
    """
        cette fonction retourne la somme de a et b;
    """
    return a + b
# end def

def produit (a, b):
    """
        cette fonction retourne le produit de a par b;
    """
    return a * b
# end def

def formule (a, b):
    """
        cette fonction applique une formule à a et b;
        vous aurez reconnu ici le calcul de l'hypoténuse;
    """
    return (a**2 + b**2)**0.5
# end def

def traiter_liste (callback, liste):
    """
        cette fonction parcourt les éléments d'une liste puis
        délègue le traitement spécifique à une fonction de rappel
        dite 'callback' capable de traiter deux arguments (a, b)
        puis de retourner à son tour une valeur unique; la fonction
        réduit successivement la liste à une seule valeur finale au
        fur et à mesure des résultats obtenus aux itérations
        précédentes;
    """
    # on crée un itérateur pour parcourir la liste
    iterator = iter(liste)
    # on essaie de récupérer la première valeur (si existe)
    try:
        resultat = next(iterator)
    # la liste est vide !
    except StopIteration:
        raise IndexError("impossible de traiter une liste vide")
        return None
    # end try
    # on peut parcourir la liste, à présent:
    for item in iterator:
        # c'est ici qu'on délègue le traitement à la fonction de rappel
        # la fonction doit accepter 2 arguments a et b i.e. callback(a, b)
        resultat = callback(resultat, item)
    # end for
    # on retourne le résultat
    return resultat
# end def

# maintenant, testons...
ma_liste = [1, 3, 56, 89, 4, 12, 45, 87, 10, 2, 4, 3, 3, 3, 5]

# annonce
print("pour ma_liste = ", ma_liste)

# faisons la somme de tous les termes de ma_liste:
print("somme de ma_liste = ", traiter_liste(somme, ma_liste))

# calculons le produit de tous les termes de ma_liste:
print("produit de ma_liste = ", traiter_liste(produit, ma_liste))

# appliquons une formule à tous les termes de ma_liste:
print("formule de ma_liste = ", traiter_liste(formule, ma_liste))

# fin du test
