erstes Banksystem-Programm

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
secretwz
User
Beiträge: 40
Registriert: Mittwoch 14. Januar 2009, 22:01

erstes Banksystem-Programm

Beitragvon secretwz » Mittwoch 14. Januar 2009, 22:14

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

also dort habe ich mal n programm gepastet.. ich wollte mal fragen was echte profis dazu meinen ;) es ist nur ein übungsprojekt also nur als fun zum üben... ich bin ansich noch totaler anfänger und hab mir das zeugs überall zusamm gesucht aber letzendlich mit viel viel mühe selbst gemacht bis es so funktionierte wie es jetz funktioniert ;)
zero-one
User
Beiträge: 58
Registriert: Dienstag 20. Mai 2008, 20:52

Beitragvon zero-one » Mittwoch 14. Januar 2009, 22:26

boah... wir predigen dir stundenlang im IRC wie du's richtig machen sollst... und nu Postest du deinen (den gleichen) Code hier...

Wieso fragst du denn nach Meinungen wenn du die Sachen die man dir sagt sowieso nicht umsetzt...

gruesse
zero-one aka. sulo im IRC
secretwz
User
Beiträge: 40
Registriert: Mittwoch 14. Januar 2009, 22:01

Beitragvon secretwz » Mittwoch 14. Januar 2009, 22:32

ja klar ^^
ich wollt es ja erstmal nur so erstelln... was ich später noch veränder is ja egal aber ich will nich gleich alles auf einmal sondern schön nacheinander!
und ich wollte hier tipps was ich verbessern kann wenn was nich richtig funktioniert.. und nicht das mir gepredigt wird was ich noch alles zu lernen hab un das ich nix über python sql datenbanken und englisch weiß ;)
das geht halt nicht alles aufeinmal das müsstest du eigentlich wissen! und das ist nur ein übungsobjekt oder ist das üben etwa verboten?
es ist ja nett von euch das ihr mir geholfen habt aber trotzdem musst du doch nich beleidigt sein wenn ich es nicht genau so mache.. ich hab niemanden gezwungen das er mir irgendwas sagt..

und ausserdem ist der code bereits verändert worden :P
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Mittwoch 14. Januar 2009, 22:35

Du hast eine miese Mischung aus deutschen Namen, englischen Namen und komplett stummen Namen (c, p - da geht einem echt das Herz auf oO).

Wie wärs das in eine Klasse zu packen und die URI zur Datenbank als Parameter zu übergeben?

Da gibts aber noch jede menge andere Grausamkeiten, aber nachdem zero-one wohl schon helfen wollte und ignoriert wurde hab ich da keine rechte Lust tiefer zu graben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Mittwoch 14. Januar 2009, 22:48

Was soll es tun? ;-)

Wie ich das sehe, soll das wohl eine Art "Kontoklasse" mit persistenter Speicherung sein? Da frage ich mich spontan: Wieso nicht wirklich eine Klasse für ein Konto?

create() und watch() würd eich in create_konto() und show_konto() umbenennen. Alles zu printen, anstatt eine Liste mit Objekten (oder eben anderen Datentypen mit den Daten drin) zurückzugegeben macht es als "Library" irgend wie ziemlich unnütz.

Wieso verschiedene update-Funktionen? Auch hier wäre eine Klasse besser, die sich selbst drum kümmert, wann sich Daten geändert haben und diese dann in die DB schreibt. Und wenn schon ohne, dann würde ich dennoch nur eine Funktion schreiben, die alle Daten eines Kunden übergeben bekommt und dann einfach das update durchführt.

Generell ist da zu wenig kommentiert, DocStrings wurden gar nicht benutzt! Ohne diese ist ein Modul aber komplett unbrauchbar und kann quasi nicht wirklich beutzt werden, da man nicht nachgucken kann, was z.B. eine Funktion genau macht.

Deine Queries sind teilweise nicht gegen SQL-Injection geschützt!
[wiki]Parametrisierte SQL-Queries[/wiki]?highlight=(sql)

Die Spielerei mit der ID in delete() finde ich auf den ersten schnellen Blick gewagt! Überlass das lieber der DB, eine numerische ID zu vergeben. Wozu gibt es auto_increment? Vermutlich hast Du da bei DBs noch keine Ahnung. Zumindest sieht es in create() sehr abenteuerlich aus, wie Du die höchste ID rausfindest! Wie gesagt, das kann man getrost der DB überlassen!

Willst Du wirklich Code auf Modulebene ausführen lassen? Wieso ist der Pfad zur DB hart codiert? Packe das Initialisieren besser in eine Funktion mit dem Pfad als Parameter!

Code: Alles auswählen

if nr == None:

So was ist unschön und unnötig!

Code: Alles auswählen

if not nr:
    pass


Code: Alles auswählen

    for p in c.execute("select Max(id) from person"):
        nr = p[0]

Dafür gibt es fetchone() (Aber wie schon mehrfach erwähnt: Nutze auto_increment!)

Im folgenden else-Zweig ist redundanter Code! Diese Abfrage hattest Du doch schon in Zeile 17 und 18 gemacht!

Code: Alles auswählen

        data =[(nr, name, kontonummer, kontostand)]
        for t in data:
            c.execute("INSERT INTO person VALUES (?, ?, ?, ?)", t)

Wozu dieses komplexe data-Konstrukt? ich meine du erstellst für genau ein Element eine Liste! (Wozu?) Da rein packst Du ein Tupel aus bekannten Variablen! (Wozu?)
So geht's doch auch:

Code: Alles auswählen

c.execute("INSERT INTO person VALUES (?, ?, ?, ?)", (nr, name, kontonummer, kontostand))


Die watch() Funktion ist ein komplettes Desaster! Wozu diese ganzen Tests? Hast Du mal eine query abgesetzt, die nach einem Eintrag mit einer bestimmten ID sucht, die nicht existiert? Wenn nein, versuche es einfach mal ;-)
Sollte kein eintrag dabei sein, so kann man entweder ein None zurückliefern oder eine exception werfen!

So, das auf den ersten Blick.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Beitragvon Dauerbaustelle » Donnerstag 15. Januar 2009, 00:35

`== True` ist Schwachsinn, weil eine IF-Abfrage überprüft, ob eine Bedinung `True` ist.

Code: Alles auswählen

foo == bar

ergibt `True` falls ja und `False` falls die Bedingung nicht stimmt.

Code: Alles auswählen

(foo == bar) == True

ergibt `True` fals ja und `False` falls die Bedingung nicht stimmt und überprüft dann, ob das Ergebnis `True` ist.
Das ergibt bei `True` `True` (genau, wahr ist wahr!) und bei `False` `False` (genau, falsch ist falsch!).

Kurze Rede, langer Sinn.. äh, wie war das nochmal?
`== True` kannst du dir AUSNAHMSLOS sparen.
secretwz
User
Beiträge: 40
Registriert: Mittwoch 14. Januar 2009, 22:01

Beitragvon secretwz » Donnerstag 15. Januar 2009, 16:16

vielen dank für eure kommentare =)

erstmal zu cofi:
ja stimmt das mit dem namen habe ich nicht richtig geordnet das sollte ich mir wohl nich so angewöhn aber ich hab nur um zu testen irgendwelche namen eingegeben und die hab ich dann so gelassen...
und mit klassen sollte ich mich wohl wirklich noch näher befassen danke =)
zero-one hat mir allerdings nicht geholfen und ich habe von vielen leuten hilfe und tipps angenommen sonst wäre alleine das skript garnich entstanden... auch das ich das sqlite3 modul nehmen soll habe ich angenommen.. das was er sagt ist einfach nicht wahr.. von manchen im irc bekam ich einfach massig dokumentationen von python zugesandt und das ist nich das was mir geholfen hat.. auch wenn es das vllt hätte hätte ich mir massig bücher zu python durchgelesen aber das war nicht mein ziel. und wenn im python-irc 200 leute drin sind und keiner was sagt und wenn man dann nicht mal was fragen kann selbst wenn es alle 10min ist dann finde ich den sinn von dem channel nich gerade sinnvoll ;)
ich nehme gerne ratschläge an und will mich damit verbessern aber das dauert halt auch ein wenig..

@Hyperion
Danke für deinen langen beitrag ;) also ansich kam mir die idee von dem openbook von galileo wo sie ein einfaches "banksystem" erstellt haben mit überweisung auszahlng etc... ich habe das auch ausprobiert allerdings fand ich es doof das wenn man jedes mal wieder das script neu ausführte alles wieder weg war. und somit wollte ich das irgendwie in eine datei speichern.. ich habe tausend sachen versucht bis mir dann vorgeschlagen wurde sqlite3 zu verwenden.
es ist halt das erste was ich wirklich selbst gemacht hab und habe halt auch noch nicht die erfahrung von daher ist es vllt sehr kompliziert und grausam ;)
ich werde aber mal ein bisschen zu deinen kommentaren recherchieren und mal sehn was sich so machen lässt ;)
und das mit der ID ist wirklich ein wenig spontan gewesn xD von daher muss ich mal schaun was ich da verändern kann! danke aufjedenfall!

@Dauerbaustelle
Danke =) wieder was dazu gelernt.. an der stelle habe ich auch alle möglichen sachen ausprobiert ich wusste einfach nicht wie man überprüft ob eine .dat leer ist oder schon etwas enthällt.. aber dass des letzendlich schwachsinn is ;)


achso und was ich noch sagen wollte.. ich habe einige python tuts und bücher angefang... ich wollte aber irgendwann auch mal aktiv werden und nich nur sowas monatelang lesen.. da verlier ich die motivation und so hab ich mir vorgenomm ein programm zu schreiben und dann anhand diesem programm sich sachen zusamm zu suchen zu fragen was man verbessern kann und auch fragen wie etwas funktioniert und auch halt sachen zu dem thema zu lesen... sowas ist für mich einfach nicht so motivationstötend ;) wie habt ihr es denn gelernt? und was denkt ihr wie man es am besten lernt?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Beitragvon helduel » Donnerstag 15. Januar 2009, 17:08

Hyperion hat geschrieben:

Code: Alles auswählen

if nr == None:

So was ist unschön und unnötig!

Code: Alles auswählen

if not nr:
    pass

Würde ich hier nicht machen. nr kann durchaus 0 sein. Also eher

Code: Alles auswählen

if nr is None:


Gruß,
Manuel
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 15. Januar 2009, 17:18

secretwz hat geschrieben:wie habt ihr es denn gelernt? und was denkt ihr wie man es am besten lernt?


Der interaktive Modus des Python-Interpreters ist eine wahre Perle - das kann man gar nicht hoch genug schätzen.

Ein sinnvoller Weg: Tutorial durcharbeiten, die dort aufgeführten Beispiele (vielleicht nicht unbedingt alle) selbst ausprobieren, einzelne Elemente verändern, sich ansehen, was passiert und aus der Analyse lernen. Das ist sehr effektiv und nicht langweilig.

IMHO ist es nicht unbedingt der richtige Weg, zu einem (zu) frühen Zeitpunkt ein zu großes Programm auf die Beine stellen zu wollen. Das findet man gelegentlich hier im Forum, meist mit der Begründung, dass man ein Ziel bräuchte. Oft ist dann aber der Code entsprechend grausam, weil es einfach noch zu viele Dinge sind, die nicht richtig verstanden wurden. Das hat dann wiederum oft zur Folge, dass der Code von denen, die es schon vernünftig können, ordentlich zerpflückt wird, und zwar nicht selten in einem Maße, das sich erheblich kontraproduktiv auf die Motivation auswirkt ...

Ich würde auch empfehlen, zunächst mal rein imperativ/prozedural ohne eigene Klassenentwürfe heran zu gehen (es sei denn, du bist schon mit OOP durch eine andere Sprache vertraut). Das ist einer der vielen Vorteile von Python, dass man da nicht gezwungen ist, mit Klassen zu arbeiten.
secretwz
User
Beiträge: 40
Registriert: Mittwoch 14. Januar 2009, 22:01

Beitragvon secretwz » Donnerstag 15. Januar 2009, 18:16

@numerix
stimmt wenn du das so schreibst klingt das einleuchtend^^ und sicherlich ist die reaktion von den leuten im irc auch gerechtfertigt..
ich denke ich habe wirklich noch zu wenig erfahrung und so ganz sinnvoll ist der weg wirklich nicht..
tutorial durcharbeiten klingt da natürlich viel einleuchtender. allerdings habe ich da das problem dass ich dies schon oft genug versucht habe.. bzw nicht versucht sondern eher nach solch tuts gesucht habe und nciht fündig geworden bin. Tuts wo programme erstellt werden und die jeweiligen dinge erkl#ärt werden. vielleicht kennt ihr ja gute seiten dazu?
ich würde jetzt am liebsten sagen "am besten auf deutsch" allerdings ist das vllt auch nciht der richtige weg.. also das grundwissen von englisch hab ich ja und ich kann wenn auch nciht alles vieles verstehn.. ich bins halt nur nich gewohnt und bin warhscheinlich auch zu faul da es länger braucht einen englischen text zu lesen und zu verstehen. allerdings will ich das jetzt nicht als bedingung stellen und ich werde es auch an englischen tuts versuchen ;) mir wurde oft genug gesagt das englisch die vorraussetzung fürs scripten ist ;)
und danke für deine antwort und dem tipp!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 15. Januar 2009, 18:36

secretwz hat geschrieben:mir wurde oft genug gesagt das englisch die vorraussetzung fürs scripten ist


Fürs Programmieren auch ... :)

Dazu als Lektüretipp: http://www.python-forum.de/topic-17375.html

Ein gutes Tutorial ist das "Original". Einigermaßen aktuelle Versionen gibt es nur auf Englisch, die aktuellste dt. Fassung ist zu Python 2.1:
http://docs.python.org bzw. http://docs.python.org/3.0/


Empfehlenswert ist auch "A Byte of Python", in der englischen Originalfassung auch schon für 3.0 verfügbar. Es gibt auch davon eine dt. Übersetzung, aber nicht zu 3.0 (genauen Stand weiß ich jetzt nicht auswendig).
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Beitragvon Dauerbaustelle » Donnerstag 15. Januar 2009, 18:52

Ich bin da anderer Ansicht: Such dir ein mittleres Projekt mit einem erfahreneren Pythoner, der deinen Code auf "Sauberkeit" und so korrigiert und lerne aus dessen Korrekturen.

So hab ichs gelernt :)
secretwz
User
Beiträge: 40
Registriert: Mittwoch 14. Januar 2009, 22:01

Beitragvon secretwz » Donnerstag 15. Januar 2009, 19:48

@numerix
ok danke für die empfehlungen =) ich werde mal schaun was mich anspricht ;)

@Dauerbaustelle
Ja ist natürlich auch ne möglichkeit.. allerdings ist es daa natürlich schwierig jemanden zu finden denn die welt ist nicht grade voll beladen mit python-progrannmierer ;) also ich kenne zumindest keinen ausser die leute natürlich hier im forum...
abgdf

Beitragvon abgdf » Donnerstag 15. Januar 2009, 21:47

Hi,

ich hab' in (m)eiem Buchführungsskript eine Klasse "Konto":

Code: Alles auswählen

class Konto:

    def __init__(self, nummer, name):

        self.nummer = nummer
        self.name = name

        self.sollsum = 0
        self.habensum = 0

        self.buchungen = []

    def bucheSoll(self, soll, bsatz):
        self.sollsum += soll
        self.buchungen.append(bsatz)

    def bucheHaben(self, haben, bsatz):
        self.habensum += haben
        self.buchungen.append(bsatz)

Die ist dort total nützlich. Genaugenommen ist es fast die einzige wirkliche OOP-Klasse, also eine, die ein Objekt aus der Lebenswirklichkeit beschreibt und sich auch so verhält, dir mir bisher untergekommen ist.

Nur mal so ...

Gruß

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder