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, 10:15

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

Mittwoch 4. April 2007, 10:35

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

Mittwoch 4. April 2007, 10:49

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

Mittwoch 4. April 2007, 10:56

Abgemacht :D
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, 11:32

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

Mittwoch 4. April 2007, 15:05

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

Montag 9. April 2007, 19:55

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

Sonntag 15. April 2007, 11:40

Habe mal so weit versucht, es richtig zu formulieren.

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

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

Sonntag 15. April 2007, 14:50

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

Sonntag 15. April 2007, 23:08

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: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 15. April 2007, 23:47

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

Montag 16. April 2007, 08:19

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

Montag 16. April 2007, 09:46

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

Montag 16. April 2007, 11:00

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

Montag 16. April 2007, 11:47

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.
Antworten