[Python] prosty generator czasu, krotki, brak pomysłu

0

Cześć.
Dostałem za zadanie zrobić prosty generator gen_time, który produkuje kolejne sekwencje czasu w postaci krotek (godziny, minuty, sekundy). Przyjmuje on w postaci krotek czas_startowy, czas_koncowy i krok_czasu. Przykładowo powinno to działać tak:
**for time in get_time((8, 10, 00), (8, 25, 00), (0, 4, 0)):
print(time)

wyniki:
(8, 14, 00)
(8, 18, 00)
(8, 22, 00)**

Utknąłem. Wiem, że ktoś ogarnięty zrobiłby to w kilkanaście minut, a mi to zajmuje już parę dni... Może mi ktoś pomóc, doradzić, czy to co robię mnie do czegoś doprowadzi? Dać jakieś wskazówki?
Oto, co udało mi się sklecić w ciągu tego czasu :/

import math

def gen_time(krotka1, krotka2, krotka3):
    (godzina1, minuta1, sekunda1) = krotka1
    czas_start = (godzina1, minuta1, sekunda1)

    (godzina2, minuta2, sekunda2) = krotka2
    czas_koncowy = (godzina2, minuta2, sekunda2)

    (godzina3, minuta3, sekunda3) = krotka3
    krok_czasu = (godzina3, minuta3, sekunda3)
    g = godzina1 + godzina3
    m = minuta1 + minuta3
    s = sekunda1 + sekunda3

    if s >= 60:
        m += math.trunc(s/60)
        s = s - (math.trunc(s/60)*60)
        if m >= 60:
            g += math.trunc(m/60)
            m = m - (math.trunc(m/60)*60)
            if g >= 24:
                g = 0 + (g%24)


    temp_wynik = (g, m, s)
    yield temp_wynik



if __name__ == '__main__':
    generator = gen_time((10, 10, 50),(11, 11, 10),(0, 10, 20))
    print(next(generator))
1

Pierwsze pytanie: czy chcesz to robić ręcznie?

Jeśli tak, to zasadniczo jesteś na dobrej drodze. Wg mnie niepotrzebne korzystasz z liczb zmiennoprzecinkowych, ale powinieneś się w końcu z tego tak czy owak wykopać. Trudno coś doradzić, jeśli nie masz konkretnych pytań.

Ale jeśli nie, to Python ma w bibliotece standardowej datetime, które Ci załatwi właściwie wszystko, czego potrzebujesz.

0

Nie chcę tego ręcznie robić. Chcę to zrobić najkrótszą metodą, jaka tylko jest. Po prostu zacząłem w ten sposób, bo nie wiedziałem, jak inaczej.
W którym miejscu korzystam z liczb zmiennoprzecinkowych? Trunc zwraca integer, z tego co sprawdziłem.

Da się jakoś sprytnie to zrobić, żeby dodać krok_czasu do czasu_startowego, a żeby trzymało się to wszystko granic sekundy i minuty max 60 w krotce, godzina max 24 i to automatycznie się wylicza? W sensie (0,0,40) + (0, 0, 50) = (0, 1, 30)? (Wie, że sekund nie może być więcej jak 60 itd.)

PS: Skąd wiedzieć, że dany moduł przyda się w danym zadaniu? Takie datetime ma tyle możliwości, że nie wiem ile trzeba mieć doświadczenia, by swobodnie się w tym wszystkim poruszać i wiedzieć, co do czego jest.

0
  1. Pomyliłem się, faktycznie trunc zwraca integera.
  2. Tak, zobacz sobie timedelta głównie z tamtego modułu.
  3. Można sobie przejrzeć dokumentację, żeby wiedzieć co w niej jest, można za każdym razem szukać w sieci.
0

Nie chcę tego ręcznie robić. Chcę to zrobić najkrótszą metodą, jaka tylko jest.

Zrób to ręcznie. To maks. 5 linii kodu.

0

Po co trunc? Zrób dzielenie całkowite operatorem // (podwójny ukośnik).

Też zalecam używanie bibliotek systemowych. Czy przewidujesz poprawną implementację sekund przestępnych?

0
def get_time(krotka1, krotka2, krotka3):
    (godzina1, minuta1, sekunda1) = krotka1
    czas_start = godzina1*60*60 + minuta1*60 + sekunda1

    (godzina2, minuta2, sekunda2) = krotka2
    czas_koncowy = godzina2*60*60 + minuta2*60 + sekunda2

    (godzina3, minuta3, sekunda3) = krotka3
    krok_czasu = godzina3*60*60 + minuta3*60 + sekunda3
    for i in range(czas_start, czas_koncowy, krok_czasu):
        yield to_touple(i)

def to_touple(secs):
    mins, secs = divmod(secs, 60)
    hours, mins = divmod(mins, 60)
    return (hours, mins, secs)

if __name__ == '__main__':
    for time in get_time((8, 10, 00), (8, 25, 00), (0, 4, 0)):
        print(time)

Ktoś napisał że da się w 5 linijkach - z chęcią zobaczę rozwiązanie na 5 linijek...

0

Ktoś napisał że da się w 5 linijkach - z chęcią zobaczę rozwiązanie na 5 linijek...

def timerange(start, stop, step=(0, 0, 1)):
    ... = map(lambda t: t[0]*3600 + t[1]*60 + t[2], (start, stop, step))
    yield from ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1