Warum wiederholst Du immer den letzten Buchstaben Deiner Variablennamen? Variablennamen sollen den Leser nicht rätseln lassen. Genauso ist xxd oder xxm schlecht, weil niemand weiß, wofür xx steht und d die Abkürzung für day einfach auch nur das Lesen erschwert, ohne Dir wirklich Arbeit beim Schreiben zu sparen.
Die for-Schleife macht nichts mit xxd, so dass nur 31mal das selbe geprüft wird, nämlich ob der Typ der Variable dayy ein int ist. Ist das nicht der Fall, passiert aber auch nichts, denn per break wird einfach nur die Schleife verlassen.
In der zweiten Schleife mußt Du Dir auch die if-Bedingung und die Reaktion dann genau anschauen. Es gibt den Fall dass wir Februar haben und der Tag im Bereich 1 bis 28 liegt, dann fängt die Schleife wieder von vorne an (continue) und prüft das selbe noch 11 weitere Male, bevor die Schleife ohne weitere Reaktion endet, oder die Bedingung ist nicht wahr, dann wird die Schleife per break verlassen. In beiden Fällen wird wieder nichts mit xxm gemacht und der Rest der Schleife wird nie erreicht.
Daneben gibt es noch ein paar Bemerkungen: `return` verläßt sofort die Funktion, alles was danach steht wird also nie erreicht. `return` ist keine Funktion, die Klammern verwirren also nur. Laut Aufgabenbeschreibung soll der Wert None zurückgeliefert werden, nicht der String "None". Auf Typen prüft man in Python normalerweise nicht explizit, das passiert schon implizit, wenn z.B. versucht wird einen String "1" >= 1 zu prüfen. Falls doch, benutzt man isinstance statt type.
Zum Grundsätzlichen:
Wenn man eine Funktion schreibt, fängt man nicht an und schreibt irgendetwas zusammen und hofft am Schluß dass es komplett funktioniert, sondern man entwickelt eine Funktion Schritt für Schritt
So ist ja auch die Aufgabenstellung geschrieben, dass man sie Satz für Satz abarbeiten kann und für jeden Satz, den man implementiert hat, dann die Funktion ausführlich testet, indem man Tests schreibt, die ausgeführt werden können und damit die Richtigkeit der Funktion testen.
Der erste Satz sagt, welche Argumente die Funktion haben soll. Soweit hast Du das richtig umgesetzt.
Der zweite Satz sagt, dass der Monat innerhalb von 1 bis 12 liegen soll.
Dafür schreibe ich Dir mal die Funktion, dass Du weißt, wie Du weiter vorgehen kannst:
Code: Alles auswählen
def format_date(day, month, year):
if not (1 <= month <= 12):
return None
return "Datum"
def test_format_date():
assert format_date(13, 1, 2022) == "Datum"
assert format_date(13, 0, 2022) is None
assert format_date(13, 15, 2022) is None
if __name__ == "__main__":
test_format_date()
Die Funktion test_format_date ruft nun die Funktion mit verschiedenen Werten auf und vergleicht die Rückgabe mit der erwarteten Rückgabe. Die Rückgabe "Datum" ist nur vorläufig, um die unvollständige Funktion sinnvoll testen zu können. Läuft das Programm ohne Fehlermeldung (und ohne Ausgabe), war alles korrekt. Es gibt Pakete wie py.test, die das Auswerten solcher Tests bequemer machen, für den Anfang reicht aber der Erfolg, dass das Programm fehlerfrei nichts macht.
Als nächstes mußt Du die Prüfung einbauen, ob der Tag je nach Monat den Wert 28, 30 oder 31 überschreitet und die Tests entsprechend erweitern.