Anfänger braucht Hilfe beim Weiterkommen in einem Projekt

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.
moreeze
User
Beiträge: 6
Registriert: Freitag 21. November 2008, 00:51

Hallo zusammen!
Ich bin neu hier im Forum und genauso neu in der Welt von Python.
Ich habe ein Projekt, welches ich mir vorgenommen habe, das ich gerne verwirklichen möchte:

Ich möchte ein Shellbasiertes Telefonbuchprogramm schreiben, das reicht mir erstmal völlig, später kann es dann evtl auf Tkinter "umsteigen".

Ich selbst beschäftige mich erst seit kurzem mit Python, deswegen entschuldigt bitte wenn ich Fragen stelle, die für euch selbstverständlich sind!

Ich würde jetzt hier einfach mal meinen Code vorstellen, wie er bis jetzt ist:

Los gehts mit einem Login, dann kann man über ein Menü verschiedene Punkte auswählen, von denen ich mir erhoffe, dass sie auch funktionieren.

Hier also mein Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
def telefonbuch():
    print "Willkommen zu Ihrem Telefonbuch."
    print "Bitte loggen Sie sich ein: "
    print "Username: "
    username = raw_input()
    if username == "test":
        print "Geben Sie nun bitte ihr Passwort ein: "
        passwort = raw_input()
        if passwort == "test":
            print "Willkommen" + " " + username + "!"
            print "Was möchten Sie als nächstes tun?"
            loop = 1
            choice = 0
            while loop == 1:
                print " "
                print "Telefonbuch: "
                print " "
                print "1) Neuen Eintrag erstellen"
                print "2) Einen Eintrag bearbeiten"
                print "3) Einen Eintrag löschen"
                print " "
                print "4) Telefonbuch einsehen"
                print "5) Bestimmten Eintrag einsehen"
                print " "
                print "6) Telefonbuch beenden"
                print " "
                choice = input("Bitte wählen Sie aus: ")
                print " "
                if choice == 1:
                    print "1"
                elif choice == 2:
                    print "2"
                elif choice == 3:
                    print "3"
                elif choice == 4:
                    print "4"
                elif choice == 5:
                    print "5"
                elif choice == 6:
                    loop = 0
                    print "Auf Wiedersehen" + " " + username + "!"
    else:
        print "Dieser Nutzername existiert nicht, bitte versuchen Sie es erneut!"
        
Die Ausgaben bei den Eingaben sind nur Platzhalter für die Funktionen, die kommen sollen. Hier weiß ich allerdings nicht weiter...
Wie kann ich Eingaben speichern zB in einer Textdatei oder einer Datenbank und diese gezielt auslesen und bearbeiten, ansehen und löschen?

Vllt hat ja jemand ein paar Tipps oder evtl ein paar Links zu dem Thema, damit würdet ihr mir sehr helfen!

Über Anregungen zu meinem Code bin ich natürlich auch sehr offen!

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

Hallo Moreeze, willkommen im Forum,

Ich weiß nicht ob es nicht sinnvoller ist, wenn du dir stattdessen tel ansiehst.

In deinem Fall sehe ich allerdings eher dass Problem, dass du etwas zu wenig Planung gemacht hast und dein Programm eher, hmm, unstrukturiert hast. Du solltest dir mal Klassen ansehen, das wäre ein Paradebeispiel für deren Einsatz.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
moreeze
User
Beiträge: 6
Registriert: Freitag 21. November 2008, 00:51

Hi!

Danke für die Antwort!
Ich werde es mir anschauen, aber irgendwo möchte ich das auch selber machen. Gibt es gute Links zum Thema Klassen?
Wie sähe denn eine gute Strukturierung aus?

Gruß
Moreeze
abgdf

Versuch' doch auch zuerst, die Funktionalität in den Griff zu kriegen: Willkommensbildschirm, Passwortabfrage usw. können dann später dazukommen. Ist z.B. am Anfang so einfacher zu testen ...

Gruß
moreeze
User
Beiträge: 6
Registriert: Freitag 21. November 2008, 00:51

Also so wie ich das jetzt verstanden habe müsste ich eine Klasse pro Funktion erstellen und diese dann verbinden...
So ganz verstanden wie ich diese definiere hab ich noch nicht...hat jemand einen guten Link dazu?

Stimmt, den ganzen Quatsch am Anfang mach ich weg :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

moreeze hat geschrieben:Also so wie ich das jetzt verstanden habe müsste ich eine Klasse pro Funktion erstellen und diese dann verbinden...
Nein. Eine Klasse wäre etwas real existierendes. Also etwa ein Telefonbucheintrag. Guck doch mal, wie tel das mit den Klassen macht - auch wenn du vielleicht mit dem restlichen Code noch nicht so viel anfangen kannst - die Klassenstruktur wird wohl in Ordnung sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Bezüglich Datenspeicherung: http://www.python-forum.de/topic-6157.html
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich denke nicht, dass man sofort mit Klassen beginnen muss. OOP wird erfahrungsgemäß nie auf Anhieb auch nur ausreichend verstanden und bringt so zusätzliche Hürden für Anfänger mit, die dann in *richtig* verkorkstem Code enden.

Als jemand, für den Refactoring eine Art Kreuzzug ist (;))), empfehle ich, zunächst das Programm mit den einfachsten, bekannten Mitteln zum Laufen zu bringen. Das kann von mir aus auch alles imperativ sein.

Nach und nach eignet man sich dann weitere Techniken an (Schleifen, Funktionen, Klassen, Hilfsmodule aus der Standardbibliothek u.s.w.) und wendet diese dann auf den Code an. Erst dann wird - wenn richtig angewendet - deren Macht und Vorteil deutlich, da der Code deutlich mächtiger, kompakter, flexibler und wartbarer werden kann. Auch mag man dann leichter erkennen, was für ein Problem bzw. Umstände man bisher hatte und es wird leichter ersichtlich, dass z. B. eine Klasse diese(s) gut lösen kann.

Später, wenn man intensiv mit OOP gearbeitet hat, wird man von selbst daran gehen, zumindest einen guten Teil von Beginn an in Klassen zu modellieren - sofern die Anforderungen dann entsprechend bekannt sind.
BlackJack

Ich denke man sollte recht früh mit Klassen als Verbund von (Daten)Attributen beginnen, also noch kein OOP, sondern als Gegenstück zu `struct` in C oder `RECORD` in Pascal. Ansonsten werden Programme schnell unübersichtlich und schwer zu durchschauen, wenn man immer tiefer verschachtelte Tupel, Listen, und Dictionaries verwendet und mit Indexen statt mit aussagekräftigen Namen hantiert.

Nachtrag: Vielleicht ist dieser Text eventuell interessant: http://www.marc.rintsch.de/simpledb/simpledb.html

Der ist letztes Jahr mal zu einer ähnlichen Diskussion entstanden (DB für Anfänger ohne Klassen) und ich suchte einen Grund `pylit` mal aus zu probieren. :-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Nunja, die essentiellen Datentypen Liste und Mapping/Hash/`dict` sollte man kennen. Von da an ist's dann zu einer Klasse nicht mehr weit - aber das kann man dann ja jemandem vorschlagen, der mit vierdimensionalen dicts und potentiell als Methoden tauglichen Funktionen hier nach Hilfe fragt ;)

Andernfalls kann es sein, dass Klassen - vermutlich insbesondere von PHP-Geschädigten - einfach als Namespace angesehen und missbraucht werden.

Das Ganze getreu dem Motto: Manche Probleme muss man erstmal haben, bevor man die Lösungsansätze dafür versteht.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

ich werde dem naechst - sobald ich zeit dazu habe - mal ein kleines beispiel-telefonbuch posten und hoffen, dass es etwas weiterhilft.

lg
roschi

[edit]
@moreeze:
hast du eigendlich schonmal das hier durchgearbeitet?
oder, hierauch in deutsch
[/edit]
Zuletzt geändert von roschi am Freitag 21. November 2008, 21:13, insgesamt 2-mal geändert.
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Leonidas hat geschrieben:
moreeze hat geschrieben:Also so wie ich das jetzt verstanden habe müsste ich eine Klasse pro Funktion erstellen und diese dann verbinden...
Nein. Eine Klasse wäre etwas real existierendes. Also etwa ein Telefonbucheintrag.
Sag das mal den Java Leuten.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

veers hat geschrieben:
Leonidas hat geschrieben:
moreeze hat geschrieben:Also so wie ich das jetzt verstanden habe müsste ich eine Klasse pro Funktion erstellen und diese dann verbinden...
Nein. Eine Klasse wäre etwas real existierendes. Also etwa ein Telefonbucheintrag.
Sag das mal den Java Leuten.
Natürlich. Java biegt es wieder in die andere Richtung um, so dass es eher im Weg steht als dass es hilft. "Zu viel ist ungesund" gilt auch für OOP. Es ist nicht ganz einfach den richtigen Mittelweg zu finden. Tendentiell würde ich aber sagen, dass zu viele Funktionen weniger schaden als zu viel OOP. Das ist auch eine dieser Sachen, die ich in Java eher ungelungen finde.

Und hey, die Java-Leute können ja auf Scala wechseln, dann hätten sie wenigstens Type Inference (die Auflistung der Programmiersprachen im ersten Absatz listet so ziemlich die statisch typisierten Sprachen ab, die einigermaßen brauchbar sind. Java ist nicht dabei, C# schon) ;) Ohh Sun, mach dass es besser wird!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Javas Problem ist IMHO, dass es nicht objektorientiert genug ist. Daher schmerzt jeder Übergang von primitiven Datentypen zu Objekten oder jeder Gebrauch von statischen Funktionen. Scala ist da besser. JavaScript oder natürlich Smalltalk oder Self ebenfalls.

Nachteil der geforderten Typinferenz sind z.B. "unbegreifliche" Fehlermeldungen und die Notwendigkeit für ein deutlich mächtiges Typsystem als es Java zur Zeit hat, was wiederum zu "unbegreiflichen" Methodendefinitionen mit Co- und Contavarianzdeklarationen führt.

Cecil ist übrigens ein typisiertes Self mit einer Prise CommonLisp. Sprachbeschreibung hat so 100 Seiten oder so, 20 beschreiben die Sprache, der Rest ist das Typsystem.

Gibt es eigentlich Versuche, Python-Code statisch zu typisieren?

Stefan
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Jap, RPython.
BlackJack

Ich weiss nicht ob das als ernsthafte Versuche zählt, aber bei "statisch typisiertem Python" fallen mir RPython (von PyPy), Cython, und ShedSkin ein. Vielleicht noch Boo als "ähnliche" Sprache.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

RPython ist irgendein (nicht außerhalb des eigentlichen Übersetzers spezifiziertes, so wie ich das sehe) Subset und Snapshot von einem ausgeführten Python-Programm. Das ist wahrscheinlich nicht, was ich mir vorstelle. Auch hier wird ja das Programm erstmal beliebig ausgeführt und dann erst ein Stand im Hauptspeicher übersetzt. Das ist einerseits nett, weil man so Metaprogrammierung machen kann, aber es hilft nicht, Programme zu typisieren und statisch auf irgendeine Form von Korrektheit zu prüfen. Ich hätte eher an etwas wie Typed Scheme und ähnliche Ansätze gedacht.

Stefan
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

so, da isses!
und hier ist noch etwas, was man zur ausfuehrung braucht.

ich hoffe, das regt ein bisschen an, und ist nicht gar so grausam geschrieben...

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

roschi hat geschrieben:so, da isses!
Naja, es hält sich nicht an PEP8, die ``exit()``-Funktion scheint mir irgendwie arg sinnlos zu sein, ``os.system`` wäre durch ``subprocess.call`` zu ersetzen (wobei ich das clearen irgendwie generell unpraktisch finde). Statt "blank" würde man eher "empty" schreiben, was "choosed" ist, ist mir hingegen völlig unklar. Die Suche ist auch eher seltsam: reguläre ausdrücke escapen und dann den Stern unescapen. Der Stern funktioniert so wie es ist wohl auch nicht wie du dir das bei ``glob`` vorstellst. Warum wohl die ``main()`` auf den ``if __name__..`` und ``main()`` verteilt ist?

Naja, für eine Inspiration reicht es wohl.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

hallo!

@Leonidas:
- Naja, es hält sich nicht an PEP8.
FIXED

- die ``exit()``-Funktion scheint mir irgendwie arg sinnlos zu sein.
die braucht es wegen dem menue-kram

- ``os.system`` wäre durch ``subprocess.call`` zu ersetzen.
Traceback (most recent call last):
File "C:\projects\tel\tel.py", line 194, in <module>
main()
File "C:\projects\tel\tel.py", line 186, in main
clear()
File "C:\projects\tel\tel.py", line 16, in clear
subprocess.call("cls")
File "C:\Python25\lib\subprocess.py", line 444, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python25\lib\subprocess.py", line 594, in __init__
errread, errwrite)
File "C:\Python25\lib\subprocess.py", line 816, in _execute_child
startupinfo)
WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden
- (wobei ich das clearen irgendwie generell unpraktisch finde)
NAJA - das ist ansichtssache, aber gut:

- Statt "blank" würde man eher "empty" schreiben.
DANKE

- was "choosed" ist, ist mir hingegen völlig unklar.
die stelle des menueeintrages in der menue-liste, der gewaehlt wurde.

Die Suche ist auch eher seltsam: reguläre ausdrücke escapen und dann den Stern unescapen. Der Stern funktioniert so wie es ist wohl auch nicht wie du dir das bei ``glob`` vorstellst.
FIXED - daran habe ich beim schreiben mitten in der nacht wohl nicht gedacht :(

Warum wohl die ``main()`` auf den ``if __name__..`` und ``main()`` verteilt ist?
FIXED

- Naja, für eine Inspiration reicht es wohl.
DANK DIR :D!

VIELEN DANK FUER DIE TIPPS!

hier ist nun das neue, verbesserte telefonbuch.

lg
roschi
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
Antworten