2013-02-28 1 views
4

По всей вероятности, это глупый вопрос, но мне было интересно, почему python не может сделать целое число из строки, которая на самом деле является числом с плавающей точкой.Python int() строки, которая является числом с плавающей запятой

>>> int(1.0) 
1 
>>> int(float('1.0')) 
1 

Но

>>> int('1.0') 
Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    int('1.0') 
ValueError: invalid literal for int() with base 10: '1.0' 

Может кто-нибудь пояснить, почему это не может сделать за один шаг?

ответ

7

Прямо из Документов о int:

Если й не является число или если основание задано, то х должно быть строка или объект Unicode, что представляет собой целое число в буквальном поразрядной базе.

А вот как определяется целое число буквального в натальной базе:

longinteger ::= integer ("l" | "L") 
integer  ::= decimalinteger | octinteger | hexinteger | bininteger 
decimalinteger ::= nonzerodigit digit* | "0" 
octinteger  ::= "0" ("o" | "O") octdigit+ | "0" octdigit+ 
hexinteger  ::= "0" ("x" | "X") hexdigit+ 
bininteger  ::= "0" ("b" | "B") bindigit+ 
nonzerodigit ::= "1"..."9" 
octdigit  ::= "0"..."7" 
bindigit  ::= "0" | "1" 
hexdigit  ::= digit | "a"..."f" | "A"..."F" 

Как вы можете видеть . нет в лексическом определении.

больше int и integer literals

Также стоит отметить, что то, что вы хотите, естественно, достижимой на языках static typing, в то время как Python использует dynamic typing

+1

Вы уверены, что это касается? Вы цитируете правила синтаксиса Python, которые не соответствуют точно тем аргументам, которые принимает функция 'int'. – Kos

+3

@Kos Я цитирую, что такое целочисленный литерал. 'int' принимает либо число, либо объект string/unicode, который представляет собой цельный литерал ** – dmg

+0

Спасибо, я прочитал, и это действительно то, что говорят документы. – Kos

15

Может кто-нибудь объяснить, почему это невозможно сделать за один шаг?

Цитирую Дзен Python: Explicit is better than implicit.

Мне было интересно, почему питон не может сделать целое число из строки, которая на самом деле является числом с плавающей точкой.

В соответствии с философией Python, если строка содержит число с плавающей точкой, которое затем вы хотите превратить в int, это ваша ответственность за то, чтобы произносить заклинания. Язык не будет пытаться и угадать ваши намерения.

+5

+1 философский ответ на философский вопрос – Kos

+0

, я подразумевал в отношении как он хранится в памяти/аппаратном обеспечении :) –

+2

@TapajitDey: вопрос не имеет ничего общего с тем, как вещи хранятся в памяти/аппаратном обеспечении. Выбор не допускать неявных преобразований такого рода был преднамеренным решением дизайнеров Python. – NPE

Смежные вопросы