Neuling sucht Rat

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.
BlackJack

@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?
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Code: Alles auswählen

d = open("traffic.bin","r")
    traffic = pickle.load(d)
    d.close()
    traffic = traffic+neuer_verbrauch

Hm ich vermute das ist Falsch weil r sagt nur lesen - also kann ich da nichts ändern?
Bzw. wird auch versucht die variable traffic zu ändern nachdem die Datei wieder geschlossen wurde.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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.

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()
                
        


BlackJack

@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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
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.

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
BlackJack

An der Stelle kann man immer ganz gut auf Peter Norvig's Essay Teach Yourself Programming in Ten Years verlinken. :-)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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 :(
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Tengel hat geschrieben:... man versucht sich wochenlang am Selbststudium nur um dann zu hören das man das grundlegendste nicht verstanden hat ...
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... :wink:
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... :(
Tengel hat geschrieben:... das man bei dieser Thematik des Englischen mächtig sein sollte ...
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.
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 ;-) )
seishin
User
Beiträge: 87
Registriert: Montag 19. Dezember 2011, 16:42

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!
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

mutetella hat geschrieben:
Tengel hat geschrieben:... das man bei dieser Thematik des Englischen mächtig sein sollte ...
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.
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
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.

Und immerhin musst Du nicht wissen, wie der Krempel auszusprechen wäre, damit ist es doch schon halb so schlimm.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

bb1898 hat geschrieben: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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein?
Funktionen sollen eine genau definierte Aufgabe lösen.
Schematisch sieht das ungefähr so aus:
Eingabedaten --> Tu irgendwas damit -> Ausgabedaten
Versuch mal an Deinen Funktionen die Eingabe und Ausgabe zu identifizieren.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein? Im Buch werden die immer so genutzt.
Ganz grundlegend: Verwende kein global. Übergebe benötigte Parameter. Schreibe Funktionen nicht so, dass sie eine Endlosrekursion erzeugen können.

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()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sirius3 hat geschrieben:
Tengel hat geschrieben:Aber - wie genau setzt man Funktionen denn dann ein?
Funktionen sollen eine genau definierte Aufgabe lösen.
Schematisch sieht das ungefähr so aus:
Eingabedaten --> Tu irgendwas damit -> Ausgabedaten
Versuch mal an Deinen Funktionen die Eingabe und Ausgabe zu identifizieren.
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.

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
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :cool:
Leonidas
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. :cool:
:D Und nicht vergessen Quickcheck zu nutzen!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

für jede einzelne Funktion umfangreiche Beweise mithilfe von Hoare-Tripeln führt
Und nicht vergessen Quickcheck zu nutzen!

:?:
BlackJack

@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.
Antworten