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

So nun die erste Änderung:

Code: Alles auswählen

liste1=('Name:','Strasse:','Wohnort:',
            'Festnetz:','Handy:','email:','Bemerkung:')
suchk=[]

for i in xrange(len(liste1)):
    print '(%d) %s' % (i + 1, liste1[i]) 

prompt = '-(%s)->:' % ')-('.join('%d'%(i+1) for i in xrange(len(liste1))) 

try:
    keingabe = int(raw_input(prompt))
      
except ValueError:
    return

if 1<= keingabe <len(liste1)+1:

    suchk=[raw_input(liste1[keingabe-1]),keingabe]
    suche_editiere(suchk)
Ich benötige 2 Werte und deswegen erzeuge ich die liste suchk - Wäre es besser zwei einzelne Werte zu übergeben?

danke frank
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Warum eigentlich für das Menü überhaupt eine Funktion?

Ist das nicht sinnvoller diesen Code quasi als Hauptprogramm zu schreiben?

LG

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

Habe mal so weit versucht, es richtig zu formulieren.

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

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

Habe einen Fehler in der Suche gefunden

Code: Alles auswählen

def suchen(spkrit ,strlng):

    suchk=[]

    f = file('adressbuch.txt','r')
    
    print
    print 'Suchkriterien:'
            
    for i in range(len(spkrit)):
        
        print '(%d) %s' % (i + 1, spkrit[i]) 

        prompt = '-(%s)->:' % ')-('.join('%d'%(i+1) for i in xrange(len(spkrit)))

    try:
            
        keingabe = int(raw_input(prompt))-1
            
    except ValueError:
        return

    if 0 <= keingabe < len(spkrit):
        
        suchk=[raw_input(spkrit[keingabe]),keingabe]
        
        lpos = strlng + strlng * suchk[1]
        
        zaehler = 0                           
            
        for x in range (int(float(f.read(strlng - 2)) / (strlng * len(spkrit)))):
        
            f.seek(lpos)
            suche=f.read(strlng - 2).upper()
            s=suche.find(suchk[0].upper())
            
            if s >= 0:
                        
                zaehler = zaehler + 1
                lpos = lpos - strlng * suchk[1]            
                ausgabe(lpos, spkrit, strlng, zaehler)
                lpos = lpos + strlng * suchk[1]
                              
            lpos = lpos + strlng * len(spkrit)
                  
    print
    print '=====!!!Suche abgeschlossen!!!====='
            

def editieren(lpos, spkrit, strlng):

    neueint = []

    f = file('adressbuch.txt','r')

    lpos = lpos - strlng * len(spkrit)
       
    for x in range(len(spkrit)):

        f.seek(lpos)
        print'____________________________________'
        print spkrit[x]
        print 'alter Eintrag:',f.read(strlng - 2)
        print
            
        edt=raw_input('neuer Eintrag:')
            
        if edt !='':     
            neueint.insert(x, edt)
                
            for x1 in range(strlng - 2 - len(neueint[x])):
                
                neueint[x] = neueint[x] + ' '
            neueint[x] = neueint[x] + '\n'

        if edt =='':
            
            f.seek(lpos)
            neueint.insert(x, f.read(strlng-2))
            neueint[x] = neueint[x] + '\n'
        f.seek(lpos + strlng)
            
    print '============!!!Fertig!!!============'

    schreiben (spkrit, neueint, strlng, lpos)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Habe noch eine alphabetische Sortierung eingebaut, doch ob es so Sinn macht? Wird beim Beenden sortiert und steht beim Neustand zu Verfügung.

Namen der Listen sind auch nicht so schön - ist nur zum Testen :P

Code: Alles auswählen

def beenden(spkrit, strlng):

    f = file('adressbuch.txt','r+')
    fbak = file('sichadressbuch.txt','r+')
    lpos = strlng
    
    liste = []
    a=1
    liste1 = []
    liste2 = []

    f.seek(0)

    for x in range (int(float(f.read(strlng - 2)) / (strlng * len(spkrit)))):
    
        f.seek(lpos)
        liste.insert(x, f.read(strlng - 2) + '#' + str(lpos))
        lpos = lpos + strlng * len(spkrit)

    liste.sort()

    for x in range (len(liste)):

        liste1 = liste1 + liste[x].split('#')
        liste2.insert(x, liste1[a])
        a=a+2   

    f.seek(0)
    fbak.write(f.read(strlng))
    f.seek(0)
    spos = strlng
    
    for x in range (int(float(f.read(strlng - 2)) / (strlng * len(spkrit)))):
        
        lpos = int(liste2[x])

        for x1 in range (len(spkrit)):
            
            f.seek(lpos)
            fbak.seek(spos)
            fbak.write(f.read(strlng))
            lpos = lpos + strlng
            spos = spos + strlng

    fbak.seek(0)
    f.write(fbak.read(strlng))
    fbak.seek(0)
    spos = strlng
    
    for x in range (int(float(fbak.read(strlng - 2)) / strlng )):
         
            fbak.seek(spos)
            f.seek(spos)
            f.write(fbak.read(strlng))
            spos = spos + strlng

    fbak.close()
    f.close()
danke frank
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Da kann man aber noch eine ganze Menge zusammenfassen. Ich sehe hier vier Blöcke, die nahezu den selben Aufbau haben:

Code: Alles auswählen

fbak.seek(spos)
f.seek(spos)
f.write(fbak.read(strlng))
spos = spos + strlng
Und dann noch zwei identische Ausdrücke:

Code: Alles auswählen

range (int(float(f.read(strlng - 2)) / (strlng * len(spkrit))))
Und wegen dem alphabetischen Sortieren solltest du noch mal in die Doku schauen (Sortieren bezgl. Gross- und Kleinschreibung).
BlackJack

Und die Namen sind alle ein wenig kryptisch. `neueint` habe ich erst als `neue_int` gelesen ('_' für die Stelle wo ich in Gedanken die Worte getrennt habe). Bei `neuer_eintrag` gäbe es solche Missverständnisse nicht. Und `spkrit`!? Klingt witzig, aber selbst für den der's ursprünglich mal geschrieben hat, ist das nach einem Jahr oder so, vielleicht nicht mehr so klar.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo EyDu

Das mit den vielen gleichen Schleifen bzw. f.seek etc. ensteht dadurch, dass ich die Daten ein und auslesen muss und ich kann doch erst nach dem erstellen einer Textdatei auf diese zugreifen. Oder sollte ich noch eine dritte Datei erzeugen?

Welche Doku ? Gross - und Kleinschreibung?

Vielen Dank EyDu

Hallo BlackJack

Du magst meine schönen Namen - wie mache ich es richtig ? Verständliche Namen ist schon klar - nur bei meinen "schöpferischen Fähigkeiten" werden die nur noch schlimmer!

Vielen Dank BlackJack
BlackJack

Also IMHO ist das Programm einfach furchtbar. Ich weiss das klingt ziemlich hart, aber alleine die Sortierfunktion ist dermassen komisch und umständlich, das man sie am besten von Grund auf neu schreiben sollte.

Zum Beispiel ist beim Anlegen einer Kopie von einer Datei die Struktur derselben doch völlig egal. Wenn man es schon "selbst" macht, dann ist die Grösse der Blöcke in denen kopiert wird unwichtig. Anderseits muss man das nicht selber machen, wenn es in der Standardbibliothek Funktionen wie `shutil.copy()` gibt.

Das gesamte Programm würde davon profitieren wenn der Dateizugriff Datensatzweise und nur in zwei dafür vorgesehenen Funktionen, zum lesen und schreiben, stattfinden würde. Dann würden an allen möglichen Stellen die immer wiederkehrenden Positionsberechnungen und der Aufruf von `file.seek()` wegfallen.

Letztendlich sehe ich den Sinn der Übung nicht ganz. Python ist wesentlich ausdrucksstärker und aktuelle Rechner sind leistungsstärker als die Sprache und das System für das dieses Programm offensichtlich geschrieben ist. Eine weniger umständliche Lösung würde die Daten am Programmanfang einlesen und am Programmende oder auf Wunsch abspeichern und Datensätze schon sortiert einfügen.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

kaytec hat geschrieben:wie mache ich es richtig ? Verständliche Namen ist schon klar - nur bei meinen "schöpferischen Fähigkeiten" werden die nur noch schlimmer!
An der Stelle hat jeder in gewisser Art und Weise seinen eigenen Stil
aber wie Blackjack schon sagt. Einzelne Wörter die du zu einem Variablennamen zusammenbaust sollten entweder mit einem '_' oder mit einem Großbuchstaben optisch aufgeteilt werden.

Beispiele:
neuer_eintrag
neuerEintrag (my favorite)

Ich würde dir (wie viele andere auch ;) ) einmal die PEP8
und zweitens die Codebeispiele von DiveIntoPython empfehlen.
Vorallem bei dive into Python lernst du einige Tricks und Kniffe wie man in Python
ordentlich mit den mitgelieferten Batterien arbeitet.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Zap hat geschrieben: Beispiele:
neuer_eintrag
neuerEintrag (my favorite)
Aber nicht nur PEP8 lesen sondern auch befolgen :D :
Function names should be lowercase, with words separated by underscores
as necessary to improve readability.

mixedCase is allowed only in contexts where that's already the
prevailing style (e.g. threading.py), to retain backwards compatibility.
Zuletzt geändert von EyDu am Montag 16. April 2007, 12:31, insgesamt 1-mal geändert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hm, ich hatte noch dran gedacht was dazu zu schreiben aber es dann doch vergessen ;)

Ich muss ganz ehrlich sagen das es meiner Meinung nach echt sch** aussieht alles mit Underscores zu bauen.
Spätestens wenn es mehr als 3 Einzelwörter sind.
Ich hatte mit Dive Into Python meinen Einstieg in Python gehabt und bin seit dem Anhänger der Camelcase-Syntax ;)
Beispiel zu meiner Verteidigung

Aber hast recht, man sollte meine schlechten Gewohnheiten nicht weitergeben ;)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke für die vielen Antworten !

Ich brauche diese Prgramm nicht wirklich - hatte eine Idee und wollte sie mit meinen Wissen umsetzen. Das ist noch sehr gering, doch erst alles zu lesen und dann etwas versuchen ist nicht wirklich spannend. Es gibt bestimmt tolle Fuktionen in der Standartbibliothek, doch ich kenne sie halt nicht. Was nicht bedeutet, dass ich es nicht weiter versuchen möchte. Was ist eigentlich IMHO ?

Na ok - Wie sollte ich einen Neuanfang machen ?

Gruss und Dank Frank
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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

Danke CM !

Ich vertstehe evt. ja noch die einzelnen Wörter - was es aber bedeutet ? Ich war vor 20 Jahren mal auf der Hauptschule. Ich sollte mal einen Fremdsprachkurs besuchen !

Na gut - gehe jetzt mal arbeiten.

gruss und dank frank
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

"meiner bescheidenen Meinung nach" - kann man sowohl ganz ernst wie völlig ironisch (meistens) meinen.
Geeksprache ist voll von englischen Akronymen. Ist halt so. Muß man mit leben, macht aber auch manchmal viel Spaß.

Gruß,
Christian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Zap hat geschrieben:Ich muss ganz ehrlich sagen das es meiner Meinung nach echt sch** aussieht alles mit Underscores zu bauen.
Spätestens wenn es mehr als 3 Einzelwörter sind.
Finde ich nicht, ich finde es so lesbarer. Es gibt auch C-Libs wie GTK, GLib und GOject, die nutzen Underscores - siehst du, nicht jeder mag camelCase. CamelCase wird in Python nur für Klassen benutzt und das finde ich auch so sinnvoll.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Da ja keiner mein Vorhaben so richtig verstanden hat, möchte ich es mal erklären.

Ich habe so ein Beispiel in einem Buch mittels Dictionaries gesehen und diese Programm hat Telefonnummern gespeichert. Der Name war der key und so hat das Programm die Telefonnummer gefunden. Ich wollte ein Adressbuch machen und wusste nicht wie ich die Daten für einen Eintrag an einen key hänge, damit sie gefunden werde können. So habe ich es mit dem Speichern in einer Textdatei versucht und habe den "key" durch die Zeilenlänge und den Kriterien erzeugt. So war immer klar wo was gefunden wurde und ich konnte zum Auslesen bzw.Einlesen des Eintragsblockes die ständige Berechnung der Leseposition verwenden. - ok - jeder verstanden ?

Wie macht man es richtig bzw. mit welcher Funktion oder Gedankengang etc ?

gruss und dank für die Antworten

frank
BlackJack

Rechner sind leistungsfähig genug um die Daten im RAM zu halten und falls sie nicht mehr komplett ins RAM passen sollten, ist eine Datenbank angesagt. Selbst mit `seek()` auf Byteebene eine Datei in mühsamer Kleinarbeit zu verwalten ist total überflüssig.

Das neueste Programm habe ich mir nicht mehr im Detail angeschaut, aber zumindest bei den ersten Quelltexten waren die Datensätze doch alle gleich gross. Da wäre es ein leichtes den Dateizugriff auf zwei Funktionen zu beschränken, die jeweils einen Datensatz lesen bzw. schreiben. Schon wären bis auf die beiden Funktionen die ganzen `seek()`\s und Positionsberechnungen aus dem Programm verschwunden. Und man könnte diese beiden Funktionen durch welche ersetzen, die die Daten in einer Datenbank ablegen oder einen LDAP-Server befragen ohne das sich am Rest des Programms viel ändert.

Man muss sich überlegen in welcher Form oder Datenstruktur sich die Daten am besten bearbeiten lassen. Das kann durchaus ein anderes Format sein, als dass in dem die Daten langfristig gespeichert werden.

Mit Bordmitteln ist die einfachste Art Daten zu speichern das `pickle`-Modul. Damit kann man Python-Objekte einfach auf die Festplatte speichern und von da wieder lesen. Das Format ist allerdings an die Sprache Python gebunden.

Als "austauschbares" Format für eine Adressdatei ist das simpelste wohl eine CSV-Datei. Die kann man mit dem `csv`-Modul lesen und schreiben.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Leonidas hat geschrieben:
Zap hat geschrieben:Ich muss ganz ehrlich sagen das es meiner Meinung nach echt sch** aussieht alles mit Underscores zu bauen.
Spätestens wenn es mehr als 3 Einzelwörter sind.
Finde ich nicht, ich finde es so lesbarer. Es gibt auch C-Libs wie GTK, GLib und GOject, die nutzen Underscores - siehst du, nicht jeder mag camelCase. CamelCase wird in Python nur für Klassen benutzt und das finde ich auch so sinnvoll.
mh...
Ok, vielleicht ist dann mal Zeit zum Umdenken ;)
Hoffentlich ist es dafür noch nicht zu spät :roll:
Antworten