[Python] 파이썬에는 삼항 조건부 연산자가 있습니까?



Answers

터플로 인덱스 할 수 있습니다 :

(falseValue, trueValue)[test]

test 또는 거짓 을 반환해야합니다.
항상 다음과 같이 구현하는 것이 더 안전 할 수 있습니다.

(falseValue, trueValue)[test == True]

또는 bool() 을 사용하여 Boolean 값을 지정할 수 있습니다.

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

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




다른 답변에 언급 된 바와 같이 삼항 옵션이 있지만 부울 또는 없음 값을 확인하는 경우 "또는"을 사용하여 시뮬레이션 할 수도 있습니다.

>>> a = False
>>> b = 5
>>> a or b
5

>>> a = None
>>> a or b
5



파이썬에는 삼항 조건부 연산자가 있습니까?

예. 문법 파일에서 :

test: or_test ['if' or_test 'else' test] | lambdef

관심있는 부분은 다음과 같습니다.

or_test ['if' or_test 'else' test]

따라서 삼항 조건부 연산은 다음과 같은 형식입니다.

expression1 if expression2 else expression3

expression3 은 느리게 평가됩니다 (즉, 부울 컨텍스트에서 expression2 가 false 인 경우에만 평가됩니다). 그리고 재귀적인 정의로 인해, 당신은 무기한으로 연결할 수 있습니다 (나쁜 스타일이라고 생각할 수도 있음).

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

사용법에 대한 참고 사항 :

모든 ifelse 따라야합니다. 목록 내포물과 생성자 표현을 배우는 사람들은 이것을 배우기가 어려운 교훈으로 간주 할 수 있습니다. 다음은 작동하지 않습니다. Python은 else에 대한 세 번째 표현을 기대합니다.

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

SyntaxError: invalid syntax .가 발생 SyntaxError: invalid syntax . 그래서 위의 것은 불완전한 논리입니다 (아마도 사용자는 거짓 조건에서 아무 작업도하지 않을 것으로 기대합니다). 또는 의도 된 것은 expression2를 필터로 사용하는 것입니다 - 다음은 합법적 인 파이썬입니다 :

[expression1 for element in iterable if expression2]

expression2 는 목록 이해를위한 필터로 작동하며 삼항 조건 연산자가 아닙니다 .

더 좁은 경우의 대체 구문 :

다음을 작성하는 것이 다소 힘들 수도 있습니다.

expression1 if expression1 else expression2

expression1 은 위의 사용법으로 두 번 평가해야합니다. 단순히 지역 변수 인 경우 중복성을 제한 할 수 있습니다. 그러나,이 유스 케이스에 대한 공통적이고 실행 가능한 Pythonic 관용구는 행동을 사용 or 단축키를 사용하는 것입니다.

expression1 or expression2

이는 의미론에서 동일하다. 일부 스타일 가이드는 명확성을 이유로이 사용을 제한 할 수 있습니다. 아주 적은 구문으로 많은 의미를 담고 있습니다.




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

그러나 xFalse 이면이 작업은 작동하지 않습니다.

가능한 해결 방법은 다음과 같이 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")

출처 : ?:




당신은 종종

cond and on_true or on_false

하지만 on_true == 0 일 때 문제가 발생합니다.

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

여기서 당신은 정상 삼항 연산자를 기대할 것입니다.

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1



예.

>>> b = (True if 5 > 4 else False)
>>> print b
True



조건 else if expression2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1



In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1



대답보다 팁이 더 많습니다 (hundreth 시간 동안 분명히 반복 할 필요는 없습니다). 그러나 가끔 그런 구문의 한 줄자 단축키로 사용합니다.

if conditionX:
    print('yes')
else:
    print('nah')

,된다 :

print('yes') if conditionX else print('nah')

일부는 (많은 :) unpythonic (조차, 루비 - ish :)으로 찡그린 수 있습니다,하지만 개인적으로 더 자연스럽게 그것을 발견 - 즉, 당신이 정상적으로 그것을 표현하는 방법 플러스 비트의 시각적으로 큰 블록에 호소 플러스.




파이썬 2.5와 그 이후에는 특별한 문법이 있습니다 :

[on_true] if [cond] else [on_false]

구형 Python에서는 삼항 연산자가 구현되지 않지만이를 시뮬레이션 할 수 있습니다.

cond and on_true or on_false

하지만, condTrue 평가되고 on_falseFalse 로 평가되면 on_false 대신 on_false 가 반환되는 잠재적 인 문제가 있습니다. 이 동작을 원한다면이 메서드는 정상이며, 그렇지 않으면 다음을 사용하십시오.

{True: on_true, False: on_false}[cond is True] # is True, not == True

다음으로 래핑 할 수 있습니다.

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

다음과 같이 사용합니다.

q(cond, on_true, on_false)

모든 Python 버전과 호환됩니다.




Links