Verständnis Frage (if-else) oder (try-except)

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.
Fabian Kochem
User
Beiträge: 36
Registriert: Mittwoch 5. April 2006, 14:11
Wohnort: Köln

Samstag 11. Oktober 2008, 22:47

birkenfeld: Das ist doch das Selbe?

Code: Alles auswählen

if dictionary.has_key(key):
    ...
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Samstag 11. Oktober 2008, 23:07

Die `has_key`-Methode von dicts wird mit Py3k verschwinden. Außerdem ist ``key in d`` doch viel schicker.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sonntag 12. Oktober 2008, 10:04

``key in d`` und ``d.has_key(key)`` tut das gleiche, und wie Trundle sagt, ist ersteres vorzuziehen.

``key in d.keys()`` allerdings ist doppelt falsch: es wird extra eine neue Liste aller Keys erzeugt *und* diese muss dann in linearer Zeit nach "key" durchsucht werden, während eine Suche direkt im Dictionary auf O(1) hinausläuft.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Sonntag 12. Oktober 2008, 10:39

@busfahrer: Du bindest in dem gezeigten Quelltextschnippsel zu viel an das Objekt. `dienstplan`,`dienste` und `dienstnummern` zum Beispiel.

Ist es ein Problem, dass wenn man eine Dienstnummer mehrfach angibt, die auch mehrfach aussummiert wird? Vielleicht solltest Du die Benutzereingabe einfach mal komplett vor der Aufsummierung prüfen und gar nicht erst rechnen, wenn da Fehler enthalten sind.

Vorausgesetzt alle Nummer in `dienstnummer` sind gültig, kann man die Berechnung auch so machen:

Code: Alles auswählen

    def ergebnis(self):
        # ...
        gesellschafts_standard = sum(dienste[n] for n in dienstnummern)
        standard_konto = gesellschafts_standard - (len(dienstnummern) * 7.8666666667)
        # ...
Wobei solche magischen Zahlen wie 7.8666666667 oder hart kodierte Pfadangaben kein guter Stil sind. So etwas gehört als Konstante definiert und ggf. erklärt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Sonntag 12. Oktober 2008, 10:42

@birkenfeld:

In der Doku zu 2.5 hieß es:
a.has_key(k) Equivalent to k in a, use that form in new code
Das habe ich so verstanden, dass die Variante a.has_key(k) diejenige sei, die man verwenden solle.

In der Doku zu 2.6 heißt es nun:
dict.has_key(key) is equivalent to key in d, but deprecated.
Das lese ich nun aber so, dass man die Methode has_key() gerade NICHT mehr verwenden sollte.

Habe ich die Fassung "2.5." einfach falsch gelesen oder hat sich da tatsächlich ein Sichtwechsel ereignet?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sonntag 12. Oktober 2008, 11:04

Ja, du hast die 2.5er falsch verstanden.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Sonntag 12. Oktober 2008, 11:04

Du hast die 2.5er Doku falsch interpretiert. Bist aber nicht der einzige -- dazu gab's mindestens eine Diskussion in der englischsprachigen Python-Newsgroup.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Sonntag 12. Oktober 2008, 11:20

BlackJack hat geschrieben: Ist es ein Problem, dass wenn man eine Dienstnummer mehrfach angibt, die auch mehrfach aussummiert wird?
Nein,da es durchaus sein kann das ich ein und den selben Dienst
mehr als einmal im Monat habe.

Werde ansonsten mal versuchen deine Verbesserungen mit meinen
sehr bescheidenen Mitteln umzusetzen.

Vielen Dank

Gruß...busfahrer
Alles wird gut ;-)
Benutzeravatar
snafu
User
Beiträge: 5534
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 12. Oktober 2008, 11:21

@BlackJack:

Ich befürchte, du hast den Code missverstanden. Du interpretierst "ges" als Gesellschaft und "std" als Standard. Möglich (und IMHO wahrscheinlicher) sind aber auch "gesamt" und "Stunden". Daraus ergibt sich dann, dass nicht alle Stunden der Busgesellschaft auf ein Standardkonto überwiesen werden sollen, sondern die bei einem Dienst abgeleisteten Stunden auf ein (Über-)Stundenkonto kommen. Von diesen Stunden wird dann pro Dienst 7,irgendwas abgezogen und das, was überbleibt, kann sich der Busfahrer z.B. als Urlaub gutschreiben lassen.

(Oder aber *ich* habe jetzt total am Thema vorbeigedacht. Vielleicht sollte man mal die Antwort von "busfahrer" abwarten...)

EDIT: Oder sagen wir besser, es sind keine Überstunden, aber eben ein bestimmter Satz an Arbeitszeit, der später zu Urlaub werden kann.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Sonntag 12. Oktober 2008, 11:42

snafu hat geschrieben:@BlackJack:

Ich befürchte, du hast den Code missverstanden. Du interpretierst "ges" als Gesellschaft und "std" als Standard. Möglich (und IMHO wahrscheinlicher) sind aber auch "gesamt" und "Stunden". Daraus ergibt sich dann, dass nicht alle Stunden der Busgesellschaft auf ein Standardkonto überwiesen werden sollen, sondern die bei einem Dienst abgeleisteten Stunden auf ein (Über-)Stundenkonto kommen. Von diesen Stunden wird dann pro Dienst 7,irgendwas abgezogen und das, was überbleibt, kann sich der Busfahrer z.B. als Urlaub gutschreiben lassen.

(Oder aber *ich* habe jetzt total am Thema vorbeigedacht. Vielleicht sollte man mal die Antwort von "busfahrer" abwarten...)

EDIT: Oder sagen wir besser, es sind keine Überstunden, aber eben ein bestimmter Satz an Arbeitszeit, der später zu Urlaub werden kann.
Genau so wie du es für wahrscheinlich hälst,ist es.
Wobei das eventuelle missverstehen meines Codes
sicher daran liegt das meine Variablen nicht deutlich
genug sprechen :oops:

Das sind wohl unter anderem die Fehler die man als
Neuling macht.Man bedenkt nicht das auch andere den
Code lesen und verstehen sollen.

ges_std = Gesammtstunden
std_kto = Sundenkonto

Gruß...busfahrer
Alles wird gut ;-)
BlackJack

Sonntag 12. Oktober 2008, 13:52

@snafu: Mein Missverständnis war Absicht. Ich habe sogar 'ne halbe Minute überlegt was ich aus 'kto' machen könnte. :-)

Die Botschaft ist anscheinend angekommen.
Antworten