Seite 1 von 1

Schaltjahr, aufgepaßt!

Verfasst: Freitag 29. Februar 2008, 20:00
von mkesper
(Nicht sicher, ob das hier richtig ist, bitte ggf. verschieben)

Code: Alles auswählen

>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2008, 2, 29)
>>> nextyear = today.replace(year=today.year+1) #findet man so im Netz
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: day is out of range for month
# Autsch!
>>> nextyear = today + dt.timedelta(days=365)
>>> nextyear
datetime.date(2009, 2, 28)
>>> nextyear = today + dt.timedelta(days=366)
>>> nextyear
datetime.date(2009, 3, 1)

Gegenvorschlag:

Verfasst: Mittwoch 18. Juni 2008, 10:40
von dor_neue

Code: Alles auswählen

# Programm:             Schaltjahr.py
# Autor:                dor_neue
#
# Aufgabe:
#   Das ist ein kurzes Script um festzustellen ob das
#   abgefragte Jah ein Schaltjahr ist oder nicht
#
#   beruht auf der Tatsache,
#   dass aller 4 Jahre ein schaltjahr ist
#   aber nicht wenn es durch 100 teilbar ist
#   aber doch wieder wenn es durch 400 teilbar ist

def bIstSchaltJahr(iJahr):
    if iJahr % 400 == 0:
        return True
    elif iJahr % 100 == 0:
        return False
    elif iJahr % 4 == 0:
        return True
    else:
        return False

print bIstSchaltJahr(2008)
müsste auch funzen und is nen bissel kürzer...

Anregung und Kritik sind gern gesehen...

Verfasst: Mittwoch 18. Juni 2008, 10:54
von EyDu
Bei mkalles ging es eigentlich nicht darum zu testen, ob es sich um ein Schlatjahr handelt, sondern eine kleine Falle zu demonstrieren, in die man leicht tappt, wenn man nicht aufpasst.

Auf ein Schlatjahr prüfen geht aber auch ohne alles selber zu berechnen:

Code: Alles auswählen

import datetime

def schaltjahr(jahr):
    try:
        datetime.date(jahr, 2, 29)
    except ValueError:
        return False
    
    return True
In Python bringt man übrigens nicht den Typ mit in den Variablennamen, das macht wenig Sinn. Schau einfach noch mal in PEP8, dein Code sieht ein wenig nach Java aus.

Edit: Natürlich noch die "offensichtliche" Lösung ;-)

Code: Alles auswählen

import functools
import operator

def ist_schaltjahr(jahr):
    return 0 in map(functools.partial(operator.mod, jahr), [400, 100, 4])

Verfasst: Mittwoch 18. Juni 2008, 12:00
von dor_neue
EyDu hat geschrieben: Schau einfach noch mal in PEP8, dein Code sieht ein wenig nach Java aus.

Edit: Natürlich noch die "offensichtliche" Lösung ;-)

Code: Alles auswählen

import functools
import operator

def ist_schaltjahr(jahr):
    return 0 in map(functools.partial(operator.mod, jahr), [400, 100, 4])
Naja, nicht ganz Java - C und C++...

Aber Codingstyle is bei uns in der Ausbildung einmal festgelegt wurden, den jetzt wieder ändern wird mir schwer fallen...
Aber Deine Lösung is ja mal der Oberhammer bezüglich Codingstyle - oder?!?
Da seh ich mal überhaupt nicht mehr durch...
Aber das ist für mich eing utes Beispiel um endlich einen Einstieg in die Sprache zu bekommen...

Verfasst: Mittwoch 18. Juni 2008, 12:43
von Leonidas
dor_neue hat geschrieben:Aber Codingstyle is bei uns in der Ausbildung einmal festgelegt wurden, den jetzt wieder ändern wird mir schwer fallen...
Solltest du aber, weil das ist blödsinn. Die Objekte die an einen Namen gebunden sind können ihren Typ ändern und dann hast du schneller falsche Prefixes als dass du es ändern kannst.
dor_neue hat geschrieben:Aber Deine Lösung is ja mal der Oberhammer bezüglich Codingstyle - oder?!?
Da seh ich mal überhaupt nicht mehr durch...
Das ist funktionale Programmierung. Ist in Python nicht sonderlich üblich, aber manchmal kann man damit nette Sachen machen.

Wenn du es verstehen willst, dann teste die einzelnen Komponenten und lies die Doku zu ``functool.partial``, ``operator.mul`` und ``map``.

Verfasst: Mittwoch 18. Juni 2008, 15:02
von Y0Gi
Es gibt keinen einzigen Codestyle für alles, sondern man sollte den der verwendeten Sprache angemessenen verwenden. Die ungarische Notation ist bei Compilersprachen bzw. Sprachen mit statischem Typing sinnvoll oder zumindest vertretbar; in Python und anderen agilen Sprachen, die in dem Sinne keine typisierten Variablen (sondern nur Namen) haben dagegen nicht.


Mit ``from functools import partial`` wird der Code etwas übersichtlicher ;)

Verfasst: Mittwoch 18. Juni 2008, 15:23
von veers
Ich verderbe euch ja nur ungerne den Spass aber:
http://docs.python.org/dev/library/cale ... dar.isleap :wink:

Verfasst: Mittwoch 18. Juni 2008, 15:40
von mkesper
Ich will ja gar nicht wissen, ob es ein Schaltjahr ist, ich will nur, daß der Code funktioniert. Und zwar immer, nicht nur an ~1439 von 1440 Tagen.