Seite 1 von 1

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

Verfasst: Donnerstag 29. März 2007, 09:58
von Corni
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

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

Verfasst: Donnerstag 29. März 2007, 10:15
von EnTeQuAk
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!

Verfasst: Donnerstag 29. März 2007, 10:33
von Corni
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.

Verfasst: Donnerstag 29. März 2007, 10:53
von 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

Verfasst: Donnerstag 29. März 2007, 11:04
von EnTeQuAk
@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

Verfasst: Donnerstag 29. März 2007, 15:52
von Leonidas
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.

Verfasst: Donnerstag 29. März 2007, 18:16
von rafael
@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.'

Verfasst: Donnerstag 29. März 2007, 18:32
von EnTeQuAk
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 ;)

Verfasst: Freitag 30. März 2007, 07:50
von mkesper
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.

Verfasst: Freitag 30. März 2007, 08:13
von Rebecca
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.

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

Verfasst: Freitag 30. März 2007, 09:07
von birkenfeld
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).

Verfasst: Freitag 30. März 2007, 09:24
von mkesper
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.