ubuntuusers.de

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

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

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Soo, jetzt habe ich geändert:
- die Struktur der Fragen(Ich hoffe so wie es jetzt ist, ist's "logisch"
- alle, ausser ein paar Zeilen(dann 83 oder so) auf '⇐ 79' Zeichen beschränkt
- die letzte funktion mit einer for - schleife versehen

Danke für den Tipp, Lunar:

Noch als Tipp für die Zukunft: "Geht doch" ist kein Qualitätsmerkmal, sondern Vorraussetzung. Ein Programm muss immer "gehen", also seinen Aufgabenzweck erfüllen. Ein gutes >Programm ist darüber hinaus noch sauber entworfen, und elegant und logisch programmiert, so dass das Verständis des Codes vereinfacht wird, was wiederrum die Wartbarkeit >fördert und Fehler vermeidet.

Danke für die Anregung, snafu1!:

Danke für den Tipp mit for..in..range, DasIch

Mr. Kanister hat geschrieben:

http://docs.python.org/tut/node7.html#SECTION007500000000000000000

Also wenn ich das richtig lese, kann man mit liste.keys() nur alle keys auf einmal herauslesen 🙄.
Wenn ich falsch liege, bitte sagen 😉

Script im Anhang.

Gruss

WWM-Neu.py (8.3 KiB)
Download WWM-Neu.py

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Mr. Kanister hat Folgendes geschrieben:

http://docs.python.org/tut/node7.html#SECTION007500000000000000000


Also wenn ich das richtig lese, kann man mit liste.keys() nur alle keys auf einmal herauslesen 🙄.
Wenn ich falsch liege, bitte sagen 😉

Auf die Values(Werte) der dazugehörigen Keys kannst du folgendermaßen zugreifen:

for key in liste.keys():
    print(liste[key])


Oder ich hab dich jetzt falsch verstanden und du möchtest doch was anderes 😉

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Ich möchte ja auf die einzelnen keys der liste zugreifen können.
Also z.B. bei:

liste = { 2 : ['Hallo'], 3 : ['Ciao'] } 


möchte ich einzeln die keys 2 und 3 rausfischen ☺

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

N3X0NIC hat geschrieben:

Ich möchte ja auf die einzelnen keys der liste zugreifen können.
Also z.B. bei:

liste = { 2 : ['Hallo'], 3 : ['Ciao'] } 


möchte ich die einzeln die keys 2 und 3 rausfischen ☺

Wenn du doch weißt, wie die Keys heißen, die du abfragen willst, dann benutzt die eckigen Klammern:

>>> liste = { 2 : ["Hallo"], 3 : ["Ciao"] }
>>> print(liste[2])
['Hallo']
>>> print(liste[3])
['Ciao']
>>> print(liste[3][0])
Ciao


'liste[3][0]' deswegen, weil du als Value zu den Keys ja Arrays angibst. Wenn man nur 'liste[3]' angibt, dann erhält man das ganze Array.

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Oops, hab mich schon wieder missverständlich ausgedrückt:
Also ich möchte, dass ich bei dem Beispiel die einzelnen keys, also 2 und 3, ausgeben kann.
Also sowas in die Richtung:

>>> liste = { 2 : ['Hallo'], 3 : ['Ciao'] } 
>>> liste.key[0]
2
>>> liste.key[1]
3


Nur dass es so nicht klappt

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

ROFL...du willst mehrfache Indirektion 😲
*SCNR*

Ne...mal im Ernst. Wenn du mit 'liste.key[0]' auf einen Key zugreifen könntest, dann könntest du doch auch direkt auf einen Inhalt (Value) zugreifen.

Das Problem ist auch - ok, genau genommen "it's not a bug it's a feature" - , dass die einzelnen Elemente eines dicts NICHT geordnet abgelegt werden, weshalb du mit 'liste.key[0]' theoretisch sowieso immer auf ein anderes Element zugreifen würdest.

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Dann frag ich mich aber wie ich das machen soll:
Marc 'BlackJack' Rintsch hat geschrieben:

Auch hier sind wieder magische Konstanten, die man sich aus fragen holen kann. Dort stehen die Beträge schliesslich schon einmal.

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Du willst folgendes, oder?

>>> liste
{100: [['frage1', ('a', 'b'), 'a'], ['frage2', ('a', 'b'), 'b']]}
>>> import random
>>> random.choice(liste[100])
['frage1', ('a', 'b'), 'a']
>>> random.choice(liste[100])
['frage2', ('a', 'b'), 'b']


Wenn du jetzt noch aus dem dict "stufe" eine Liste machst, kannst du zB. über

random.choice(liste[stufe[3]])


auf eine beliebige Frage der Stufe 3 zugreifen.

(ich hoffe ich hab jetzt verstanden was du willst/wolltest ☺ )

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Naja, zufällige Frage hab ich ja schon durch

def frage_stellen(wert,stop_wert):

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

aber die Frage ist glaub ich eher, ob ICH Marc 'BlackJack' Rintsch richtig verstanden habe.
Das war ja der einzige Grund, warum ich das wissen wollte, obwohl ich, so, wie ich das von Marc 'BlackJack' Rintsch verstanden habe, für überflüssig halte.
Aber wie gesagt als Anfänger kann ich das leider noch nicht beurteilen, wie man das an der Fragenstruktur gesehen hat 😬

Also frag ich einfach mal so, ist der code wie er jetzt ist, logisch, verständlich und übersichtlich...?

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Also frag ich einfach mal so, ist der code wie er jetzt ist, logisch, verständlich und übersichtlich...?

Vielleicht ein paar einzelne Punkte, die auch schon genannt wurden:

Du benutzt Tabs. Benutze zum Einrücken Leerzeichen. In den meisten Editoren kannst du einstellen, dass Tabs durch eine bestimmte Anzahl an Leerzeichen ersetzt werden sollen.
Schau dir dazu unbedingt auch nochmal das Python Style Guide an.

if eingabe == loesung:
return True


Hier kannst du auch einfach schreiben:

return(eingabe == loesung)
def entwerten(frage,antworten,loesung,eingabe,wert,stop_wert):


Stehen "frage", "antworten" und "loesung" nicht immer alle zusammen in einer Liste? Was passiert mit "stop_wert" im Laufe des Skritps?

stufe = { 0 : [0],
	  1 : [50],
	  2 : [100],
	  3 : [200],
	  4 : [300],
	  5 : [500],
	  6 : [1000],
	  7 : [2000],
	  8 : [4000],
	  9 : [8000],
	 10 : [16000],
	 11 : [32000],
	 12 : [64000],
	 13 : [125000],
	 14 : [500000],
	 15 : [1000000]
	} 


Wenn du dafür schon extra was eigenes anlegst, warum dann ein dict und keine Liste?

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Du benutzt Tabs. Benutze zum Einrücken Leerzeichen. In den meisten Editoren kannst du einstellen, dass Tabs durch eine bestimmte Anzahl an Leerzeichen ersetzt werden sollen.
Schau dir dazu unbedingt auch nochmal das Python Style Guide an.

Achja, das hab ich ganz vergessen 😉

Hier kannst du auch einfach schreiben:

return(eingabe == loesung

Hab ich ebend ausprobiert, dann fragt er nicht nach, ob ich wirklich aufhören möchte, wenn ich 's' drücke 🙄

Stehen "frage", "antworten" und "loesung" nicht immer alle zusammen in einer Liste?

in einer Liste im dict, ja, aber die möglichen Antworten stehen in einem Tupel(?) innerhalb der Liste. Alles auf Hinweis von snafu1:
http://forum.ubuntuusers.de/post/1431365/

Was passiert mit "stop_wert" im Laufe des Skritps?

"stop_wert" ist der Wert des Geldbetrags immer der letzten Frage. Der wird dann ausgegeben, wenn man bei einer Frage aufhört, siehe:

def auswerten(frage,antworten,loesung,eingabe,wert,stop_wert):
		if entwerten(frage,antworten,loesung,eingabe,wert,stop_wert) == False:
			print "$$$ Du gehst mit",stop_wert,"Euro nach Hause! $$$"


Festgelegt wird er hier:

stufe = { 0 : [0],
	  1 : [50],
	  2 : [100],
	  3 : [200],
	  4 : [300],
	  5 : [500],
	  6 : [1000],
	  7 : [2000],
	  8 : [4000],
	  9 : [8000],
	 10 : [16000],
	 11 : [32000],
	 12 : [64000],
	 13 : [125000],
	 14 : [500000],
	 15 : [1000000]
	}

...

def alle_fragen_stellen():
	for i in range(15):
		j = i+1
		frage_stellen(stufe[j][0],stufe[i][0])


das zweite Argument in "def frage_stellen()" wird damit belegt.

Allerdings fällt mir auch gerade auf, dass "stop_wert" in "def entwerten()" nichts bewirkt, nur in "def auswerten()" und somit auch "def frage_stellen()"

Wenn du dafür schon extra was eigenes anlegst, warum dann ein dict und keine Liste?

Weil ich, wie gesagt noch ziemlich am "Anfang der Sprache" und somit noch nicht konfirm mit den verschiedenen Möglichkeiten bin- eine Liste hab ich z.B. noch nie benutzt.
Warum ich dann ein dict, def, ... kenne?
Nunja, weil mir Ein Stein diese erklärt hat, nachdem ich ihm meinen ersten Versuch mit WWM(siehe Anhang) zeigte.

Was ich dann jetzt verbessern werde ist:
- ändern der Tabs in Leerzeichen
- ändern des "stufe"-dicts in eine liste
- die in "def entwerten()" enthaltenen Argumente auf die nötigen beschränken

Gruss

WWM-ALT.py (121.9 KiB)
Allererster Versuch mit WWM :[]
Download WWM-ALT.py

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

N3X0NIC hat geschrieben:

Hier kannst du auch einfach schreiben:

return(eingabe == loesung

Hab ich ebend ausprobiert, dann fragt er nicht nach, ob ich wirklich aufhören möchte, wenn ich 's' drücke 🙄

Tschuldige, mein Fehler. In der konstellation musst du es so machen, weil return eine Funktion immer sofort beendet .

N3X0NIC hat geschrieben:

Stehen "frage", "antworten" und "loesung" nicht immer alle zusammen in einer Liste?

in einer Liste im dict, ja, aber die möglichen Antworten stehen in einem Tupel(?) innerhalb der Liste.

Na und!? 😉

>>> fragen
{50: [['Wer ist Bundeskanzler?', ('a) Anneliese Ferkel', 'b) Angela Merkel', 'c) Agathe Gerkel', 'd) Alice Jerkel'), 'b'], ['Was hiervon kann man essen?', ('a) Orangenkoffer', 'b) Apfeltasche', 'c) Kirschsack', 'd) Erdbeerranzen'), 'b']]}
>>> fragen[50][1][1][2]
'c) Kirschsack'


Anhand des Index-Wirrwarrs siehst du aber schon, dass es vielleicht sinnvoll wäre, über die Struktur und Speicherung der Fragen ein wenig nachzudenken. Ich hab zwar jetzt spontan keine Idee, aber ich bin sicher, dass man es eleganter lösen kann.😉

N3X0NIC hat geschrieben:

Allerdings fällt mir auch gerade auf, dass "stop_wert" in "def entwerten()" nichts bewirkt, nur in "def auswerten()" und somit auch "def frage_stellen()"

Richtig ... du stiftest durch die ganzen Funktionparameter aber auch ordentlich Verwirrung 😀

N3X0NIC hat geschrieben:

Weil ich, wie gesagt noch ziemlich am "Anfang der Sprache" und somit noch nicht konfirm mit den verschiedenen Möglichkeiten bin- eine Liste hab ich z.B. noch nie benutzt.

Hatte vermutet, dass du dir ein kurzes Tutorial angeguckt hast. Dort werden die Basisdatentypen nämlich in der Regel recht früh aufgegriffen.

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Na und!? 😉

>> fragen
{50: [['Wer ist Bundeskanzler?', ('a) Anneliese Ferkel', 'b) Angela Merkel', 'c) Agathe Gerkel', 'd) Alice Jerkel'), 'b'], ['Was hiervon kann man essen?', ('a) Orangenkoffer', 'b) Apfeltasche', 'c) Kirschsack', 'd) Erdbeerranzen'), 'b']]}
>> fragen[50][1][1][2]
'c) Kirschsack'


Anhand des Index-Wirrwarrs siehst du aber schon, dass es vielleicht sinnvoll wäre, über die Struktur und Speicherung der Fragen ein wenig nachzudenken. Ich hab zwar jetzt spontan keine Idee, aber ich bin sicher, dass man es eleganter lösen kann.😉

Index Wirrwarr? hab ich ja aufgrund der Anregung von snafu1 nicht mehr 😉
Speicherung der Fragen: Ich denke, wenn DIR schon spontan nichts einfällt, wie sollte es mir einfallen ❓ ▶ 😊 😀 😬

du stiftest durch die ganzen Funktionparameter aber auch ordentlich Verwirrung

Also ich steig durch 😈 😈

Hatte vermutet, dass du dir ein kurzes Tutorial angeguckt hast. Dort werden die Basisdatentypen nämlich in der Regel recht früh aufgegriffen.

Tutorial Jein, habe ein Buch angefangen zu lesen. Da ich aber vorerst keine Lust hatte zu lesen, hab ich einfach etwas praktisches angefangen, WWM 😀!
Was daraus zuerst geworden ist, sieht man in meinem letzten anhang 😬

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Soo, jetzt keine tabs mehr 😀
"stufe" nicht mehr als dict sondern als liste
die in "def entwerten()" enthaltenen Argumente auf die nötigen beschränkt

WWM-0.2.1.py (10.6 KiB)
Download WWM-0.2.1.py

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

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