[Typ-Umwandlung] int(raw_input("Eingabe: ")

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
Corni
User
Beiträge: 4
Registriert: Donnerstag 29. März 2007, 09:51

Hallo,

kann mir jemand sagen, warum folgendes nicht funktioniert bzw. Teil 2 funktioniert. Bereite mich gerade auf meine mdl. Prüfung vor und wäre für eure Hilfe sehr dankbar:

Code: Alles auswählen

x = int(raw_input("Eingabe: ")) # funktioniert nur bei Eingabe eines integers, Fehler bei z.B. 4.0
x = '4.0' # type(x) = str
x = int(x) # FEHLER
x = float(x) # OK

x= '4' # type(x) = str
x= float(x) # OK 
Vielen Dank vorab. Gruß, Cornelius
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Corni hat geschrieben:Hallo,

kann mir jemand sagen, warum folgendes nicht funktioniert bzw. Teil 2 funktioniert. Bereite mich gerade auf meine mdl. Prüfung vor und wäre für eure Hilfe sehr dankbar
Sehr gerne...

Code: Alles auswählen

x = int(raw_input("Eingabe: ")) # funktioniert nur bei Eingabe eines integers, Fehler bei z.B. 4.0
x = '4.0' # type(x) = str
x = int(x) # FEHLER
x = float(x) # OK

x= '4' # type(x) = str
x= float(x) # OK 
Gehen wir das mal einzeln durch:

Code: Alles auswählen

x = int(raw_input("Eingabe: ")) # funktioniert nur bei Eingabe eines integers, Fehler bei z.B. 4.0
Klar. Denn 'int()' wandelt immer in eine Ganzzahl um.
Der Traceback sagt es eigentlich schon ganz gut:

Code: Alles auswählen

>>> x = "4.02"
>>> x = int(x)

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x = int(x)
ValueError: invalid literal for int() with base 10: '4.02'
Allerdings würde folgendes klappen:

Code: Alles auswählen

>>> x = int(float("4.02"))
>>> x
4
Das sieht mir aber nicht nach einer guten Lösung aus... weiß nur grad nichts anderes ;)

Code: Alles auswählen

x = '4.0' # type(x) = str
Hast du etwas anderes erwartet?
In Python werden Strings durch einzelne Hochkommata oder doppelte begrenzt. Daher ist ist '4.0' folglich ein waschechter String.

Code: Alles auswählen

x = int(x) # FEHLER
Schau dir mal den Fehler an ;) Dann weißt du, warum :)
Ist exakt das gleiche wie oben mit dem '' int(raw_input("Eingabe:")) ''

Code: Alles auswählen

x = float(x) # OK
Weil... 4.0 ein Float ist.

Aber so wie es mir ausschaut, kommt die Funktion 'int' nicht mit Strings klar. Float kann ja die zahlen wunderbar aus Strings konvertieren... Bug oder Feature?

Code: Alles auswählen

x= '4' # type(x) = str
x= float(x) # OK 
Klar... ersteres ham wa ja schon geklärt.
Und das darunter würde auch mit '' int(x) '' klappen.
Jede ganze Zahl ist ohne Einschränkungen in eine Kommazahl (float) umwandelbar. Daher klappt das ebenfalls wunderbar.

Ich hoffe, ich rede nicht zu viel Stuss bzw. konnte dir ein wenig Helfen.
Vielen Dank vorab. Gruß, Cornelius
Gruß zurück!
Corni
User
Beiträge: 4
Registriert: Donnerstag 29. März 2007, 09:51

So ganz klar ist mir noch nicht warum int(4.02) funktioniert aber int('4.02') nicht. Was wandelt er denn um? Er findet doch eine Zahl vor, wenn auch eben nur eine Gleikommazahl, aber diese lasst sich im Normalfall ja auch umwandeln. Warum kriegt er die aus dem String nicht sauber extrahiert und wandelt sie um?
Umgekehrt ist es ja möglich float('4') macht ihm ja keine Probleme. Da die Datentypen in Python aber dynamisch gebunden werden ist ja beides immer möglich- also: int(x) <-> float(x).
In Java sieht das ja anderst aus, da der Datentyp an die Variable gebunden wird und sich ein int zwar nach float konvertieren lässt aber umgekehrt nur durch den Cast-Operator.
BlackJack

@EnTeQuAk: Natürlich kommt `int()` mit Zeichenketten klar:

Code: Alles auswählen

In [4]: int('42')
Out[4]: 42
@Corni: `int()` wandelt das übergebene Objekt in eine ganze Zahl um. Bei Fliesskommazahlen ist das als der ganzzahlige Anteil definiert und bei Zeichenketten eben als die ganze Zahl in der Zeichenkette. Und wenn die Zeichenkette keine gültige ganze Zahl enthält ist das ein Fehler.

Bis auf bei Zeichenketten liegt die Definition wie ein Objekt als `int` auszusehen hat übrigens beim *übergebenen Objekt* und *nicht* bei der `int()`-Funktion!

Code: Alles auswählen

In [5]: (4.2).__int__()
Out[5]: 4
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

@EnTeQuAk: Natürlich kommt `int()` mit Zeichenketten klar:
Meinte ja auch net komplett...

Dachte nur, das int ja wie in deinem Beispiel ganze Zahlen aus Strings umwandeln kann. Bei Float aber scheitert... (ich hoffe, ich hab mich richtig ausgerückt)
Bis auf bei Zeichenketten liegt die Definition wie ein Objekt als `int` auszusehen hat übrigens beim *übergebenen Objekt* und *nicht* bei der `int()`-Funktion!
Das ist interessant zu höhren ;) Davon wusste ich noch nicht so viel.

MfG EnTeQuAk
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

EnTeQuAk hat geschrieben:Davon wusste ich noch nicht so viel.
Das ist nur konsequent, es gibt ja auch __str__ und str(), ebenso viele andere Builtins die eigentlich im großen und ganzen nur Callbacks auf die entsprechenden Funktionen des übergebenen Objekts sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

@Corni: Dein Problem würde ich so lösen:

Code: Alles auswählen

x = raw_input('Eingabe: ')
try:
    x = int(x)
except ValueError:
    print 'Error beim Umwandeln in Integer.'
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

rafael hat geschrieben:@Corni: Dein Problem würde ich so lösen:

Code: Alles auswählen

x = raw_input('Eingabe: ')
try:
    x = int(x)
except ValueError:
    print 'Error beim Umwandeln in Integer.'
Der Unterschied ist ja wohl nur, das eine schönere, nichts sagende Fehlermeldung erzeugt wird.

Des weiteren wollte er nur wissen, warum ;)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Python wurde nach dem Grundsatz entwickelt, daß dort, wo das Ergebnis mehrdeutig wäre, nicht geraten werden soll, sondern lieber ein Fehler erzeugt wird.
Nehmen wir an, du gibst '4.5' ein. Was sollte int('4.5') tun, aufrunden, abschneiden, abrunden?
Wenn dein Programm fordert: 'Geben Sie die Zahl der Dreiecke' ein oder Ähnliches, dann ist eine Eingabe wie '4.02' Quark und dies sollte dem Anwender auch mitgeteilt werden.
Technisch sieht es so aus, daß Integer-Zahlen eine Methode int() besitzen, Float-Zahlen dagegen eine float()-Methode. Das läßt sich schön durch die Eingabe von

Code: Alles auswählen

help(4)
bzw.

Code: Alles auswählen

help(4.02)
sehen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

mkallas hat geschrieben:Technisch sieht es so aus, daß Integer-Zahlen eine Methode int() besitzen, Float-Zahlen dagegen eine float()-Methode.
Nein.

Code: Alles auswählen

>>> a = 1
>>> a.__float__()
1.0
>>> float(a)
1.0
>>> b = 3.14
>>> b.__int__()
3
>>> int(b)
3
Wuerde ja auch keinen Sinn machen, denn die int- und float-Methode sollen ja das Objekt in ein int oder float umwandeln. Waer ja bloed, wenn man floats nur in floats umwandeln kann und ints nur in ints.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

EnTeQuAk hat geschrieben: Aber so wie es mir ausschaut, kommt die Funktion 'int' nicht mit Strings klar. Float kann ja die zahlen wunderbar aus Strings konvertieren... Bug oder Feature?
Hu? int("100") funktioniert perfekt, und sogar int("0xFF", 0).
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Rebecca hat geschrieben:
mkallas hat geschrieben:Technisch sieht es so aus, daß Integer-Zahlen eine Methode int() besitzen, Float-Zahlen dagegen eine float()-Methode.
Nein.


Wuerde ja auch keinen Sinn machen, denn die int- und float-Methode sollen ja das Objekt in ein int oder float umwandeln. Waer ja bloed, wenn man floats nur in floats umwandeln kann und ints nur in ints.
Oops, sorry. Ich nehme mal ganz schnell die Tomaten von den Augen...
Das Problem war ja hier, daß ein String umgewandelt wird.
Der hat natürlich weder eine __int__ noch eine __float__ Methode, so daß sozusagen ein expliziter Cast erfolgt, der dann fehlschlägt.
Antworten