benutzer soll speichern können

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.
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

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
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?
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

In der Liste sind Namen von Mustern, also Text.
r = ["Afreeka","Well","Heartwave","Tree","Coll","Biloxy","Jasmin"] zum Beispiel
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@mettalqueen: dann ist doch json genau das richtige; das kannst Du auch noch verwenden, wenn es etwas komplexer wird.
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

Ok danke dann weiß ich jetzt wonach ich mal googlen muss
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

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
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.
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

aber ich habe beim letzten doch immer 4 leerzeichen
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: das wäre aber ein IndentationError :wink: .
@mettalqueen: neben der falschen Einrückung würde ich in Zeile 11 noch mal die Klammern zählen.
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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das hat doch nichts mit Schlechtmachen zu tun. Wie willst du denn etwas lernen, wenn du nicht auf deine Fehler hingewiesen wirst?
Das Leben ist wie ein Tennisball.
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mettalqueen
User
Beiträge: 44
Registriert: Dienstag 7. Mai 2013, 23:02
Wohnort: Greifswald

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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