En Python, tout est objet. Les fonctions sont donc des objets… Il ne faut donc pas confondre les instructions
ma_func()
qui est un appel de la fonction et qui retourne le retour de la fonction et
ma_func
qui est une référence à la fonction et retourne donc… La fonction.
Une fonction est un callable et pour être appelé, sa déclaration doit être suivie de parenthèses.
Si le nom de la fonction retourne la fonction et que ce retour peut être exécuté par ajout de parenthèses, alors nous pouvons affecter une fonction à une variable, un paramètre de fonction ou un retour de fonction…
Voyons un exemple avec ces deux fonctions qui permettent d'appliquer des opérations commerciales
In [ ]:
def third_free(price, quantity=1):
"""
Le troisième gratuit
"""
return price * (quantity - quantity // 3)
def second_half_price(price, quantity=1):
"""
Le second à 50%
"""
return (price * (quantity // 2) * 1.5) + (price * (quantity % 2))
En caisse, nous avons évidemment une liste de produits. La liste est composé d'une liste de 3 éléments : nom, prix et quantité.
In [ ]:
products_list = [['Kit Kat', 3.5, 2],
['Choucroute', 7, 6],
['Madeleines', 6.5, 3],
['Sardines', 4, 5],
['Pates', 5, 4]]
nous avons les algorithmes de calcul des remises et la liste des courses. Il nous manque un composant qui fera la relation entre les produits et les opérations commerciales.
Le dictionnaire suivant permet d'associer une promotion à un produit.
In [ ]:
active_promotions = {'Kit Kat': second_half_price,
'Choucroute': third_free,
'Madeleines': second_half_price,
'Sardines': third_free,
'Pates': third_free}
Vous voyez que pour chaque clef produit, le dictionnaire retourne une fonction. Nous pouvons donc itérer sur les éléments de la manière suivante :
In [ ]:
for product, price, quantity in products_list:
print(product, active_promotions[product](price, quantity))
In [ ]:
active_promotions = {'Kit Kat': second_half_price,
'Madeleines': second_half_price,
'Pates': third_free}
for product, price, quantity in products_list:
print(product, active_promotions.get(product, lambda price, quantity: price * quantity)(price, quantity))