일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 사이버보안
- 웹개발
- 데이터분석
- 빅데이터
- 네트워크
- 데이터과학
- 딥러닝
- 프로그래밍언어
- 데이터구조
- 소프트웨어공학
- 컴퓨터비전
- 2
- 알고리즘
- Yes
- 네트워크보안
- 버전관리
- 컴퓨터과학
- 컴퓨터공학
- 프로그래밍
- 보안
- 자료구조
- 머신러닝
- 클라우드컴퓨팅
- 자바스크립트
- 소프트웨어
- I'm Sorry
- 인공지능
- 파이썬
- 데이터베이스
- 코딩
- Today
- Total
스택큐힙리스트
파이썬은 왜 sign 함수가 없나요? 본문
파이썬이 왜 sign 함수가 없는지 이해가 되지 않습니다. sign 의 자매같은 것인 내장 함수는 있지만 sign 는 없습니다.
파이썬 2.6에서는 심지어 copysign ( th ), bu 에서) 함수가 있지만 부호는 없습니다. pysign(x,y) when 를 쓰는 대신 gn and 를 쓰고 abs(x) * sign(y) 로부터 직접 copysign 을 얻는 게 더 나은 이유가 무엇인가요? 후자가 더 명확합니다. 왜냐하면 copysign을 사용하면 x가 y의 부호인지 y가 x의 부호인지 기억해야 하기 때문입니다!
분명히 sign(x)는 cmp(x,0)보다 더 많은 기능을 제공하지 않지만, 이것도 읽기 쉬웠을 것입니다 (그리고 파이썬 같은 매우 읽기 쉬운 언어에는 큰 플러스가 될 것입니다).
만약 나가 파이썬 디자이너였다면, 그 반대였을 것이다: cmp 내장 함수가 아니라 @#sign 가 필요했을 것이다. @#cmp(x,y) 가 필요할 때, @#sign(x-y) 를 하면 되고 (혹은, 비수치적인 것들에 대해서는 더욱 좋게, x>y 를 사용할 수 있을 것이다. 물론, 이를 위해서 @#sorted 불린(boolean) 대신 정수(compator)보다 불리언(boolean)을 허용해야 했겠지) 이렇게 하면 더욱 명확하게 될 것이다: @#x>y 에서 양수전환 (positive)이 된다 (반면에, cmp 는 첫번째 값이 더 큰 경우에 양수전환된다는 규칙을 기억해야 한다.) 물론, cmp 는 다른 이유로도 유용하다( 만약 비수치적인 것을 정렬하거나, 정렬이 안정적일 필요가 있어서).
그래서 질문은, 파이썬 디자이너(들)이 언어에서 sign 함수를 제외하도록 결정한 이유는 무엇인가? sign의 상위 함수가 아니라 #copysign 에 주력한 이유가 뭐지?
제가 놓치고 있는 게 있나요?
Peter Hansen의 댓글 후 수정합니다.
당신이 파이썬을 사용하지 않았다는 것은 공정하다, 하지만 당신은 파이썬을 어떤 목적으로 사용하는지 말하지 않았습니다. 저는 7년간 파이썬을 사용해왔는데, 그동안 무수히 많은 필요성을 느꼈고, 마지막에 겨우 끝마칠 수 있었습니다.
네, cmp를 전달할 수는 있지만 대부분 내가 전달해야할 때는 부호로도 충분히 작동 될 것 같은 lambda x,y: cmp(score(x),score(y)) 같은 관용어식으로 전달하는 경우였습니다.
마지막으로, sign가 copysign보다 더 유용하다는 점에 동의해 주시길 바라며, 내가 당신의 견해를 받아들인다 하더라도 왜 부호 대신 수학적으로 정의하는 것이 중요한지 궁금해 질 것이다. 어떻게 copysign이 sign보다 더 유용할 수 있는 건가요?
답변 1
편집:
실제로 patch이 sign()을 포함한 math이 있었지만, what it should return in all the edge cases (+/-0, +/-nan 등)에 대해 합의하지 않았기 때문에 받아들여지지 않았습니다.
그들은 copysign 만 구현하기로 결정했으며, 이는 (더 많은 단어가 필요하지만) used to delegate to the end user the desired behavior for edge cases 가 될 수 있습니다. - 이 sometimes might require the call to cmp(x,0) 입니다.
내가 그것이 내장되어 있지 않은 이유를 모르겠지만, 몇 가지 생각이 있습니다.
copysign(x,y):
Return x with the sign of y.
가장 중요한 것은 copysign가 function. 의 슈퍼셋이라는 것입니다! x=1로 호출하는 copysign 함수는 function. 함수와 동일합니다. 따라서 copysign만 사용하고 그만두면 됩니다.
>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0
만약 두 가지 전달인자를 불편하게 느낄 경우, 다른 이들이 언급한 IEEE 것과 호환 가능한 sign 구현 방식을 사용할 수 있습니다.
>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
>>> sign(0)
1.0
>>> sign(-0.0)
-1.0
>>> sign(float('nan'))
-1.0
둘째, 보통 어떤 것의 부호를 알고 싶을 때는 그것을 다른 값으로 곱해야 합니다. 그리고 물론 그것이 대체로 copysign이 하는 것입니다.
그래서, 대신에:
s = sign(a)
b = b * s
당신은 그냥 이렇게 할 수 있습니다:
b = copysign(b, a)
그리고 네, 당신이 파이썬을 7년동안 사용하고 cmp를 매우 쉽게 제거하고 @#sign 로 대체할 수 있다고 생각하는 것이 놀라워요. 당신은 그동안 @#__cmp__ 메소드를 가진 클래스를 구현해본 적이 없나요? 당신은 cmp을 호출하고 사용자 지정 비교 함수를 지정한 적이 없나요?
요약하자면, 나도 gn woul 함수를 필요로 하지만 첫번째 인자가 1일 때 copysign 함수가 아주 잘 작동합니다. gn woul 이 copysign 보다 더 유용하다고는 생각하지 않습니다. 두 함수는 동일한 기능을 가진 하위 집합에 불과하기 때문입니다.
답변 2
파이썬은 왜 부호 함수를 가지고 있지 않을까요?파이썬은 인기 있는 프로그래밍 언어 중 하나입니다. 이 언어는 사용하기 쉽고 다양한 용도로 활용됩니다. 하지만, 파이썬에는 부호 함수라는 것이 없습니다. 이는 많은 프로그래머들이 의아해하는 부분입니다. 왜 파이썬은 이러한 유용한 기능을 제공하지 않을까요? 이에 대한 이유는 다음과 같습니다.
첫째, 부호 함수는 상황에 따라 다르게 구현될 수 있습니다. 즉, 부호를 계산하는 방법은 다양합니다. 이는 코드가 불안정하고 호환성 문제가 발생할 수 있습니다. 따라서, 파이썬은 이러한 문제를 방지하기 위해 부호 함수를 제공하지 않는 것입니다.
둘째, 파이썬은 이미 부호를 계산하는 방법을 제공하고 있습니다. 다음과 같은 코드를 사용하면 부호를 계산할 수 있습니다.
def sign(x):
if x>0:
return 1
elif x<0:
return -1
else:
return 0
이러한 코드는 부호 함수보다 더 간단하고 직관적입니다. 또한 이 코드는 파이썬에서 많이 사용되고 있습니다.
셋째, 파이썬은 C 언어와 호환성이 좋습니다. C언어는 부호 함수를 제공하지 않습니다. 파이썬은 C언어와 함께 사용하기 쉽도록 부호 함수를 지원하지 않는 것입니다.
결론적으로, 파이썬이 부호 함수를 제공하지 않는 이유는 호환성, 안정성, 간결함 등의 이유로 설명될 수 있습니다. 따라서, 프로그래밍을 할 때 부호를 계산해야 한다면 위에서 제시한 코드를 사용하시는 것이 좋습니다.