Zahl mit Input

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
Schwarze_Mamba
User
Beiträge: 16
Registriert: Montag 5. November 2012, 20:31

Wi kriege ich es hin, dass ich mit Input() eine Zahl und keinen String bekomme.
Ich Versuche gerade folgenden Code:

Code: Alles auswählen

num1 = input("Erste Zahl: ")
        num2 = input("Zweite Zahl: ")
        try:
            float(num1)
            float(num2)
            float(num3)
            num3 = num1 + num2
            print(num1 + " + " + num2 + " + " + " = " + num3)
        except:
            print("Das war keine Zahl")
Ich erhalte entweder den Exceept-Fehler oder z.B. 1+2=12

Schwarze_Mamba
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

float() ist eine interne Funktion. Funktionen geben etwas zurück. Das muss dann aber auch an einen Namen gebunden werden.
BlackJack

@Schwarze_Mamba: ``+`` hat bei Zahlen und bei Zeichenketten eine unterschiedliche Bedeutung. Du musst die Werte jeweils Umwandeln um die richtige Bedeutung im jeweiligen Ausdruck zu bekommen.

Du solltest mit ``except:`` vorsichtig sein. Wenn Du das so schreibst, dann wird für *jede* Ausnahme einfach nur „Das war keine Zahl” ausgegeben. Das ist nicht hilfreich denn so siehst Du den Programmfehler nicht der dadurch entsteht dass Du `num3` verwendest obwohl es noch gar nicht definiert ist.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Das Problem bei deinem Quelltext ist m. E., dass du zwar den Typ der Variablen mal tauschst, aber das nicht wieder speicherst:

Code: Alles auswählen

>>> zahl = "4"
>>> float(zahl)
4.0
>>> type(zahl)
<class 'str'>
Im Prinzip müsstest du etwas der folgenden Form machen:

Code: Alles auswählen

>>> zahl = "4"
>>> zahl = float(zahl)
>>> zahl
4.0
>>> type(zahl)
<class 'float'>
Good luck!
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Die Einrückung in deinem Quelltext ist auch murks!?

Code: Alles auswählen

num1 = input("Erste Zahl: ")
num2 = input("Zweite Zahl: ")

try:
    num3 = float(num1) + float(num2)
    print(num1 + " + " + num2 + " + " + " = " + str(num3))
except:
    print("Das war keine Zahl")
Shell:

Code: Alles auswählen

>>> 
Erste Zahl: 18
Zweite Zahl: 21
18 + 21 +  = 39.0
>>> 
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Wie wärs mit sowas:

Code: Alles auswählen

try:
    eingabe1 = int(input("eingabe1:"))
    eingabe2 = int(input("eingabe2:"))
    print("{0} + {1} = {2}".format(eingabe1,eingabe2,eingabe1+eingabe2))
except:
    print("fehler bei eingabe")
Hier wird schon während der Eingabe überprüft ob der Wert ein INT ist.

Durch die format Methode wird das ganze auch gleich übersichtlicher.

Greez
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

kevind hat geschrieben:Wie wärs mit sowas:

Code: Alles auswählen

try:
    eingabe1 = int(input("eingabe1:"))
    eingabe2 = int(input("eingabe2:"))
    print("{0} + {1} = {2}".format(eingabe1,eingabe2,eingabe1+eingabe2))
except:
    print("fehler bei eingabe")
Hier wird schon während der Eingabe überprüft ob der Wert ein INT ist.

Durch die format Methode wird das ganze auch gleich übersichtlicher.

Greez
Da wird nichts während der Eingabe geprüft. Ist das gleiche in grün nur in einer Zeile und mit int statt float.
BlackJack

@kevind: Da ist immer noch das Problem, dass das „nackte” ``except:`` *jede* Ausnahme behandelt und so Fehler die nichts mit der Umwandlung der Zahlen zu tun haben „verschluckt”.
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

JonasR hat geschrieben:
kevind hat geschrieben:Wie wärs mit sowas:

Code: Alles auswählen

try:
    eingabe1 = int(input("eingabe1:"))
    eingabe2 = int(input("eingabe2:"))
    print("{0} + {1} = {2}".format(eingabe1,eingabe2,eingabe1+eingabe2))
except:
    print("fehler bei eingabe")
Hier wird schon während der Eingabe überprüft ob der Wert ein INT ist.

Durch die format Methode wird das ganze auch gleich übersichtlicher.

Greez
Da wird nichts während der Eingabe geprüft. Ist das gleiche in grün nur in einer Zeile und mit int statt float.
Nagut vl. ist "überprüft" das falsche Wort aber ist der Input kein Zahlenwert gibts ne exception. Ist für mich doch irgendwo ne Kontrollinstanz...

Wäre es schöner ne Funktion zu haben welche überprüft was für eine art der Eingabe erfolgte ? Oder wie stellt ihr euch nen ordentliches Try/except vor ?

Für mich wär der Fall mit der Exception nicht so schlimm ... :oops: sry

Und danke!
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Die Überpfrüfung des Typs hast du bei dem Code von pixewakb auch ;)
Am besten im except "ValueError" abfangen, damit ist man vor falscheingaben erstmal auf der sicheren Seite und bekommt andere Fehler auch noch mit.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dies sind gerne gemachte Fehler bei try/except:
  • 1. zu viele Statements zwischen try und except.
    2. pauschales Abfangen aller Exceptions.
Beides erschwert die Fehlersuche oder verhindert sogar das erkennen eines Fehlers überhaupt.

besser:

Code: Alles auswählen

try:
    a = float(input("Zahl 1:"))
    b = float(input("Zahl 2:"))
except ValueError:
    print "Bitte nur Zahlen eingeben"
else:
    print a + b
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Ah so genau hatte ich das noch nicht betrachtet...
So ist das natürlich schon besser.

http://tutorial.pocoo.org/errors.html

Hier ne nette Anleitung dazu.

Danke!
Antworten