Wenn ich int("1.7")
Python eintrage gibt Fehler (speziell ValueError) zurück. Ich weiß, dass ich es in Ganzzahl um int(float("1.7"))
umwandeln kann. Ich würde gerne wissen, warum die erste Methode Fehler zurückgibt.
Aus der Dokumentation :
Wenn x keine Zahl ist oder wenn eine Basis angegeben wird, muss x eine Zeichenkette oder ein Unicode-Objekt sein, das ein Integer-Literal in der Radix-Basis darstellt ...
Offensichtlich stellt "1.7"
kein Ganzzahl-Literal in der Basis-Wurzel dar.
Wenn Sie wissen wollen, warum die Python-Entwickler entschieden haben, sich auf Integer-Literale in Radix-Basis zu beschränken, gibt es eine unendliche Anzahl von Gründen, und Sie müssten Guido et fragen. Sicher wissen. Eine Vermutung wäre eine einfache Implementierung + Effizienz. Sie könnten denken, es wäre leicht für sie, es als zu implementieren:
Leider funktioniert das in Python nicht, da Integer eine beliebige Genauigkeit haben und Floats nicht können. Spezielle Gehäuse große Zahlen könnten zu Ineffizienz für den gemeinsamen Fall 1 führen.
Darüber hinaus hat das Erzwingen von int(float(...))
den zusätzlichen Vorteil in der Klarheit - Es macht es offensichtlicher, wie die Eingabekette wahrscheinlich aussieht, die beim Debuggen an anderer Stelle helfen kann. Tatsächlich könnte ich argumentieren, dass, auch wenn int
Zeichenfolgen wie "1.7"
akzeptieren würde, es trotzdem besser wäre, int(float("1.7"))
zu schreiben, um die Klarheit des Codes zu erhöhen.
1 Nehmen wir eine Validierung an. Andere Sprachen überspringen dies - z.B. ruby
wird '1e6'.to_i
auswerten und dir 1
geben, da es aufhört, beim ersten nicht-integralen Zeichen zu analysieren. Scheint so, als könnte das zu lustigen Bugs führen, die man aufspüren kann ...
Wir haben eine gute, offensichtliche Vorstellung davon, was "aus diesem Float ein Int machen" bedeutet, weil wir einen Float als zwei Teile betrachten und wir einen von ihnen wegwerfen können.
Es ist nicht so offensichtlich, wenn wir eine Schnur haben. Machen Sie diese Zeichenfolge zu einem Float, das alle möglichen subtilen Dinge über den Inhalt der Zeichenfolge enthält, und das ist nicht die Art von Dingen, die eine vernünftige Person im Code sehen möchte, wo der Wert nicht offensichtlich ist.
Die kurze Antwort lautet also: Python mag offensichtliche Dinge und entmutigt Magie.
Hier ist eine gute Beschreibung, warum Sie das nicht in der Python-Dokumentation finden können.
Wenn x keine Zahl ist oder wenn eine Basis angegeben wird, muss x eine Zeichenfolge oder ein Unicode-Objekt sein, das ein Integer-Literal in der Radix-Basis darstellt. Optional kann dem Literal ein + oder - vorangestellt werden (ohne Zwischenraum) und von Leerzeichen umgeben sein. Ein Basis-n-Literal besteht aus den Ziffern 0 bis n-1, wobei a bis z (oder A bis Z) die Werte 10 bis 35 haben. Die Standardbasis ist 10. Die zulässigen Werte sind 0 und 2-36. Base-2-, -8- und -16-Literale können optional mit 0b / 0B, 0o / 0O / 0 oder 0x / 0X vorangestellt werden, wie bei Integer-Literalen im Code. Base 0 bedeutet, dass die Zeichenfolge genau als Ganzzahl-Literal interpretiert wird, sodass die tatsächliche Basis 2, 8, 10 oder 16 ist.
Um eine Ganzzahl aus einer Zeichenkette zu schreiben, darf die Zeichenkette kein "."
enthaltenBricht die Rückwärtskompatibilität ab . Es ist sicherlich möglich, aber dies wäre eine schreckliche Idee, da es die Rückwärtskompatibilität mit dem sehr alten und gut etablierten Python-Idiom brechen würde, sich auf einen Versuch zu verlassen ... außer Leiter () "Einfacher um Verzeihung bitten als Erlaubnis" ), um den Typ des Inhalts der Zeichenfolge zu bestimmen. Dieses Idiom gibt es seit mindestens Python 1.5, AFAIK; Hier sind zwei Zitate: [1] [2]
%Vor% Und noch eine Kleinigkeit: es geht nicht nur darum, ob die Nummer '.' Wissenschaftliche Notation oder willkürliche Buchstaben könnten auch die Ganzheit der Zeichenkette unterbrechen.
Beispiele: int("6e7")
ist keine Ganzzahl (Basis-10). Jedoch int("6e7",16)
=
1767 ist eine ganze Zahl in der Basis 16 (oder irgendeiner Basis & gt; = 15). Aber int("6e-7")
ist niemals ein int.
(Und wenn Sie die Basis auf Basis-36 erweitern, kann jede zulässige alphanumerische Zeichenfolge (oder Unicode) als eine Ganzzahl interpretiert werden, aber das standardmäßig zu tun, wäre im Allgemeinen ein schreckliches Verhalten, da "Hund" oder "Katze "sind wahrscheinlich keine Verweise auf ganze Zahlen."
Tags und Links python type-conversion integer floating-point coercion