파이썬에 삼항 조건 연산자가없는 경우 다른 언어 구문을 사용하여이를 시뮬레이션 할 수 있습니까?
답변
예, 버전 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]
test
True 또는 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]
신뢰성이 떨어지지 만 신뢰할 수있는 또 다른 방법은 사용 and
및 or
연산자입니다.
result = (a > b) and x or y
그러나이 작동하지 않습니다 x
것입니다 False
.
가능한 해결 방법은 만드는 것입니다 x
및 y
다음과 같이리스트 나 튜플을 :
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")
답변
불행히도
(falseValue, trueValue)[test]
솔루션에는 단락 동작이 없습니다. 따라서 모두 falseValue
와 trueValue
관계없이 증상의 평가된다. 이 될 수있는 최적 또는 버그 (즉, 모두 trueValue
와 falseValue
방법하고 부작용을 가질 수있다).
이것에 대한 한 가지 해결책은
(lambda: falseValue, lambda: trueValue)[test]()
(승자가 알려질 때까지 실행이 지연됨)) 호출 가능 오브젝트와 호출 불가능 오브젝트간에 불일치가 발생합니다. 또한 속성을 사용할 때 경우를 해결하지 못합니다.
그리고 이야기는 계속됩니다. 언급 된 3 가지 솔루션 중에서 선택하는 것은 적어도 Зython 2.5 (더 이상 문제가되지 않음)를 사용하고 ” trueValue
-false-to-false”오류 가 발생하지 않는 단락 기능을 갖는 것 사이의 절충입니다. .