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





11 Answers

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

(falseValue, trueValue)[bool(<expression>)]
python operators ternary-operator conditional-operator python-2.5

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




조건 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



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")

출처 : ?:




파이썬 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 버전과 호환됩니다.




당신은 종종

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



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

예. 문법 파일에서 :

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

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




당신은 이것을 할 수 있습니다 :

[condition] and [expression_1] or [expression_2] ;

예:-

print(number%2 and "odd" or "even")

번호가 홀수 인 경우 "홀수"또는 짝수 인 경우 "짝수"가 인쇄됩니다.

결과는 다음과 같습니다. - 조건이 true이면 exp_1이 실행되고 그렇지 않으면 exp_2가 실행됩니다.

주 : - 0, None, False, emptylist, emptyString은 False로 평가됩니다. 그리고 0이 아닌 다른 데이터는 True로 평가됩니다.

다음은 작동 방식입니다.

조건 [condition]이 "True"가되면 expression_1은 평가되지만 expression_2는 평가되지 않습니다. 우리가 "0"을 가진 무언가 "0"이라면, 결과는 항상 fasle이 될 것입니다. 그래서 아래 명령문에서,

0 and exp

표현식 exp는 전혀 평가되지 않을 것입니다. "and"가 0이면 항상 0으로 평가되고 표현식을 평가할 필요가 없기 때문입니다. 이것은 컴파일러가 모든 언어로 작동하는 방식입니다.

에서

1 or exp

expression exp는 전혀 평가되지 않을 것입니다. 왜냐하면 "1"을 가진 "or"가 항상 1이 될 것이기 때문에 결과는 1이 될 것이기 때문에 표현 exp를 평가하는 것은 어렵지 않을 것입니다. (컴파일러 최적화 방법).

그러나

True and exp1 or exp2

두 번째 표현식 exp2는 True and exp1 가 아니므로 평가되지 않으며 exp1은 false가 아닌 경우 True가됩니다.

마찬가지로

False and exp1 or exp2

표현식 exp1은 False가 0을 쓰는 것과 같고 0을 "0"과 같으므로 exp1은 평가되지 않습니다. "or"가 사용되기 때문에 exp1 다음에 "or"다음에 exp2가 평가됩니다.

참고 : - "or"및 "and"를 사용하는 이러한 종류의 분기는 expression_1의 진리 값이 False (또는 0 또는 None 또는 emptylist [] 또는 emptystring '')가 아닌 경우에만 사용할 수 있습니다. expression_1이 False이면 exp_1과 exp_2 사이에 "or"가 있기 때문에 expression_2가 평가됩니다.

exp_1과 exp_2의 진리 값이 무엇이든 상관없이 모든 경우에 대해 여전히 작동하게하려면 다음과 같이하십시오.

[condition] and ([expression_1] or 1) or [expression_2] ;




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



네, 그렇게 사용할 수 있습니다 :

is_fat = True
state = "fat" if is_fat else "not fat"

삼항 조건부 연산자 에 대해 더 자세히 읽어보십시오.




예, 파이썬 삼진 연산자를 가지고, 여기에 구문과 예제 코드는 동일을 보여줍니다 :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")



변수가 정의되어 있고 값이 있는지 확인하려는 경우 a or b 만 가능 a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

출력 할 것이다.

no Input
no Input
no Input
hello
['Hello']
True



Related