2012-04-15 4 views
0

에서 삼항 조건문을 수행하는 나는 파이썬 버전으로 부담해야 < 2.5 (이 특성에 대한 2.4.3이다)가장 좋은 방법은 파이썬 <2.5

삼항 연산자 2.5에서 시작 파이썬에서 소개합니다이었다 보인다

. 이 같은 파이썬에서 삼항 연산자> = 2.5보기에 익숙하지 않은 사람들을 위해 :

def do_ternary(flag): 
    return "foo" if flag else "bar" 

파이썬의 초기 버전에서이 문제를 에뮬레이트하는 몇 가지 해결책을 알고 싶습니다. 나는 그걸로 확실히 할 수있다 ... 다른 사람,하지만 좀 더 파이썬 뭔가 생산 수준의 코드를 넣어 부끄럽지 않을 것이라고 찾고 있어요 :)

도와 줘서 고마워!

+0

당신의 반대 의견 : "foo"를 반환 else : "bar"를 반환하면 충분히 세련되지 않습니까? 아니면 구체적인 이유가 있습니까? – mfrankli

+0

잘 논리는 괜찮지 만 삼항 연산자가 아닙니다. "세련된"것인지 아닌지에 대한 질문이 아니라 코드 분해 및 코드 작성에 관한 것입니다. 내 코드에 if ... else 문으로 된 전체 트리를 갖고 싶지 않습니다. –

+2

테스트가 사실 일 때 뭔가하고 싶다면,''if ... : ... else : ...''꽤 합리적인 것처럼 보입니다. _terse_와 _readable_를 혼동하지 마십시오. 읽기 가능은 둘 다 할 수 없다면 항상 승리해야합니다. –

답변

4

으로, 일반 올 if: 문을 사용하고 정말 우아한 파이썬 솔루션처럼 보이는 발견

def _if(test): 
    return lambda alternative: \ 
       lambda result: \ 
        [delay(result), delay(alternative)][not not test]() 

def delay(f): 
    if callable(f): return f 
    else: return lambda: f 

>>> fact = lambda n: _if (n <= 1) (1) (lambda: n * fact(n-1)) 
>>> fact(100) 
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L 

이 점에 대해 어떻게 생각하십니까? 그것은 꽤 깨끗하고 내 의견으로 읽기 쉽게 보입니다.

+0

나는 꽤 멋지다 고 생각한다. :) 가독성에 관한 한, 말을해야만한다. 그렇다면 문장은 꽤 읽기 쉽다. –

+1

그래, 다른 사람이 가장 읽을 수 있지만 그저 창의력을 발휘하고 트릭을 할 수있는 한 줄짜리가 있으면 다음과 같이 동의한다. :) 지금까지 이걸 믿어 봤는데 @ TokenMacGuy는 내가 ' 가장 많이 고려하고 있습니다. –

+0

이 코드는 아마도이 코드 중 가장 읽기 어려운 코드 일 것이라고 생각합니다. 멋진 코드이지만 실제로 독자 나 작가에게 어떤 이점도 제공하지는 않습니다. –

1

이 작업을 수행하는 데 사용되는 고전적인 '트릭'입니다 : 이것은 and로 작동

test and true_value or false_value 

와 파이썬과 같이 or 일 :

x or y -> if x is false, then y, else x 
x and y -> if x is false, then x, else y 

Source

이 우리 것을 의미한다 대략 동일한 결과를 얻으십시오 - true_valueTrue으로 평가되는 한 - 예를 들어, fol []으로

flag and [] or "bar" 

False로 평가 lowing하지 작업을 것이다.

나는 아직도 익숙하지 않은 한 단순히 if/else 블록을 사용하는 것보다 읽기 쉽지 않다고 주장합니다. 불분명합니다.

그래서 사용 좋을 걸 :

if test: 
    return true_value 
else: 
    return false_value 

(할당 또는 무엇이든 필요한 경우에 대체 귀국일).

+5

'true_value'가 'False'로 평가되는 항목 인 경우 예상대로 작동하지 않습니다. 플래그와 [] 또는 "bar"에'. – Dougal

+0

@Dougal +1. 나는 그 노트를 추가 할 것입니다 - 나는 결코 이것을 좋아하지 않았고 결코 사용하지 않았고 그 문제를 잊어 버렸습니다. –

4

정수가 필요할 때/True0/로 바뀌기 때문에 일반적인 목록 작성이 사용됩니다.

["bar", "foo"][bool(flag)] 

귀하의 질문에 삼항과 같은 출력을 생성 : 경우 테스트가 거짓 Y 또는 진실-Y보다는 부울 수 있으며, 첫 번째 테스트를 보장하기 위해 그것의 좋은 연습은 부울입니다.

편집 : Dougal은 true 값과 false 값이 모두 평가 될 것이고 부작용이있을 수 있기 때문에이 값이 3 값과 약간 다를 수 있음을 지적합니다.

+0

좋은 대안이지만 가독성면에서 다소 부족하다고 생각합니다. 삼항 연산의 장점 중 하나는 읽기가 쉽다는 것입니다.이 코드는 잘 작동하지만 코드가 복잡 해지는 것을 발견했습니다. –

+0

이것은 또한 단락 회로 평가가 아닙니다. – Dougal

+0

@Dougal 좋은 지적입니다. –

7

if/else가하는 모든 일들을 수행하는 올바른 방법은 다음과 같습니다

짧은 단락을 모두 수행하고 yes_value가 falsey 자신을 때의 문제를 해결
(condition and (yes_value,) or (no_value,))[0] 

.분명히, 만약 당신이이 헛소리를 피할 이유가 있다면, 그렇게하십시오; 귀하의 예제에서, 두 조건이 모두 일정한 표현이있다, 그래서 당신은 할 수 있습니다 :

{True: yes_value, False: no_value}[bool(condition)] 

이상의 간결 :

(no_value, yes_value)[condition] 

당신이이 짧은 circut을 필요로 할 경우,하지만 당신은 것으로 확신 yes_value 결코 falsey, 당신은 튜플 밖으로 트림 할 수 있습니다

condition and yes_value or no_value 

을하지만 yes_value 실제로 일정 할 때 그것은 아마에만 유효합니다. 이 중 어느 것도 당신의 취향이나 필요에 맞게하지 않으면, 그냥 웹에서보고 된 중간 변수 사실

if condition: 
    result = yes_value 
else: 
    result = no_value