Aller au contenu

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 :

🐍 Script Python
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.

🐍 Console Python
>>> 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...).

🐍 Script Python
>>> n_uplet = (5, 7, -3, 1, 6, 42, 17)
>>> len(n_uplet)
7
###
# Testsbksl-nlassert enpy-undsecondes((1, 25, 50)) == 5150bksl-nlassert enpy-undsecondes((2, 20)) == 140bksl-nlbksl-nl# autres testsbksl-nlassert enpy-undsecondes((1, 0, 0)) == 3600bksl-nlassert enpy-undsecondes((1, 1, 1)) == 3661bksl-nlassert enpy-undsecondes((0, 1, 0)) == 60bksl-nlassert enpy-undsecondes((0, 0, 1)) == 1bksl-nlassert enpy-undsecondes((1, 1)) == 61bksl-nlassert enpy-undsecondes((1, 0)) == 60bksl-nlassert enpy-undsecondes((0, 1)) == 1bksl-nlbksl-nlassert enpy-undsecondes((0, 0, 0)) == 0bksl-nlassert enpy-undsecondes((0, 0)) == 0bksl-nlbksl-nl 5/5

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 :

🐍 Script Python
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 :

🐍 Script Python
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 :

\[\text{total minutes} = h \times 60 + m\]

Et donc :

\[\text{total secondes} = \text{total minutes} \times 60 + s = (h \times 60 + m) \times 60 + s\]

On retrouve l'expression de la deuxième solution proposée.

Dans le cas d'un couple \((m, s)\), on a :

\[\text{total secondes} = m \times 60 + s\]

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