Előző - #10 Keresés és csere | Tartalomjegyzék | Következő - #12 legkisebb és legnagyobb
getHoursMinutesSeconds(90) → '1h 30s'
A webhelyek gyakran relatív időbélyegeket használnak, például „3 nappal ezelőtt” vagy „kb. 3 órája”, így a felhasználónak nem kell abszolút időbélyegzőt összehasonlítania a jelenlegi idővel. Ebben a gyakorlatban olyan függvényt írunk, amely a másodpercek számát órák, percek és másodpercek számát tartalmazó karakterláncsá alakítja.
Gyakorlat leírása
Írj egy getHoursMinutesSeconds() függvényt, amelynek van totalSecondsparamétere. A paraméter argumentuma az órák, percek és másodpercek számává fordítandó másodpercek száma. Ha az órák, percek vagy másodpercek összege nulla, ne jelenítse meg: a függvénynek a '10m' értéket kell visszaadnia , nem pedig '0h 10m 0s'. Az egyetlen kivétel az, hogy getHoursMinutesSeconds(0) vissza kell térnie '0s'.
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :
assert getHoursMinutesSeconds(30) == '30s'
assert getHoursMinutesSeconds(60) == '1 perc'
assert getHoursMinutesSeconds(90) == '1 óra 30 másodperc'
assert getHoursMinutesSeconds(3600) == '1h'
assert getHoursMinutesSeconds(3601) == '1h 1s'
assert getHoursMinutesSeconds(3661) == '1h 1p 1s'
assert getHoursMinutesSeconds(90042) == '25h 42s'
assert getHoursMinutesSeconds(0) == '0s'
További kihívásként bontsa fel a 24 órás időszakokat napokra „d” utótaggal. Például a getHoursMinutesSeconds(90042)következőt adná vissza : "1d 1h 42s" .
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: join(), append() , lists, string conkatenation, while ciklusok
Megoldás tervezése
Egy óra 3600 másodperc, egy perc 60 másodperc, egy másodperc pedig… 1 másodperc. Megoldásunkban lehetnek olyan változók, amelyek az órák, percek és másodpercek számát követik a végeredményben óra , minutes, és másodperc változókkal . A kód levonja 3600 a totalSecondsnövekvő órákat a -val 1. Ezután a kód kivon 60ebből, totalSeconds miközben minutes1-gyel nő. A másodperces változót ezután beállíthatjuk arra, ami a totalSeconds- ban marad .
Az órák, percek és másodpercek kiszámítása után ezeket az egész számokat karakterláncokká kell konvertálnia a megfelelő 'h', 'm', és 's'utótagokkal, például '1h'vagy '30s'. Ezután hozzáfűzheti őket egy listához, amely kezdetben üresen kezdődik. Ezután a join() list metódus össze tudja kapcsolni ezeket a karakterláncokat egyetlen szóközzel elválasztva: a listától ['1h', '30s'] a karakterláncig '1h 30s'. Például írja be a következőket az interaktív héjba:
>>> hms = ['1h', '30s']
>>> ' '.join(hms)
'1h 30s'
A függvény ezután ezt a szóközzel elválasztott karakterláncot adja vissza.
Ha nem ismeri a join() karakterlánc-módszert, beléphet help(str.join)az interaktív shellbe, és megtekintheti a dokumentációját, vagy kereshet az interneten a „python join” kifejezésre.
Különleges esetek és Gotchák
Az első speciális eset, amelyet a függvénynek ellenőriznie kell, az az, hogy a totalSeconds paraméter 0-ra van állítva. Ebben az esetben a függvény azonnal visszatérhet '0s'.
A végeredmény karakterlánca nem tartalmazhat órákat, perceket vagy másodperceket, ha ezek száma nulla. Például a programnak vissza kell térnie, '1h 12s'de nem '1h 0m 12s'.
Ezenkívül fontos, hogy először vonja ki a nagyobb összegeket. Ellenkező esetben például a hourskövetkezővel 0és perccel növelne 120 , ahelyett, hogy hoursa -val 2 és minutes-vel növekedne 0.
Most próbáljon meg egy megoldást írni az előző szakaszok információi alapján. Ha továbbra is problémái vannak a gyakorlat megoldásával, olvassa el a Megoldássablon részt további tippekért.
Megoldás sablon
Próbáljon először megoldást írni a semmiből. De ha nehézségei vannak, akkor a következő részprogramot használhatja kiindulási helynek. Másolja ki a következő kódot a https://invpy.com/hoursminutesseconds-template.py webhelyről , és illessze be a kódszerkesztőbe. Cserélje ki az aláhúzást kódra, hogy működő programot készítsen:
def getHoursMinutesSeconds(totalSeconds):
# Ha a totalSeconds értéke 0, adja vissza a '0-t':
if totalSeconds == ____:
Visszatérés ____
# Állítsa az órákat 0-ra, majd adjon hozzá egy órát minden 3600 másodperchez, amelyet eltávolított
# totalSeconds addig, amíg a totalSeconds kevesebb, mint 3600:
óra = 0
míg totalSeconds ____ 3600:
óra += ____
totalSeconds -= ____
# Állítsa a perceket 0-ra, majd adjon hozzá egy percet minden 60 másodperchez, amelyet eltávolított
# totalSeconds addig, amíg a totalSeconds kevesebb, mint 60:
perc = 0
míg totalSeconds >= ____:
perc += 1
totalSeconds -= ____
# Állítsa be a másodperceket a maradék totalSeconds értékre:
másodperc = ____
# Hozzon létre egy hms listát, amely tartalmazza az óra/perc/másodperc karakterláncot:
hms = []
# Ha egy vagy több óra van, adja hozzá az összeget „h” utótaggal:
ha óra > ____:
____.append(str(____) + 'h')
# Ha van egy vagy több perc, adja hozzá az összeget „m” utótaggal:
if minutes > 0:
hms.append(____(minutes) + 'm')
# If there are one or more seconds, add the amount with an 's' suffix:
if seconds > 0:
hms.append(str(seconds) + ____)
# Join the hour/minute/second strings with a space in between them:
return ' '.join(____)
The complete solution for this exercise is given in Appendix A and https://invpy.com/hoursminutesseconds.py. You can view each step of this program as it runs under a debugger at https://invpy.com/hoursminutesseconds-debug/.
Alternate Solution Design
Alternatively, instead of subtractions in a loop you can use Python’s // integer division operator to see how many 3600 amounts (for hours) or 60 amounts (for minutes) fit into totalSeconds. To get the remaining amount in totalSeconds after removing the seconds accounted for hours and minutes, you can use Python’s % modulo operator.
For example, if totalSeconds were 10000, then 10000 // 3600 evaluates to 2, telling you that there are two hours in 10,000 seconds. Then 10000 % 3600 evaluates to 2800, telling you there are 2,800 seconds left over after removing the two hours from 10,000 seconds. You would then run 2800 // 60 to find the number of minutes in 2,800 seconds and 2800 % 60 to find the number of seconds remaining after removing those minutes.
Alternate Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/hoursminutesseconds2-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def getHoursMinutesSeconds(totalSeconds):
# If totalSeconds is 0, just return '0s':
if totalSeconds == ____:
return ____
# Set hours to how many times 3600 seconds can divide
# totalSeconds. Then set totalSeconds to the remainder:
if totalSeconds >= 3600:
hours = totalSeconds // 3600
totalSeconds = totalSeconds % 3600
else:
hours = 0
# Set minutes to how many times 60 seconds can divide
# totalSeconds. Then set totalSeconds to the remainder:
if totalSeconds >= 60:
minutes = totalSeconds // 60
totalSeconds = totalSeconds % 60
else:
minutes = 0
# Set seconds to the remaining totalSeconds value:
seconds = ____
# Create an hms list that contains the string hour/minute/second amounts:
hms = []
# If there are one or more hours, add the amount with an 'h' suffix:
if hours > ____:
____.append(str(____) + 'h')
# If there are one or more minutes, add the amount with an 'm' suffix:
if minutes > 0:
hms.append(____(minutes) + 'm')
# If there are one or more seconds, add the amount with an 's' suffix:
if seconds > 0:
hms.append(str(seconds) + ____)
# Join the hour/minute/second strings with a space in between them:
return ' '.join(____)
The complete solution for this exercise is given in Appendix A and https://invpy.com/hoursminutesseconds2.py. You can view each step of this program as it runs under a debugger at https://invpy.com/hoursminutesseconds2-debug/.
Prev - #10 Find and Replace | Table of Contents | Next - #12 Smallest & Biggest