Warum ist es nicht möglich, "1.7" direkt in Integer zu konvertieren, ohne zuerst in float zu konvertieren?

8

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.

    
user3140972 13.10.2015, 22:52
quelle

4 Antworten

9

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:

  1. Interpretiere Nummer als Float
  2. trunkiert auf eine Ganzzahl

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 ...

    
mgilson 13.10.2015, 22:54
quelle
2

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.

    
Chad Miller 13.10.2015 22:57
quelle
1

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 "."

enthalten     
digitaLink 13.10.2015 22:56
quelle
1

Bricht 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."

    
smci 14.10.2015 00:40
quelle