int (number)가 바닥 유형 변환이라는 것이 문서에 명확하게 명시되어 있습니다.
int(1.23)
1
int (string)은 문자열이 정수 리터럴 인 경우에만 int를 반환합니다.
int('1.23')
ValueError
int('1')
1
특별한 이유가 있습니까? 기능이 한 경우에는 바닥이지만 다른 경우에는 그렇지 않다는 것이 직관적이지 않습니다.
답변
특별한 이유 가 없습니다 . 파이썬은 단순히 묵시적 변환을 수행하지 않는다는 일반적인 원칙을 적용하고 있으며, 이는 특히 Perl 및 Javascript와 같은 언어에서 특히 초보자에게 잘 알려진 문제의 원인입니다.
int(some_string)
문자열을 정수 형식으로 변환하기위한 명시 적 요청입니다. 이 변환에 대한 규칙은 문자열이 유효한 정수 리터럴 표현을 포함해야 함을 지정합니다. int(float)
부동 소수점을 정수로 변환하기위한 명시 적 요청입니다. 이 변환에 대한 규칙은 float의 소수 부분이 잘 리도록 지정합니다.
위해서는 int("3.1459")
반환하는 3
암시 적으로 float로 문자열을 변환해야 인터프리터. Python은 암시 적 변환을 지원하지 않으므로 대신 예외를 발생시킵니다.
답변
이것은 거의 확실하게 Zen of Python 의 세 가지 원칙을 적용한 경우입니다 .
명시 적 일수록 암시 적입니다.
[…] 실용성은 순수함을 이긴다
오류는 조용히 전달되지 않아야합니다.
시간의 일부 비율은, 사람의 행함은 int('1.23')
자신의 사용 사례에 대한 잘못된 변환을 호출하고, 같은 싶어한다 float
나 decimal.Decimal
대신합니다. 이러한 경우에는 잘못된 값을 조용히 제공하는 것보다 수정할 수있는 즉각적인 오류를 얻는 것이 분명 낫습니다.
당신이하는 경우 않는 int로, 명시 적으로 그것을 통해 전달하여 그렇게 사소한 것을 잘라 내기하려는 float
첫 번째, 다음 중 하나를 호출 int
, round
, trunc
, floor
또는 ceil
적절합니다. 이것은 또한 당신의 코드 가 당신이 원하는 값임을 명확하게함으로써 가설적인 조용히 잘리는 int
호출을 “수정”하는 추후 수정으로부터 보호하면서 당신의 코드를 더 자기 문서화하게 만듭니다 .float
답변
때때로 사고 실험이 유용 할 수 있습니다.
- 동작 A :
int('1.23')
오류와 함께 실패합니다. 이것은 기존의 동작입니다. - 동작 B : 오류없이
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 (decimal)은 ‘floor ie 소수점 부분을 제거하고 int로 반환’으로 동작합니다.
- int (string)은 ‘이 텍스트는 정수를 설명하고, 변환하고 int로 반환’하는 것처럼 동작합니다.
정수를 반환하는 동일한 이름 을 가진 두 개의 다른 함수 이지만 다른 함수입니다.
‘int’는 짧고 기억하기 쉬우 며 각 유형에 적용되는 의미는 대부분의 프로그래머에게 직관적이기 때문에 선택했습니다.
동일하거나 결합 된 기능을 제공한다는 의미는 없으며 단순히 이름이 같고 동일한 유형을 반환합니다. ‘floorDecimalAsInt’및 ‘convertStringToInt’라고 쉽게 불릴 수 있지만 기억하기 쉽고 (99 %) 직관적이고 혼란이 거의 발생하지 않기 때문에 ‘int’를 사용했습니다.
“4.5”와 같은 소수점을 포함하는 텍스트에 대해 텍스트를 정수로 구문 분석하면 대부분 의 컴퓨터 언어에서 오류가 발생하고 대부분 의 프로그래머 가 오류를 발생시킬 것으로 예상됩니다. 이는 텍스트 값이 정수를 나타내지 않고이를 의미하기 때문입니다. 그들은 잘못된 데이터를 제공하고 있습니다
답변
