ubuntuusers.de

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

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

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

def stopfrage():
    antwort = raw_input('Wirklich aufhoeren? ')
    if antwort == 'j':
        print 'Wir hoeren auf'
    elif antwort == 'n':
        print 'Wir machen weiter'
    else:
        print 'Ungueltige Eingabe'
        stopfrage()

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Nach die while Schleife kommt einfach der Code, der ausgeführt werden soll, wenn die Eingabe richtig war. 😉

Solange nicht "j" oder "n" eingegeben wurde, bleibt das Programm in der Schleife.

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

## Hier gehts mit dem Code weiter


So in etwa sollte das leicht zu lösen sein.

@snafu1:
Die Rekursion möchte ich ja gerade vermeiden 😉

Gruß Martin

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Hab ich ja so gemacht:

def entwerten(loesung,eingabe):
    if eingabe == loesung:
        return True

    
    if eingabe == 's':
        stop = raw_input("Wirklich aufhoeren? [j/n] ")
        print 55*'-'

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

Aber wenn ich dann etwas falsche, z.b. f, eingebe, dann kommt ja immer wenn ich enter drücke 'Falsche Eingabe'.
So:

Antwort: s
Wirklich aufhoeren? [j/n] f
-------------------------------------------------------
))) Falsche Eingabe (((
))) Falsche Eingabe (((
))) Falsche Eingabe (((
...

Gruss
N3X0N!C

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

N3X0NIC hat geschrieben:

Hab ich ja so gemacht:

def entwerten(loesung,eingabe):
    if eingabe == loesung:
        return True

    
    if eingabe == 's':
        stop = raw_input("Wirklich aufhoeren? [j/n] ")
        print 55*'-'

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

Aber wenn ich dann etwas falsche, z.b. f, eingebe, dann kommt ja immer wenn ich enter drücke 'Falsche Eingabe'.

Du wertest die erneute Eingabe ja auch nicht aus!
So wie du es machst könntest du statt "raw_input()" auch einfach "print" schreiben.

Lies also die neue Eingabe des Benutzers ein:

while (stop != "j" and stop != "n"): 
    stop = raw_input("Falsche Eingabe! [j/n]: ")

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Wenn du mit Return abbrechen willst, musst du das auch in den Code schreiben. Hier mal mit Returnwerten:

def stopfrage():
    antwort = raw_input('Wirklich aufhoeren? ')
    if antwort == 'j':
        print 'Wir hoeren auf'
        return True
    elif antwort == 'n':
        print 'Wir machen weiter'
        return False
    elif antwort == '':
        print 'Abbruch, weil nichts geschrieben'
        return None
    else:
        print 'Ungueltige Eingabe'
        return stopfrage()

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

@ Mr. Kanister
whoops 😳
Das hab ich glatt übersehen, Danke ☺

Gruss

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

snafu1 hat geschrieben:

Wenn du mit Return abbrechen willst, musst du das auch in den Code schreiben. Hier mal mit Returnwerten:

def stopfrage():
    antwort = raw_input('Wirklich aufhoeren? ')
    if antwort == 'j':
        print 'Wir hoeren auf'
        return True
    elif antwort == 'n':
        print 'Wir machen weiter'
        return False
    elif antwort == '':
        print 'Abbruch, weil nichts geschrieben'
        return None
    else:
        print 'Ungueltige Eingabe'
        return stopfrage()

Und nochmal. Nein! Keine Rekursion!

Stell dir vor der Benutzer gibt 100x das Falsche ein. Dann wird die Funktion 100 mal aufgemacht, was einfach nur unnötig ist. 😉

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Mr. Kanister hat geschrieben:

@snafu1:
Die Rekursion möchte ich ja gerade vermeiden 😉

Wenn ich die vier verschiedenen Möglichkeiten jeweils gesondert behandeln will, muss ich das IMHO so schreiben.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Mr. Kanister hat geschrieben:

Und nochmal. Nein! Keine Rekursion!

Stell dir vor der Benutzer gibt 100x das Falsche ein. Dann wird die Funktion 100 mal aufgemacht, was einfach nur unnötig ist. 😉

Der Sinn von Funktionen ist es aber doch gerade, mehrfach verwendbar zu sein. Und genau dieser Fall besteht in meinem Beispiel.

Oder sprichst du von 100 gleichzeitig offenen Funktionen? Also ich gehe davon aus, dass durch return immer die vorherige geschlossen wird, oder nicht?

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Mal von dem Argument "böse Rekursion" abgesehen...

Warum sollte man den Benutzer solange fragen, bis etwas richtiges eingegeben wurde?
Man kann auch einfach die wichtig der Frage und eine damit verbunden Standard-Wert vorgeben:

def confirm(question="Möchten Sie fortfahren [J/n]? ", key="N"):
    return(key not in str(raw_input(question)).upper())


Alles außer "n/nein/no", etc. bedeutet: Mach weiter.

Nimm apt-get als Beispiel: wenn es eine Ja/Nein Frage gibt und mann etwas außer J/N/"" eingibt, dann wird das als Abbruch interpretiert. Und das Verhalten finde ich auch gut.

@N3X0NIC:
Mir fällt gerade auf, dass du bei meinem Beispiel eventuell mit einer globalen Variable arbeiten musst, da innerhalb von Schleifen neue Namensräume eröffnet werden, durch die die Variablen außerhalb der Schleife nicht verändert werden.

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

@N3X0NIC:
Mir fällt gerade auf, dass du bei meinem Beispiel eventuell mit einer globalen Variable arbeiten musst, da innerhalb von Schleifen neue Namensräume eröffnet werden, durch die die Variablen außerhalb der Schleife nicht verändert werden.

Funktioniert aber alles wie es soll 😉

Gruss

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

snafu1 hat geschrieben:

Oder sprichst du von 100 gleichzeitig offenen Funktionen? Also ich gehe davon aus, dass durch return immer die vorherige geschlossen wird, oder nicht?

nein, wird sie ja nicht.
return bedeutet ja, das die funktion beendet wird mit dem wert hinter return
wenn dieser aber erneut eine funktion ist, muss diese erst aufgerufen werden, und wenn da wieder ein return mit funktion ist, wird die wiederaufgerufen, und wenn...

das frisst unnötig speicher

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

@Kanister:
Joa, jetzt siehts vernünftig aus.

BadBoy hat geschrieben:

snafu1 hat geschrieben:

Oder sprichst du von 100 gleichzeitig offenen Funktionen? Also ich gehe davon aus, dass durch return immer die vorherige geschlossen wird, oder nicht?

nein, wird sie ja nicht.
return bedeutet ja, das die funktion beendet wird mit dem wert hinter return
wenn dieser aber erneut eine funktion ist, muss diese erst aufgerufen werden, und wenn da wieder ein return mit funktion ist, wird die wiederaufgerufen, und wenn...

das frisst unnötig speicher

Ah okay. Das war mir nicht bewusst.

Antworten |