Seite 1 von 1

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

Verfasst: Freitag 1. Mai 2020, 13:42
von Loppox
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

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

Verfasst: Freitag 1. Mai 2020, 13:59
von pillmuncher
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

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

Verfasst: Freitag 1. Mai 2020, 14:26
von Loppox
Hab das komma zeichen im Code komplett übersehen
Danke dir vielmals

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

Verfasst: Freitag 1. Mai 2020, 14:57
von __blackjack__
@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.