Sommer de manière concise les résultats d’une fonction en Python

Il arrive parfois que l’on ait une fonction à laquelle on passe une valeur numérique en entrée et qui retourne elle-même une nouvelle valeur numérique en sortie.

C’est le cas si on modélise une suite, par exemple.

Prenons un exemple simple : une suite géométrique de premier terme 1 et où chaque terme est ensuite deux fois plus grand que son précédent :

1
2
def U(n):
    return 1 * (2**n)

On souhaite sommer les termes des vingt premiers rangs (Du rang 0 au rang 19).

Si l’on souhaite conserver la suite au sein d’une fonction, on peut écrire écrire :

1
2
3
4
5
6
7
8
9
def U(n):
    return 1 * (2**n)
 
ma_somme = 0
 
for n in range(0,20):
    ma_somme += U(n)
 
print(ma_somme)

Résultat :

1
1048575

Sauf qu’en Python, on peut faire plus concis et plus élégant.

Les list comprehensions

Si vous ne connaissez pas les list comprehensions, ou bien compréhensions de liste en français, ou bien encore listes en intension, je vous renvoie vers deux excellents articles : celui de Sam et Max ainsi que celui d’OpenClassrooms.

Les itérateurs et générateurs

Là aussi, si vous ne connaissez pas le concept des générateurs et itérateurs en Python (bien que vous vous en serviez forcément sans le savoir), je vous renvoie vers l’article d’OpenClassrooms et de Sam et Max.

Les expressions génératrices

Il s’agit simplement d’appliquer le principe des list comprehensions aux générateurs. Pour cela on remplace les crochets par des parenthèses. Et l’avantage des générateurs est qu’on peut sommer tous les termes retournés en une seule commande. Avec la commande… sum()

Ce qui nous donne :

1
2
3
4
def U(n):
    return 1 * (2**n)
 
ma_somme = sum((U(n) for n in range(0,20)))

Résultat :

1
1048575

En une seule ligne, on obtient le même résultat qu’avec une boucle for. On gagne à la fois en concision mais également en clarté de lecture.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *