error mit ">"

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.
Antworten
Ullimell
User
Beiträge: 3
Registriert: Montag 13. April 2020, 12:32

Hallo Pythoner,

Da, auf Grund von Coruna, viel Zeit versuche ich mich ein klein wenig in programmieren.
Bei mir läuft Python Version 3.6.9 und Tk Version 8.6.8.
In einem Tutorial komme ich einfach nicht weiter. Bekomme in meinem script folgende Meldung:

TypeError: '>' not supported between instances of 'str' and 'int'

Was könnte ich da ändern.

Auch ein copy und paste des Tutorialscriptes gib diese Fehlermeldung aus.
Eine Googlrecherche war nicht Ziehlführend.
Hoffe auf Eure Hilfe.

ullimell
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Indem Du zwei Zahlen miteinander vergleichst. Aber ohne Code kann man da nicht viel mehr sagen.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Noch mal die Ursache, die ja eigentlich ziemlich deutlich in der Fehlermeldung steht, an einem Beispiel verdeutlicht:

Code: Alles auswählen

In [498]: "42" > 23                                                             
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-498-d31f8d5e21f8> in <module>
----> 1 "42" > 23

TypeError: '>' not supported between instances of 'str' and 'int'
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ullimell hat geschrieben: Montag 13. April 2020, 13:01 Auch ein copy und paste des Tutorialscriptes gib diese Fehlermeldung aus.
Ist das Tutorialskript vielleicht noch auf das nicht mehr unterstützte Python 2 ausgelegt? Da ging so ein Vergleich noch, brachte dann aber andere Ergebnisse als der Anwender erwartete. Deshalb geht es jetzt zu Recht nicht mehr.
unknown_user_123
User
Beiträge: 27
Registriert: Dienstag 14. April 2020, 09:32

Wenn ich es richtig sehe, dann handelt es sich bei "42" um einen String und bei 23 um einen Integer. Diese kann man nicht miteinander vergleichen. Wenn sie den Link von dem Tutorial schicken könnt ich mir villeicht kurz ansehen, was falsch erklärt wurde, falls das Tutorial kostenlos ist.
Ullimell
User
Beiträge: 3
Registriert: Montag 13. April 2020, 12:32

Hier das scipt:





import random
ratezahl = random.randint(0,100)
durchgang = 0
aktiv = True
while aktiv:
print(durchgang)
durchgang = durchgang + 1
benutzereingabe = input("Bitte Zahl eingeben: ")
if benutzereingabe == ratezahl:
print("Gewonnen! Zahl richtig")
aktiv = False
break
elif benutzereingabe > ratezahl:
print("Zahl zu groß")
else:
print("Zahl zu klein")
if (durchgang == 7):
print("Schade. Leider verloren")
print("Es wäre die Nummer " + str(ratezahl))
aktive =False
if (benutzereingabe == "ende"):
aktiv = False
print("Ende des Spiels")

Hier die Fehlermeldung

0
Bitte Zahl eingeben: 67
Traceback (most recent call last):
File "/home/ulli/Python-TESTS/1 AUS 7.py", line 17, in <module>
elif benutzereingabe > ratezahl:
TypeError: '>' not supported between instances of 'str' and 'int'
>>>

Gruß
ullimell
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Eingaben, die du mit 'input()' entgegen nimmst, sind Strings. Du musst sie mit 'int()' in eine Ganzzahl umwandeln, damit der Vergleich funktioniert.
Ullimell
User
Beiträge: 3
Registriert: Montag 13. April 2020, 12:32

@ nezzcarth,

habe es nun begriffen wenn ein input aus einer Eingabe besteht muss dieses mit int () beginnen.

Beispiel: int (input()).

Danke für die Erklärung.

ullimell
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ullimell: Anmerkungen zum Quelltext:

Die Klammern um die Bedingungen bei zwei der ``if``-Anweisungen sind überflüssig und sollten dort nicht stehen.

`aktiv` kann man sich sparen wenn man eine ”Endlosschleife” schreibt und die jeweils bei passender Gelegenheit mit ``break`` verlässt. Einmal ist `aktiv` falsch geschrieben und kommt da zu einem `NameError`.

Wobei das auch eher eine ``for``-Schleife ist, denn in dieser ``while``-Schleife wird eine Laufvariable `durchgang` manuell hochgezählt, was sich ganz prima als Schleifenvariable für ``for`` machen würde.

Zeichenketten und Werte mit ``+`` und `str()` zusammenstückeln ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode oder ab Python 3.6 auch f-Zeichenkettenliterale.

Literale Wert die von anderen Werten abhängen sollten aus denen berechnet werden. Sonst hat man unnötig Arbeit und eine potentielle Gefahrenquelle wenn man da mal etwas ändern muss oder will, und daran denken muss auch alle abhängigen Werte entsprechend zu ändern. Die 7 hängt ja beispielsweise ganz klar mit der 100 zusammen (sieht bestimmt auch jeder sofort 🤓).

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from math import ceil, log2

GEHEIMZAHL_OBERGRENZE = 100


def main():
    geheime_zahl = random.randint(0, GEHEIMZAHL_OBERGRENZE)
    for durchgang in range(ceil(log2(GEHEIMZAHL_OBERGRENZE))):
        print(durchgang)
        benutzereingabe = input("Bitte Zahl eingeben: ")
        if benutzereingabe == "ende":
            break
        
        zahl = int(benutzereingabe)        
        if zahl == geheime_zahl:
            print("Gewonnen! Zahl richtig")
            break
        
        if zahl > geheime_zahl:
            print("Zahl zu groß")
        else:
            print("Zahl zu klein")
    else:
        print("Schade. Leider verloren")
        print("Es wäre die Nummer", geheime_zahl)
        
    print("Ende des Spiels")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten