Jeden Monat trifft sich dein Partner mit seinem besten Freund. Beide haben sehr volle Terminkalender, sodass es schwierig ist, einen passenden Termin zu finden! Da auch du einen vollen Terminkalender hast, geht dein Partner mögliche Termine für ein Treffen immer mit dir durch:
Bei eurem Anruf in diesem Monat stellte dir dein Partner diese Frage:
Verwirrt fragst du, was ein „Teenth-Tag“ ist. Dein Partner erklärt, dass ein Teenth-Tag, ein Konzept, das er sich ausgedacht hat, die Tage eines Monats bezeichnet, die auf „-teenth“ enden:
Da es außerdem sieben Wochentage gibt, ist garantiert, dass jeder Wochentag genau einen Teenth-Tag pro Monat hat.
Jetzt, wo du das Konzept eines Teenth-Tags verstehst, schaust du in deinen Kalender. Am Teenth-Donnerstag hast du nichts vor, also bestätigst du deinem Partner freudig das Datum.
Deine Aufgabe ist es, das genaue Datum eines Treffens zu finden, wenn ein Monat, ein Jahr, ein Wochentag und eine Woche gegeben sind.
Es gibt sechs Wochenwerte zu beachten: first, second, third, fourth, last, teenth.
Zum Beispiel könnte man dich bitten, das Datum für das Treffen am ersten Montag im Januar 2018 zu finden (1. Januar 2018).
Ebenso könnte man dich bitten, Folgendes zu finden:
Die teenth-Woche bezieht sich auf die sieben Tage eines Monats, die auf „-teenth“ enden (13., 14., 15., 16., 17., 18. und 19.).
Wenn wir den teenth Samstag im August 1953 finden sollen, schauen wir uns den Kalender an:
August 1953
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Daraus ersehen wir, dass der teenth Samstag der 15. August 1953 ist.
Wir haben eine zusätzliche Wochenangabe (fifth) für den fünften Wochentag des Monats hinzugefügt, falls es einen gibt.
Wenn es in einem Monat keinen fünften Wochentag gibt, solltest du eine Exception auslösen.
Manchmal ist es notwendig, Exceptions in deinem Code sowohl zu anpassen als auch mit raise auszulösen. Wenn du das tust, solltest du immer eine aussagekräftige Fehlermeldung angeben, um anzugeben, was die Fehlerquelle ist. Das macht deinen Code lesbarer und hilft beim Debugging erheblich.
Benutzerdefinierte Exceptions lassen sich durch neue Exception-Klassen erstellen (siehe classes für weitere Details), die typischerweise Unterklassen von Exception sind.
In Situationen, in denen du weißt, dass die Fehlerquelle von einem bestimmten Exception-Typ abstammt, kannst du dich dafür entscheiden, von einem der built in error types unter der Exception-Klasse zu erben. Wenn du den Fehler auslöst, solltest du trotzdem eine aussagekräftige Meldung angeben.
Diese Übung erfordert, dass du eine benutzerdefinierte Exception erstellst, die ausgelöst/„geworfen“ wird, wenn deiner meetup()-Funktion eine ungültige Kombination aus Wochentagsname und Zahl übergeben wird. Die Tests sind nur dann erfolgreich, wenn du passende Exceptions anpasst, diese Exceptions mit raise auslöst und passende Fehlermeldungen angibst.
Um eine built-in exception anzupassen, erstelle eine class, die von dieser Exception erbt. Wenn du die benutzerdefinierte Exception mit einer Meldung auslöst, schreibe die Meldung als Argument an den exception-Typ:
# subclassing the built-in ValueError to create MeetupDayException
class MeetupDayException(ValueError):
"""Exception raised when the Meetup weekday and count do not result in a valid date.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a MeetupDayException
raise MeetupDayException("That day does not exist.")
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.