Python Lernhandbuch

Kapitel 9: Module, Imports und die wichtigste Standardbibliothek

Musterlösung mit Erklärung

Deine Lösung hat die Prüfung noch nicht bestanden. Lies die Erklärung, dann versuche es erneut – möglichst ohne abzuschreiben.
Aufgabe noch einmal lesen

Schreibe ein Kommandozeilenprogramm alter.py, das:

  1. ein Geburtsdatum im Format TT.MM.JJJJ als Argument entgegennimmt,
  2. das Alter in Jahren und die Tage bis zum nächsten Geburtstag ausgibt,
  3. bei einem ungültigen Datum eine verständliche Fehlermeldung ausgibt.

Beispiel: uv run alter.py 17.05.1990

python
import argparse
from datetime import date, datetime


def berechne(geburtstag, heute):
    jahre = heute.year - geburtstag.year
    if (heute.month, heute.day) < (geburtstag.month, geburtstag.day):
        jahre -= 1                       # Geburtstag dieses Jahr noch nicht gewesen

    naechster = geburtstag.replace(year=heute.year)
    if naechster < heute:
        naechster = naechster.replace(year=heute.year + 1)
    return jahre, (naechster - heute).days


def main():
    parser = argparse.ArgumentParser(description='Alter berechnen')
    parser.add_argument('geburtsdatum', help='Format TT.MM.JJJJ')
    args = parser.parse_args()

    try:
        geburtstag = datetime.strptime(args.geburtsdatum, '%d.%m.%Y').date()
    except ValueError:
        parser.error('Ungültiges Datum, erwartet TT.MM.JJJJ')

    jahre, tage = berechne(geburtstag, date.today())
    print(f'Alter: {jahre} Jahre, nächster Geburtstag in {tage} Tagen')


if __name__ == '__main__':
    main()

Was passiert:

  • strptime wandelt den Text in ein datetime, .date() macht daraus ein reines Datum. Passt das Format nicht, löst strptime einen ValueError aus. parser.error(...) gibt dann eine Meldung samt Hilfe-Hinweis aus und beendet das Programm.
  • Der Vergleich der Tupel (Monat, Tag) ist ein eleganter Weg zu prüfen, ob der Geburtstag dieses Jahr schon war: Tupel werden elementweise von links verglichen.
  • geburtstag.replace(year=...) baut ein neues Datum mit anderem Jahr. Für den 29. Februar würde das in Nicht-Schaltjahren einen Fehler auslösen. Als Verbesserung kannst du diesen Sonderfall selbst abfangen.
  • Die Rechenlogik steht in der Funktion berechne, die kein input und kein print enthält. Dadurch lässt sie sich mit festen Testdaten prüfen, z. B. berechne(date(1990, 5, 17), date(2026, 10, 20)).

Warum so: Das Muster "Eingabe lesen, rechnen, ausgeben" in getrennten Funktionen ist die Grundlage für jedes spätere Skript, egal ob die Daten aus der Kommandozeile, einer Datenbank oder einer API kommen.