파이썬에는 삼항 조건 연산자가 있습니까? 경우 다른 언어 구문을

파이썬에 삼항 조건 연산자가없는 경우 다른 언어 구문을 사용하여이를 시뮬레이션 할 수 있습니까?



답변

예, 버전 2.5에서 추가 되었습니다. 표현식 구문은 다음과 같습니다.

a if condition else b

먼저 condition평가 된 후 a또는 b부울 값을 기준으로 정확하게 평가되거나 반환 condition됩니다. 경우에 condition평가하여 제품에 True, 다음 a평가 및 반환 있지만 b때 무시, 또는 다른되고 b평가 및 반환되지만 a무시됩니다.

이것은 condition참일 때만 a평가되고 b전혀 평가되지 않기 때문에 단락을 허용 하지만, condition거짓 일 때만 b평가되고 a전혀 평가되지 않기 때문입니다.

예를 들면 다음과 같습니다.

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

조건문은 참고 표현 이 아닌 . 이는 조건식 내에서 대 입문 pass또는 다른 명령문을 사용할 수 없음을 의미합니다 .

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

그러나 조건식을 사용하여 다음과 같이 변수를 지정할 수 있습니다.

x = a if True else b

조건식을 두 값 사이를 전환하는 것으로 생각하십시오. ‘하나의 가치 또는 다른’상황에있을 때 매우 유용하지만 그다지 많은 일을하지는 않습니다.

명령문을 사용해야하는 경우 조건식 대신 일반 if 명령문 을 사용해야합니다 .


몇 가지 이유로 인해 일부 Pythonistas는 눈살을 찌푸 리고 있음을 명심하십시오.

  • 인수의 순서는 다른 condition ? a : b많은 언어 (예 : C, C ++, Go, Perl, Ruby, Java, Javascript 등) 의 기존 삼항 연산자 의 순서와 다릅니다 . 이로 인해 사람들이 Python의 ” 놀랍게도 “행동은 그것을 사용합니다 (논쟁 순서를 바꿀 수도 있습니다).
  • 어떤 사람들은 생각의 정상적인 흐름 (조건을 먼저 생각한 다음 그 영향을 생각 함)과 상반되기 때문에 그것을 다루기 힘들다.
  • 양식상의 이유. ( ‘인라인 if‘은 실제로 유용하고 스크립트를 더 간결하게 만들 수 있지만 실제로는 코드를 복잡하게 만듭니다)

당신이 명령을 기억하는데 어려움이 있다면, 큰 소리로 읽을 때, 당신은 (거의) 당신이 의미하는 것을 말한다는 것을 기억하십시오. 예를 x = 4 if b > 8 else 9들어을 소리내어 읽습니다 x will be 4 if b is greater than 8 otherwise 9.

공식 문서 :


답변

튜플로 색인을 생성 할 수 있습니다.

(falseValue, trueValue)[test]

testTrue 또는 False 를 반환해야합니다 .
항상 다음과 같이 구현하는 것이 더 안전 할 수 있습니다.

(falseValue, trueValue)[test == True]

또는 내장을 사용하여 부울bool()을 보장 할 수 있습니다 .

(falseValue, trueValue)[bool(<expression>)]

답변

2.5 이전 버전의 경우 트릭이 있습니다.

[expression] and [on_true] or [on_false]

on_true
부울 값이 잘못된 경우 잘못된 결과를 줄 수 있습니다 . 1
왼쪽에서 오른쪽으로 표현을 평가할 수 있다는 이점이 있지만, 이는 내 의견으로는 더 분명합니다.

1. C의”? :”삼항 연산자에 해당하는 것이 있습니까?


답변

<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

답변

에서 문서 :

조건식 (때때로 “삼항 연산자”라고도 함)은 모든 Python 작업의 우선 순위가 가장 낮습니다.

표현식은 x if C else y먼저 조건 C ( x 아님)를 평가합니다 . 만약 C가 참이고, X는 계산되고 그 값이 리턴되고; 그렇지 않으면 y 가 평가되고 해당 값이 리턴됩니다.

참조 PEP (308)를 조건식에 대한 자세한 내용은.

버전 2.5 이후 새로운 기능.


답변

Python의 조건부 표현식 연산자는 2006 년 Python Enhancement Proposal 308의 일부로 추가되었습니다 . 형식은 일반적인 ?:연산자와 다르며 다음과 같습니다.

<expression1> if <condition> else <expression2>

이는 다음과 같습니다.

if <condition>: <expression1> else: <expression2>

예를 들면 다음과 같습니다.

result = x if a > b else y

사용할 수있는 다른 구문 (2.5 이전 버전과 호환 가능) :

result = (lambda:y, lambda:x)[a > b]()

피연산자가 느리게 평가 됩니다.

다른 방법은 튜플을 인덱싱하는 것입니다 (대부분의 다른 언어의 조건 연산자와 일치하지 않음).

result = (y, x)[a > b]

또는 명시 적으로 구성된 사전 :

result = {True: x, False: y}[a > b]

신뢰성이 떨어지지 만 신뢰할 수있는 또 다른 방법은 사용 andor연산자입니다.

result = (a > b) and x or y

그러나이 작동하지 않습니다 x것입니다 False.

가능한 해결 방법은 만드는 것입니다 xy다음과 같이리스트 나 튜플을 :

result = ((a > b) and [x] or [y])[0]

또는:

result = ((a > b) and (x,) or (y,))[0]

삼항 조건을 사용하는 대신 사전을 사용하는 경우 다음과 같은 이점을 활용할 수 있습니다 get(key, default).

shell = os.environ.get('SHELL', "/bin/sh")

출처 : ? : Wikipedia의 Python


답변

불행히도

(falseValue, trueValue)[test]

솔루션에는 단락 동작이 없습니다. 따라서 모두 falseValuetrueValue관계없이 증상의 평가된다. 이 될 수있는 최적 또는 버그 (즉, 모두 trueValuefalseValue방법하고 부작용을 가질 수있다).

이것에 대한 한 가지 해결책은

(lambda: falseValue, lambda: trueValue)[test]()

(승자가 알려질 때까지 실행이 지연됨)) 호출 가능 오브젝트와 호출 불가능 오브젝트간에 불일치가 발생합니다. 또한 속성을 사용할 때 경우를 해결하지 못합니다.

그리고 이야기는 계속됩니다. 언급 된 3 가지 솔루션 중에서 선택하는 것은 적어도 Зython 2.5 (더 이상 문제가되지 않음)를 사용하고 ” trueValue-false-to-false”오류 가 발생하지 않는 단락 기능을 갖는 것 사이의 절충입니다. .