Wie vergleiche ich 2 Daten(Datum) ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Hallo liebe Python Community,

erst mal will ich mich kurz vorstellen, da ich ja neu hier bin :).
Mein Name ist Luca, ich bin 21 Jahre alt und wohne zurzeit im schönen Hamburg. Ich hab vor ein paar Tage angefangen mich intensiv mit Python zu beschäftigen. Ich hatte mich vorher ein wenig mit C++ beschäftigt, da ich das bald in der Schule haben werde, allerdings habe ich keine wirkliche Programmiererfahrung, außer ein wenig bash-scripting und ein wenig halbwissen in html und css, und war daher ein wenig mit C++ überfordert. Da bin ich dann durch udacity auf python gestoßen und hab damit angefangen. Die Sprache macht mir bis dato wirklich spaß und ich sehe wirklich Fortschritt bei mir, im Gegensatz zu C++ :p

Nun ja, genug von mir und genug Offtopic, ich komme nun mal zu meinem Problem.

Ich habe um die Grundlagen zu festigen, ein kleines Programm geschrieben, welches vom Geburtsdatum aus zum heutigen Datum errechnet wie alt du in Tagen bist.
Das ganze funktioniert schon ganz gut, wobei es sicherlich nicht das effizienteste design ist...
Allerdings hab ich das Problem, das ich das Geburtsdatum mit dem heutigen Datum vergleichen will, um zuprüfen, das diese auch vor dem heutigen Datum liegt. Nur leider habe ich keine Ahnung wie ich das anstellen soll :/

Hier ist die funktion die die Tage zählt und die einzelnen Werte vergleicht.

Code: Alles auswählen

def countDays(userDay, userMonth, userYear, todayDay, todayMonth, todayYear):
    ageInDays = 0
    # hier würde ich gerne vorher Prüfen.
    while userDay != todayDay or userMonth != todayMonth or userYear != todayYear:
        userDay, userMonth, userYear = getNextDay(userDay, userMonth, userYear, getDaysInMonth(userMonth, userYear))
        ageInDays += 1

    return ageInDays
Also gibt es eine Methode oder iwas dafür? Oder muss ich mir da selber was ausdenken?

Ich würde mich sehr über hilfe freuen :)
Natürlich freue ich mich auch über Verbesserungen zu meinem CodeStyle oder anderem! :D

Mit freundlichen Grüßen
desmater
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen zu Python und hier im Forum!

Ohne gleich alles zu verraten: Du suchst datetime.date und wenn du mehr als eine Zeile brauchst, machst du was falsch ;)
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo und willkommen im Forum,

um solche "alltäglichen" Probleme zu lösen hat Python zum Glück bereits Module. Das was du vor hast ist mit dem datetime Modul ein Einzeiler:

Code: Alles auswählen

import datetime
difference = datetime.datetime.today()-datetime.datetime(year=1990, month=4, day=20)
print difference.days
Hoffentlich beantwortet das zumindest ein Teil deiner Frage :)

Grüße,
anogayales
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

desmater hat geschrieben:[...] und wohne zurzeit im schönen Hamburg.
Wo ist das denn? Ich kenne nur das schäbige in Norddeutschland. :mrgreen:
desmater hat geschrieben:Natürlich freue ich mich auch über Verbesserungen zu meinem CodeStyle oder anderem! :D
Es gibt mit PEP-8 den wundervollen Style Guide for Python Code. Danach ist CamelCase für Klassennamen vorgesehen. Für Funktionen und Variablen nimmt man lower_case_with_underscores Deine Routine würde also so aussehen:

Code: Alles auswählen

def count_days(user_day, user_month, user_year, today_day, today_month, today_year):
    age_in_days = 0
    [...]
Es handelt sich bei PEP-8 um Empfehlungen, nicht um Gesetze. Es handelt sich allerdings um sehr, sehr starke Empfehlungen und du solltest nur davon abweichen wenn du einen guten Grund hast.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo desmaster,
zum Glück gibt es bei den Jahren, Monaten und Tagen keine Überschneidungen. Wenn das Jahr des einen Datums größer ist als das des zweiten, ist das erste Datum garantiert später. Falls die beiden Jahre gleich sind, gilt die gleiche Überlegung für die Monate, und dann für die Tage.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

@Sirius3: Ach, ich wette da gibt es irgendwelche Gotchas, die in der Implementierung von datetime berücksichtigt wurden :D

@desmater: Wie du siehst, geht der Trend in die Richtung die sehr umfangreiche Standardbibliothek von python weitestgehend auszunutzen. Außer man hat Zugang zu einem überlegeneren externen Modul. Klar kann man seinen Spaß damit haben als Übungsaufgabe solche Funktionalität nachzubauen, aber gerade in Sachen Zeit und Kalender gibt es einige Stolperfallen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben:
desmater hat geschrieben:[...] und wohne zurzeit im schönen Hamburg.
Wo ist das denn? Ich kenne nur das schäbige in Norddeutschland. :mrgreen:
Vorsicht! Mod aus HH liest mit :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Erst einmal danke für die vielen Rückmeldungen und das so schnell :)

Also für mein Problem, werde ich mir dann erst mal, wie hier ja öfters angesprochen wurde, datetime.date anschauen :)
/me hat geschrieben: Es gibt mit PEP-8 den wundervollen Style Guide for Python Code. Danach ist CamelCase für Klassennamen vorgesehen. Für Funktionen und Variablen nimmt man lower_case_with_underscores Deine Routine würde also so aussehen:

Code: Alles auswählen

def count_days(user_day, user_month, user_year, today_day, today_month, today_year):
    age_in_days = 0
    [...]
Es handelt sich bei PEP-8 um Empfehlungen, nicht um Gesetze. Es handelt sich allerdings um sehr, sehr starke Empfehlungen und du solltest nur davon abweichen wenn du einen guten Grund hast.
Ah danke, darüber war ich bist jetzt noch nicht gestolpert! Das werde ich mir dann im laufe des heutigen und morgigen Tages erst einmal genauer anschauen und meinen Code dementsprechend überarbeiten :mrgreen:


Dann wollte ich noch Fragen, ob es hier lieber gern gesehen ist ein all in one Fragen Thema zu eröffnen, so ähnlich wie von Tengel( Neuling sucht Rat ) , oder lieber für zusammengehörende Probleme / Code ein neues Thema eröffnen? Ich persönlich finde die all in one Fragen Themen recht praktisch, da ich sie auch schon in anderen Foren früher genutzt habe.
Wie sieht das hier aus?

Mit freundlichen Grüßen

desmater
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

desmater hat geschrieben: Dann wollte ich noch Fragen, ob es hier lieber gern gesehen ist ein all in one Fragen Thema zu eröffnen, so ähnlich wie von Tengel( Neuling sucht Rat ) , oder lieber für zusammengehörende Probleme / Code ein neues Thema eröffnen? Ich persönlich finde die all in one Fragen Themen recht praktisch, da ich sie auch schon in anderen Foren früher genutzt habe.
Ich persönlich finde das nicht so gut. Ein neues Thema gehört auch in einen neuen Thread. Da wir hier keine Tags haben und auch einzelne Beiträge nicht getaggt werden können, klappt die SuFu nun einmal am besten über die (aussagekräftigen) Titel. Insofern würde ich empfehlen, für thematisch neue Fragen auch einen neuen Thread zu eröffnen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Hyperion hat geschrieben: Ich persönlich finde das nicht so gut. Ein neues Thema gehört auch in einen neuen Thread. Da wir hier keine Tags haben und auch einzelne Beiträge nicht getaggt werden können, klappt die SuFu nun einmal am besten über die (aussagekräftigen) Titel. Insofern würde ich empfehlen, für thematisch neue Fragen auch einen neuen Thread zu eröffnen.
Alles klar, dann weiß ich bescheid :) Gut das ich vorher mal gefragt hab :mrgreen:
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

So ich hoffe niemand ist mir böse wegen einem doppel Post :(

Also ich habe das ganze dann jetzt mit datetime.date so gelöst:

Code: Alles auswählen

if datetime.date(today_year,today_month,today_day) > datetime.date(user_year, user_month, user_day):
Scheint auch soweit zu funktionieren.

Ich würde mich freuen wenn ihr euch das ganze mal anschauen würdet und mir mit konstruktiver Kritik helft besser zu werden :wink:

Hier einmal der ganze code des "Programms" :mrgreen:

Code: Alles auswählen

#!/usr/bin/python
# age_in_days.py --- asks for the date of birth of the user and returns his age in days

import datetime
import time

# checks if the year is a leap year
def leap_year(year):
    if year % 400 == 0:
        return True
    elif year % 100 == 0:
        return False
    elif year % 4 == 0:
        return True
    else:
        return False

# Returns the next date after the date the function gets
# day1 is the last day of the month which is used in the moment
def get_next_day(day,month,year,day1):
    if day < day1:
        return day+1, month, year
    elif day == day1:
        if month < 12:
            return 1, month+1, year
        else:
            return 1, 1, year+1

# returns the number of days for the month
def get_days_in_month(month, year):
    if leap_year(year):
        days_in_month = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    else:
        days_in_month = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    return days_in_month[month-1]

# counts the days from start date to target date
def count_days(user_day, user_month, user_year, today_day, today_month, today_year):
    days = 0
    while user_day != today_day or user_month != today_month or user_year != today_year:
        user_day, user_month, user_year = get_next_day(user_day, user_month, user_year, get_days_in_month(user_month, user_year))
        days += 1
    return days

# Gets the Input from user and convert it to the int variables day month year
def get_user_input():
    print 'Enter your date of birth in this notation: dd.mm.yyyy'
    user_input = raw_input('Please enter your date of birth: ')
    dot_position = user_input.find('.')
    day = int(user_input[:dot_position])
    dot_position2 = user_input.find('.',dot_position+1)
    month = int(user_input[dot_position+1:dot_position2])
    year = int(user_input[dot_position2+1:])

    return day, month, year

# the main function -> bring all the other functions together 
def age_in_days():
    # set todays date variables
    today_day = int(time.strftime('%d'))
    today_month = int(time.strftime('%m'))
    today_year = int(time.strftime('%Y'))


    while True:
        # set variables of the users date of birth
        user_day, user_month, user_year = get_user_input() 

        # checks if the date enterd by user is befor the current date
        if datetime.date(today_year,today_month,today_day) > datetime.date(user_year, user_month, user_day):    
            age_in_days = count_days(user_day, user_month, user_year, today_day, today_month, today_year)
            return 'Your age in days is: %d days' %age_in_days
        else:
            print "I'm sorry, but you didn't enter a valid date for your birth!\nPlease try again."
            continue


print age_in_days()
Was mir persönlich gerade aufgefallen ist, ich habe Funktionen und Variablen mit dem gleichen Namen verwendet. Das sollte man nicht tun oder?
BlackJack

@desmater: Etwas viel Code den man mit ein zwei Zeilen und `datetime.datetime` ausdrücken könnte. Wie, das wurde ja schon gezeigt.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Bitte mach dir nicht die Mühe und bau dir deine eigene Kalender-Bibliothek. Das haben schon andere vor dir getan. Bei Themen wie Datum und Uhrzeit kann man den Aufwand leicht unterschätzen und denken, dass man doch gar nicht so viel beachten müsse. Schau dir mal diesen (recht unterhaltsamen) Vortrag an: http://pyvideo.org/video/1765/blame-it- ... ow-about-d. Dann sollte dir klar werden, dass man "Datum X plus ein Tag" nicht so einfach implementieren kann wie man es sich vielleicht vorgestellt hat.
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Ja sicher hätte ich das mit der datetime Bibliothek wesentlich besser lösen können. Das ist mir klar. Allerdings ging es mir hier mehr darum das ich übe probleme mit den Grundlagen zu lösen. Daher wäre der Lerneffekt sicher nicht sehr hoch wenn ich einfach fertige Bibliotheks Funktionen nutze oder? Immerhin habe ich ja gerade erst angefangen Python zu lernen und bin nicht mal mit der ersten Woche um.
Ich sehe nämlich mein größtes Problem darin, das ich nicht weiß wie man Probleme in einer Programmiersprache löst. So fand ich das eine gute erste Übung.
BlackJack

@desmater: Das ist alles ein wenig widersprüchlich. Wenn Du es ohne zusätzliche Module machen möchtest, dann dürftest Du `datetime` auch nicht für den „grösser”-Vergleich verwenden. Probleme löst man in einer Programmiersprache dadurch, dass man sich die passenden Sprachmittel und Bibliotheken sucht, mit denen man das Problem möglichst einfach und verständlich lösen kann. Das wäre in diesem Fall — also in Python — das `datetime`-Modul aus der Standardbibliothek. Ohne dieses ist das Problem, zumindest wenn man es richtig und fehlerfrei lösen möchte, alles andere als trivial. Zum Thema, rechnen mit Datumswerten ist nicht so leicht wie es auf den ersten Blick scheint, wurde in den einzelnen Beiträgen ja schon einiges verlinkt.

Edit: Sonstige Anmerkungen zum Quelltext:

Die Kommentare über den Funktionen würden besser als DocStrings unter die ``def``-Anweisung geschrieben.

Funktionen die etwas prüfen und einen Wahrheitswert zurück geben haben oft ein Namen der mit `is_` oder `has_` beginnt. Also zum Beispiel `is_leap_year()`. Die Funktion liesse sich auch mit *einem* logischen Ausdruck formulieren, statt mit den ganzen ``if``/``elif`` und literalen Wahrheitswerten.

Bei `get_next_day()` ist der Name des letzten Arguments schlecht gewählt. Statt in einerm Kommentar zu erklären was der Wert bedeutet, hätte man ihn besser `last_day_of_month` oder so ähnlich genannt und sich die Erklärung gespart. Als Argument hätte ich diesen Wert auch nicht übergeben, denn man bekommt ja den Monat und das Jahr übergeben, kann diesen Wert also *in* dieser Funktion berechnen und muss das nicht dem Aufrufer überlassen.

In der `get_days_in_month()`-Funktion werden Daten fast 1:1 wiederholt. Die beiden Sequenzen unterscheiden sich nur in einem Wert und da auch nur um den Wert 1. Ich würde dort die Tage für den Normalfall ermitteln und im Sonderfall, dass es sich um den zweiten Monat in einem Schaltjahr handelt, 1 vom Ergebnis abziehen. Dabei kann man zusätzlich ausnutzen, dass Wahrheitswerte in Python ein Untertyp von ganzen Zahlen sind, und die `True` und `False` den Werten 1 und 0 entsprechen. Man kann also das Ergebnis der Bedingung einfach von der Monatsanzahl abziehen.

Die beiden Daten in `count_days()` als Einzelwerte zu behandeln obwohl immer alle drei zusammen verwendet werden, macht den Quelltext umfangreicher und unübersichtlicher als er sein müsste. Die Namen sind ausserdem schlecht gewählt, denn dass das zweite Datum das *heutige* Datum ist, stimmt ja nur wenn man diese Funktion auch tatsächlich mit dem heutigen Datum aufruft. Die Funktion würde aber auch mit jedem anderen funktionieren. Ebenso egal ist, ob das erste Datum vom Benutzer eingegeben wurde, oder irgendwie anders zustande kam. Die Funktion zählt die Tage von einem Start- zu einem Enddatum.

Der Kommentar bei `get_user_input()` wäre zumindest als Dokumentation für die Funktion nicht so gut, weil die Variablennamen *in* der Funktion für den Aufrufer egal sind.

Das Zerlegen der Komponenten des Datums ist umständlich. Die `split()`-Methode wäre hier viel einfacher.

Den aktuellen Tag in `age_in_days()` über eine Zeichenkettendarstellung der Einzelteile, die dann wieder in Zahlen umgewandelt werden, zu erstellen, ist auch wieder umständlich. Die `time.localtime()`-Funktion liefert diese Komponenten schon als Zahlen.

Eine lokale Variable genau so zu nennen wie die Funktion kann verwirrend werden.

``continue`` am Ende einer Schleife macht keinen Sinn, denn dort hat diese Anweisung keinen Effekt.

Das alles umgesetzt komme ich ungefähr auf so etwas (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import time


def is_leap_year(year):
    """Checks if the year is a leap year."""
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)


def get_days_in_month(month, year):
    """Returns the number of days for the month."""
    result = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]
    return result - (month == 2 and is_leap_year(year))


def get_next_day((day, month, year)):
    """Returns the next date after the date the function gets."""
    last_day_of_month = get_days_in_month(month, year)
    if day < last_day_of_month:
        return day + 1, month, year
    elif day == last_day_of_month:
        if month < 12:
            return 1, month + 1, year
        else:
            return 1, 1, year + 1


def count_days(start_date, end_date):
    """Counts the days from start date to target date."""
    days = 0
    while start_date != end_date:
        start_date = get_next_day(start_date)
        days += 1
    return days


def get_user_input():
    """Gets the input from user and returns a sequence with day, month, year."""
    print 'Enter your date of birth in this notation: dd.mm.yyyy'
    user_input = raw_input('Please enter your date of birth: ')
    return map(int, user_input.split('.'))


def age_in_days():
    """The main function -> bring all the other functions together."""
    today = tuple(reversed(time.localtime()[:3]))
    while True:
        birth_date = get_user_input() 
        if today[::-1] > birth_date[::-1]:    
            return 'Your age in days is: {0} days'.format(
                count_days(birth_date, today)
            )
        print "I'm sorry, but you didn't enter a valid date for your birth!"
        print 'Please try again.'


def main():
    print age_in_days()


if __name__ == '__main__':
    main()
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Danke für dein umfangreiches Feedback BlackJack.

Ja so wie du das sagst, ist es doch einleuchtender. Das zeigt mir, wie viel ich noch lernen muss!
Du hast ja bereits einiges genannt, an dem ich arbeiten muss.
So wie ich das jetzt verstanden habe, sollte ich also bevor ich anfange ein Programm zu schreiben, mir Gedanken machen welche Probleme ich zu lösen habe. Wenn ich das dann analysiert habe sollte ich erst einmal schauen ob es für dieses Problem bereits eine Lösung gibt, in Form eines Moduls aus einer Externen- oder der Standardbibliothek. Dann, falls ich diese noch nicht kenne mich einarbeiten und dann damit letztendlich das Problem in meinem Programm lösen. Sollte es keine für mich passende Lösung geben, muss ich das Problem selber lösen.

Hab ich den Weg soweit richtig verstanden?

Dann stellt sich mir jetzt allerdings die Frage, soll ich mich sofort weiter mit der OOP in Python beschäftigen, oder soll ich erst einmal weiter kleine Programme schreiben, um die Grundlagen total zu verinnerlichen und lernen wie man Module/Bibliotheken richtig einsetzt?

Denn im Moment ist mir nicht so ganz klar wie ich weiter machen soll :K . Ich habe bis jetzt mir alles mit der deutschen Version von A Byte of Python erlesen. Das Buch habe ich nun bis zum 10. Kapitel gelesen und denke das ich bisdahin auch alles soweit verstanden habe. Nun ist das 10. Kapitel OOP was mir halt ein wenig Angst macht. Daher wollte ich erst mal weiter üben in dem ich kleine Programme schreibe. Wie das erste jetzt hier geendet ist kann man ja sehen.

Ich würde mich über einen kleinen Ratschlag darüber wie ich jetzt weiter lernen soll sehr freuen :? :/

Mit freundlichen Grüßen

desmater
BlackJack

@desmater: Der beschriebene Weg ist das was Programmierer in der Regel machen um ein Problem zu lösen. Manchmal erfindet man das Rad selbst, entweder weil man die passende Bibliothek nicht kennt, oder aus irgendwelchen Gründen nicht einsetzen kann oder darf, oder weil das (Teil)Problem so einfach ist, dass man es sehr leicht selber lösen kann. Oder man denkt das zumindest. :-)

Ich weiss nicht man tatsächlich Angst vor OOP haben sollte oder muss. Wenn man Funktionen und Datenstrukturen verstanden hat, dann ist der nächste Schritt zusammengehörige Daten und Funktionen in Klassen zusammen zu fassen. Um mal bei Deinem Beispiel mit dem Tage zählen zu bleiben: Du hast da drei Werte, Jahr, Monat, und Tag, die *zusammen* ein Datum beschreiben, und Funktionen, die auf einem Datum operieren, denen man also diese drei Einzelwerte übergeben muss. Das könnte dann so aussehen:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import time


class Date(object):
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __repr__(self):
        return '{0}{1!r}'.format(self.__class__.__name__, self.as_tuple())

    def __cmp__(self, other):
        return cmp(self.as_tuple(), other.as_tuple())

    def __hash__(self):
        return hash(self.as_tuple())

    def __iter__(self):
        result = self
        while True:
            yield result
            result = next(result)

    def as_tuple(self):
        return (self.year, self.month, self.day)

    def is_leap_year(self):
        """Checks if the date is in a leap year."""
        return (
            self.year % 4 == 0
            and (self.year % 100 != 0 or self.year % 400 == 0)
        )

    def get_days_in_month(self):
        """Returns the number of days for the month."""
        result = [
            31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
        ][self.month - 1]
        return result - (self.month == 2 and self.is_leap_year())

    def next(self):
        """Returns the next date after this date."""
        last_day_of_month = self.get_days_in_month()
        if self.day < last_day_of_month:
            return Date(self.year, self.month, self.day + 1)
        elif self.day == last_day_of_month:
            if self.month < 12:
                return Date(self.year, self.month + 1, 1)
            else:
                return Date(self.year + 1, 1, 1)
        else:
            assert False, 'illegal day'

    def count_days_to(self, other):
        """Counts the days from this to other date."""
        return sum(1 for _ in iter(iter(self).next, other))

    @classmethod
    def today(cls):
        return cls(*(time.localtime()[:3]))


def get_user_input():
    """Gets the input from user and returns a `Date`."""
    print 'Enter your date of birth in this notation: dd.mm.yyyy'
    user_input = raw_input('Please enter your date of birth: ')
    day, month, year = map(int, user_input.split('.'))
    return Date(year, month, day)


def age_in_days():
    """The main function -> bring all the other functions together."""
    today = Date.today()
    while True:
        birth_date = get_user_input() 
        if today > birth_date:    
            return 'Your age in days is: {0} days'.format(
                birth_date.count_days_to(today)
            )
        print "I'm sorry, but you didn't enter a valid date for your birth!"
        print 'Please try again.'


def main():
    print age_in_days()


if __name__ == '__main__':
    main()
Interessant wäre es jetzt noch heraus zu finden warum das Ergebnis von meinem Geburtstag um 20 Tage daneben liegt. Denn ich gehe mal davon aus, dass `datetime` korrekt rechnet. :-)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

BlackJack hat geschrieben:Interessant wäre es jetzt noch heraus zu finden warum das Ergebnis von meinem Geburtstag um 20 Tage daneben liegt. Denn ich gehe mal davon aus, dass `datetime` korrekt rechnet.
Vielleicht weil Deine Februare jeweils 29 Tage haben, außer in Schaltjahren, da sind es 28 :wink:
BlackJack

@Sirius3: Wie peinlich. :oops:
desmater
User
Beiträge: 32
Registriert: Donnerstag 18. April 2013, 20:53

Hm hm, ich muss zugeben, ich verstehe gerade mal die hälfte von deinem Code :mrgreen:

Code: Alles auswählen

def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
Der Code erinnert mich ein wenig an Strukturen aus C++, kann ich mir das so ähnlich vorstellen?

Was mich noch extrem rätseln lässt sind die Functionsnamen wie __cmp__ oder __repr__ ^^. Sind das Abkürzungen oder was bedeutet das? :oops:

Gut also werde ich mal versuchen mich langsam mit der OOP auseinander zusetzen und hoffe das ich das auch verstehe :mrgreen:
Wenn ich mal feststecke weiß ich ja, das hier kompetente Hilfe zu finden ist :wink:
Und es ist schön zusehen, das auch erfahrene Leute mal ab und zu nen kleinen Denkfehler habe :D

Mit freundlichen Grüßen

desmater
Antworten