Там нет специальной причины. Python просто применяет свой общий принцип отказа от неявных преобразований, которые являются хорошо известными причинами проблем, особенно для новичков, в таких языках, как Perl и Javascript.
int(some_string)
явный запрос на преобразование строки в целочисленный формат; правила для этого преобразования определяют, что строка должна содержать допустимое целочисленное буквальное представление. int(float)
явный запрос на преобразование числа с плавающей запятой в целое число; правила этого преобразования определяют, что дробная часть числа с плавающей запятой будет усечена.
Для int("3.1459")
возврата 3
интерпретатор должен неявно преобразовать строку в число с плавающей запятой. Поскольку Python не поддерживает неявные преобразования, вместо этого он предпочитает вызывать исключение.
type(3)
возвращается<type int>
. Однако питон на это не жалуетсяfloat("3")
. Разве python не преобразует неявно строку в int, а затем в float?Это почти наверняка случай применения трех принципов из дзен Python :
Некоторый процент времени кто-то
int('1.23')
вызывает неправильное преобразование для своего варианта использования и хочет что-то вродеfloat
илиdecimal.Decimal
вместо этого. В таких случаях для них явно лучше получить немедленную ошибку, которую они могут исправить, чем молча давать неправильное значение.В случае, если вы действительно хотите срезанный , что к междунару, это тривиально явно сделать это путем пропускания ее через
float
первую, а затем вызвать одну изint
,round
,trunc
,floor
илиceil
в зависимости от обстоятельств. Это также делает ваш код более самодокументируемым, защищая от более поздней модификации «корректирующей» гипотетический беззвучно-усечениеint
вызоваfloat
, сделав его ясно , что округленное значением является то , что вы хотите.источник
Иногда может быть полезен мысленный эксперимент.
int('1.23')
завершается ошибкой. Это существующее поведение.int('1.23')
производит1
без ошибок. Это то, что вы предлагаете.С поведением A просто и тривиально получить эффект поведения B:
int(float('1.23'))
вместо этого используйте .С другой стороны, с поведением B получить эффект поведения A значительно сложнее:
def parse_pure_int(s): if "." in s: raise ValueError("invalid literal for integer with base 10: " + s) return int(s)
(и даже с помощью приведенного выше кода у меня нет полной уверенности в том, что не существует каких-то угловых случаев, с которыми он неправильно справляется.)
Таким образом, поведение A более выразительно, чем поведение B.
Еще одна вещь, которую следует учитывать:
'1.23'
это строковое представление значения с плавающей запятой. Преобразование'1.23'
в целое число , концептуально включает в себя два преобразования (строку всплывать на целое число), ноint(1.23)
иint('1')
каждый включает в себя только одну конверсии.Редактировать:
И действительно, есть угловые случаи, которые приведенный выше код не обрабатывает:
1e-2
и1E-2
оба они являются значениями с плавающей запятой.источник
int('123E-2')
илиint('1L')
.Проще говоря - это разные функции.
Это две разные функции с одинаковым именем, которые возвращают целое число, но это разные функции.
«int» короткое и легко запоминающееся, и его значение применительно к каждому типу интуитивно понятно большинству программистов, поэтому они выбрали его.
Нет никакого смысла в том, что они предоставляют одинаковые или комбинированные функции, они просто имеют одинаковое имя и возвращают один и тот же тип. Их так же легко можно было бы назвать floorDecimalAsInt и convertStringToInt, но они выбрали int, потому что их легко запомнить, (99%) интуитивно понятны, и путаница возникнет редко.
Анализ текста как целого числа для текста, который включает десятичную точку, такую как «4.5», вызовет ошибку на большинстве компьютерных языков и, как ожидается, вызовет ошибку у большинства программистов, поскольку текстовое значение не представляет собой целое число и подразумевает они предоставляют ошибочные данные
источник
int
это тип (и притом встроенный). Его создатель (__new__
) принимает несколько возможных типов аргументов. Его поведение для каждого типа четко определено.int
это на самом деле не функция , а тип, которого__new__
и__init__
методы взять строку или поплавка аргумент, имея дело с каждым соответствующим образом . Правильнее было бы сказать, что тип обрабатывает два типа аргументов по-разному, но есть только одинint
.