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


6042

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


149
위의 주석에서 참조 된 Python 3.0 공식 문서에서이를 "조건부 표현식"이라고하며 매우 암호 적으로 정의됩니다. 이 문서에는 "삼항"이라는 용어도 포함되어 있지 않기 때문에 무엇을 찾아야할지 정확히 알지 못한다면 Google을 통해 찾기가 어려울 것입니다. 버전이 문서는 좀 더 유용하고에 대한 링크 포함 "PEP (308)" 이 질문에 관한 흥미로운 역사적 맥락을 많이 포함되어 있습니다.
nobar

26
"삼원"(세 개의 입력 값을 가짐)은 개념의 정의 속성이 아니라이 영향의 결과 속성입니다. 예 : SQL은 case [...] { when ... then ...} [ else ... ] end비슷한 효과를 갖지만 전혀 3 진은 아닙니다.
user313114

10
또한 ISO / IEC 9899 (C 프로그래밍 언어 표준) 섹션 6.5.15 통화 그것을 "를 condtitional 연산자"
user313114

9
Wikipedia는 기사 " ? : " 에이 내용을 자세히 설명합니다 .
HelloGoodbye

9
nobar가 언급 한 이후 몇 년 동안 조건식 문서조건식 (때때로 "삼항 연산자"라고도 함)이라고
Scott Martin

답변:


7040

예, 버전 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.

공식 문서 :


268
코더에게는 순서가 이상하게 보일 수 있지만 f(x) = |x| = x if x > 0 else -x수학자에게는 매우 자연스럽게 들립니다. C를 사용하는 경우를 제외하고 대부분의 경우 A와 마찬가지로 이해할 수도 있습니다.
yota

120
사용시 순서에주의하십시오. 예를 들어, line z = 3 + x if x < y else y입니다. 경우 x=2y=1, 그 4를 얻을 것으로 예상 할 수 있지만 실제로 1. 얻을 것이다 z = 3 + (x if x > y else y)올바른 사용법이다.
Kal Zekdor

11
요점은 결과에 값을 추가하는 것과 같이 조건부 평가 추가 평가를 수행하려는 경우 추가 표현식을 양쪽에 추가 z = 3 + x if x < y else 3 + y하거나 조건부 ( z = 3 + (x if x < y else y)또는 z = (x if x < y else y) + 3)를 그룹화해야합니다.
Kal Zekdor

4
@MrGeek, 나는 당신이 무슨 뜻인지 알기 때문에 기본적으로 연산을 중첩 할 것입니다 :`Bool else면 ""foo "(Bool else"foobar "면"bar ")`
Dimesio

3
수학에서는 항상 기본 개념에 의지하기 때문에 프로그래머는 수학자보다 정확한 정확한 공식이 필요합니다. 설득력있는 주장은 % 연산자이며, 수학에서 "mod"가 사용되는 방식을 모방 한 것은 재앙이었을 것입니다. 아니, 난 당신의 주장을 받아들이지 않습니다. 제국 단위를 고수하는 것과 같습니다. Groetjes Albert
Albert van der Horst

796

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

(falseValue, trueValue)[test]

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

(falseValue, trueValue)[test == True]

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

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

590
이 것은 항상 모든 것을 평가하지만 if / else 구문은 승리 한 표현 만 평가합니다.
SilverbackNet

117
(lambda: print("a"), lambda: print("b"))[test==true]()
Dustin Getz

15
[]s 안에 있는 것은 임의의 표현 일 수 있습니다. 또한 안전을 위해을 작성하여 명시 적으로 진실성을 테스트 할 수 있습니다 [bool(<expression>)]. 이 bool()기능은 v2.2.1부터 사용되었습니다.
martineau

12
한 번 또는 두 번,하지만 그것을 한 - - 나는 비슷한 트릭을 수행 한 색인에 의해 사전에로 True하고 False열쇠로 : {True:trueValue, False:falseValue}[test] 난이 덜 효율적인지 모르겠지만, 적어도 피하기 전체에게로 수행 "우아한"대 "못생긴"토론. int보다는 boolean을 다루는 모호성이 없습니다.
JDM


338

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

[expression] and [on_true] or [on_false]

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

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


67
해결책은이 트랩을 피하는 (test and [true_value] 또는 [false_value]) [0]을 사용하는 것입니다.
ThomasH

5
3 차 연산자는 일반적으로 더 빠릅니다 (때로는 10-25 %).
화산

7
@volcano 나에게 소스가 있습니까?
OrangeTux

4
@OrangeTux 다음은 분해 된 코드 입니다. ThomasH가 제안한 방법을 사용하면 속도가 더 느려집니다.
mbomb007

265

<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

83
이것은 삼항 연산자의 주요 의도, 즉 가치 선택을 강조합니다. 또한 하나 이상의 삼항이 하나의 표현으로 연결될 수 있음을 보여줍니다.
Roy Tinker

6
@Craig는 동의하지만 괄호가 없을 때 어떤 일이 발생하는지 아는 것도 도움이됩니다. 실제 코드에서는 명시 적 인 parens를 삽입하는 경향이 있습니다.
Jon Coombs

158

에서 문서 :

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

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

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

버전 2.5 이후 새로운 기능.


120

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


1
result = {1: x, 0: y}[a > b]다른 가능한 변형이다 ( True그리고 False, 실제로 값이 정수 10)
월터 Tross

98

불행히도

(falseValue, trueValue)[test]

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

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

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

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

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


2
람다 트릭의 튜플은 작동하지만 삼항 연산자보다 약 3 배가 걸립니다. 긴 체인을 대체 할 수 있다면 합리적인 아이디어 일 것입니다 if else if.
Perkins

72

다른 프로그래밍 언어의 삼항 연산자

여기서는 ternary operator몇 가지 프로그래밍 언어의 중요한 차이점을 보여 주려고 합니다.

자바 스크립트의 삼항 연산자

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

루비의 삼항 연산자

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

스칼라의 3 차 연산자

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

R 프로그래밍의 3 진 연산자

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

파이썬의 삼항 연산자

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0


5
의견이있는 것 같습니다. 그러나 본질적으로 파이썬 구문은 삼항 연산자를 보지 않은 사람이 이해할 수 있지만, 가장 먼저 구문이 무엇인지 알려주지 않으면 더 일반적인 구문을 이해하는 사람은 거의 없습니다.
fralau

1
Algol68 : a = .if. .진실. .그때. 그 외 1 0 .fi. 이것은 또한 a = (. true. | 1 | 0)으로 표현 될 수있다. 일반적으로 Algol68은 그 후속 제품에 대한 개선이다.
Albert van der Horst

63

Python 2.5 이상에는 구체적인 구문이 있습니다.

[on_true] if [cond] else [on_false]

오래된 파이썬에서는 삼항 연산자가 구현되지 않지만 시뮬레이션 할 수 있습니다.

cond and on_true or on_false

비록, 경우에 잠재적 인 문제가 cond로 평가 True하고 on_true평가 False한 후이 on_false대신 반환됩니다 on_true. 이 동작을 원하면 방법이 정상입니다. 그렇지 않으면 다음을 사용하십시오.

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


2
동작은 동일하지 - q("blob", on_true, on_false)반환 on_false, 반면에 on_true if cond else on_false돌아갑니다 on_true. 해결 방법은 교체하는 것입니다 cond으로 cond is not None그 완벽한 해결책은 아니지만, 이러한 경우이다.

5
bool(cond)대신에 cond is True? 전자는의 진실성을 cond확인하고 후자는 True객체 와의 포인터 평등을 확인 합니다. @AndrewCecil에 의해 강조로서, "blob"truthy하지만입니다 is not True.
Jonas Kölker

와우, 정말 해키 보인다! :) 기술적으로도 [on_false, on_True][cond is True]표현이 짧아 질 수 있습니다.
Arseny

이 답변에는 단락이 없습니다. on_true 및 on_false가 호출 비용이 많이 드는 경우 이는 잘못된 답변입니다.
Hucker

44

당신은 종종 찾을 수 있습니다

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

38

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

예. 로부터 문법 파일 :

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

사용법에 대한 참고 사항 :

모든 if뒤에는가 와야합니다 else. 리스트 이해와 생성자 표현을 배우는 사람들은 이것이 배우기 어려운 교훈이라는 것을 알 수 있습니다. 파이썬은 다른 것에 대한 세 번째 표현을 기대하기 때문에 다음은 효과가 없습니다.

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

을 발생 SyntaxError: invalid syntax시킵니다. 따라서 위의 내용은 불완전한 논리 (아마도 사용자가 잘못된 조건에서 no-op를 기대할 것임)이거나 expression2를 필터로 사용하려는 것일 수 있습니다. 다음은 합법적 인 Python입니다.

[expression1 for element in iterable if expression2]

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

보다 좁은 경우에 대한 대체 구문 :

다음을 작성하는 것이 다소 고통 스러울 수 있습니다.

expression1 if expression1 else expression2

expression1위의 사용법으로 두 번 평가해야합니다. 단순히 로컬 변수 인 경우 중복성을 제한 할 수 있습니다. 그러나이 유스 케이스에 대해 일반적이고 성능이 뛰어난 파이썬 이디엄은 or바로 가기 동작 을 사용 하는 것입니다.

expression1 or expression2

의미론과 동일합니다. 일부 스타일 가이드는 명확성을 이유로이 사용법을 제한 할 수 있습니다.이 구문은 구문에 거의 의미가 없습니다.


1
expression1 or expression2expression1 || expression2자바 스크립트에서 와 유사하고 동일한 단점 / 양성으로
JSDBroughton

1
고마워, @selurvedu-당신이 그것을 얻을 때까지 혼란 스러울 수 있습니다. 나는 어려운 길을 배웠기 때문에 당신의 길은 어렵지 않을 수 있습니다. ;) else가 없으면 if를 사용하면 생성기 표현식 또는 목록 이해가 끝나면 iterable을 필터링합니다. 앞에서는 삼항 조건 연산이며 else가 필요합니다. 건배!!
Aaron Hall

@AaronHall expressionN모든 인스턴스에 대해 metasyntactic 을 사용하는 것이 일관되지만 조건부 테스트 표현식을 두 개의 결과 표현식과 구분하는 이름 지정으로 이해하는 것이 더 쉬울 수 있습니다. 예를 들어, result1 if condition else result2. 이것은 중첩 (일명 체인) 일 때 특히 분명 result1 if condition1 else result2 if condition2 else result3합니다. 이 방법으로 읽는 것이 얼마나 더 좋은지보십시오?
tchrist

@tchrist 검토해 주셔서 감사합니다-개정 내역을 보면이 게시물에는 현재 두 가지 개정이 있습니다. 다른 답변, 특히 상위 답변의 대부분은 계속해서 다시 방문했습니다. 이 답변은 커뮤니티 위키 상태가 내용에 대한 크레딧을 제공하지 않기 때문에 관심을 얻지 못하므로 이에 대한 투표가 없습니다. 지금이 부분을 편집 할 시간이 없기 때문에 개구리는 나중에 다시 주목을받을시기를 알고 있습니다. 그래서 그 일이 게시물에서 / 견적 내 자료를 빌려 자유롭게, 당신은 최고 대답을 편집 한 참조 (그리고 때마침 경우에 저를 인용!) 수
아론 홀

23

파이썬 삼항 연산자 시뮬레이션.

예를 들어

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

산출:

'b greater than a'

왜 단순히 함수 result = (y, x)[a < b]를 사용하지 않습니까? lambda
Grijesh Chauhan

5
@GrijeshChauhan "호환 된"표현식 (예 : 함수 호출 등)으로 인해 두 경우 모두 실행됩니다. 원하지 않을 수도 있습니다.
glglgl

20

3 차 조건부 연산자를 사용하면 코드를 간결하게 만드는 여러 줄을 대신하여 한 줄로 조건을 테스트 할 수 있습니다.

구문 :

[on_true] if [expression] else [on_false]

1- 삼항 연산자를 사용하는 간단한 방법 :

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- 튜플, 사전 및 람다를 사용하는 직접 방법 :

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- 삼항 연산자는 중첩 된 if-else로 작성할 수 있습니다.

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

위의 접근 방식은 다음과 같이 작성할 수 있습니다.

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

1
삼항 연산자는 메모리에서 작고 중첩 된 if보다 빠릅니다. 또한 중첩 if-else은 실제로 삼항 연산자를 다시 쓰지 않으며 a 및 b의 선택 값에 대해 다른 출력을 생성합니다 (특히 이상한 __ne__메서드 를 구현하는 유형 인 경우 ).
Perkins

19

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

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

예:-

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

숫자가 홀수이면 "홀수"로 표시되고 짝수이면 "짝수"로 인쇄됩니다.


결과 :- 조건이 참이면 exp_1이 실행되고 그렇지 않으면 exp_2가 실행됩니다.

참고 : -0, None, False, emptylist, emptyString은 False로 평가됩니다. 그리고 0 이외의 데이터는 True로 평가됩니다.

작동 방식은 다음과 같습니다.

조건 [condition]이 "True"가되면 expression_1은 평가되지만 expression_2는 평가되지 않습니다. 우리가 0으로 무언가를 "그리고"한다면 결과는 항상 희미 해 질 것입니다.

0 and exp

0을 가진 "and"는 항상 0으로 평가되고 expression을 평가할 필요가 없으므로 표현식 exp는 전혀 평가되지 않습니다. 이것은 모든 언어에서 컴파일러 자체가 작동하는 방식입니다.

1 or exp

1을 가진 "또는"이 항상 1이므로 표현식 exp는 전혀 평가되지 않습니다. 따라서 결과가 1이되기 때문에 표현식 exp를 평가하는 것은 귀찮지 않습니다. (컴파일러 최적화 방법).

그러나

True and exp1 or exp2

True and exp1exp1이 false가 아닌 경우 True 이기 때문에 두 번째 표현식 exp2는 평가 되지 않습니다.

마찬가지로

False and exp1 or exp2

False가 0을 작성하는 것과 같고 0을 사용하여 "and"를 수행하는 것은 0 자체이지만 exp1 이후에는 "or"가 사용되므로 exp1 표현식은 평가되지 않습니다.


참고 :- "or"및 "and"를 사용하는 이런 종류의 분기는 expression_1이 False (또는 0 또는 None 또는 emptylist [] 또는 emptystring '')가 아닌 경우 expression_1이되는 경우에만 사용할 수 있습니다. False이면 exp_1과 exp_2 사이의 "또는"존재로 인해 expression_2가 평가됩니다.

exp_1 및 exp_2 true 값이 무엇이든 관계없이 모든 경우에 여전히 작동하게하려면 다음을 수행하십시오.

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


당신의 맥락에서 그것을 사용하려는 경우 x = [condition] and ([expression_1] or 1) or [expression_2]expression_1false로 평가, x1,하지 expression_1. 허용 된 답변을 사용하십시오.
moi

18

대답보다 팁이 더 많지만 (이런 시간에 명백한 것을 반복 할 필요는 없지만) 때로는 그러한 구성에서 oneliner 지름길로 사용합니다.

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

다음과 같이됩니다.

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

일부 (많은 :)는 비언어적 인 것으로 찌를 수도 있지만 (루비 -ish :) 개인적으로 더 자연 스럽습니다. 즉, 정상적으로 표현하는 방법과 큰 코드 블록에서 시각적으로 호소력이 있습니다.


5
나는 print( 'yes' if conditionX else 'nah' )당신의 대답보다 선호 합니다. :-)
frederick99

그것은 당신이 print()두 경우 모두 를 원한다면 -그리고 좀 더 파이썬처럼 보인다면, 나는 인정해야합니다 :) 그러나 표현 / 기능이 동일하지 않은 경우-같은 print('yes') if conditionX else True- print()진실을 유일 하게 얻으려면conditionX
Todor Minakov

Frederick99의 발언에 추가하기 위해 피해야 할 또 다른 이유 print('yes') if conditionX else print('nah')는 Python2에서 SyntaxError를 제공한다는 것입니다.
Thierry Lathuille

구문 오류가 발생하는 유일한 이유는 Python 2에서 print가 명령문 print "yes"인 반면 Python 3에서는 함수이기 때문입니다 print("yes"). 이를 문장으로 사용하거나 더 나은 방법으로 해결할 수 있습니다 from future import print_function.
Todor Minakov

18
a if condition else b

기억하기 어려운 경우이 피라미드를 외우십시오.

     condition
  if           else
a                   b 

14

파이썬의 조건식 에 대한 대안 중 하나

"yes" if boolean else "no"

다음과 같습니다.

{True:"yes", False:"no"}[boolean]

다음과 같은 멋진 확장 기능이 있습니다.

{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

가장 짧은 대안은 다음과 같습니다.

("no", "yes")[boolean]

그러나 대안이 없습니다

yes() if boolean else no()

당신의 평가를 피하려는 경우 yes() no() ,에 있기 때문에

(no(), yes())[boolean]  # bad

모두 no()yes()평가된다.


10

C일반적으로 파생 된 많은 프로그래밍 언어 에는 다음과 같은 삼항 조건 연산자 구문이 있습니다.

<condition> ? <expression1> : <expression2>

처음에는 Python B의 enevolent의 D의 ictator F 또는 L의 가 사용되지 사람들을 이해하는 것은 매우 어렵다 이후 IFE는 (비 파이썬 스타일 등)을 거부 (나는 귀도 반 로섬 (Guido van Rossum)은 물론 평균) C언어. 또한 콜론 부호는 :이미 여러 용도로 사용됩니다 Python. PEP 308 이 승인 된 후 Python마침내 자체 단축 조건식 (현재 사용중인 것)을 받았습니다.

<expression1> if <condition> else <expression2>

따라서 먼저 조건을 평가합니다. 이 값을 반환 True하면 expression1 이 평가되어 결과가 제공되고, 그렇지 않으면 expression2 가 평가됩니다. 지연 평가 메커니즘 으로 인해 하나의 표현식 만 실행됩니다.

다음은 몇 가지 예입니다 (조건은 왼쪽에서 오른쪽으로 평가됨).

pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

삼항 연산자는 직렬로 연결할 수 있습니다.

pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

다음은 이전과 동일합니다.

pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

도움이 되었기를 바랍니다.


10

이미 대답했듯이, 파이썬에는 삼항 연산자가 있습니다.

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

추가 정보:

짧은<expression 1> 조건 평가를 사용할 수있는 조건 인 경우 :

a = True
b = False

# Instead of this:
x = a if a else b

# You could use Short-cirquit evaluation:
x = a or b

추신 : 물론, 단기 간 평가는 삼항 연산자가 아니지만 단락이 충분할 경우 삼항이 사용되는 경우가 많습니다.


1
short-circuit평가에 대한 찬성 .
CodeIt

7

예, 파이썬에는 삼항 연산자가 있습니다. 구문과 예제 코드는 동일합니다. :)

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

나는 그것을 더 정교하게 큰 어떤 수를 확인하는 한 줄의 문장의 예를 추가 한
PythonLover

1
printPython2에서 SyntaxError가 발생하기 때문에 실제로는 좋은 선택이 아닙니다.
Thierry Lathuille

@Thierry Lathuille 여기에 print 문이 아닌 print () 함수를 사용했습니다. print 함수는 Python 3을위한 반면 print 문은 Python 2를위한 것입니다
PythonLover

이 질문은 이미 SO에 대해 요청되었으므로 Python 2로 시도하면 직접 볼 수 있습니다. 'print ('hello ')는 Python 2.7에서 완벽하게 유효한 구문이지만 구문 분석 방식에 따라 위의 코드에서 SyntaxError가 발생합니다.
Thierry Lathuille

2

파이썬은 과제에 대한 삼항 형식을 가지고 있습니다. 그러나 사람들이 알아야 할 짧은 형식이있을 수도 있습니다.

조건에 따라 변수에 하나 이상의 값을 할당해야하는 것이 매우 일반적입니다.

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]

^ 이것은 그러한 과제를 수행하기위한 긴 형식입니다.

아래는 삼항 형식입니다. 그러나 이것은 가장 간결한 방법은 아닙니다. 마지막 예를 참조하십시오.

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 

Python을 사용 or하면 대체 할당에 간단히 사용할 수 있습니다 .

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

때문에 위의 작품 li1이다 None그 논리 표현식에서 거짓으로하고 보정시 취급합니다. 그런 다음 interp은 계속 진행하여 두 번째 표현식을 평가합니다. 두 번째 표현식 None은 비어 있고 목록이 아니므로 a에 지정됩니다.

이것은 빈 목록에서도 작동합니다. 예를 들어 a항목이있는 목록 을 지정하려는 경우 .

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

이것을 알면, 그러한 과제가 발생할 때마다 간단하게 그러한 과제를 할 수 있습니다. 이것은 또한 문자열과 다른 이터 러블과도 작동합니다. a비어 있지 않은 문자열을 할당 할 수 있습니다.

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 

나는 항상 C 삼항 구문을 좋아했지만 파이썬은 한 걸음 더 나아갑니다!

일부 개발자는 이것이 모든 개발자에게 즉시 드러나지 않는 역학에 의존하기 때문에 이것이 좋은 문체 선택이 아니라고 말할 수도 있습니다. 나는 개인적으로 그 견해에 동의하지 않습니다. 파이썬은 관용구에게 즉시 명백하지 않은 많은 관용적 트릭을 가진 구문이 풍부한 언어입니다. 그러나 기본 시스템의 메커니즘을 더 많이 배우고 이해할수록 더 감사합니다.


1

다른 답변은 Python 삼항 연산자에 대해 올바르게 이야기합니다. 삼항 연산자가 자주 사용되지만 더 좋은 관용구가있는 시나리오를 언급하여 보완하고 싶습니다. 이것이 기본값을 사용하는 시나리오입니다.

option_value설정되지 않은 경우 기본값 으로 사용한다고 가정 합니다.

run_algorithm(option_value if option_value is not None else 10)

또는 단순히

run_algorithm(option_value if option_value else 10)

그러나 더 나은 해결책은 간단히 작성하는 것입니다.

run_algorithm(option_value or 10)

-2

변수가 정의되어 있고 값이 있는지 확인하려는 경우 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

1
비슷한 문제에 유용하지만 이것은 삼항 조건이 아닙니다. 대체 할 수 x if x else y는 있지만 작동 하지는 않습니다 x if z else y.
Perkins

-2

여러 연산자를 연결하는 깔끔한 방법 :

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

-2

기본 파이썬 구문이 번거롭기 val = a if cond else b때문에 때로는 이렇게합니다.

iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)

물론, 그것은 항상 양쪽 (a와 b)을 평가하는 단점이 있지만 구문은 나에게 더 명확합니다.


이것은 간단한 작업보다 두 배의 작업량, 더 많은 RAM 사용량 및 난독 처리 된 것으로 보입니다 val = a if cond else b.
eatsfood

-3
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

필요에 따라 중첩 될 수 있습니다. 행운을 빌어 요

**

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.