Schaltjahr, aufgepaßt!

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

(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)
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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])
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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 ;)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich verderbe euch ja nur ungerne den Spass aber:
http://docs.python.org/dev/library/cale ... dar.isleap :wink:
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Antworten