Seite 1 von 2
benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 14:38
von mettalqueen
Hey Leute. ich habe ein kleines Programm geschrieben(mit haufenweisen Fehlern aber es funktioniert)
und nu möchte ich, dass der Benutzer, die Veränderungen (in meinem Programm, dass hinzufügen von Listenelementen) speichern kann
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 14:40
von BlackJack
@mettalqueen: Und die Frage ist nun welche?
Was ist in den Listen drin? Kann man das einfach als JSON serialisieren? Oder reicht vielleicht sogar ein einfacheres Format wie CSV aus?
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 14:47
von mettalqueen
In der Liste sind Namen von Mustern, also Text.
r = ["Afreeka","Well","Heartwave","Tree","Coll","Biloxy","Jasmin"] zum Beispiel
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 15:34
von Sirius3
@mettalqueen: dann ist doch json genau das richtige; das kannst Du auch noch verwenden, wenn es etwas komplexer wird.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 15:36
von mettalqueen
Ok danke dann weiß ich jetzt wonach ich mal googlen muss
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:15
von mettalqueen
Code: Alles auswählen
import sys
d=open("wuerfelnMuster.txt","w")
musterListe = ["Afreeka","Well","Heartwave","Tree","Coll","Biloxy","Jasmin"]
def listeSchreiben():
print"Gib dein Muster ein"
musterEingabe = raw_input()
r.append(e)
def wuerfeln():
musterListe = d.readlines()
random.shuffle(musterListe)
print(musterListe[0:3]
def anfangsMenue():
eingabemenue = input()
if eingabemenue == 1:
listeSchreiben()
if eingabemenue == 2:
wuerfeln()
print"Möchtest du ein Muster zur Datei hinzufügen 1 oder Würfeln 2"
anfangsMenue()
ich habe beim letzten def ein syntax error und finde die Lösung einfach nicht
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:19
von BlackJack
@mettalqueen: Da ist ganz offensichtlich die Einrückung kaputt. Vier Leerzeichen pro Ebene und keine Tabulatorzeichen sind Konvention. Das, und auch etwas zu Namensschreibweisen und Leerzeilen steht im
Style Guide for Python Code.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:22
von mettalqueen
aber ich habe beim letzten doch immer 4 leerzeichen
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:25
von Sirius3
@BlackJack: das wäre aber ein IndentationError

.
@mettalqueen: neben der falschen Einrückung würde ich in Zeile 11 noch mal die Klammern zählen.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:35
von BlackJack
@mettalqueen: Das Programm hat auch noch eine ganze Reihe anderer Probleme. `sys` wird importiert aber nicht benutzt. `random` wird dagegen nicht importiert, aber verwendet. Auf Modulebene sollten nur Konstanten, Funktionen, und Klassen definiert werden und nicht Dateiobjekte, Listen die verändert werden, oder andere Variablen. `d` ist ein schlechter Name für eine Datei. `input()` sollte man nicht verwenden weil das die Eingabe als Python-Ausdruck interpretiert. ``print`` ist keine Funktion sondern eine Anweisung, also sollte man das nicht so schreiben als wäre es eine Funktion. Zumal das auch mal mit, und mal ohne die ”falschen” Klammern geschrieben wurde. `raw_input()` kann man einen Text für die Eingabeaufforderung als Argument übergeben. `listeSchreiben()` schreibt keine Liste. Das `r` was darin verwendet wird gibt es gar nicht.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:50
von Sirius3
@mettalqueen: und zusätzlich was BlackJack schreibt, kann man aus Dateien, die zum Schreiben geöffnet werden, nicht lesen, e ist genauso wenig definiert wie r und musterListe in Zeile 3 wird nie verwendet, sondern nur die lokale musterListe in wuerfeln. Funktionen sollten Parameter entgegen nehmen und/oder Rückgabewerte haben, weil sonst die Funktion einer Funktion pervertiert wird.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 17:56
von Hyperion
Hinzu kommt, dass die Kernfunktionalität nicht gut gekapselt wird! Schauen wir uns mal die ``wuerfeln``-Funktion genauer an. Diese liest die Zeilen einer (global!) geöffneten Textdatei aus und bindet diese an den Namen ``musterListe`` (was an sich auch ein schlechter Name ist!). Danach wird diese Liste gemischt und anschließend die ersten 3 Elemente ausgegeben.
Imho werden da drei verschiedene Aspekte vermischt:
1.) Das Beschaffen der Daten aus einer Datei
2.) Das Mischen und "Berechnen" des Ergebnis
3.) Die Ausgabe des Vorgangs
Die Funktion wäre viel universeller, klarer in ihrer Aufgabe und auch testbar, wenn diese ausschließlich Punkt 2 abbildete, z.B. so:
Code: Alles auswählen
def choose_patterns(patterns):
shuffle(patterns)
return patterns[:3]
Woher die Muster stammen ist dieser Implementierung egal - ob die nun aus einer Datei eingelesen werden oder statisch aus dem Programm kommen oder sonst woher...
Indem man das Ergebnis zurückgibt, kann man die Funktion auch anderweitig einsetzen, als nur in einem CLI Programm.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:07
von mettalqueen
Das steht aber alles so nicht in meinem Buch und ich bin Anfängerin und finde es scheiße das sihr alles immer schlecht macht
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:19
von EyDu
Das hat doch nichts mit Schlechtmachen zu tun. Wie willst du denn etwas lernen, wenn du nicht auf deine Fehler hingewiesen wirst?
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:24
von mettalqueen
was bringt es mir denn wenn ihr meine Zeilen so umschreibt dass nicht mehr ein einziges Wort von mir übrig bleibt? was lerne ich denn daraus?
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:27
von EyDu
Wie es einfacher, robuster und eleganter geht. Du musst dich eben mit den vorgeschlagenen Lösungen beschäftigen, diese verstehen und mit deinem Ansatz vergleichen. Lies unbekannte Dinge nach und spiele ein wenig damit. So lernt man Dinge.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:29
von Sirius3
@mettalqueen: bis jetzt hat noch niemand etwas umgeschrieben. Du hast nach einem Fehler gefragt und die meisten Punkte beziehen sich auf Fehler, die verhindern, dass das Programm "läuft". Daneben solltest Du von Anfang an ein paar Richtlinien mitlernen. Denn ob man jetzt umständliches Zeugs oder das ordentliche Programmieren lernt, macht vom Aufwand her keinen Unterschied.
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 18:38
von Hyperion
mettalqueen hat geschrieben:Das steht aber alles so nicht in meinem Buch und ich bin Anfängerin und finde es scheiße das sihr alles immer schlecht macht
Dein Buch ist doch nicht Deine Grundschullehrerin, die man als Gott gleiches Wesen nie in Frage gestellt hat! Zum einen muss Dein Buch nicht in allen Punkten gut und richtig sein, zum anderen kann ein Buch ja auch nicht alles beinhalten. (Ansonsten würdest Du Dich ja auch gar nicht hier an das Forum wegen Hilfe richten

)
Und wenn in Deinem Buch Funktionen eingeführt werden, wird da sicherlich darauf eingegangen werden, wozu Funktionen so allgemein gut sind und wie man Parameter übergeben und Rückgabewerte erhalten kann. Das ist doch alles kein Zauberkram!
Und Du verwendest ja auch schon reichlich Funktionen aus der Standard Lib. Diese sind doch auch so aufgebaut, dass die eine bestimmte Aufgabe lösen! ``open`` öffnet eine Datei und gibt Dir Objekt zurück, mit welchem Du auf diese Datei zugreifen kannst. ``shuffle`` mischt eine gegebene Sequenz "in place" und ``raw_input`` liest einen String von der Shell ein. Du wirst da kaum Funktionen finden, deren Aufgabe sich so lesen lassen: "Mache dies und das oder das und im Falle X noch dieses dazu und dann gibt das oder jenes zurück".
Und wir machen auch nicht alles schlecht, sondern weisen Dich auf Fehler oder schlechtes Design hin. Das schmälert weder Deinen Wert als Mensch, noch wollen wir Dich als Person schlecht machen oder Deine Anstregungen bewerten. Wir treffen nur Aussagen zu Deinem Code! Aber wir müssen Dich auch nicht loben, um Dich zu motivieren. Das kann mal vorkommen, dass man einem User auch mal ein Lob ausspricht, aber die Regel ist das nicht. Wozu auch? Motivation sollte jeder selber mitbringen und selbst wenn hier zig Postings kommen, die Stil und Vorgehen kritisieren, kannst Du ja dennoch stolz auf Deine bisherige Leistung sein.
Aber eines solltest Du nicht tun: Nämlich Kritik am Code persönlich nehmen!
Wir wollen hier nur helfen, dass *Du* *Deinen* Code verbessern kannst. Nicht mehr und nicht weniger.
Und ich habe auch nicht alles komplett umgeschrieben. Ok, ich habe das auf Englisch formuliert, aber ansonsten habe ich lediglich das Lesen der Muster aus der Datei weggelassen und das Ergebnis nicht *direkt* an ``print`` weitergegeben. Das Mischen und das Zusammenstellen des Ergebnisses ist doch gleich geblieben!
(Für Dich wäre übrigens ``random.sample`` besser geeignet, wenn ich das richtig sehe)
Re: benutzer soll speichern können
Verfasst: Sonntag 22. März 2015, 20:59
von mettalqueen
Ja ich wollte auch nicht böse sein, aber ich war einfach sauer und niedergeschlagen habe den ganzen Tag ununterbrochen dran gearbeitet und das ich noch nicht viel weiß, das weiß ich ja. Es war einfach nur sehr frustrierend. Ein paar verbesserungen habe ich nun auch schon gemacht
Re: benutzer soll speichern können
Verfasst: Montag 23. März 2015, 08:46
von /me
mettalqueen hat geschrieben:Code: Alles auswählen
def listeSchreiben():
print"Gib dein Muster ein"
musterEingabe = raw_input()
r.append(e)
Was erwartest du, was bei der letzten zitierten Codezeile passiert?