Frage zu Uni-Aufgabe

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
wowlol
User
Beiträge: 2
Registriert: Freitag 25. Oktober 2019, 13:12

Write a Python script that asks for two numbers and store them in the variables x and y, respectively. Make sure that x and y are of type float. The script should then check whether x equals y. Why is the following code not a good idea to do so? Provide a better solution.
x == y


Das ist die Aufgabe. Ich habe also folgenden Code geschrieben:
x=input('x')
y=input('y')
x==y
Der funktioniert auch gut, wenn ich z.B. 2.5 mit 2.5 vergleiche. Wenn ich aber 2.5 mit 5/2 vergleiche funktioniert es nicht mehr. Ist das mit dem obergenannten "not a good idea" gemeint oder ist es viel einfacher zu lösen?
Wie würde ich denn das Problem mit 5/2 umgehen? Als Input eingegeben will Python es irgendwie nicht in eine float umwandeln, sondern bezeichnet es immer als string.
Ich hoffe, ihr könnt mir helfen.
Vielen Dank und Grüße,
Karl
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`input` liefert immer Strings als Ergebnis, daher auch die Bedingung, dass das Floats sein sollen.

Aus der Aufgabe lese ich nicht heraus, dass welche Art Eingaben unterstütz werden sollen, also dass 5/2 eine valide Eingabe ist.
Wenn das der Fall wäre, müßte man selbst einen Parser schreiben, der auch mit Brüchen umgehen kann.

Gleichheit ist bei floating-Pointzahlen wegen ihrer endlichen Genauigkeit manchmal nicht exakte Gleichheit. Bei der Aufgabe, dass man direkt Eingaben vergleichen kann (auch wenn man die als Brüche angibt) tritt das Problem aber nicht auf. Daher weiß ich auch nicht, was mit "keine gute Idee" in diesem Kontext gemeint ist. Da hätte man ein besseres Beispiel finden können.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du musst die Eingabe an die float()-Funktion übergeben, damit der String in einen Float umgewandelt wird.

Wie kommst du denn bei der zweiten Eingabe auf 5/2? Soll y immer als Bruch angegeben werden oder wie ist das gemeint?
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sirius3 hat geschrieben: Freitag 25. Oktober 2019, 14:58 Aus der Aufgabe lese ich nicht heraus, dass welche Art Eingaben unterstütz werden sollen, also dass 5/2 eine valide Eingabe ist.
Wenn das der Fall wäre, müßte man selbst einen Parser schreiben, der auch mit Brüchen umgehen kann.
Für Brüche kann man auch einfach das fractions-Modul benutzen. Analog dazu gibt es für Dezimalzahlen das decimal-Modul:

Code: Alles auswählen

from decimal import Decimal
from fractions import Fraction

print(Decimal("2.5") == Fraction("5/2"))
Benutzeravatar
noisefloor
User
Beiträge: 4192
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Als Input eingegeben will Python es irgendwie nicht in eine float umwandeln, sondern bezeichnet es immer als string.
Richtig. `input` liefert immer eine String. Darum wird die Eingabe von "5/2" auch nicht zu 2.5 umgerechnet.

Und du würdest auch "False" bekommen, wenn x=2.5 und y=2.50, obwohl das ja mathematisch gleich ist. Also ist es wahrscheinlich eine gute Idee, die Eingabe in einen `float` umzuwandeln. Wenn man es einfach halten will. Kann man aber beliebig komplex ausbauen, siehe vorherige Posts.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wowlol: Egal wie Du den Vergleich machst, Du solltest das Ergebnis auch ausgeben, damit der Benutzer das sehen kann. Einfach nur ``x == y`` oder einen anderen Ausdruck hin zu schreiben ist etwas sinnlos, denn davon bekommt der Benutzer nur etwas mit wenn der Ausdruck einen Laufzeitfehler auslöst.

Zur Lösung könntest Du auch mal einen Blick in das `math`-Modul werfen, denn dort gibt es eine passende Funktion für diese Aufgabe.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@wowlol: der Kontext dieser Aufgabe ist unklar. Das der direkte Vergleich von x und y keine gute Lösung sein soll, könnte darauf hindeuten, dass Differenzen unterhalb eines gegebenen Epsilon tolerierbar sind. Dann hilft der Hinweis von __blackjack__. Ansonsten wäre ˋx == yˋ völlig in Ordnung.
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Um dann mal aufzulösen welche Funktion aus `math` gemeint war:

Code: Alles auswählen

#!/usr/bin/env python3
import math


def ask_float(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print("Fehler! Die Eingabe war keine Zahl.")
        

def main():
    x = ask_float(" Bitte die erste Zahl eingeben: ")
    y = ask_float("Bitte die zweite Zahl eingeben: ")
    
    if math.isclose(x, y):
        print("Die beiden Zahlen sind gleich.")
    else:
        print("Die beiden Zahlen unterscheiden sich.")


if __name__ == "__main__":
    main()
Wobei das für dieses Programm eigentlich egal ist ob man ``==`` oder `math.isclose()` verwendet. Es gibt in beiden Fällen nur einen einzigen Fall bei dem bei der gleichen Eingabe für `x` und `y` die Antwort kommt das sich `x` und `y` unterscheiden — und in dem Fall stimmt das per Definition sogar.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten