Neuling sucht Rat
@Tengel: Du benutzt keine Funktionen, also nicht so wie man Funktionen definieren und benutzen sollte. ``global`` sollte man dann nicht benötigen. Das ganze Programm wirkt nicht wirklich durchdacht. Du bekommst doch sicher eine Fehlermeldung. Wie sieht die aus und was verstehst Du an der nicht?
Code: Alles auswählen
d = open("traffic.bin","r")
traffic = pickle.load(d)
d.close()
traffic = traffic+neuer_verbrauch
Bzw. wird auch versucht die variable traffic zu ändern nachdem die Datei wieder geschlossen wurde.
Traceback (most recent call last):
File "D:/Phyton/ARbeitKM/arbeitTraffic.py", line 44, in <module>
traffic_lesen()
File "D:/Phyton/ARbeitKM/arbeitTraffic.py", line 13, in traffic_lesen
traffic = pickle.load(d)
TypeError: 'str' does not support the buffer interface
Ich versteh nicht genau was der da mit strings will
Ja, hmmm in dem Beispiel aus dem Buch werden die Funktionen aber genau so benutzt - oder ich bin doch zu doof ka.
File "D:/Phyton/ARbeitKM/arbeitTraffic.py", line 44, in <module>
traffic_lesen()
File "D:/Phyton/ARbeitKM/arbeitTraffic.py", line 13, in traffic_lesen
traffic = pickle.load(d)
TypeError: 'str' does not support the buffer interface
Ich versteh nicht genau was der da mit strings will

Ja, hmmm in dem Beispiel aus dem Buch werden die Funktionen aber genau so benutzt - oder ich bin doch zu doof ka.
Code: Alles auswählen
import random
import time
import glob
import pickle
def hs_lesen():
global hs_liste
if not glob.glob("highscore.bin"):
hs_liste = []
return
d = open("highscore.bin","rb")
hs_liste = pickle.load(d)
d.close()
def hs_anzeigen():
if not hs_liste:
print("Keine Highscores vorhanden")
return
print("P. Name Zeit")
for i in range(len(hs_liste)):
print("{0:2d}.{1:10}{2:5.2f} sec".format(i+1,hs_liste[i][0],hs_liste[i][1]))
if i >= 9:
break
def hs_schreiben():
d = open("highscore.bin","wb")
pickle.dump(hs_liste,d)
d.close()
def spiel():
name = input("Bitte geben Sie Ihren Namen ein(max. 10 Zeichen):")
name = name[0:10]
richtig = 0
startzeit = time.time()
for aufgabe in range(5):
a = random.randint(10,30)
b = random.randint(10,30)
c = a+b
try:
zahl = int(input("Aufgabe"+str(aufgabe+1)+"von 5: "+str(a) +"+"+str(b)+":"))
if zahl == c:
print("***Richtig***")
richtig += 1
else:
raise
except:
print("***Falsch***")
endzeit = time.time()
differenz = endzeit-startzeit
print("Ergebnis:{0:d} von 5 in {1:.2f} Sekunden".format(richtig,differenz),end="")
if richtig == 5:
print(",Highscore")
else:
print(",leider kein Highscore")
return
gefunden = False
for i in range(len(hs_liste)):
if differenz < hs_liste[i][1]:
hs_liste.instert(i,[name,differenz])
gefunden = True
break
if not gefunden:
hs_liste.append([name,differenz])
hs_anzeigen()
# Hauptprogramm
random.seed()
hs_lesen()
while True:
try:
menu = int(input("Bitte eingeben (0:Ende 1:Highscores, 2:Spielen):"))
except:
print("Falsche Eingabe")
continue
if menu == 0:
break
elif menu == 1:
hs_anzeigen()
elif menu == 2:
spiel()
else:
print("Falsche Eingabe")
hs_schreiben()
@Tengel: Pickle-Dateien sind *Binärdateien* die muss man immer im Binärmodus öffnen. Das wird in dem Highscore-Beispiel aus dem Buch ja auch gemacht.
Das Beispiel aus dem Buch ist sehr schlecht, weil es nicht die richtige Verwendung von Funktionen zeigt, sondern sie nur als eine Art Sprungmarken für Quelltextabschnitte missbraucht. Die Verwendung von `glob.glob()` als Mittel das vorhandensein einer Datei zu testen habe ich vorher auch noch nicht gesehen. Keine Ahnung wie man auf so eine Idee kommen kann, beziehungsweise wie jemand der auf solche Ideen kommt, denkt er sollte Bücher schreiben um anderen Programmieren beizubringen. 8-o
Ich würde sogar behaupten es ist syntaktisch falsch, denn ein ``raise`` ohne eine Ausnahme darf AFAIK nur in einem ``except``-Zweig vorkommen. Denn sonst ist ja gar nicht klar *welche* Ausnahme damit ausgelöst werden soll. Die ``except``-Anweisunge ohne konkrete Ausnahmen sind auch etwas was man auf keinen Fall machen sollte.
Bei Deiner „Funktion” ist das nächste Problem, dass `neuer_verbrauch` nicht definiert ist, und selbst wenn er das wäre höchstwahrscheinlich nicht von einem Typ bei dem ein ``+`` mit einer Liste funktioniert.
Das Beispiel aus dem Buch ist sehr schlecht, weil es nicht die richtige Verwendung von Funktionen zeigt, sondern sie nur als eine Art Sprungmarken für Quelltextabschnitte missbraucht. Die Verwendung von `glob.glob()` als Mittel das vorhandensein einer Datei zu testen habe ich vorher auch noch nicht gesehen. Keine Ahnung wie man auf so eine Idee kommen kann, beziehungsweise wie jemand der auf solche Ideen kommt, denkt er sollte Bücher schreiben um anderen Programmieren beizubringen. 8-o
Ich würde sogar behaupten es ist syntaktisch falsch, denn ein ``raise`` ohne eine Ausnahme darf AFAIK nur in einem ``except``-Zweig vorkommen. Denn sonst ist ja gar nicht klar *welche* Ausnahme damit ausgelöst werden soll. Die ``except``-Anweisunge ohne konkrete Ausnahmen sind auch etwas was man auf keinen Fall machen sollte.
Bei Deiner „Funktion” ist das nächste Problem, dass `neuer_verbrauch` nicht definiert ist, und selbst wenn er das wäre höchstwahrscheinlich nicht von einem Typ bei dem ein ``+`` mit einer Liste funktioniert.
Hm stimmt 
Ka - bisher wurden alle Buchbeispiele hart kritisiert..ich glaub das Buch ist nicht so die Wucht obwohl die Rezesionen eig alle gut waren.
Wobei ich auchs nicht aufs Buch schieben sollte das ich das Zeug nicht check.

Ka - bisher wurden alle Buchbeispiele hart kritisiert..ich glaub das Buch ist nicht so die Wucht obwohl die Rezesionen eig alle gut waren.
Wobei ich auchs nicht aufs Buch schieben sollte das ich das Zeug nicht check.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Rezensionen sind oft von Leuten die Einsteiger sind und daher selbst nicht beurteilen können ob das was sie gelernt haben sinnvoll ist oder nicht. Es geht glaub ich jedem erfahrenerem Programmierer so, dass er irgendwann seine alten Programme anschaut und sich an den Kopf fasst, was er da damals verbrochen hat.Tengel hat geschrieben:Ka - bisher wurden alle Buchbeispiele hart kritisiert..ich glaub das Buch ist nicht so die Wucht obwohl die Rezesionen eig alle gut waren.
Und in dieser Phase gibt es zwei Wege: eine Dunning-Kruger-artige Überzeugung dass man alles richtig macht und die Leute sich nur über nutzlose Sachen aufregen denn das Programm das man geschrieben hat funktioniert ja augenscheinlich oder inkrementelles Lernen wo man oftmals über viele Jahre und gut und gerne auch eine Reihe Programmiersprachen lernt worauf es ankommt.
Ich glaube das ist auch ein Grund warum es wenige richtig gute Programmierer gibt die Einsteigerbücher schreiben: sie wissen dass eine sinnvolle, ihren Standards entsprechende Einführung ein unfassbares Unterfangen ist. Das ist nicht einfach eben die Syntax einer Sprache runterbeten wie das offenbar in den Galileo-Büchern gehandhabt wird, das ist quasi auch die Evolution eines Programmierers nachzuvollziehen was oftmals Jahre dauern kann.
Damit will ich dich jetzt gar nicht entmutigen, ganz im Gegenteil, du solltest am Ball bleiben denn dass einzige Rezept was ich kenne um brauchbar zu programmieren ist es sich ständig zu verbessern.

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
An der Stelle kann man immer ganz gut auf Peter Norvig's Essay Teach Yourself Programming in Ten Years verlinken. 

Naja - trotzdem ist es frustrierend
- man versucht sich wochenlang am Selbststudium nur um dann zu hören das man das grundlegendste nicht verstanden hat - und wenn das zum teil daran liegt das im Buch Dinge schlecht erklärt werden ist es dennoch entmutigend.
Leider gibt es im deutschsprachigen nicht soviel zu der Thematik und noch weniger was wirklich "taugt" - ich weiß das man bei dieser Thematik des Englischen mächtig sein sollte ...aber naja ....bin ich halt nicht

Leider gibt es im deutschsprachigen nicht soviel zu der Thematik und noch weniger was wirklich "taugt" - ich weiß das man bei dieser Thematik des Englischen mächtig sein sollte ...aber naja ....bin ich halt nicht

Ich beschäftige mich seit ~ 4 Jahren in meiner Freizeit mit Python und fühle mich eigentlich immer noch sehr oft wie ein blutiger Anfänger. Daneben "ertappe" ich mich aber auch immer wieder, wie ich Dinge inzwischen verstehen und lösen kann, obwohl ich vor noch nicht langer Zeit dachte, niemals Zugang dazu zu bekommen. Auch kann ich immer öfters Codebeispiele lesen und verstehen, die mich früher einfach nur zum Heulen brachten...Tengel hat geschrieben:... man versucht sich wochenlang am Selbststudium nur um dann zu hören das man das grundlegendste nicht verstanden hat ...

Wenn Du also zu hören bekommst oder auch selbst denkst, dass Du das grundlegendste nicht verstanden hast so ist meine Erfahrung: Einfach mal "sacken" lassen, etwas anderes, das man vielleicht schon ein wenig im Griff hat, trainieren. Das Gehörte oder Gelesene reift auch ohne ständiger bewusster Beschäftigung in einem weiter. Nach einiger Zeit kann man meistens beobachten, wie man quasi "über Nacht" plötzlich etwas begriffen hat.
Aber wie auch immer: Ich kann Dich da echt gut verstehen, das Gefühl, überhaupt nicht weiter zu kommen und nichts begriffen zu haben bringt mich auch oft zum Verzweifeln...

Das war für mich anfangs auch eines der großen Probleme und ist es manchmal immer noch. Mit meinem verstaubten Schulenglisch war und bin ich ständig damit beschäftigt, Wörter nachzuschlagen, um Dokumentationen oder Bücher halbwegs zu verstehen. Und das alles innerhalb einer Materie, an der man sich oft genug selbst mit deutschsprachiger Unterstützung die Zähne ausbeißt.Tengel hat geschrieben:... das man bei dieser Thematik des Englischen mächtig sein sollte ...
Aber auch das relativiert sich mit der Zeit. Man bewegt sich ja innerhalb einer bestimmten Thematik und stößt somit immer wieder auf dieselben Wörter und sogar Phrasen.
Lass also nicht locker: Es geht immer vorwärts. Und selbst das, das Dir momentan noch überhaupt nicht klar werden will wird Dir früher oder später kein Problem mehr machen.
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit
)

Was ab und an hilft ist, zumindest mir: Einfach mal eine andere Sache machen. Damit meine ich nicht Fahrrad fahren das sollte man eh tun.
Sondern sich einfach mal einer anderen Thematik um Python widmen.
Möchte meinen z.B. man tüddelt die ganze Zeit an Web Gedöns herum und irgendwann ist der Punkt erreicht wo es einfach irgendwie hakelt, man sich fest beißt und den Wald vor lauter Bäumen nicht mehr sieht. Dann einen cut machen. Es erstmal ruhen lassen und z.B. mal schauen wie man mit Python eine Konsolenanwendung erstellt o.ä.
Zumindest bei mir ist dann die Lernkurve erstmal wieder sehr steil. Kann man natürlich nur bei privaten Projekten ohne Zeitdruck machen, oder mit einem top Arbeitgeber... Englisch ist nicht nur für Python unablässig, sondern generelle notwendig in der IT, von daher: Sorry but deal with it. Wenn es wirklich zu schwer ist, sollte man evtl. (kenne nun dich nicht in, wie alt, ob Schule oder Student usw.) über einen VHS Kurs nachdenken, lohnt sich jedoch nur, wenn man das Gefühl hat sonst gänzlich aufgeschmissen zu sein. Wenn ich da an mein Schul-Englisch Denke, wars lächerlich... ein Lehrer hatte ich, welcher super Unterricht gab nur leider zu kurz, einen Ami der kaum deutsch konnte...
Aber mit Python bist du auf der sanften Seite.
Wünsche dir weiterhin viel Erfolg und auch wieder Spaß bei der Sache!

Möchte meinen z.B. man tüddelt die ganze Zeit an Web Gedöns herum und irgendwann ist der Punkt erreicht wo es einfach irgendwie hakelt, man sich fest beißt und den Wald vor lauter Bäumen nicht mehr sieht. Dann einen cut machen. Es erstmal ruhen lassen und z.B. mal schauen wie man mit Python eine Konsolenanwendung erstellt o.ä.
Zumindest bei mir ist dann die Lernkurve erstmal wieder sehr steil. Kann man natürlich nur bei privaten Projekten ohne Zeitdruck machen, oder mit einem top Arbeitgeber... Englisch ist nicht nur für Python unablässig, sondern generelle notwendig in der IT, von daher: Sorry but deal with it. Wenn es wirklich zu schwer ist, sollte man evtl. (kenne nun dich nicht in, wie alt, ob Schule oder Student usw.) über einen VHS Kurs nachdenken, lohnt sich jedoch nur, wenn man das Gefühl hat sonst gänzlich aufgeschmissen zu sein. Wenn ich da an mein Schul-Englisch Denke, wars lächerlich... ein Lehrer hatte ich, welcher super Unterricht gab nur leider zu kurz, einen Ami der kaum deutsch konnte...

Aber mit Python bist du auf der sanften Seite.
Wünsche dir weiterhin viel Erfolg und auch wieder Spaß bei der Sache!
Deshalb würde ich es mal mit einem Python-Text in Original und Übersetzung probieren, vorzugsweise mindestens eins von beiden ausleihen oder aus dem Netz holen. Und dann entweder immer wieder vergleichen oder größere Teile erst in der Übersetzung und dann noch mal im Original durcharbeiten. Es hilft erheblich, wenn man die Sache kennt und "nur" die Sprache nicht.mutetella hat geschrieben:Das war für mich anfangs auch eines der großen Probleme und ist es manchmal immer noch. Mit meinem verstaubten Schulenglisch war und bin ich ständig damit beschäftigt, Wörter nachzuschlagen, um Dokumentationen oder Bücher halbwegs zu verstehen. Und das alles innerhalb einer Materie, an der man sich oft genug selbst mit deutschsprachiger Unterstützung die Zähne ausbeißt.Tengel hat geschrieben:... das man bei dieser Thematik des Englischen mächtig sein sollte ...
Aber auch das relativiert sich mit der Zeit. Man bewegt sich ja innerhalb einer bestimmten Thematik und stößt somit immer wieder auf dieselben Wörter und sogar Phrasen.
mutetella
Und immerhin musst Du nicht wissen, wie der Krempel auszusprechen wäre, damit ist es doch schon halb so schlimm.
Wobei Onlinewörterbücher wie z.B. dict.cc es durchaus erlauben, die Wörter auch anzuhören, wenn's einen denn interessiert.bb1898 hat geschrieben:Und immerhin musst Du nicht wissen, wie der Krempel auszusprechen wäre, damit ist es doch schon halb so schlimm.
So nachdem meine Erkältung langsam am abflachen ist und mein Kopf nicht mehr kurz vorm platzen ist kanns weiter gehen.
Na ja ich werde erstmal am Ball bleiben und hoffen.
Aber - wie genau setzt man Funktionen denn dann ein? Im Buch werden die immer so genutzt.
Na ja ich werde erstmal am Ball bleiben und hoffen.
Aber - wie genau setzt man Funktionen denn dann ein? Im Buch werden die immer so genutzt.
Funktionen sollen eine genau definierte Aufgabe lösen.Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein?
Schematisch sieht das ungefähr so aus:
Eingabedaten --> Tu irgendwas damit -> Ausgabedaten
Versuch mal an Deinen Funktionen die Eingabe und Ausgabe zu identifizieren.
Ganz grundlegend: Verwende kein global. Übergebe benötigte Parameter. Schreibe Funktionen nicht so, dass sie eine Endlosrekursion erzeugen können.Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein? Im Buch werden die immer so genutzt.
Ein Beispiel für letzteres:
(Ehe jemand nur die Hälfte liest und das übernimmt: Der Code ist Müll!)
Code: Alles auswählen
def convert(value):
try:
return int(value)
except ValueError:
eingabe()
def eingabe():
number = raw_input('A number please: ')
value = convert(number)
eingabe()
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Genau das ist der Punkt. Stell dir Funktionen wie eine Black-Box vor: Daten kommen rein (Parameter) -> MAGIC -> Daten kommen raus (Rückgabewerte). Eine Funktion erfüllt nach Möglichkeit nur genau eine Aufgabe, so dass sie kurz und überschaubar bleibt. Dabei ist es durchaus gültig und erwünscht viele einzelne Funktionen zu schreiben die für sich genommen simpel sind aber aufeinander aufbauend in der Summe komplexe Dinge machen.Sirius3 hat geschrieben:Funktionen sollen eine genau definierte Aufgabe lösen.Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein?
Schematisch sieht das ungefähr so aus:
Eingabedaten --> Tu irgendwas damit -> Ausgabedaten
Versuch mal an Deinen Funktionen die Eingabe und Ausgabe zu identifizieren.
Das hat den Vorteil, dass die Funktionen einzeln einfacher zu verstehen sind, einfacher zu sehen ist dass sie korrekt sind und einzeln test-bar sind, so dass du einfach eine Funktion mit den gewünschten Eingabgewerten fütterst und es kommen bestimmte Ausgabewerte raus. Das kannst du dann einfach mit allen möglichen Werten testen und wenn immer der erwartete Wert rauskommt ist die Funktion korrekt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Also ich würde ja definitv dazu raten, dass man für jede einzelne Funktion umfangreiche Beweise mithilfe von Hoare-Tripeln führt und die dann komplett in den Docstring setzt. Nur dann ist man so richtig true. 

-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
snafu hat geschrieben:Also ich würde ja definitv dazu raten, dass man für jede einzelne Funktion umfangreiche Beweise mithilfe von Hoare-Tripeln führt und die dann komplett in den Docstring setzt. Nur dann ist man so richtig true.

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@Tengel: Vergiss das einfach. Informatiker-Humor ist 'ne eigenartige Sache. 
Das Hoare-Kalkül zum formalen Beweis der Korrektheit von Algorithmen wird in der Praxis *sehr* selten angewendet.
QuickCheck ist eine Bibliothek die beim Erzeugen von Testfällen für Code helfen soll. Ursprünglich für die Programmiersprache Haskell entwickelt, gibt es mittlerweile Portierungen für eine ganze Menge anderer Programmiersprachen, inklusive für Python: Simple Quickcheck implementation for Python.

Das Hoare-Kalkül zum formalen Beweis der Korrektheit von Algorithmen wird in der Praxis *sehr* selten angewendet.
QuickCheck ist eine Bibliothek die beim Erzeugen von Testfällen für Code helfen soll. Ursprünglich für die Programmiersprache Haskell entwickelt, gibt es mittlerweile Portierungen für eine ganze Menge anderer Programmiersprachen, inklusive für Python: Simple Quickcheck implementation for Python.