Les durées (II)⚓︎
Les durées peuvent être exprimées en secondes, en minutes-secondes, ou en heures-minutes-secondes.
Ainsi, la durée 6 h 34 min et 12 s peut être exprimée par :
duree_sec = 21612 # en secondes
duree_min_sec = (360, 12) # en minutes-secondes
duree_h_min_sec = (6, 34, 12) # en heures-minutes-secondes
On souhaite créer une fonction permettant de convertir une durée en secondes, alors qu'elle est exprimée initialement sous l'une des deux dernières formes.
Écrire la fonction en_secondes
qui prend en paramètre un p-uplet représentant une durée
exprimée soit en heures, minutes et secondes sous la forme (h, m, s)
, soit en minutes et secondes (m, s)
, et qui renvoie le nombre total de secondes.
>>> en_secondes((1, 25, 50))
5150
>>> en_secondes((2, 20))
140
Astuce
La fonction len
permet de connaître le nombre d'éléments contenus dans un type construit (tableau, dictionnaire, p-uplet...).
>>> n_uplet = (5, 7, -3, 1, 6, 42, 17)
>>> len(n_uplet)
7
def enpy-undsecondes(...):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlassert enpy-undsecondes((1, 25, 50)) == 5150bksl-nlassert enpy-undsecondes((2, 20)) == 140bksl-nlbksl-nlbksl-nldef enpy-undsecondes(duree):bksl-nl if len(duree) == 2:bksl-nl minutes, secondes = dureebksl-nl return minutes py-str 60 + secondesbksl-nl else:bksl-nl h, m, s = dureebksl-nl return h py-str 3600 + m py-str 60 + s # il y a 3600 secondes dans 1 heurebksl-nlbksl-nl
A
Cette solution peut aussi s'écrire ainsi :
def en_secondes(duree):
if len(duree) == 2:
minutes, secondes = duree
return minutes * 60 + secondes
else:
h, m, s = duree
return (h * 60 + m) * 60 + s
Autre solution⚓︎
En généralisant la solution précédente, on peut même se passer du test sur la longueur du p-uplet :
def en_secondes(duree):
total = 0
for val in duree:
total = total * 60 + val
return total
Voici ce qui se passe lors de l'évaluation de en_secondes((1, 25, 50))
:
valeur de val |
valeur de total |
explications |
---|---|---|
0 | valeur initiale | |
1 | 1 | nombre total d'heures |
25 | 85 | nombre total de minutes |
50 | 5150 | nombre total de secondes |
Dans le cas d'un triplet \((h, m, s)\), on a :
Et donc :
On retrouve l'expression de la deuxième solution proposée.
Dans le cas d'un couple \((m, s)\), on a :
Cette technique s'appelle la méthode de Horner. Elle est aussi utilisée, entre autres, pour convertir un nombre exprimé dans une base \(b\) vers la base \(10\).
Z