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: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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:

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

[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: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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

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

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

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

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

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

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: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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

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

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

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: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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

Hallo birkenfeld !

Ich glaube du hast Probleme. Helfe dir selbst sonst hilft die ein Pädagoge.
Ich bin einer.

gruss 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

Ich glaube eher, du hast keinen Humor oder die falschen Erwartungen an ein Forum. Hier sitzen nicht Leute, die bezahlt werden, deine Fragen zu beantworten, sondern Leute, die in ihrer Freizeit hier an einer Community teilnehmen. Dazu gehört auch, Witze zu machen und zu erkennen und nicht bierernst am Topic zu kleben.

Und was meine Probleme angeht, woher weißt du von den Stimmen in meinem Kopf?
Dann lieber noch Vim 7 als Windows 7.

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

Ich habe Humor und mache dies auch in meiner Freizeit. Euren Einsatz in diesem Forum ist auch echt nett für alle die von der Materie keine Ahnung haben. Hättest es mir auch erklären können und danach Witze machen - hätten wir zusammen lachen können :-).
"Erzähle es mir und ich vergesse, zeige es mir und ich erinnere, lass es mich tun und ich verstehe." Konfuzius 554 v. Chr. - ist der einzigste den ich kenne :-)

gruss 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

Abgemacht :D
Dann lieber noch Vim 7 als Windows 7.

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

Damit man sehen kann was am Ende rauskommt(Müll:-))
Das steht in der Datei adressbuch.txt:
448.0
Max Mustermann
Musterstrasse 1
10000 Musterhausen
012345678
012345678
max@muster.de
muster
Maxi Muster
Maxstrasse 1
2000 Maxhausen
0123123
0123123
maxi@muster.de
muster

Aus der oberen Zahl berechnet es den letzten Eintrag (für neue Einträge)
und daraus werden auch die Einträge nach Name, Wohnort etc. ausgelesen. Immer in Sprüngen von 32 (deswegen immer diese 32)

Die Anmerkungen von BlackJack werde ich mal versuche zu berücksichtigen - und später mal neu posten - noch mehr Augenkrebs !

gruss frank
Antworten