Wie kann man Variablen prüfen, ob sie Float sind?

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.
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Hallo
Ich habe vor ~2Tagen mit Python angefangen und da müsste ich noch einiges vertrauter werden mit den Grundlagen.

Anscheinend gibt es eine voreingestellte "isFloat"-Funktion, wie in einem anderen Forum jemand schrieb, bei mir funktionierte sie aber nicht, obwohl ich dasselbe eingegeben habe. Dann habe ich einem anderen Post nach versucht, eine isFloat-Funktion selbst zu definieren, das funktionierte auch nicht. Ich poste einfach mal, womit ich stehen geblieben bin und bin natürlich offen für jegliche Lösungen:
Bild
Ich habe es ein wenig modifiziert, weil alles andere nicht ging.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich sehe kein Bild. Ansonsten ist `isinstance()` dein Freund.
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt ein Bild zu posten, schreib den Code ins Forum mit code-Tags </>.
Eine isFloat-Funktion gibt es nicht im Standardumfang. Nach dem Bild zu urteilen ist irgendetwas woanders falsch. Einrückungen per Tab / Space (sieht man dem Bild halt nicht an)? Statt explizit auf == True oder ==False zu prüfen (was wiederum nur einen Wahrheitswert liefert), läßt man das == True einfach weg, oder prüft auf `not ...`.
Nackte excepts nie verwenden. In der Funktion isfloat erwartest Du einen ValueError, und nur der sollte abgefangen werden.

Code: Alles auswählen

def isfloat(x):
    try:
        float(x)
    except ValueError:
        return False
    else:
        return True
    
number = input("Zahl eingeben")
if not isfloat(number):
    print("keine Zahl")
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Ich habe deinen Code eins zu eins kopiert und auch nichts anderes in dem pythondokument stehen. Wenn ich als input ,,1" eingebe, wird nichts geprintet und das Programm ist finished. Wenn ich ,,1.23" eingebe, wird nichts geprintet und das Programm ist finished.

Wie sähe denn isinstance als Code aus? Das habe ich schon versucht, ging aber nicht.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@Knampf: `isinstance` hilft Dir hier nicht. Und ja, es wird nur etwas ausgegeben, wenn man keine Zahl eintippt. So ist die if-Bedingung formuliert.
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Dann war das wohl ein sehr grundlegender Fehler von mir. Sind dann Integers Floats? Ich dachte, Nichtkomma-Zahlen (Integer) und Kommazahlen (Float) wären getrennt. Wie kann ich prüfen, ob die Zahl Nachkommastellen hat, die größer sind als 0? Danke schonmal für die ganze Hilfe.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knampf: `int` und `float` *sind* verschiedene Typen, aber man kann selbstverständlich Gleitkommazahlen haben die keinen Nachkommaanteil haben – die werden nicht auf magische Weise zu `int`. Um zu prüfen ob eine Gleitkommazahl nur 0en hinter dem Dezimalpunkt hat gibt es mehrere Möglichkeiten. Zum Beispiel den Wert mit dem Vergleichen was bei der Umwandlung mit `int()` heraus kommt, oder ob bei dem Wert modulo 1 eine 0 heraus kommt. Wobei ich für den Vergleich nicht ``==`` noch auf `math.isclose()` hinweisen möchte, weil Vergleiche mit Gleitkommazahlen so ihre Tücken haben können. Im vorliegenden Fall, wenn die Eingabe direkt vom Benutzer kommt, ist das kein Problem, aber wenn der Wert durch Berechnungen zustande kommt, kann es Dir passieren das ein Wert der eigentlich keine Nachkommastellen haben sollte, doch welche hat, aber gaaaanz weit hinten erst.

Wozu brauchst Du das denn überhaupt?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Ich fange gerade an mit kleinen Projekten zum Lernen. Das ist meine Hauptquelle: https://www.youtube.com/watch?v=rfscVS0vtbw

Ich kann dir genau sagen, was ich damit konkret machen möchte: Ich möchte einen Taschenrechner basteln, der errorproof ist.
1. Zahl 1 eingeben und prüfen, ob es eine Zahl ist (kann int oder float sein) - wenn Zahl, nächster Schritt, wenn nicht, verlange wieder die Eingabe von Zahl 1 solange die Eingabe keine Zahl ist.
2. Operator eingeben und prüfen, ob es ein Operator ist. wenn ja, weiter, wenn nein, eingabeaufforderung bis es passt #Den Teil habe ich schon ziemlich gut hinbekommen
3. gleiche wie Zahl 1, nur für Zahl 2
4. Prüfen, welcher Operator vorliegt und Zahl 1 und Zahl 2 passend zum Operator verrechnen (dass er ,,+" macht, wenn eingabe = +, dass er ,,-" macht, wenn eingabe = - und so weiter) #Den Teil habe ich fertig, wie im Video mit mehreren ifs und es hat funktioniert.

Nachtrag: Und natürlich das Ergebnis printen.
Chr0medome
User
Beiträge: 30
Registriert: Freitag 20. Juli 2018, 15:39

Code: Alles auswählen

def foo(var):
	return type(var) == float
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Knampf hat geschrieben: Mittwoch 6. Februar 2019, 13:07 1. Zahl 1 eingeben und prüfen, ob es eine Zahl ist (kann int oder float sein) - wenn Zahl, nächster Schritt, wenn nicht, verlange wieder die Eingabe von Zahl 1 solange die Eingabe keine Zahl ist.
Das kannst Du prima mit Type-Conversion und Exception-Handling umsetzen.
Chr0medome
User
Beiträge: 30
Registriert: Freitag 20. Juli 2018, 15:39

Einen Taschenrechner basteln? Python selbst ist doch schon Taschenrechner genug? :D

Lerne doch lieber mit projecteuler.net

Falls du aber unbedingt ein Programm schreiben willst...:

Code: Alles auswählen

def offset(val1, val2, op):
	if op == "+":
		return val1 + val2
	elif op == "/":
		pass
	elif op == "*":
		pass
	elif op == "-":
		pass

val1 = input(": ")
while type(val1) not in [float, int]:
	val1 = input(": ")
		
(Code nicht getestet)
Chr0medome
User
Beiträge: 30
Registriert: Freitag 20. Juli 2018, 15:39

Mir fällt außerdem gerade ein, dass du auch eval() benutzen könntest... Ist aber noch hässlicher als mein letzter Lösungsvorschlag.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chr0medome: (Code nicht getestet) heißt, er tut nicht, denn `input` liefert immer den Typ str zurück. Falls es doch eine Funktion gibt, die verschiedene Eingaben in verschiedene Typen konvertieren kann, würde man hier wie `sls` schon geschrieben hat, mit isinstance arbeiten: `isinstance(val1, [float, int])`. Mit `eval` lernt man ja nichts, außer, welche Funktionen man am besten nicht nutzt.

@Knampf: und wo konkret kommst Du jetzt bei der Umsetzung des Taschenrechners nicht weiter?
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knampf: Aus der Beschreibung wird mir jetzt so überhaupt nicht klar warum Du testen willst ob eine Zahl Nachkommastellen hat oder nicht. Für den Taschenrechner an sich reicht es doch völlig aus mit Gleitkommazahlen zu arbeiten. Und eine Funktion zum Testen ob eine Eingabe in eine Zahl umwandelbar wäre brauchst Du nicht, denn Du willst ja nicht nur das wissen, sondern es tatsächlich auch *machen*, also *mach* das einfach und behandle entsprechend die Ausnahme die auftritt wenn die Umwandlung nicht funktioniert hat.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Hier genau komme ich nicht weiter: Ich möchte eine Schleife, die läuft, solange die Eingabe keine Zahl ist. Wie stelle ich diese Schleife her?

Code: Alles auswählen

num1 = input("Enter number 1: ")

while num1 not in float:
    input("Enter number 1: ")
Das sollte eigentlich reichen. ,,TypeError: argument of type 'type' is not iterable" Jetzt muss es geschafft werden, dass er die Zahlenprüfung erkennt.

Ich habe es schon mit einer While, try, except-Kombination versucht.

Nachtrag: Die Schleife soll auch errorabgesichert sein.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie hast Du am Anfang getestet, ob eine Eingabe eine Zahl ist, und wie prüfst Du es jetzt? Und warum? Wo Du doch merkst, dass die neue Variante nicht funktioniert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Vorzugsweise erstellt man sich dafür eine Funktion.

Code: Alles auswählen

def input_float(message, errortext=None):
    while True:
        try:
            return float(input(message))
        except ValueError:
            if errortext:
                print(errortext)

value = input_float('Her mit der Zahl: ', 'Bitte eine Zahl eingeben')
Es gibt dort eine Endlosschleife (while True). In dieser Schleife wird versucht, eine Eingabe in einen Fließkommawert zu konvertieren und diesen zurückzugeben wodurch die Schleife verlassen wird. Gelingt die Konvertierung nicht, dann wird eine Exception vom Typ ValueError ausgelöst, entsprechend behandelt und anschließend wird die Schleife erneut durchlaufen.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knampf: Der Code sieht extram nach „programmieren durch raten“ aus – das funktioniert nicht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Knampf
User
Beiträge: 7
Registriert: Mittwoch 6. Februar 2019, 09:29

Ich bin gerade neu beim Programmieren und brauche Starthilfe... Ich habe schon an sämtlichen Orten im Internet gesucht und keine Lösung gefunden, deswegen bin ich jetzt hier und versuche es mit Kommunikation. Raten war alternativ zum Posten meine einzige Möglichkeit.

/mes Lösung und Erklärung war von allen empfohlenen die beste. Ich muss mich noch mit den Strukturen vertraut machen, dass ich weiß, was genau die einzelnen Bestandteile wie ,,return" und ,,value" heißen. Programmierung mache ich, abgesehen von einem Grundkurs in der Schule, in dem ich kaum mitgekommen bin, seit ~3 Tagen.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Anzufangen ist nichts, wofür man sich rechtfertigen müsste. Lernen ist immer gut, ausprobieren auch – aber einfach nur raten ist schlecht. Denn es widerspricht dem Verstehen – also dem Lernen.

Die Lösung von /me wurde Dir in einigen Beiträgen schon zuvor genannt. Er aber war so nett, es Dir auch zu implementieren.

Wenn Du nicht weißt, was ValueError und return bedeuten, aber Spaß am Programmieren hast und dies gerne lernen möchtest, dann empfehle ich (wenn es deutschsprachig sein soll) das Buch von Michael Weigend (Python 3). Das eignet sich für Einsteiger als Lesebuch, zum Selbststudium, als Nachschlagewerk und enthält relativ wenig Fehler (Bücher werden von Menschen gemacht und enthalten immer Fehler).

Aber versuche nicht zu raten, sondern zu verstehen. Das ist viel besser. Dabei helfen dann manchmal auch ausformulierte Beispiele wie von /me.
Antworten