Aller au contenu

Indices ou valeurs ?⚓︎

On donne un tableau de nombres nombres.

Compléter le code des deux fonctions ci-dessous :

  • somme_par_indices_pairs prend le tableau en argument et renvoie la somme des valeurs placées à des indices pairs ;

  • somme_des_valeurs_paires prend le tableau en argument et renvoie la somme des valeurs paires.

Par exemple :

🐍 Console Python
>>> # indices  0  1  2
>>> nombres = [4, 6, 3]
>>> somme_par_indices_pairs(nombres)
7
>>> somme_des_valeurs_paires(nombres)
10

En effet, :

  • il y a deux indices pairs (0 et 2) et la somme des valeurs correspondantes vaut 7.
  • il y a deux valeurs paires (4 et 6) et leur somme vaut 10.

On rappelle qu'il est possible de tester la parité d'un nombre n en faisant n % 2 == 0 :

🐍 Console Python
>>> 14 % 2 == 0
True
>>> 15 % 2 == 0
False

Exemples

🐍 Console Python
>>> somme_par_indices_pairs([]) 
0
>>> somme_des_valeurs_paires([]) 
0
>>> somme_par_indices_pairs([4, 6, 3])
7
>>> somme_des_valeurs_paires([4, 6, 3])
10
###
# Testsbksl-nlassert sommepy-undparpy-undindicespy-undpairs([]) == 0bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([]) == 0bksl-nlassert sommepy-undparpy-undindicespy-undpairs([4, 6, 3]) == 7bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([4, 6, 3]) == 10bksl-nlbksl-nl# Tests supplémentairesbksl-nlnombres = [-17, 9, -8, -4, 3, 15, 12, -2, -19, 10]bksl-nlassert sommepy-undparpy-undindicespy-undpairs(nombres) == -29bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires(nombres) == 8bksl-nlnombres = [-5, -2, -20, -5, -18, -12, -2, -20, -10, -10]bksl-nlassert sommepy-undparpy-undindicespy-undpairs(nombres) == -55bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires(nombres) == -94bksl-nlbksl-nl 5/5

def sommepy-undparpy-undindicespy-undpairs(nombres):bksl-nl somme = ...bksl-nl for ... in ...:bksl-nl if ...:bksl-nl somme = ...bksl-nlbksl-nl return ...bksl-nlbksl-nldef sommepy-unddespy-undvaleurspy-undpaires(nombres):bksl-nl somme = ...bksl-nl for ... in ...:bksl-nl if ...:bksl-nl somme = ...bksl-nlbksl-nl return ...bksl-nlbksl-nl# Testsbksl-nlassert sommepy-undparpy-undindicespy-undpairs([]) == 0bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([]) == 0bksl-nlassert sommepy-undparpy-undindicespy-undpairs([4, 6, 3])== 7bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([4, 6, 3])== 10bksl-nldef sommepy-undparpy-undindicespy-undpairs(nombres):bksl-nl somme = 0bksl-nl for i in range(len(nombres)):bksl-nl if i % 2 == 0:bksl-nl somme += nombres[i]bksl-nlbksl-nl return sommebksl-nlbksl-nlbksl-nldef sommepy-unddespy-undvaleurspy-undpaires(nombres):bksl-nl somme = 0bksl-nl for x in nombres:bksl-nl if x % 2 == 0:bksl-nl somme += xbksl-nlbksl-nl return sommebksl-nlbksl-nlbksl-nl# Testsbksl-nlassert sommepy-undparpy-undindicespy-undpairs([]) == 0bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([]) == 0bksl-nlassert sommepy-undparpy-undindicespy-undpairs([4, 6, 3]) == 7bksl-nlassert sommepy-unddespy-undvaleurspy-undpaires([4, 6, 3]) == 10bksl-nlbksl-nl

A

Solutions alternatives⚓︎

Pour le parcours sur les indices, on pourrait aussi jouer sur le pas :

🐍 Script Python
def somme_par_indices_pairs(nombres):
    somme = 0
    for i in range(0, len(nombres), 2):
        somme += nombres[i]
    return somme

Dans ce cas, on ne lit qu'un indice sur deux en débutant à 0.

Dans le même esprit, les tranches permettent de modifier les listes en omettant certains indices :

🐍 Script Python
def somme_par_indices_pairs(nombres):
    somme = 0
    for x in nombres[::2]:
        somme += x
    return somme

Dans ce cas, on indique à Python de ne prendre qu'un nombre x sur deux. La notation nombres[::2] est un raccourci pour nombres[0:len(nombres):2].

Approche fonctionnelle⚓︎

D'autre part, la fonction sum permet d'utiliser une approche fonctionnelle :

🐍 Script Python
def somme_par_indices_pairs(nombres):
    return sum([nombres[i] for i in range(0, len(nombres), 2)])

def somme_des_valeurs_paires(nombres):
    return sum([x for x in nombres if x % 2 == 0])

Z