Lets do it the Python way

Jusqu'ici, nous avons vu la sémantique du langage Python. Avec les connaissance acquises jusqu'ici, vous savez écrire un programme avec la syntaxe Python. Si vous avez vu certaines caractéristiques du langage, il est est temps de voir les plus intéressantes.

Les fonctions

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))

Utilisation des lambdas

La liste de promotions suivante ne couvre pas tous les produits. il faut donc une fonction par défaut. Nous pouvons utiliser une lambda et la méthode get().


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))