Funktionen richtig formuliert ?

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

Mittwoch 9. Mai 2007, 20:19

Du bindest den Eintrag in Zeile 15 nur an einen neuen Namen, das ist immer noch das Objekt im Adressbuch, also werden Änderungen an dem Objekt auch gespeichert.

Fürs rechnen mit Datumswerten schau mal ins `datetime`-Modul. Und statt der ``* -1`` könntest Du auch einfach die Reihenfolge bei der Subtraktion vertauschen.
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 9. Mai 2007, 21:33

Danke BlackJack !

Soweit habe ich es verstanden. Das mit dem Erstellen von "Sicherungslisten" ist überflüssig ? Ist mein Ansatz komplett falsch oder muss ich am Ende der Funktion den Eintrag aus dem Adressbuch Löschen und neu einschreiben?

gruss und dank frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 11. Mai 2007, 19:00

Habe es mal so gelöst !!

Code: Alles auswählen

def testen(adressbuch):
    for eintrag in adressbuch:
        for feldname, feld_wert in zip(FELDNAMEN, eintrag):
            if feldname == 'Geburtstag:':
                geburtstag = feld_wert.split('.')
                datum =(strftime('%x'))
                datum = datum.split('/')
                datum.pop()
                geburtstag.pop()
                if datum[0] == geburtstag[1]:
                    auswertung = float(geburtstag[0]) - float(datum[1])
                    for feldname, feld_wert in zip(FELDNAMEN, eintrag):
                        print '_' * 35
                        print feldname, feld_wert
                    if 1 < auswertung <= 7:
                        print 'Geburtstag ist in ' + str(int(auswertung)) + ' Tagen'
                    elif auswertung == 1:
                        print '!Geburtstag ist morgen!'
                    elif auswertung == 0:
                        print '!!!der Geburtstag ist heute!!!'
gruss frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 11. Mai 2007, 20:43

Habe noch eine Falscheingabe berücksichtigt.

Code: Alles auswählen

                try:
                    if datum[0] == geburtstag[1]:
                        auswertung = float(geburtstag[0]) - float(datum[1])
                        for feldname, feld_wert in zip(FELDNAMEN, eintrag):
                            print '-' * 35
                            print feldname, feld_wert
                        print '=' * 35
                        if 1 < auswertung <= 7:
                            print 'Geburtstag ist in ' + str(int(auswertung)) + ' Tagen'
                        elif auswertung == 1:
                            print '!Geburtstag ist morgen!'
                        elif auswertung == 0:
                            print '!!!der Geburtstag ist heute!!!'
                        print '=' * 35
                        raw_input()

                except IndexError:
                    for feldname, feld_wert in zip(FELDNAMEN, eintrag):
                        print '-' * 35
                        print feldname, feld_wert
                    print '=' * 35
                    print 'Dieser Eintrag hat eine falsche Geburtstagsangabe'
                    continue
 
gruss frank
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 11. Mai 2007, 20:59

Da ist aber noch einiges was man verbessern könnte:

Ich würde die Zeilen

Code: Alles auswählen

print '-' * 35
noch in eine Funktion packen, da sich dieser Trenner doch öfter mal wiederholt, und du diesen so wesentlich leichter anpassen kannst.

Sollten "geburtstag[0]" und "datum[0]" Zahlen sein, und keine sein, kannst du die Zeile

Code: Alles auswählen

auswertung = float(geburtstag[0]) - float(datum[1])
noch in

Code: Alles auswählen

auswertung = float(geburtstag[0] - datum[1])
vereinfachen.

Weiter versuchst du offensichtlich, eine Fließkommazahl per "==" mit einer anderen Zahl zu vergleichen:

Code: Alles auswählen

elif auswertung == 1
elif auswertung == 0
Früher oder später wird da etwas auf Grund von Rundungsfehler schiefgehen.

Als letztes fällt mir noch dein try/except-Block auf: Die goldene Regel für dieses Konstrukt ist, dass im try-Teil nur so wenig wie nötig steht. Alles was nach dem laufen soll, wo ein Fehler auftreten könnte hat im else-Block zu stehen (oder nach dem try/except-Teil, wenn except das Problem auflöst).

Grüße,
Sebastian
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 11. Mai 2007, 21:22

Hallo EyDu !!

Das mit dem Teiler ist eine gute Idee, da ich diesen oft verwende. Das eine float kann ich weglassen, doch bei dem Vergleichen der Zahlen ist es doch egal, da keine kommastellen entstehen können - sind doch immer ganze Zahlen.

Das mit der try - except Anweisung verstehe ich nicht so ganz ?

gruus und dank frank
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 11. Mai 2007, 21:43

kaytec hat geschrieben:Das eine float kann ich weglassen, doch bei dem Vergleichen der Zahlen ist es doch egal, da keine kommastellen entstehen können - sind doch immer ganze Zahlen.
In diesem Kontext wird das mit hoher Wahrscheinlichkeit immer funktionieren, aber man weiss ja nie was noch hinzugebaut wird. Das Problem mit Fließkommazahlen ist also eher allgemeiner Natur. Wenn aber nur ganze Zahlen auftreten können, dann frage ich mich, warum du nicht gleich Integers benutzt ;-)

kaytec hat geschrieben:Das mit der try - except Anweisung verstehe ich nicht so ganz ?
Das Problem ist, um so größer der try-Teil wird, desto höher ist auch die Wahrscheinlichkeit, dass du Fehler abfängst die du gar nicht abfangen willst. Hinzu kommt noch, dass man bei einem langen try-Teil suchen muss, welche(r) Fehler denn abgefangen werden soll. Ist dieser kurz gehalten, ist dieses im Allgemeinen jedoch recht einfach.

Aus

Code: Alles auswählen

try:
    spam = eggs[0] #Hier kann etwas schiefgehen (Index-Fehler)
    
    #Code bei dem kein Index-Fehler auftreten sollte
    #...
    wert = berechne_etwas()
except IndexError:
    #Defaultwert setzen
    wert = 1
solltest du also folgendes machen:

Code: Alles auswählen

try:
    spam = eggs[0] #Moeglicher Indexfehler
except IndexError:
    #Defaultwert setzen
    wert = 1
else:
    #Code bei dem kein Index-Fehler auftreten sollte
    #...
    wert = berechne_etwas()
Wenn jetzt nämlich beispielsweise in "berechne_wert" ein Index-Fehler auftritt, den du eigentlich nicht abfangen wolltest, wird dir dieser auch gemeldet und nicht aus Versehen verdeckt.

Wenn du aus dem except-Teil mit "return" springst, kannst du auch den else-Teil weglassen, und hinter dem except-Teil auf gleicher Ebene wie das try-Statement weiterarbeiten.

Sebastian
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 11. Mai 2007, 22:03

Danke DIr EyDu!!

Hatte gedacht das Strings immer mit float ausgelesen werden - geht auch mit int.

Code: Alles auswählen

def testen(adressbuch):
    s = sys.winver
    os.system("cls")
    for eintrag in adressbuch:
        for feldname, feld_wert in zip(FELDNAMEN, eintrag):
            if feldname == 'Geburtstag:':
                geburtstag = feld_wert.split('.')
                datum =(strftime('%x'))
                datum = datum.split('/')
                datum.pop()
                geburtstag.pop()
                try:
                    if datum[0] == geburtstag[1]:
                        auswertung = int(geburtstag[0]) - (datum[1])
                except IndexError:
                        for feldname, feld_wert in zip(FELDNAMEN, eintrag):
                            print '-' * 35
                            print feldname, feld_wert
                        print '=' * 35
                        try:
                            if 1 < auswertung <= 7:
                                print 'Geburtstag ist in ' + str(auswertung) + ' Tagen'
                            elif auswertung == 1:
                                print '!Geburtstag ist morgen!'
                            elif auswertung == 0:
                                print '!!!der Geburtstag ist heute!!!'
                            print '=' * 35
                        except UnboundLocalError:
                            print 'Dieser Eintrag hat eine falsche Geburtstagsangabe'
                        raw_input()
etwa so ?

frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Samstag 12. Mai 2007, 23:07

Habe jetzt mal damit rumprobiert, doch es geht nicht so richtig! Es werden jetzt alle Einträge angezeigt - muss ich mal überarbeiten ?!

gruss frank
Antworten