간단한 작성 방법 (a + b == c 또는 a + c == b 또는 b + c == a)


136

부울 식을 작성하는 더 간결하거나 비열한 방법이 있습니까?

a + b == c or a + c == b or b + c == a

나는 생각해 냈다

a + b + c in (2*a, 2*b, 2*c)

그러나 그것은 조금 이상합니다.


16
더 컴팩트? 혹시. 더 파이썬적인? 있을 것 같지 않게.
chepner

126
미래의 자기 자신에게 호의를 베풀고 원래 형태로 유지하십시오. 바로 이것의 목적을 알려주는 것은 유일합니다. 수정하지 마십시오. “복잡한 것보다 간단합니다.”,“가독성이 중요합니다.”. "구현하기 어려운 경우 나쁜 생각입니다."
찌르다

21
파이썬 == 읽을 수 없습니까?
nhaarman

3
@wwii 상호 배타적이지 않습니다. a = 0, b = 0, c = 0;) 참조
Honza

1
@phresnel이 말한 것. 식을 "단순화"하는 대신 설명이 포함 된 함수로 식을 래핑하십시오.
Cephalopod

답변:


206

파이썬의 선을 보면 내 것을 강조합니다.

Tim Peters의 Python Zen

못생긴 것보다 아름답습니다.
암시적인 것보다 명시적인 것이 좋습니다.
단순보다 복잡합니다.
복잡한 것이 복잡한 것보다 낫습니다.
평평한 것이 중첩보다 낫습니다.
스파 스가 밀도보다 낫습니다.
가독성이 중요합니다.
특별한 경우는 규칙을 어길만큼 특별하지 않습니다.
실용성은 순도를 능가하지만.
오류가 자동으로 전달되지 않아야합니다.
명시 적으로 침묵하지 않는 한.
모호함에 직면하여 추측하려는 유혹을 거부하십시오.
그것을하는 명백한 방법이 있어야합니다.
네덜란드 인이 아니라면 처음에는 그 방법이 명확하지 않을 수 있습니다.
지금보다 결코 낫습니다.
결코 결코 낫지 않지만바로 지금
구현이 설명하기 어렵다면 나쁜 생각입니다.
구현이 설명하기 쉬운 경우 좋은 생각 일 수 있습니다.
네임 스페이스는 훌륭한 아이디어 중 하나입니다. 더 많은 것을 해보자!

가장 Pythonic 솔루션은 가장 명확하고 간단하며 설명하기 쉬운 솔루션입니다.

a + b == c or a + c == b or b + c == a

더 좋은 점은이 코드를 이해하기 위해 Python을 알 필요조차 없습니다! 그것은이다 쉬운. 이것은 예약없이 최상의 솔루션입니다. 다른 것은 지적 자위 행위입니다.

더구나, 이것은 제안 된 것 중 단 하나 뿐인 것이기 때문에 이것이 가장 성능이 좋은 솔루션 일 것입니다. 인 경우 a + b == c단일 추가 및 비교 만 수행됩니다.


11
더 나은 방법은 의도를 명확하게하기 위해 괄호를 사용하는 것입니다.
Bryan Oakley

3
의도는 괄호없이 이미 명확합니다. 괄호를 사용하면 읽기가 더 어려워집니다. 우선 순위가 이미 이것을 다룰 때 저자가 괄호를 사용하는 이유는 무엇입니까?
Miles Rout

1
너무 똑똑해 지려는 것에 대한 또 다른 메모 : 고려하지 않은 조건이 누락되어 예기치 않은 버그가 발생할 수 있습니다. 다시 말해, 새로운 컴팩트 솔루션이 동일 하다고 생각할 수 있지만 모든 경우에 해당되는 것은 아닙니다. 다른 방법으로 코드를 작성해야 할 강력한 이유가없는 한 (성능, 메모리 제한 등) 명확성이 가장 중요합니다.
Rob Craig

수식의 목적에 따라 다릅니다. '명시 성이 암시 적보다 낫다'를보십시오. '정렬 우선'접근법은 프로그램이 수행하는 작업이나 다른 것들 중 하나를보다 명확하게 표현할 수 있습니다. 나는 우리가 그 질문에서 판단 할 수 있다고 생각하지 않습니다.
Thomas Ahle

101

의 세 가지 평등을 해결 :

a in (b+c, b-c, c-b)

4
이것의 유일한 문제는 부작용입니다. b 또는 c가 더 복잡한 표현식 인 경우 여러 번 실행됩니다.
Silvio Mayolo

3
@Kroltan 내 요점은 실제로 그의 질문에 대답하여 "더 컴팩트 한"표현을 요구한다는 것이었다. 참조 : en.m.wikipedia.org/wiki/Short-circuit_evaluation
Alex Varga

24
이 코드를 읽는 사람은 아마도 "영리한"사람으로 저주 할 것입니다.
Karoly Horvath

5
@SilvioMayolo 원본도 마찬가지입니다
Izkata

1
@AlexVarga, "내 요점은 실제로 그의 질문에 대답했다" 당신은; 문자를 30 % 적게 사용합니다 (연산자 사이에 공백을 넣음). 나는 당신의 대답이 잘못되었다고 말하지 않고 단지 관용적 인 단어에 대해 언급했습니다. 좋은 대답입니다.
폴 드레이퍼

54

파이썬에는 시퀀스의 모든 요소를 ​​처리 하는 any함수가 or있습니다. 여기에서는 문장을 3 요소 튜플로 변환했습니다.

any((a + b == c, a + c == b, b + c == a))

참고 or개별 조건을 계산하는 것은 비싼 경우가 더 좋을 수도 원래의 구조를 유지하기 때문에, 단락이다.


2
any()all()단락도.
TigerhawkT3

42
@ TigerhawkT3이 경우에는 그렇지 않습니다. 튜플이 존재하기 전에 세 가지 표현식이 평가되고 튜플 any도 실행 되기 전에 존재 합니다.
찌를

13
아, 알겠습니다 거기에 발전기 또는 비슷한 게으른 반복 기가있을 때만 추측합니다.
TigerhawkT3

4
any그리고 주어진 반복성 all검사 하는 과정을 "단락" ; 그러나 iterable이 제너레이터가 아닌 시퀀스 인 경우 함수 호출이 발생하기 전에 이미 완전히 평가되었습니다 .
Karl Knechtel

이것은 여러 줄 (의 인수를 두 번 들여 쓰기를 통해 분할을 쉽게하는 장점이있다 any, 단일 들여 쓰기 ):에서 if수학이 포함될 때 가독성을 위해 많은 도움이 문)
Izkata

40

당신이 양수만을 다루고 있다는 것을 안다면, 이것은 효과가 있으며 매우 깨끗합니다.

a, b, c = sorted((a, b, c))
if a + b == c:
    do_stuff()

내가 말했듯이, 이것은 양수에만 적용됩니다. 그러나 그들이 긍정적이 될 것임을 안다면 이것은 코드에서 직접 함수가 아닌 매우 읽기 쉬운 솔루션 IMO입니다.

이 작업을 수행하면 약간의 반복 계산이 수행 될 수 있습니다. 그러나 성과를 목표로 지정하지 않았습니다.

from itertools import permutations

if any(x + y == z for x, y, z in permutations((a, b, c), 3)):
    do_stuff()

또는 permutations()반복 계산이 없거나 없을 가능성 :

if any(x + y == z for x, y, z in [(a, b, c), (a, c, b), (b, c, a)]:
    do_stuff()

아마도 이것이나 다른 솔루션을 함수에 넣을 것입니다. 그런 다음 코드에서 함수를 깨끗하게 호출 할 수 있습니다.

개인적으로 코드에서 더 많은 유연성이 필요하지 않으면 질문에 첫 번째 방법을 사용합니다. 간단하고 효율적입니다. 여전히 함수에 넣을 수 있습니다.

def two_add_to_third(a, b, c):
    return a + b == c or a + c == b or b + c == a

if two_add_to_third(a, b, c):
    do_stuff()

그것은 꽤 파이썬 적이며, 아마도 가장 효율적인 방법 일 것입니다 (추가 함수 호출은 제외). 실제로 문제를 일으키지 않는 한 어쨌든 성능에 대해 너무 걱정하지 않아도됩니다.


특히 a, b, c는 모두 음이 아니라고 가정 할 수 있습니다.
cphlewis

"항상 작동하지는 않습니다"라는 문구가 약간 혼란 스럽습니다. 첫 번째 솔루션은 숫자가 음수가 아닌 것을 확신하는 경우에만 작동합니다. 예를 들어 (a, b, c) = (-3, -2, -1)을 사용하면 a + b! = c이지만 b + c = a입니다. (-1, 1, 2) 및 (-2, -1, 1)의 경우와 유사합니다.
usernumber

@usernumber, 아시다시피, 나는 그것을 일찍 알아 차 렸습니다. 왜 내가 고치지 않았는지 확실하지 않습니다.
Cyphase

OP의 제안은 모든 입력에 대해 작동하는 반면 상위 솔루션은 큰 입력 클래스에 대해 작동하지 않습니다. "작동하지 않는"이 "작동하는"보다 파이썬적인 방법은 무엇입니까?
Barry

3
어, 스냅 " 만약 당신양수만을 다루고 있다는 것을 안다면 , 이것은 효과가 있고 매우 깨끗합니다." 다른 모든 숫자는 숫자에 관계없이 작동하지만 양수 만 다루는 것을 알고 있다면 최상위 숫자 는 읽기 쉽고 / Pythonic IMO입니다.
Cyphase

17

세 개의 변수 만 사용하는 경우 초기 방법 :

a + b == c or a + c == b or b + c == a

이미 매우 pythonic입니다.

더 많은 변수를 사용할 계획이라면 다음과 같은 추론 방법을 사용하십시오.

a + b + c in (2*a, 2*b, 2*c)

매우 영리하지만 이유를 생각할 수 있습니다. 왜 이것이 작동합니까?
간단한 산술을 통해 우리는 다음을 볼 수 있습니다.

a + b = c
c = c
a + b + c == c + c == 2*c
a + b + c == 2*c

그리고 이것은 그 예는 동일합니다 의미, a, b 또는 c에 대해 true를 유지해야한다 2*a, 2*b또는를 2*c. 이것은 여러 변수에 해당됩니다.

따라서 이것을 빠르게 작성하는 좋은 방법은 단순히 변수 목록을 가지고 두 배의 값 목록과 합계를 확인하는 것입니다.

values = [a,b,c,d,e,...]
any(sum(values) in [2*x for x in values])

이런 식으로 방정식에 변수를 더 추가하려면 'n'방정식을 쓰지 말고 'n'새로운 변수로 값 목록을 편집하면됩니다.


4
무엇에 대한 a=-1, b=-1, c=-2, 다음 a+b=c,하지만 a+b+c = -4하고 2*max(a,b,c)있다-2
에릭 Renouf

사실 감사합니다, 복근을 사용해야합니다. 지금 조정 중입니다.
ThatGuyRussell 3

2
십여 번의 abs()호출로 후추를 뿌린 후에 는 OP의 스 니펫보다 Pythonic입니다 (실제로 읽기가 쉽지 않습니다).
TigerhawkT3

즉, 매우 사실, 난 지금을 조정합니다
ThatGuyRussell

1
@ThatGuyRussell 단락을 위해 발전기를 사용하고 싶을 any(sum(values) == 2*x for x in values)것입니다.
Barry

12

다음 코드를 사용하여 각 요소를 다른 요소의 합계와 반복적으로 비교할 수 있습니다.이 요소는 해당 요소를 제외하고 전체 목록의 합계에서 계산됩니다.

 l = [a,b,c]
 any(sum(l)-e == e for e in l)

2
니스 :) 나는 당신 []이 두 번째 줄에서 브래킷 을 제거하면 , 이것도 원래처럼 단락됩니다 or...
psmears

1
이는 기본적으로 any(a + b + c == 2*x for x in [a, b, c])OP의 제안에 매우 가깝습니다
njzk2

비슷하지만이 방법은 여러 변수로 확장됩니다. @psmears의 단락에 대한 제안을 통합했습니다.
Arcanum

10

시도하고 단순화하지 마십시오. 대신 함수로 수행중인 작업의 이름을 지정하십시오 .

def any_two_sum_to_third(a, b, c):
  return a + b == c or a + c == b or b + c == a

if any_two_sum_to_third(foo, bar, baz):
  ...

조건을 "영리한"것으로 바꾸면 더 짧아 질 수 있지만 더 읽기 쉽지는 않습니다. 그러나이 세 가지 조건을 한눈에 확인하는 이유 를 아는 것은 까다로워서 읽기 쉽지 않은 방법으로 남겨 두십시오 . 이것은 당신이 확인하는 것을 절대적으로 명확하게 만듭니다.

성능과 관련하여이 접근 방식은 함수 호출의 오버 헤드를 추가하지만 반드시 해결해야하는 병목 현상을 발견하지 않으면 성능에 대한 가독성을 희생하지 않습니다. 일부 영리한 구현은 일부 상황에서 일부 함수 호출을 최적화하고 인라인 할 수 있으므로 항상 측정하십시오.


1
함수는 둘 이상의 스팟에서 동일한 코드를 사용하거나 코드가 복잡한 경우에만 작성해야합니다. 원래 질문에 코드 재사용에 대한 언급은 없으며 한 줄의 코드에 대한 함수를 작성하는 것은 과잉 일뿐 만 아니라 실제로 가독성을 손상시킵니다.
Igor Levicki

5
FP 학교에서 온 나는 완전히 동의하지 않으며 잘 알려진 한 줄 함수는 가독성을 높이는 데 가장 좋은 도구 중 하나라고 말합니다. 당신이 뭔가를 복용하고있는 단계는 바로 선명도를 가져 오지 않는 때마다 기능을 확인 어떤 함수의 이름은 사용자가 지정할 수 있습니다, 당신이하고있는 것을 더 잘 댓글이 할 수있는 것보다.
Jack

어떤 학교를 부르든간에 맹목적으로 일련의 규칙을 준수하는 것은 좋지 않습니다. 소스의 다른 부분으로 이동하여 함수에 숨겨진 한 줄의 코드를 읽으면 실제로 이름에서 말하는 것을 실제로 수행 한 다음 호출 위치로 다시 전환해야한다는 것을 확인할 수 있습니다. 올바른 매개 변수를 전달하는 것이 완전히 불필요한 컨텍스트 전환인지 확인하십시오. 내 의견으로는 그렇게하면 가독성과 워크 플로우가 모두 손상됩니다. 마지막으로 함수 이름이나 코드 주석은 코드 문서를 올바르게 대체하지 않습니다.
Igor Levicki

9

파이썬 3 :

(a+b+c)/2 in (a,b,c)
(a+b+c+d)/2 in (a,b,c,d)
...

여러 변수로 확장됩니다.

arr = [a,b,c,d,...]
sum(arr)/2 in arr

그러나 일반적으로 세 개 이상의 변수가 없으면 원래 버전을 더 읽기 쉽다는 데 동의합니다.


3
부동 소수점 반올림 오류로 인해 일부 입력에 대해 잘못된 결과를 반환합니다.
pts

성능과 정확성을 이유로 구분을 피해야합니다.
Igor Levicki

1
@pts 부동 소수점 반올림으로 인해 구현에서 잘못된 결과를 반환하지 않습니까? 심지어 a + b == c
osundblad

@osundblad : a, b 및 c가 정수인 경우 (a + b + c) / 2는 반올림을 수행하고 잘못된 결과를 반환 할 수 있지만 a + b == c는 정확합니다.
pts

3
2로 나누면 단순히 지수가 1 씩 감소하므로 2 ^ 53보다 작은 정수 (파이썬에서 부동 소수점 부분)의 경우 정확하고 더 큰 정수의 경우 decimal 을 사용할 수 있습니다 . 예를 들어, 2 ^ 30 미만의 정수를 확인하려면[x for x in range(pow(2,30)) if x != ((x * 2)/ pow(2,1))]
Vitalii Fedorenko

6
(a+b-c)*(a+c-b)*(b+c-a) == 0

두 항의 합이 세 번째 항과 같으면 요인 중 하나가 0이되어 전체 제품이 0이됩니다.


나는 정확히 같은 것을 생각하고 있었지만 그의 원래 제안이 더 깨끗하다는 것을 부정 할 수는 없다.
user541686

@Mehrdad-물론입니다. 정말 다르지 않습니다(a+b<>c) && (a+c<>b) && (b+c<>a) == false
mbeckish

곱셈이 논리식과 기본 산술보다 비싸다는 것입니다.
Igor Levicki

@IgorLevicki-그렇습니다. 매우 조기 최적화 문제입니다. 이 작업이 초당 수만 번 수행됩니까? 그렇다면 아마도 다른 것을보고 싶을 것입니다.
mbeckish

@mbeckish-왜 그것이 조기라고 생각합니까? 코드는 최적화를 염두에두고 작성해야하며 나중에 생각할 때 최적화되지 않아야합니다. 언젠가 일부 인턴은이 코드 스 니펫을 복사하여 임베디드 플랫폼의 성능 결정 루프에 붙여 넣어 수백만 대의 장치에서 실행될 것입니다. 이러한 코드를 작성하면 잘못된 코딩 방식이 권장됩니다. 제 생각에 OP가 물어야 할 것은 그 논리 표현을 최적화하는 방법이 있는지입니다.
Igor Levicki

6

어때요?

a == b + c or abs(a) == abs(b - c)

변수가 부호없는 경우에는 작동하지 않습니다.

코드 최적화 관점에서 (적어도 x86 플랫폼에서는) 이것이 가장 효율적인 솔루션 인 것 같습니다.

최신 컴파일러는 abs () 함수 호출을 인라인하고 CDQ, XOR 및 SUB 명령어영리한 시퀀스를 사용하여 부호 테스트 및 후속 조건부 분기를 피 합니다 . 따라서 위의 높은 수준의 코드는 대기 시간이 짧고 처리량이 많은 ALU 명령어와 두 개의 조건부만으로 표현됩니다.


그리고 유형에 fabs()사용할 수 있다고 생각 float합니다.).
shA.t

4

Alex Varga가 제공 한 "a in (b + c, bc, cb)"솔루션은 작고 수학적으로 아름답지만 다음 개발자가 코드의 목적을 즉시 이해하지 못하기 때문에 실제로 그런 식으로 코드를 작성하지는 않습니다. .

마크 랜섬의 솔루션

any((a + b == c, a + c == b, b + c == a))

보다 명확하지만 간결하지는 않습니다.

a + b == c or a + c == b or b + c == a

다른 사람이보아야 할 코드를 작성할 때, 또는 내가 작성할 때 생각했던 것을 잊었을 때 오랜 시간을보아야 할 코드를 작성할 때 너무 짧거나 영리한 것이 좋은 것보다 더 해가되는 경향이 있습니다. 코드를 읽을 수 있어야합니다. 간결함은 훌륭하지만 간결하지는 않지만 다음 프로그래머가 이해할 수 없습니다.


정직한 질문 : 왜 사람들은 항상 다음 프로그래머가 코드를 읽을 수없는 바보가 될 것이라고 생각합니까? 나는 개인적으로 그 아이디어를 모욕하는 것을 발견했다. 만약 모든 프로그래머에게 명백하게 코드를 작성해야한다면, 이는 우리가 직업으로서 가장 낮은 공통 분모를 수용하고 있음을 의미합니다. 우리가 계속 그렇게한다면, 그들은 어떻게 개인적 능력을 향상시킬 수 있습니까? 나는 다른 직업에서 이것을 보지 못합니다. 작곡가가 간단한 음악 악보를 쓰는 것을 마지막으로 보았을 때 모든 음악가가 기술 수준에 관계없이 연주 할 수 있도록했을까요?
Igor Levicki

6
문제는 프로그래머조차도 정신 에너지가 제한되어 있기 때문에 알고리즘과 프로그램의 높은 수준의 측면에서 제한된 정신 에너지를 사용하거나 더 간단하게 표현할 수있을 때 복잡한 코드 줄이 무엇을 의미하는지 파악하고 싶습니다 ? 올림픽 주자가 단지 배낭 때문에 무거운 경주를 할 수 없기 때문에 프로그래밍은 어렵 기 때문에 불필요하게 힘들게 만들지 마십시오. Steve McConell이 Code Complete 2에서 말한 것처럼 가독성은 코드의 가장 중요한 측면 중 하나입니다.
Paul J Abernathy

2

요청은 더 간결하거나 더 많은 pythonic에 대한 것입니다-나는 더 컴팩트하게 손을 시험해 보았습니다.

주어진

import functools, itertools
f = functools.partial(itertools.permutations, r = 3)
def g(x,y,z):
    return x + y == z

원본보다 2 자 적습니다.

any(g(*args) for args in f((a,b,c)))

테스트 :

assert any(g(*args) for args in f((a,b,c))) == (a + b == c or a + c == b or b + c == a)

또한 다음과 같이 주어진다 :

h = functools.partial(itertools.starmap, g)

이것은 동등하다

any(h(f((a,b,c))))

글쎄, 그것은 원본보다 두 문자가 짧지 만 OP가 직후에 준 문자는 아닙니다. 그는 현재 사용하고 있다고 말했습니다. 원본에는 많은 공백이 포함되어 있으므로 가능하면 생략됩니다. g()이것이 작동하도록 정의해야 할 작은 기능도 있습니다. 모든 것을 감안할 때, 나는 그것이 훨씬 크다고 말할 것입니다.
TigerhawkT3

@ TigerigerT3, 나는 그것을 짧은 표현 / 줄에 대한 요청으로 해석했습니다. 추가 개선을 위해 편집을 참조하십시오 .
wwii

4
코드 골프에만 적합한 매우 나쁜 기능 이름.
0xc0de 5

@ 0xc0de-죄송합니다. 재생하지 않습니다. 적절한는 매우 주관적이고 상황에 따라 달라질 수 있습니다 -하지만 난 사회에 연기됩니다.
wwii

원래 코드보다 많은 문자가있을 때 이것이 얼마나 컴팩트한지 알 수 없습니다.
Igor Levicki

1

가장 파이썬적인 답변 으로 보이는 것을 제시하고 싶습니다 .

def one_number_is_the_sum_of_the_others(a, b, c):
    return any((a == b + c, b == a + c, c == a + b))

일반적으로 최적화되지 않은 경우 :

def one_number_is_the_sum_of_the_others(numbers):
    for idx in range(len(numbers)):
        remaining_numbers = numbers[:]
        sum_candidate = remaining_numbers.pop(idx)
        if sum_candidate == sum(remaining_numbers):
            return True
    return False 

파이썬의 선에 관해서는 강조된 문장이 다른 답변보다 더 많이 따르는 것으로 생각합니다.

Tim Peters의 Python Zen

못생긴 것보다 아름답습니다.
암시적인 것보다 명시적인 것이 좋습니다.
단순보다 복잡합니다.
복잡한 것이 복잡한 것보다 낫습니다.
평평한 것이 중첩보다 낫습니다.
스파 스가 밀도보다 낫습니다.
가독성이 중요합니다.
특별한 경우는 규칙을 어길만큼 특별하지 않습니다.
실용성은 순도를 능가하지만.
오류가 자동으로 전달되지 않아야합니다.
명시 적으로 침묵하지 않는 한.
모호함에 직면하여 추측하려는 유혹을 거부하십시오.
그것을하는 명백한 방법이 있어야합니다.
네덜란드 인이 아니라면 처음에는 그 방법이 명확하지 않을 수 있습니다.
지금보다 결코 낫습니다.
결코 결코 낫지 않지만바로 지금
구현이 설명하기 어렵다면 나쁜 생각입니다.
구현이 설명하기 쉬운 경우 좋은 생각 일 수 있습니다.
네임 스페이스는 훌륭한 아이디어 중 하나입니다. 더 많은 것을 해보자!


1

내 프로그래밍의 오래된 습관으로, 복잡한 표현을 절에 올바르게 배치하면 다음과 같이 더 읽기 쉽습니다.

a == b+c or b == a+c or c == a+b

플러스 ():

((a == b+c) or (b == a+c) or (c == a+b))

또한 여러 줄을 사용하면 다음과 같이 더 의미가 있다고 생각합니다.

((a == b+c) or 
 (b == a+c) or 
 (c == a+b))

0

일반적인 방식으로

m = a+b-c;
if (m == 0 || m == 2*a || m == 2*b) do_stuff ();

입력 변수 조작이 괜찮다면

c = a+b-c;
if (c==0 || c == 2*a || c == 2*b) do_stuff ();

비트 핵을 사용하여 악용하려는 경우 "!", ">> 1"및 "<< 1"을 사용할 수 있습니다.

반올림 오류를 피하기 위해 두 번의 곱셈을 피하는 데 사용할 수는 있지만 나누기를 피했습니다. 그러나 오버플로 확인


0
def any_sum_of_others (*nums):
    num_elements = len(nums)
    for i in range(num_elements):
        discriminating_map = map(lambda j: -1 if j == i else 1, range(num_elements))
        if sum(n * u for n, u in zip(nums, discriminating_map)) == 0:
            return True
    return False

print(any_sum_of_others(0, 0, 0)) # True
print(any_sum_of_others(1, 2, 3)) # True
print(any_sum_of_others(7, 12, 5)) # True
print(any_sum_of_others(4, 2, 2)) # True
print(any_sum_of_others(1, -1, 0)) # True
print(any_sum_of_others(9, 8, -4)) # False
print(any_sum_of_others(4, 3, 2)) # False
print(any_sum_of_others(1, 1, 1, 1, 4)) # True
print(any_sum_of_others(0)) # True
print(any_sum_of_others(1)) # False

함수는 둘 이상의 스팟에서 동일한 코드를 사용하거나 코드가 복잡한 경우에만 작성해야합니다. 원래 질문에 코드 재사용에 대한 언급은 없으며 한 줄의 코드에 대한 함수를 작성하는 것은 과잉 일뿐 만 아니라 실제로 가독성을 손상시킵니다.
Igor Levicki

나는 그것이 가독성을 손상 시킨다는 것에 동의하지 않는다; 적절한 이름을 선택하면 가독성이 향상 될 수 있습니다 (그러나이 답변에서 선택한 이름의 품질에 대해서는 언급하지 않습니다). 또한 개념에 이름을 지정하는 것이 도움이 될 수 있습니다. 기능에 좋은 이름을 주도록 강요하는 한 그렇게해야합니다. 기능이 좋습니다. 기능이 기능에 캡슐화되어 혜택을 볼 수있을만큼 기능이 복잡한 지 여부는 주관적인 판단입니다.
Hammerite
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.