TypeError: '>' not supported between instances of 'tuple' and 'float'

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
Loppox
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 21:48

Guten Tag erstmal an alle,
Um die Corona Zeit etwas auszunutzen, wollte ich in Python ein paar Projekte machen. Ich habe mich dazu entschieden eine Parkuhr mithile von Tkinter zu machen, doch jetzt stehe ich komplett auf dem Schlauch.

Code: Alles auswählen

def Berechnen():
    try:
        geld = einwurf.get()
        geld = float(geld)
    except ValueError:
        fehler.config(text="Nur in Zahlen alles angeben")
    else:
        stunden = 0
        stunden = int(stunden)
        while (geld > 0.4):
            if stunden > 5:
                break
            else:
                stunden = stunden + 1
                geld = geld - 0,4
        parkzeit_aus.config(text=str(stunden))
Das ist der Code Problemteil des Codes. Ich bekomme immer den Error TypeError: '>' not supported between instances of 'tuple' and 'float' in while(geld > 0.4). Ich habe bereits probiert im Internet nach Lösungen einer Hilfestellung zu suchen, leider ohne erfolg. Die meisten Tipps die ich fand waren einfach die Variable geld in eine Float umzuwandeln (geld = float(geld)), welches aber auch nicht geholfen hat. Deshalb hoffe ich hier einen kleinen Denkanstoß zu bekommen um weiter zu bekommen. Ich bedanke mich schon mal im voraus an alle die sich die Zeit genommen haben alles zu lesen
Mfg
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Schau mal, ob du den Unterschied zwischen Zeile 1 und Zeile 6 findest:

Code: Alles auswählen

>>> geld = 12.34
>>> geld
12.34
>>> geld + 56.78
69.12
>>> geld = 12,34
>>> geld
(12, 34)
>>> geld + 56.78
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "float") to tuple
In specifications, Murphy's Law supersedes Ohm's.
Loppox
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 21:48

Hab das komma zeichen im Code komplett übersehen
Danke dir vielmals
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Loppox: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `Berechnen()` sollte also klein geschrieben werden, da es keine Klasse sondern eine Funktion ist.

Klassen (und Methoden) sollten alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. `Berechnen()` fehlt also `einwurf`, `parkzeit_aus`, und `fehler` als Argumente.

Dass das bisher ohne die Übergabe funktioniert, bedeutet das Du das als Variablen auf Modulebene definiert haben musst. Da gehören aber keine Variablen hin, sondern nur Code der Konstanten, Funktionen, und Klassen definiert.

Ein Name sollte nicht direkt hintereinander an so verschiedene Datentypen wie Zeichenketten und Gleitkommazahlen gebunden werden. Man muss auch nicht jeden Zwischenschritt an einen Namen binden wenn man das Zwischenergebnis nicht mehrmals braucht.

`stunden` an eine 0 zu binden und die im nächsten Schritt dann noch mal in eine ganze Zahl zu wandeln ist sinnlos.

Um die Bedingung bei ``while`` gehören keine Klammern. Und das ``if`` mit dem ``break`` gehört eigentlich mit in die ``while``-Bedingung.

Magische Zahlen sollten als Konstanten definiert werden. Dann weiss der Leser zum einen was der Wert bedeutet, und man kann den Wert einfach und weniger fehleranfällig ändern, weil man das nur noch an *einer* Stelle machen muss.

Gleitkommazahlen sind tückisch, das funktioniert nicht so wie Du Dir das vorstellst, weil 0,4 nicht präzise als Gleitkommazahl darstellbar ist:

Code: Alles auswählen

In [1]: geld = 1.2  # 3 * 0.4                                                   

In [2]: stunden = 0                                                             

In [3]: while geld > 0.4: 
   ...:     stunden += 1 
   ...:     geld -= 0.4 
   ...:                                                                         

In [4]: geld                                                                    
Out[4]: 0.3999999999999999

In [5]: stunden                                                                 
Out[5]: 2

In [6]: 1.2 / 3                                                                 
Out[6]: 0.39999999999999997
Strategien dazu: Mit Centbeträgen und ganzen Zahlen arbeiten, oder das `decimal`-Modul verwenden. Wobei Stunden rauf- und Geld runterzählen ein bisschen umständlich ist wenn man Division und Modulo als Rechenoperationen hat.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten