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.
Funktionen richtig formuliert ?
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
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
Habe es mal so gelöst !!
gruss frank
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!!!'
Habe noch eine Falscheingabe berücksichtigt.
gruss frank
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
Da ist aber noch einiges was man verbessern könnte:
Ich würde die Zeilen 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
noch in
vereinfachen.
Weiter versuchst du offensichtlich, eine Fließkommazahl per "==" mit einer anderen Zahl zu vergleichen:
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
Ich würde die Zeilen
Code: Alles auswählen
print '-' * 35
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])
Code: Alles auswählen
auswertung = float(geburtstag[0] - datum[1])
Weiter versuchst du offensichtlich, eine Fließkommazahl per "==" mit einer anderen Zahl zu vergleichen:
Code: Alles auswählen
elif auswertung == 1
elif auswertung == 0
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
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
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
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 benutztkaytec 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.
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.kaytec hat geschrieben:Das mit der try - except Anweisung verstehe ich nicht so ganz ?
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
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 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
Danke DIr EyDu!!
Hatte gedacht das Strings immer mit float ausgelesen werden - geht auch mit int.
etwa so ?
frank
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()
frank