Jupp, meinte Leerzeilen
Naja, wenn Du ``with`` nicht kapierst, dann hast Du einfach noch keine Situationen erlebt, bei denen es helfen könnte Anders formuliert: Willst Du selber ein Objekt bauen, welches das Context Manager Verhalten implementiert, oder willst Du es selber in einer bestimmten Situation nutzen?
Für ersteres solltest Du zweiteres verstanden haben; und zweiteres ergibt sich doch aus der jeweiligen Situation!?! Wenn Du eine solche nicht hast, dann bringt es ja nichts, krampfhaft dieses anwenden zu wollen...
Das klassische Beispiel ist eben das Öffnen von Datei-Objekten... das wird ja sogar im OpenBook gezeigt - auch wenn Du DIr lieber eine andere Quelle suchen solltest.
Spiel: Kleines FakeHackprogramm Frage
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- noisefloor
- User
- Beiträge: 3858
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das with-statement ist eigentlich überhaupt nicht schwer zu verstehen, insbesonderts nicht im Umgang mit Dateien...
Ein sehr konkretes Beispiel, was du quasi 1:1 in deinen Code übernehmen kannst: http://preshing.com/20110920/the-python ... by-example
Der schwerwiegende Vorteil des with-Statements ist, dass das, was man geöffnet hat (z.B. eine Datei) automatisch wieder geschlossen wird.
Gruß, noisefloor
das with-statement ist eigentlich überhaupt nicht schwer zu verstehen, insbesonderts nicht im Umgang mit Dateien...
Ein sehr konkretes Beispiel, was du quasi 1:1 in deinen Code übernehmen kannst: http://preshing.com/20110920/the-python ... by-example
Der schwerwiegende Vorteil des with-Statements ist, dass das, was man geöffnet hat (z.B. eine Datei) automatisch wieder geschlossen wird.
Gruß, noisefloor
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Ui OK habs verstanden, denke ich. Danke an euch.
So wäre es also korrekt:
Vom lesen her leichter? Alle PEP8 Richtlinien eingehalten? Gibt es was zu beanstanden?
So wäre es also korrekt:
Code: Alles auswählen
# A little game
import sys
import signal
import time
def phase1():
print("Verbindung wird aufgenommen!")
time.sleep(10.0)
print("Verbindung aufgenommen!")
print("Es werden Dateien gestohlen! Haben Sie etwas Geduld!")
time.sleep(10.0)
print("Daten erfolgreich gestohlen")
with open("Daten.txt", "w") as datei:
datei.write("Ebay - Passwort: Hekdlaien33 ")
datei.write("FB - Passwort: ji87z78zhihg76 ")
datei.write("READY")
print("Das Spiel ist jetzt beendet")
sys.exit()
def hilfe():
print("Mit Hilfe dieses Programm werden sie hacken! INFO: Das ist ein Spiel und kein echtes Hackprogramm!")
def hacken():
print("Hier werden zuerst Infos über den Angreifer erfasst und diese in ein sogenanntes Logfile eingetragen!")
opfer_Name = input("Geben Sie hier den Namen des Opfers ein! (Vor- und Nachname!)")
opfer_IP = input("Geben Sie hier die IP des Opfers ein!")
angreifer_Port = input("Geben Sie hier die Portnummer ein, über die Sie hacken möchten!")
with open("info.txt", "w") as datei2:
#content of the file
datei2.write("Name des Opfers ")
datei2.write(opfer_Name)
datei2.write("IP des Opfers ")
datei2.write(opfer_IP)
datei2.write("Über welchem Port: ")
datei2.write(angreifer_Port)
oa_abfrage = input("Wollen sie wirklich hacken? 1 für ja!")
if oa_abfrage == "1":
print("Der Computer wird jetzt gehackt. Gedulden Sie sich bitte etwas!")
phase1()
else:
print("Sie haben nichts eingegeben!")
def starte_spiel():
hilfe_abfrage = input("Falls Sie Hilfe brauchen, drücken Sie die 1.")
if hilfe_abfrage == "1":
hilfe()
else:
spiel_abfrage = input("Wollen Sie wirklich hacken? Falls ja, drücken sie 1.")
if spiel_abfrage == "1":
hacken()
elif spiel_abfrage == None:
print("Das Spiel wird jetzt beendet")
sys.exit()
registrieren = input("Falls Sie sich registrieren möchten, drücken sie 1.")
alle_benutzer = []
alle_passwort = []
if registrieren == "1":
neuer_benutzer = input("Geben Sie den gewünschten Benutzernamen ein:")
neues_passwort = input("Geben Sie das gewünschte Passwort ein:")
alle_benutzer.append(neuer_benutzer)
alle_passwort.append(neues_passwort)
elif registrieren == None:
benutzer = input("Geben Sie Ihren Benutzernamen ein:")
passwort = input("Geben Sie Ihr Passwort ein:")
try:
if alle_benutzer[0] == neuer_benutzer and alle_passwort[0] == neues_passwort:
starte_spiel()
except:
print("User nicht registriert oder anderer Fehler!")
sys.exit()
Deine Zeilen sind noch zu lang. Außerdem "sollen" (SHOULD) alle Bezeichner möglichst Englisch sein (hilfe -> help, hacken -> hack, ...) (und SHOULD heißt, dass du es wirklich tun solltest ).
Und es wäre schöner, wenn du alles nach deinen Funktionsdefinitionen in eine Funktion main() packen könntest, die du dann mitstartest.
Dein try-except-Block am Ende ist noch zu weit gefasst. Solltest du mal ein Fehler in deinen Code einbauen, wird dir in Zukunft nur angezeigt werden: Ein Fehler ist aufgetreten, statt einer richtigen Fehlermeldung. Außerdem ist das sys.exit() am Ende unnötig.
Außerdem sollten Funktionen möglichst keine Nebeneffekte haben. Das Beenden des Programms ist aber so ein Nebeneffekt. Schöner wäre es, wenn du die Funktion einfach mit "return" beenden würdest. So kannst du zum Beispiel auch nach dem Spiel noch irgendwas anderes drucken oder so.
Und ich verstehe auch nicht, was der "elif registrieren == None"-Block soll. registrieren kann doch gar nicht None sein.
Und es wäre schöner, wenn du alles nach deinen Funktionsdefinitionen in eine Funktion main() packen könntest, die du dann mit
Code: Alles auswählen
if __name__ == '__main__':
main()
Dein try-except-Block am Ende ist noch zu weit gefasst. Solltest du mal ein Fehler in deinen Code einbauen, wird dir in Zukunft nur angezeigt werden: Ein Fehler ist aufgetreten, statt einer richtigen Fehlermeldung. Außerdem ist das sys.exit() am Ende unnötig.
Außerdem sollten Funktionen möglichst keine Nebeneffekte haben. Das Beenden des Programms ist aber so ein Nebeneffekt. Schöner wäre es, wenn du die Funktion einfach mit "return" beenden würdest. So kannst du zum Beispiel auch nach dem Spiel noch irgendwas anderes drucken oder so.
Und ich verstehe auch nicht, was der "elif registrieren == None"-Block soll. registrieren kann doch gar nicht None sein.
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Hi,
Neuer Code:
Den try-Block habe ich jetzt mal ganz rausgenommen.Dein try-except-Block am Ende ist noch zu weit gefasst. Solltest du mal ein Fehler in deinen Code einbauen, wird dir in Zukunft nur angezeigt werden: Ein Fehler ist aufgetreten, statt einer richtigen Fehlermeldung. Außerdem ist das sys.exit() am Ende unnötig.
Gemacht.Deine Zeilen sind noch zu lang. Außerdem "sollen" (SHOULD) alle Bezeichner möglichst Englisch sein (hilfe -> help, hacken -> hack, ...) (und SHOULD heißt, dass du es wirklich tun solltest ).
Noch nie davon gehört. Was macht diese main?Und es wäre schöner, wenn du alles nach deinen Funktionsdefinitionen in eine Funktion main() packen könntest, die du dann mit
Habe das jetzt auch besser gelöst!Außerdem sollten Funktionen möglichst keine Nebeneffekte haben. Das Beenden des Programms ist aber so ein Nebeneffekt. Schöner wäre es, wenn du die Funktion einfach mit "return" beenden würdest. So kannst du zum Beispiel auch nach dem Spiel noch irgendwas anderes drucken oder so.
Neuer Code:
Code: Alles auswählen
# A little game
import sys
import signal
import time
def phase1():
print("Verbindung wird aufgenommen!")
time.sleep(10.0)
print("Verbindung aufgenommen!")
print("Es werden Dateien gestohlen! Haben Sie etwas Geduld!")
time.sleep(10.0)
print("Daten erfolgreich gestohlen")
with open("Daten.txt", "w") as file:
file.write("Ebay - Passwort: Hekdlaien33 ")
file.write("FB - Passwort: ji87z78zhihg76 ")
file.write("READY")
print("Das Spiel ist jetzt beendet")
def help_game():
print("Mit Hilfe dieses Programm werden sie hacken!")
def hack():
print("Logfileerstellung")
victim_name = input("Geben Sie hier den Namen des Opfers ein!")
victim_ip = input("Geben Sie hier die IP des Opfers ein!")
attacker_port = input("Geben Sie hier die Portnummer ein.")
with open("info.txt", "w") as file2:
#content of the file
file2.write("Name des Opfers ")
file2.write(victim_name)
file2.write("IP des Opfers ")
file2.write(victim_ip)
file2.write("Über welchem Port: ")
file2.write(attacker_port)
oa_query = input("Wollen sie wirklich hacken? 1 für ja!")
if oa_query == "1":
print("Der Computer wird jetzt gehackt.")
return phase1()
else:
print("Sie haben nichts eingegeben!")
sys.exit()
def start_game():
help_query = input("Falls Sie Hilfe brauchen, drücken Sie die 1.")
if help_query == "1":
help_game()
else:
game_query = input("Wollen Sie wirklich hacken? Falls ja, drücken sie 1.")
if game_query == "1":
return hack()
else:
sys.exit()
register = input("Falls Sie sich registrieren möchten, drücken sie 1.")
all_user = []
all_password = []
if register == "1":
new_user = input("Geben Sie den gewünschten Benutzernamen ein:")
new_password = input("Geben Sie das gewünschte Passwort ein:")
all_user.append(new_user)
all_password.append(new_password)
else:
sys.exit()
if all_user[0] == new_user and all_password[0] == new_password:
start_game()
@Gary123456: Die `main()`-Funktion macht das was Du da rein schreibst. Und das sollte halt der Code auf Modulebene sein der keine Konstanten oder Klassen/Funktionen definiert. Dann kann man das Modul importieren ohne dass das Programm abläuft, um zum Beispiel einzelne Funktionen isoliert testen zu können, und Unittests schreiben zu können, und einzelne Funktionen wiederverwenden zu können, …
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Hi,
Ich werde das nicht einbauen, da ich keinen blassen Schimmer habe, wofür das da ist und wofür das nützlich sein soll. Entschuldige.
Aber sonst ist am Code nichts zu beanstanden. Ich werde bezüglich dieser MAIN Funktion noch etwas googlen und in meinem Buch nachschauen. Vll finde ich was nützliches.
Ich werde das nicht einbauen, da ich keinen blassen Schimmer habe, wofür das da ist und wofür das nützlich sein soll. Entschuldige.
Aber sonst ist am Code nichts zu beanstanden. Ich werde bezüglich dieser MAIN Funktion noch etwas googlen und in meinem Buch nachschauen. Vll finde ich was nützliches.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Solltest Du aber besserGary123456 hat geschrieben: Ich werde das nicht einbauen,
BlackJack hat Dir doch zig Gründe *für* den Einsatz davon genannt...Gary123456 hat geschrieben: da ich keinen blassen Schimmer habe, wofür das da ist und wofür das nützlich sein soll. Entschuldige.
Sich schlau zu machen ist zwar gut, manchmal muss man als Anfänger aber auch Dinge einfach akzeptieren. Man kann nicht immer alles sofort verstehen und verinnerlichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Code: Alles auswählen
# A little game
import sys
import signal
import time
def phase1():
print("Verbindung wird aufgenommen!")
time.sleep(10.0)
print("Verbindung aufgenommen!")
print("Es werden Dateien gestohlen! Haben Sie etwas Geduld!")
time.sleep(10.0)
print("Daten erfolgreich gestohlen")
with open("Daten.txt", "w") as file:
file.write("Ebay - Passwort: Hekdlaien33 ")
file.write("FB - Passwort: ji87z78zhihg76 ")
file.write("READY")
print("Das Spiel ist jetzt beendet")
def help_game():
print("Mit Hilfe dieses Programm werden sie hacken!")
def hack():
print("Logfileerstellung")
victim_name = input("Geben Sie hier den Namen des Opfers ein!")
victim_ip = input("Geben Sie hier die IP des Opfers ein!")
attacker_port = input("Geben Sie hier die Portnummer ein.")
with open("info.txt", "w") as file2:
#content of the file
file2.write("Name des Opfers ")
file2.write(victim_name)
file2.write("IP des Opfers ")
file2.write(victim_ip)
file2.write("Über welchem Port: ")
file2.write(attacker_port)
oa_query = input("Wollen sie wirklich hacken? 1 für ja!")
if oa_query == "1":
print("Der Computer wird jetzt gehackt.")
return phase1()
else:
print("Sie haben nichts eingegeben!")
sys.exit()
def start_game():
help_query = input("Falls Sie Hilfe brauchen, drücken Sie die 1.")
if help_query == "1":
help_game()
else:
game_query = input("Wollen Sie wirklich hacken? Falls ja, drücken sie 1.")
if game_query == "1":
return hack()
else:
sys.exit()
def main():
register = input("Falls Sie sich registrieren möchten, drücken sie 1.")
all_user = []
all_password = []
if register == "1":
new_user = input("Geben Sie den gewünschten Benutzernamen ein:")
new_password = input("Geben Sie das gewünschte Passwort ein:")
all_user.append(new_user)
all_password.append(new_password)
else:
sys.exit()
if all_user[0] == new_user and all_password[0] == new_password:
start_game()
if __name__ == '__main__':
main()
Sonst noch was auszusetzen?
Zuletzt geändert von Gary123456 am Sonntag 17. März 2013, 14:10, insgesamt 1-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja, der Thread hier wird durch die ellenlangen Code-Passagen stark unterbrochen. Wie ich Dir schon empfahl, solltest Du das besser in Pastebins auslagern (in Zukunft). Speziell bei gist.github.com hättest Du jetzt für jedes Update einfach dein Gist überarbeiten können.Gary123456 hat geschrieben: Sonst noch was auszusetzen?
Inhaltlich habe ich mir das noch nicht angeguckt...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ok, also generell vermischst Du viel zu sehr Logik mit Darstellung bzw. Benutzerinteraktion. Wieso muss das Speichern von Werten direkt in derselben Funktion stehen, wie die Eingabe durch den Benutzer?
Vieles lässt sich auch besser kapseln, etwa die immer ähnlichen Menü-Fragmente. Mal willst Du nur Ja oder Nein, mal 1 oder 2 usw. Das kann man sicherlich besser generalisieren.
Vieles lässt sich auch besser kapseln, etwa die immer ähnlichen Menü-Fragmente. Mal willst Du nur Ja oder Nein, mal 1 oder 2 usw. Das kann man sicherlich besser generalisieren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Habe es jetzt editiert.Ziemlich viele Leerzeilen.
Werde mir das jetzt mal anschauen. Ich denke, dass das letzte Mal wegen des neuen Editors was schiefgelaufen ist. Werde das jetzt berücksichtigen.Ja, der Thread hier wird durch die ellenlangen Code-Passagen stark unterbrochen. Wie ich Dir schon empfahl, solltest Du das besser in Pastebins auslagern (in Zukunft). Speziell bei gist.github.com hättest Du jetzt für jedes Update einfach dein Gist überarbeiten können.
Warum nicht? Ist es besser/übersichtlicher, wenn man für jede Aktion eine eigene Funktion aufbaut? Dann wären das aber recht viele Funktionen.Ok, also generell vermischst Du viel zu sehr Logik mit Darstellung bzw. Benutzerinteraktion. Wieso muss das Speichern von Werten direkt in derselben Funktion stehen, wie die Eingabe durch den Benutzer?
Werde versuchen, da eine bessere Lösung zu finden.Vieles lässt sich auch besser kapseln, etwa die immer ähnlichen Menü-Fragmente. Mal willst Du nur Ja oder Nein, mal 1 oder 2 usw. Das kann man sicherlich besser generalisieren.
- noisefloor
- User
- Beiträge: 3858
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
für text-basierte Interaktion (also mehr als 1 oder 2 Eingaben) finde ich ja das cmd-Modul aus der Standardbibliothek sehr praktisch...
Gruß, noisefloor
für text-basierte Interaktion (also mehr als 1 oder 2 Eingaben) finde ich ja das cmd-Modul aus der Standardbibliothek sehr praktisch...
Gruß, noisefloor
Würde sich hier IMHO auch ganz gut eignen weil man sich da auch so einen schönen Retro-mässigen Prompt für die Eingaben mit basteln kann.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja, so ist das bei Programmen Aber es ist immer besser Funktionen so weit zu zerlegen, dass diese eher klein und überschaubar für sich sind. Man sollte sie auch immer so halten, dass Funktionen genau *eine* Aufgabe erledigen und nicht mehrere auf einmal. Eine Aufgabe kann es sein, Daten vom Benutzer abzufragen. Eine andere, diese in eine passende Datenstruktur zu packen, eine weitere dann schließlich, diese irgend wie zu speichern.Gary123456 hat geschrieben: Warum nicht? Ist es besser/übersichtlicher, wenn man für jede Aktion eine eigene Funktion aufbaut? Dann wären das aber recht viele Funktionen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Werde den COde jetzt mal total umändern
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Neuer Code:
http://www.python-forum.de/pastebin.php?mode=view&s=331
@Hyperion) Von der Aufteilung her besser?
@ noisefloor and BlackJack) Werde mir jetzt das Modul ansehen!
http://www.python-forum.de/pastebin.php?mode=view&s=331
@Hyperion) Von der Aufteilung her besser?
@ noisefloor and BlackJack) Werde mir jetzt das Modul ansehen!
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Hum, `register` ist ein reichlich komplizierter Weg um `hack` aufzurufen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Warum kompliziert? Verstehe Dich ehrlicherweise nicht.