Problem

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.
Antworten
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Hallo Python-Forum!
Mir war gerade danach mal wieder, weil ich die Projektideenseite gesehen habe, ein Adressbuch ohne Benutzeroberfläche zu machen. Ich werde den Code weiter unten Posten, aber:
ich habe das mit der Datenverwaltung ein bisschen aufgeschoben und habe jetzt das Problem, das ich das letzte mal hatte, als ich ein Adressbuch schreiben wollte, dass ich Namen für Listen generieren möchte(automatisches weiterzählen), aber ich weiß nicht wie ich aus folgendem einen Namen mache:
id=ist dieser Zähler
"Vorname"+"_"+"Nachname"+id
==> ??

Wie gesagt, ich bin gerade erst mittendrin: pickle kommt noch dazu! Da sind 2 Typen schon dabei, als Beispiel der Struktur

Code: Alles auswählen

# -*- coding: cp1252 -*-
#Adressliste
#Vorname Nachname Wohnort Postleitzahl Straße Hausnummer Telefonnummer
Muster_Peter=["Muster", "Peter","Baldham", 85598, "Weg", "1", "39989"]
Garet_Meret=["Garet", "Meret", "Baldham", 85598, "Weg", "2", "856887"]
BUCH=[Garet_Meret, Alois_Pollithy]
global counter
counter=2
global id
id=1

FEHLER="~~~ FEHLERHAFTE EINGABE ~~~"

class Adressbuch(object):
    BUCH.sort()
    print "--"*20
    print "|", """  """*18, "|"
    print "  DAS ADRESSBUCH"
    print "--"*20

    def eingabe(self):
        print "--"*20
        print "[a]uflisten | [b]earbeiten | a[n]legen | [q]uit"
        print "--"*20
        eingabe=raw_input("--[")
        if eingabe=="a":
            self.auflisten()
            return
        if eingabe=="b":
            self.bearbeiten()
            return
        if eingabe=="n":
            self.anlegen()
            return
        if eingabe=="q":
            self.quit()
            return
        if (eingabe <> "a") or (eingabe <> "b") or (eingabe <> "n") or (eingabe <> "q"):
            print "~~~ FEHLERHAFTE EINGABE ~~~"
            self.eingabe()

    def auflisten(self):
        eingabe=0
        print "--"*20
        print "Das Adressbuch umfasst %s Einträge." % (count)
        print "--"*20
        print "[A]lle Einträge | [P]ostleitzahl | [N]ame | [W]ohnort |"
        print "[S]traße || [z]urück"
        eingabe=raw_input("--[")
        if eingabe=="A":
            print "Alle Einträge"
            for Vorname, Nachname, Ort, Plz, Strasse, Nummer, Tel in BUCH:
                print "--"*20
                print Vorname, Nachname, """              """, Ort, Plz
                print Strasse, Nummer
                print Tel
                print "--"*20
                
            self.eingabe()
            return
        if eingabe=="P":
            print "nach Postleitzahl sortieren"
            print "--"*20
            print "Postleitzahl eingeben:"
            eingabe=0
            eingabe=input("--[")
            c=0
            for Vorname, Nachname, Ort, Plz, Strasse, Nummer, Tel in BUCH:
                if Plz==eingabe:
                    print "--"*20
                    print Vorname, Nachname, """          """, Ort, Plz
                    print Strasse, Nummer
                    print Tel
                    print "--"*20
                    c += 1
            print "Meldung: %s Treffer auf %s!  =statistic=> %s %s" % (c, eingabe, c/counter*100, "%")
            eingabe=0

            print "--"*20
            self.eingabe()
            return
        
        if eingabe=="N":
            print "nach Name sortieren"
            print "--"*20
            print "Vor- oder Nachname hier eingeben:"
            eingabe=0
            eingabe=raw_input("--[")
            c=0
            for Vorname, Nachname, Ort, Plz, Strasse, Nummer, Tel in BUCH:                
                if (Vorname==eingabe) or (Nachname==eingabe):
                    print "--"*20
                    print Vorname, Nachname, """          """, Ort, Plz
                    print Strasse, Nummer
                    print Tel
                    print "--"*20
                    c += 1
            print "Meldung: %s Treffer auf %s!  =statistic=> %s %s" % (c, eingabe, c/counter*100, "%")
            eingabe=0

            print "--"*20
            self.eingabe()
            return
        if eingabe=="W":
            print "nach Wohnort sortieren"
            print "--"*20
            print "Wohnort hier eingeben:"
            eingabe=0
            eingabe=raw_input("--[")
            c=0
            for Vorname, Nachname, Ort, Plz, Strasse, Nummer, Tel in BUCH:
                if (Ort==eingabe) or (Plz==eingabe):
                    print "--"*20
                    print Vorname, Nachname, """          """, Ort, Plz
                    print Strasse, Nummer
                    print Tel
                    print "--"*20
                    c += 1
            print "Meldung: %s Treffer auf %s!  =statistic=> %s %s" % (c, eingabe, c/counter*100, "%")
            eingabe=0

            print "--"*20
            self.eingabe()
            return
        if eingabe=="S":
            print "nach Straßenamen sortieren"
            print "--"*20
            print "Straßenname hier eingeben:"
            eingabe=0
            eingabe=raw_input("--[")
            c=0
            for Vorname, Nachname, Ort, Plz, Strasse, Nummer, Tel in BUCH:
                if (Strasse==eingabe) or (Nummer==eingabe):
                    print "--"*20
                    print Vorname, Nachname, """          """, Ort, Plz
                    print Strasse, Nummer
                    print Tel
                    print "--"*20
                    c += 1
            print "Meldung: %s Treffer auf %s!  =statistic=> %s %s" % (c, eingabe, c/counter*100, "%")
            eingabe=0

            print "--"*20
            self.eingabe()
            return
        if eingabe=="z":
            self.eingabe()
            return
        if (eingabe <> "A") or (eingabe <> "P") or (eingabe <> "N") or (eingabe <> "W") or (eingabe <> "S") or (eingabe <> "z"):
            print "~~~ FEHLERHAFTE EINGABE ~~~"
            self.auflisten()


    def bearbeiten(self):
        eingabe=0
        print "Vorname der Person eingeben"
        eingabe=raw_input("--[")
        print "Nachname der Person eingaben"
        eingabe2=raw_input("--[")
        Zusammensetzung=eingabe+"_"+eingabe2
        ZS=Zusammensetzung
        print "--"*20
        eingabe=0
        eingabe2=0
        try:
            for i in ZS:
                print i
            print "Bearbeitung beginnt nach [enter]"
            raw_input("")
            self.BEARB(ZS)
        except:
            print "Inkorrekte Eingaben: %s existiert nicht!" % (ZS)

    def anlegen_weiter(self):
        print "Sie legen einen neuen Eintrag an."
        print "--"*20
        Vorname=raw_input("Vorname:")
        Nachname=raw_input("Nachname:")
        Wohnort=raw_input("Wohnort:")
        Postleitzahl=raw_input("Postleitzahl:")
        Strasse=raw_input("Straße:")
        Hausnummer=raw_input("Hausnummer:")
        Telefonnummer=raw_input("Telefonnummer:")
        print "--"*20
        BUCH.insert(0, Vorname)
        BUCH.insert(0, Nachname)
        BUCH.insert(0, Wohnort)
        BUCH.insert(0, Postleitzahl)
        BUCH.insert(0, Strasse)
        BUCH.insert(0, Hausnummer)
        BUCH.insert(0, Telefonnummer)

        #
        #  hier will ich den Namen erstellen und ihm alle Werte von oben zuordnen
        #  und dann BUCH zuordnen
        
        
        print "Eintrag gespeichert."
        

    def anlegen(self):
        print "Neuen Eintrag anlegen."
        print "[m]enü | [w]eiter"
        eingabe=0
        eingabe=raw_input("--[")
        if eingabe=="m":
            self.eingabe()
        if eingabe=="w":
            self.anlegen_weiter()
            return
        if (eingabe != "m") or (eingabe <> "w"):
            print FEHLER
            self.anlegen()
            
            
            
        
        
        

A=Adressbuch()
A.eingabe()
mfg Daniel
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Du willst keine Variablennamen während der Laufzeit generieren, das wird garantiert Murks.

Nimm doch ein Dictionary als Datenstruktur und die Namen als Schlüssel.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Verschieb deinen Code bitte nach -> http://paste.pocoo.org/
Denn es ist nahezu unmöglich darauf zu antworten.

Wie Panke schon sagte, ist das was du vorhast Unsinn.

Noch ein paar andere Sachen:

- Wenn du schon das Adressbuch als Klasse zusammenstöpselst, dann doch erst recht die Einträge. So musst du auch nicht mit einer Liste arbeiten, die unbedingt Kommentare braucht (wobei auch hier ein Dictionary eine Lösung wäre, aber ein Eintrag ist zweifellos ein Objekt -> editieren, anlegen, usw)

- `<>' als Test auf Ungleichheit ist deprecated. Benutze `!='
- Lies dir mal PEP 8 durch ;) [wiki]PEP 8 (?ersetzung)[/wiki]
- Benutze für die Datenpersistenz doch besser eine Datenbank (oder doch zumindest `shelf')
- Wenn du global benutzen musst, hast du meistens ein tiefer greifendes Designproblem. In dem Fall würden auch Instanzvariablen der Klasse genügen (wenn ich das richtig überflogen hab)
- Ich komme nich umhin, dich drauf hinzuweisen, dass deine Adressbuchklasse eigentlich nur eine Sammlung von Funktionen ist ;)

- Deine if - Kaskade ist besser durch if - elif - else ausgedrückt, oder noch besser: du schreibst Funktionen für die einzelnen Schritte und benutzt ein Dictionary als switch.

Sooo .. erste Anmerkungen ;)

Btw `%%' beschert dir ein `%' in einem String ;)
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Toller titel
mal die rules lesen und dann auch ein tutorial
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Der einzige Regelverstoß von Danipol ist der wenig aussagekräftige Titel. Da kann man beim ersten Beitrag ruhig mal drüber hinwegsehen oder per PN darauf hinweisen.
Dass Danipol kein Tutorium je gelesen hat, halte ich auch für zweifelhaft, seine Frage wird im Offiziellen m.W. jedenfalls nicht direkt beantwortet.

Von einem Nutzer mit > 300 Beiträgen erwarte ich allerdings schon, dass er die Regeln hält - insbesondere wenn er selbst darauf hinweist. Da steht nämlich zum Beispiel etwas von Netiquette, Satzzeichen und Rechtschreibung. Also: Das nächste mal per PN oder direkt ganz sparen.

Danipol: Lass dir nicht ans Bein pinkeln von den Rüpeln.
Zuletzt geändert von Panke am Montag 2. Februar 2009, 10:27, insgesamt 1-mal geändert.
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Hallo!
Ist '!=' nicht das gleiche wie '<>'?
Entschuldigung, wenn ich gegen irgendwelche Regeln verstoße.
Was ist 'elif'?
Wieso soll ich denn keine Klasse verwenden? Ich habe immer gelesen, dass das die schönere Form wäre.
Wie heißt denn der Befehl, um in einem Dict einen Eintrag zu ergänzen?
Was ist shelf(sowas wie ein Dict ohne Bezug?)
Den counter und die id braucht es ja auch nicht. Das sollte nur irgendein Ansatz sein.
==> Man kann keine Namen für Variablen generieren?

Danipol
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Danipol hat geschrieben:Ist '!=' nicht das gleiche wie '<>'?
Nein, es tut zwar dass selbe letzteres ist allerdings deprecated.
Was ist 'elif'?

Code: Alles auswählen

if <condition>:
    pass
elif <condition>:
    pass
else:
    pass
Bei dieser Abfrage wird der erste Block ausgeführt bei dem die condition True ist.
Wieso soll ich denn keine Klasse verwenden? Ich habe immer gelesen, dass das die schönere Form wäre.
Klassen sind nicht schön oder hässlich sie sind ein Werkzeug. Ob man sie einsetzt oder nicht hängt vom Problem ab, keiner sägt Bretter mit einem Hammer.
Wie heißt denn der Befehl, um in einem Dict einen Eintrag zu ergänzen?

Code: Alles auswählen

d = {}
d['foo'] = 'bar'
Was ist shelf(sowas wie ein Dict ohne Bezug?)
shelf gibt es nicht, ich vermute mal dass damit shelve gemeint ist.
Den counter und die id braucht es ja auch nicht. Das sollte nur irgendein Ansatz sein.
==> Man kann keine Namen für Variablen generieren?
Es gibt keine Variablen in Python. Das was du meinst geht schon ist aber böse und führt zu einem Haufen weiterer Probleme die nicht in den Griff zu bekommen sind. Man nimmt für soetwas Tuple, Listen oder Dictionarys.
Zuletzt geändert von DasIch am Montag 2. Februar 2009, 14:52, insgesamt 1-mal geändert.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ist '!=' nicht das gleiche wie '<>'?
Ja, aber <> wird in Python 3 entfernt, ist also seit einigen Python Versionen "deprecated". Deswegen solltest du != benutzen.
Was ist 'elif'?
else if. Wenn du bei einer if Anweisung statt else elif <bedingung> schreibst, wird diese überprüft, wenn die ursprüngliche if Bedingung sich als False erweist. Erst danach "else".
Wieso soll ich denn keine Klasse verwenden? Ich habe immer gelesen, dass das die schönere Form wäre.
Weil Klassen existieren, um Objekte zu entwerfen, nicht Funktionen. Siehe das Tutorial, auf das ich gleich verweise. Die Methode eines Objektes manipuliert das Objekt, und das Objekt trägt Daten. Du allerdings benutzt die Methoden wie Funktionen.
Wie heißt denn der Befehl, um in einem Dict einen Eintrag zu ergänzen?

Code: Alles auswählen

dictionary[key] = value
(oder dictionary.__setitem__, aber das brauchst du dir nicht zu merken, wenn dir das nicht sofort etwas sagt)
Was ist shelf(sowas wie ein Dict ohne Bezug?)
Eine Art, ein Dictionary ähnliches Objekt in eine Datei zu schreiben.

Code: Alles auswählen

import shelve
help(shelve)
==> Man kann keine Namen für Variablen generieren?
Du wirst keine Namen für Variablen brauchen. Man stopft ein Objekt nicht mit Einträgen voll, indem man einfach Namen (Attribute) auf ihnen definiert. Benutz doch eine List oder ein Dictionary, für sowas sind sie gedacht. Faustregel: Ähnliche Daten (also zb Einträge, sind ja ähnlich) werden immer in einer grundlegenden Datenstruktur abgelegt, niemals einzeln als Namen.

http://docs.python.org/tutorial/index.html
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Danke.

Ihr habt mir ganz schön geholfen! Das Problem hatte ich schon öfter.
Ich dachte, dass ein Wert in einem Dict nur einen einzigen Gegenwert hat, aber mit ner Liste...

Wie soll ich denn sonst meinen Code ordnen, wenn nicht mit Klassen?

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

Danipol hat geschrieben:Wie soll ich denn sonst meinen Code ordnen, wenn nicht mit Klassen?
Mit Funktionen.
Danipol
User
Beiträge: 38
Registriert: Sonntag 1. Februar 2009, 21:08

Ver der Vorteil, wenn ich meine Funktionen in Klassen schreibe, ist, dass ich die 'self.'-Werte verwenden kann.

Nja, danke nochmal.
Ich glaub das "Problem" hat sich gelöst.

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

Danipol hat geschrieben:Ver der Vorteil, wenn ich meine Funktionen in Klassen schreibe, ist, dass ich die 'self.'-Werte verwenden kann.
Der Nachteil ist, dass du Klassenbasierte Programmierung hast und nicht Objektorientierte Programmierung betreibst. Klassen sind eigentlich für letzteres gedacht.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Danipol hat geschrieben:Ver der Vorteil, wenn ich meine Funktionen in Klassen schreibe, ist, dass ich die 'self.'-Werte verwenden kann.

Nja, danke nochmal.
Ich glaub das "Problem" hat sich gelöst.

Danipol
Und wieder ein zufriedener ForenNeuling.!
Antworten