ubuntuusers.de

TypeError: 'str' object is not callable (Python)

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Senex

Anmeldungsdatum:
17. September 2007

Beiträge: 88

*mischt sich einfach mal ohne jegliche Kompetenz ein*

Nicht, dass es jetzt bei dem konkreten Problem riesig was bringen würde, aber du könntest beispielsweise die Fragen als Klasse implementieren. Früher oder später wirst du vielleicht mal objektorientiert programmieren wollen, und da ist es dann nicht schlecht, wenn du es schon mal an einem einfachen Beispiel geübt hast.

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

*mischt sich einfach mal ohne jegliche Kompetenz ein*

Das würde ich nicht behaupten....Die Idee ist einfach Klasse (Haha...Wortspie 😀 l)

Fühl dich von nun an zu den kompetenten gehörend ☺

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Mr. Kanister hat geschrieben:

N3X0NIC hat geschrieben:

die in "def entwerten()" enthaltenen Argumente auf die nötigen beschränkt

Ich bin zu dem Ergebnis gekommen, dass es doch recht sinnvoll ist, die Liste so auf zu splitten, wie snafu1 beschrieben hat; allerdings erst innerhalb der Funktion.
Dann hast du kein Parameter-Wirrwarr und keinen Index-Wahn (Der Nachfolger von Rinder-Wahn 😀 )

wird doch innerhalb der funktion aufgesplittet:

def frage_stellen(wert,stop_wert):

    frage, antworten, loesung = random.choice(fragen[wert])

...die Fragen als Klasse implementieren...

Klasse? Wie? Wo? Was?

Senex

Anmeldungsdatum:
17. September 2007

Beiträge: 88

Klasse_(objektorientierte_Programmierung)

Für eine Frage könnte das uuuungefähr so aussehen: (Man verzeihe mir das Nicht-Nutzen der Python-Syntax, kann kein Python [darauf bezog sich auch meine Inkompetenz 😉], auch wenn es ganz oben auf meiner Liste der noch zu lernenden Sprachen steht. [da stehen gar nicht mehr soo viele … 😉])

Klasse Frage
Feld Frage #Ein String mit der Frage
Feld Antwortmöglichkeiten #Ein Array mit den Antwortmöglichkeiten
Feld Richtige Antwort #Der Index der richtigen Antwort
Methode Antwort richtig? #Eine Funktion, die eine Zahl annimmt, mit dem Index der richtigen Antwort vergleicht und je nachdem True oder False zurückschmeißt
# Vielleicht auch noch, je nach geplanter Struktur
Feld Wert #Wie viel Euro man für die Frage kriegt

Drum rum könnte man noch eine Klasse für das Spiel selbst bauen. Falls du Klassen noch nicht kennst, überleg dir, ob du sie kennenlernen willst (Ja! Du willst!), wenn ja ist das Programm vielleicht gar nicht soo schlecht, weil du ja den Code an sich schon hast und das ganze nur noch in Klassen verpacken musst.

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Eigentlich habe ich nicht vor mich gleich zu überstürzen 😲 😬
Ich denke Klassen sind noch ETWAS zu früh... 🙄
Vor allem weil ich in meinem 600 Seiten Buch erst auf S 88 bin und Klassen auf 280 vorkommen.
Praktisch sollte ich eigentlich noch nicht einmal den if-befehl können.

Ausserdem ist das Programm von Inhaltlichen Funktionen noch nichtmal fertig. So war mein Verlauf geplant:

|>>> 0.3 <<<
|\––\––\––\––\–––
|# Frage, ob nochmal spielen
|# insgesamt eine bessere Übersicht und strukturierterer Aufbau der Fragen und der Eingabezeilen(während des Spielens) (→ strukturierterer Aufbau der Antwortmöglichkeiten

________________________________________________________________________________
|>>> 0.4 <<<
|\––\––\––\––\–––
|# pro Stufe 8 Fragen mehr

________________________________________________________________________________
|>>> 0.8 <<<
|\––\––\––\––\–––
|# Auswahlrunde mit 2 Auswahlfragen

________________________________________________________________________________
|>>> 0.9 <<<
|\––\––\––\––\–––
|# 3 Auswahlfragen mehr

________________________________________________________________________________
|>>> 1.0 <<<
|\––\––\––\––\–––
|# Alle Joker

________________________________________________________________________________
|>>> 1.1 <<<
|\––\––\––\––\–––
|# pro Stufe 5 Fragen mehr

Sprich: Es kommen noch ganz andere Probleme auf mich zu 😉

Aber trotzdem Danke für den Tipp 😉
Vielleicht werde ich, wenn ich in ein paar Monaten weiter mit Python bin, das Programm "umbauen"
Vorerst kümmer ich mich aber darum, dass das Programm alle WWM-Artigen Funktionen besitzt, ausser diesem neuen "Risiko Joker", weil ich den doof finde 😛 😀

Gruss

Senex

Anmeldungsdatum:
17. September 2007

Beiträge: 88

Klingt vernüftig. Sehr vernünftig. Schön, dass es vernünftige Leute gibt, die sich nicht immer gleich übernehmen. (Ich will ein Betriebssystem schreiben! Mit Python! – Ja klaaar …)

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Pass auf ❗

Sonst tippe ich gleich ein Betribssystem mit meinem CASIO fx-9750G Plus Taschenrechner 😬 😀

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Dein Code wäre leichter zu lesen wenn du die Reihenfolge der Funktionen gemäß dem Ablauf im Spiel einhalten würdest. Aber bei dir kommt erst das Logo, dann die Entwertung und sehr viel später erst das Fragestellen. Hat es einen Grund warum du das so machst? Außerdem ist besonders das Auswerten eine ziemlich große Funktion geworden. Das könnte man ja auch nochmal aufteilen. 😉

Du musst übrigens auch nicht soviele prints machen. Probier mal das aus:

betrag = '100'
print '''Herzlichen Glückwunsch!
Du gehst mit %s Euro nach Hause :-)''' % betrag

Dabei sagt %s, dass an dieser Stelle ein String eingesetzt werden soll, welcher am Ende durch % stringname benannt wird.

Und wenn alle Elemente deines Antworten-Tupels (übrigens würde an der Stelle auch ne Liste gehen) untereinander angezeigt werden sollen, kannst du das auch so lösen:

for antwort in antworten:
    print antwort

Sollten jetzt nur ein paar Hinweise sein, die einfach helfen, dass auch jemand anders oder du selber in 3 Monaten immer noch weißt was da überhaupt passiert ohne dich großartig durch den Code hin- und herwühlen zu müssen. Ändert nichts am Programmablauf, aber erleichtert das Lesen und Verstehen ungemein. 😉

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Dein Code wäre leichter zu lesen wenn du die Reihenfolge der Funktionen gemäß dem Ablauf im Spiel einhalten würdest. Aber bei dir kommt erst das Logo, dann die Entwertung und sehr viel später erst das Fragestellen. Hat es einen Grund warum du das so machst?

Ich weis gar nicht mehr genau, warum ich es gemacht hatte, aber ich glaube, ich dachte, dass erst die funktion definiert werden muss bevor man sie startet, aber er läuft sie ja am anfang eeh alle einmal durch, sodass ich sie jetzt in die richtige Reihenfolge gebracht habe.

Außerdem ist besonders das Auswerten eine ziemlich große Funktion geworden. Das könnte man ja auch nochmal aufteilen.

Das stimmt! Done!

Du musst übrigens auch nicht soviele prints machen. Probier mal das aus:

betrag = '100'
print '''Herzlichen Glückwunsch!
Du gehst mit %s Euro nach Hause :-)''' % betrag

find ich persönlich unpraktisch, weil, wenn der text z.b. eingerückt ist, also so:

def blabla():
    if foo == bar:
        if bar == foo:
            print '''Irgendwas
                     anderes
                     nochwas'''


dann wird er auch bei der ausgabe eingerückt angezeigt. Ich könnte natürlich die 2. und 3. zeile ganz an den rand machen, aber das ist dann auch schon wieder unübersichtlich.

for antwort in antworten:
    print antwort

geht auch, aber dann hat es nicht mehr "den bezug zur ausgabe" wie wenn ich es so mache wie ich es mache.

Denn so wie ich es habe, kann man sofort erkennen, dass so die antworten angezeigt werden.

So hier der neue Code:

WWM-0.3.py (13.0 KiB)
Download WWM-0.3.py

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

N3X0NIC hat geschrieben:

find ich persönlich unpraktisch, weil, wenn der text z.b. eingerückt ist, also so:

def blabla():
    if foo == bar:
        if bar == foo:
            print '''Irgendwas
                     anderes
                     nochwas'''


dann wird er auch bei der ausgabe eingerückt angezeigt. Ich könnte natürlich die 2. und 3. zeile ganz an den rand machen, aber das ist dann auch schon wieder unübersichtlich.

Soweit ich weiß erlaubt Python das auch gar nicht. Du bist eigentlich zu diesen Einrückungen gezwungen.

N3X0NIC hat geschrieben:

for antwort in antworten:
    print antwort

geht auch, aber dann hat es nicht mehr "den bezug zur ausgabe" wie wenn ich es so mache wie ich es mache.
Denn so wie ich es habe, kann man sofort erkennen, dass so die antworten angezeigt werden.

Sorry, aber was soll for antwort in antworten denn wohl sonst implizieren?

Okay, vielleicht sind die for-Schleifen ja noch nicht so vertraut...

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Sorry, aber was soll for antwort in antworten denn wohl sonst implizieren?

Da hast du schon Recht aber wenn ich es so mache, wie ich es habe, dann ist, so wie der Code in dem Teil aussieht, auch gleichzeitig schon die Struktur, wie es in der Ausgabe aussehen wird. Das meine ich damit 😉

Okay, vielleicht sind die for-Schleifen ja noch nicht so vertraut...

Jein, weis schon wie sie arbeiten und wozu sie gut sind, aber wenn ich z.B. nach einer Lösung für etwas suche, dann würde mir, falls die for-schleife eine Lösung eines Problems wäre, bestimmt nicht sofort soetwas einfallen.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Naja, vielleicht änderst du ja deine Meinung wenn du irgendwann mal 25 Elemente wiedergeben musst oder wenn gar nicht bekannt ist wieviele Elemente deine Liste zur Laufzeit haben wird.

Übrigens lässt sich das Spiel auch beenden wenn man bei der Frage "wirklich aufhören" irgendwas außer n eingibt (also auch andere Sachen als j). Ich weiß ja nicht ob das so von dir gewollt ist.

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Naja, vielleicht änderst du ja deine Meinung wenn du irgendwann mal 25 Elemente wiedergeben musst oder wenn gar nicht bekannt ist wieviele Elemente deine Liste zur Laufzeit haben wird.

Meine Meinung bezieht sich gerade ausschließlich auf WWM.
4 != 25

Übrigens lässt sich das Spiel auch beenden wenn man bei der Frage "wirklich aufhören" irgendwas außer n eingibt (also auch andere Sachen als j). Ich weiß ja nicht ob das so von dir gewollt ist.

Ist leider nicht gewollt, hab ebend "def entwerten" so umgeschrieben:

def entwerten(loesung,eingabe):
    # Frage Richtig -> Weiter
    if eingabe == loesung:
        return True

    # Aufhoeren ?
    if eingabe == 's':
        stop = raw_input("Wirklich aufhoeren? [j/n] ")
        print 55*'-'
        
       if stop !=  'j' and stop !='n':
            raw_input("))) Falsche Eingabe (((")
            entwerten(loesung,eingabe)
       else:
            return stop == 'n'


Aber wenn ich jetzt erst ein 's', dann etwas falsches und dann ein 'j' eingebe, wiederholt er die Frage Trotzdem 🙄 ☹
Keine Ahnung warum

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

N3X0NIC hat geschrieben:

Ist leider nicht gewollt, hab ebend "def entwerten" so umgeschrieben:

def entwerten(loesung,eingabe):
    # Frage Richtig -> Weiter
    if eingabe == loesung:
        return True

    # Aufhoeren ?
    if eingabe == 's':
        stop = raw_input("Wirklich aufhoeren? [j/n] ")
        print 55*'-'
        
       if stop !=  'j' and stop !='n':
            raw_input("))) Falsche Eingabe (((")
            entwerten(loesung,eingabe)
       else:
            return stop == 'n'


Aber wenn ich jetzt erst ein 's', dann etwas falsches und dann ein 'j' eingebe, wiederholt er die Frage Trotzdem 🙄 ☹
Keine Ahnung warum

Du sollst doch keine Rekursion einbauen 😀

Mach einfach innerhalb der Funktion eine while Schleife auf:

while (eingabe != "j" or eingabe != "n"):
...

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

while (stop != "j" and eingabe != "n"): 
    raw_input ("))) Falsche Eingabe (((")


Und danach 🙄 ❓