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.
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 00:12

Habe mich mal mit der Formulierung von Funktionen beschäftigt, doch ob ich so auf dem richtigen Weg bin ist mir nicht ganz klar?

http://paste.pocoo.org/show/1320/

danke frank
DaSch
User
Beiträge: 72
Registriert: Mittwoch 28. März 2007, 20:04
Kontaktdaten:

Mittwoch 4. April 2007, 00:31

was ist dabei jetzt konkret unklar?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 4. April 2007, 07:37

[wiki]Die global-Anweisung[/wiki] wäre mal ein guter Startpunkt.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 08:46

Die variable liste1 ist ja nicht veränderbar und ich verwende sie zu Darstellung im ganzen Programm, deswegen fand ich dies nicht so problematisch. Bei der Variable suchk(legt die Suchkriterien fest) hat ich mir das schon gedacht. Ich habe es aber nicht so ganz hinbekommen mit return, da ich diese dann dem Hauptprogramm übergebe (zb.:suchk=suchk() nächste Zeile suche_editiere()). Das Programm ist dann auch unbeabsichtigt in die Suchfunktion verzweigt. Hätte ich das Hauptprogramm anders gestalten sollen ?

danke frank
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 4. April 2007, 08:47

Oder die Enter-Taste, um mal ein Paar sinnvolle Leerzeilen zu setzen.

P.S. Hier eine Fassung mit eingeschaltetem Python-Highlighting.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 4. April 2007, 08:49

kaytec hat geschrieben:(zb.:suchk=suchk() nächste Zeile suche_editiere())
Du weißt schon, dass man suchk auch an suche_editiere als Parameter angeben kann?

Davon abgesehen ist liste1 gar keine List sondern ein Tupel.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 09:12

Das mit der Tulpe ist mir klar - habe mich da falsch ausgedrückt - Das mit der Übergabe als Parameter wusste ich nicht, sonst hätte ich es evt. ja richtig gemacht und nicht hier Fragen gestellt. Das mit den Leerzeichen ist mir auch verständlich, doch evt. wäre dies wieder nicht pyhtonkonform gewesen.

danke frank
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 4. April 2007, 09:14

kaytec hat geschrieben:Das mit den Leerzeichen ist mir auch verständlich, doch evt. wäre dies wieder nicht pyhtonkonform gewesen.
Keine Sorge - erhöhte Lesbarkeit ist immer Pythonkonform :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 09:20

Wie hätte ich es ohne global übergeben können ?

danke frank
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 4. April 2007, 09:41

Vorsicht, Verwechslungsgefahr!

Tupel:

Code: Alles auswählen

(1, 2, 3, 4)
Tulpe:

Code: Alles auswählen

\ ( ) /
( ( ) )
( ( ) )
`----´
  ||
  ||
  ||
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 09:48

Witzig! Da wären ja meine Fragen beantwortet. Für was steht dieses Forum eigentlich? Willst Du andere Leute unterstützen oder dich lustig machen ?

gruss und dank frank
BlackJack

Mittwoch 4. April 2007, 09:56

StyleGuide-Anmerkungen: Die Einrückung mit 6 statt 4 Leerzeichen fällt auf. Keine Leerzeichen vor und nach Operatoren und nach Kommata.

Namen wie `x`, `liste1`, `liste2` usw. sind sehr nichtssagend.

Wie schon erwähnt erfolgt die Übergabe von Daten über globale Variablen; das ist sehr unübersichtlich und macht das Programm fehleranfälliger.

Das Programm ist nicht dokumentiert, was bei der Dateiakrobatik die da vollführt wird, den nichtsagenden Namen und den völlig undurchsichtigen und über das ganze Programm verteilten Datenstrukturen, dringend notwendig wäre.

Es gibt viel zuviele hart kodierte Zahlkonstanten, die eine Änderung des Programms eigentlich zu einem neuschreiben werden lassen. Beispielsweise die 7 als Anzahl der Felder pro Datensatz. In `liste1` stehen die Bezeichnungen, diese Liste kennt ihre eigene Länge, das heisst die kann man abfragen. Oder im Falle von Schleifen die auf deren Elemente zugreifen, kann man gleich auf die Elemente selbst zugreifen.

So bekommt man die 7 z.B. aus der `sucheingabe()` heraus:

Code: Alles auswählen

    for i, field_description in enumarate(liste1):
        print '(%d) %s' % (i + 1, field_description)
    
    prompt = '-%s->:' % '-'.join('(%d)' % i + 1 for i in xrange(len(liste1)))
    try:
        keingabe = int(raw_input(prompt)) - 1
    except ValueError:
        return
    
    if 0 <= keingabe < len(liste1):
        suche_editiere(keingabe)
Nun kann man Felder einfach durch ändern der `liste1` hinzufügen oder entfernen. Die literalen Konstanten für die Dateizugriffe muss man dazu natürlich auch entsprechend eleminieren.

Der Name `suche_editiere()` lässt schon vermuten, dass es sich um eine Funktion handelt die zwei Sachen anstelle von einer macht. Das sollte man besser aufteilen.

Auch hier gibt es wieder unheimlich viele "magische" Konstanten. Und wie auch an anderen Stellen im Programm merkwürdige Umwandlungen in Fliesskommazahlen bei Werten die, soweit ich das sehe, alle Positionen in Dateien darstellen. Da es nur ganze Bytes gibt, die man ansprechen kann, erscheint das etwas sinnlos!?

Der Zugriff auf einzelne Datensätze sollte sowieso in eigene Funktionen ausgelagert werden. Dann müssen diese Postionsrechnereien nicht in jeder Funktion erneut durchgeführt werden und es gibt weniger Quellen für Fehler. Ausserdem würde ich Datensätze als Ganzes lesen und schreiben und nicht die Felder einzeln. Das ist etwas zu viel Puzzlearbeit. Für das Zusammensetzen und Zerlegen der Datensätze bietet sich das `struct`-Modul an.

Die Anzahl der Datensätze lässt sich aus Dateigrösse / Datensatzgrösse berechnen, so kann man sich den entsprechenden Einrag am Kopf der Datei sparen.

Unterm Strich macht das Programm einen ziemlich "altbackenen" Eindruck. So hätte man vor 20 Jahren ein Pascal-Programm geschrieben, aber nach Python sieht das nicht aus. Und selbst vor 20 Jahren hätte man die Daten zu ``RECORD``\s zusammengefasst und den Datensatz-Zugriff vom Rest getrennt und das Programm damit lesbarer gestaltet.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 4. April 2007, 10:00

Och, du armer. Setz dich, nimm dir nen http://www.buh.de/referenzen/leibniz/img/keks.jpg
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Groucho
User
Beiträge: 9
Registriert: Donnerstag 15. Februar 2007, 14:44

Mittwoch 4. April 2007, 10:09

birkenfeld hat geschrieben:Vorsicht, Verwechslungsgefahr!

Tupel:

Code: Alles auswählen

(1, 2, 3, 4)
Tulpe:

Code: Alles auswählen

\ ( ) /
( ( ) )
( ( ) )
`----´
  ||
  ||
  ||
Die Grenzen sind aber durchlässig: :)

Code: Alles auswählen

>>> tulpe = ("\ ( ) /",
... 	     "( ( ) )",
... 	     "( ( ) )",     
... 	     "`----´",
... 	     "  ||  ",
... 	     "  ||  ",
... 	     "  ||  ")
>>> type(tulpe)
<type 'tuple'>
 
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 4. April 2007, 10:10

Danke ! Das war eine Antwort mit konstruktiver Kritik. Nur so ganz habe ich es nicht verstanden :-). Das mit den 20 Jahren könnte hinkommen. Da hatte ich ein Buch und einen Rechner mit 1KB RAM (Sinclar ZX81). Nur konnte ich da keine Fragen stellen. Habe mir so einiges falsch angeeignet. Na ist ja auch schon lange her und man darf es ja wieder versuchen.

danke
Antworten