def somme(li):
    """
    Calcule la somme des éléments d'un tableau.

    @param      li      tableau
    @return             somme

    .. exref::
        :tag: Base
        :title: calcul d'une somme

        Le calcul d'une somme fait toujours intervenir une boucle car le langage
        :epkg:`Python` ne peut faire des additions qu'avec deux nombres.
        Le schéma est toujours le même : initialisation et boucle.

        .. runpython::
            :showcode:

            li = [0, 434, 43, 6456]
            s  = 0                       # initialisation
            for l in li :                # boucle
                s += l                   # addition
            print(s)

        Ce code est équivalent à la fonction `sum <https://docs.python.org/3/library/functions.html#sum>`_.
        Dans ce cas où la somme intègre le résultat d'une fonction (au sens mathématique)
        et non les éléments d'une liste, il faudrait écrire :

        .. runpython::
            :showcode:

            def fonction(x):
                return x

            li = [0, 434, 43, 6456]
            s  = 0
            for l in li:
                s += fonction (l)
            print(s)

        Et ces deux lignes pourraient être résumées en une seule grâce
        à l'une de ces instructions :

        .. runpython::
            :showcode:

            def fonction(x):
                return x

            li = [0, 434, 43, 6456]
            s1 = sum([fonction(l) for l in li])
            s2 = sum(fonction(l) for l in li)
            s3 = sum(map(fonction, li))
            print(s1, s2, s3)

        L'avantage des deux dernières instructions est qu'elles évitent
        la création d'une liste intermédiaire,
        c'est un point à prendre en compte si la liste sur laquelle opère la
        somme est volumineuse.
    """
    return sum(li)
