20
에서 X 다른 y` if 문

꽤 파이썬의 삼항 연산자의 접근 방식에 익숙해 해요 : 사전 할당하지 않고 용어의 존재를 참조 어쨌든 거기 :압축`의 X 파이썬

value = foo if something else bar 

내 질문은 매우 간단합니다 반환 피연산자 (... if 또는 else ...) 중 하나에서 (if ...)로 평가됩니까?

동기 부여는 때로는 if ...의 표현식을 사용하여 정확히 3 진 연산의 결과로 사용하고 싶습니다. 작은 표현식의 경우, 그것을 반복하는 데 아무런 문제가 없지만 좀 더 긴 표현식의 경우 다소 불쾌 해집니다. 예를 들면 다음과 같습니다.

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa" 
+0

잘, Oompa Loompa는 우습다! –

+0

@AspiringAqib 우리는 과제가 없지만 여전히 일부 oompa loompas를 즐길 수 있습니다 ( – Rubens

+0

글쎄, 거기에 해결책이 있습니까? –

답변

23

이렇게하는 방법은 없으며 의도적 인 방법입니다. 삼원 항은 사소한 경우에만 사용된다고 가정합니다.

두 번 계산의 결과를 사용하려는 경우, 임시 변수에 넣어 :이 작업을 수행하면

value = info.findNext("b") 
value = value if value else "Oompa Loompa" 

, 당신이 바보 같은 일을하고있는 것이 분명하게, 사실에서

value = info.findNext("b") 
if not value: 
    value = "Oompa Loompa" 

그리고 실제로 원래 시도 5 적은 키의이를 작성하는 파이썬 방법입니다.

value = info.findNext("b") or "Oompa Loompa" 

을하지만 그 많은 스타일 가이드에 의해 낙담하고 BDFL에 의한 것 : 당신이 정말로 키 입력을 저장하려면 경우

대신이 작업을 수행 할 수 있습니다.

이 작업을 한 번만 수행하는 경우 더 명확하게하는 것이 좋습니다. 당신이 그것을 대여섯 번하고 있다면, 그냥 같은 모든 내장 및 다음 stdlib 기능은 findNext 대신 None의 반환 옵션 기본을 만들기 위해 더 나은 많은 사소한-하고있다 : 다음

def findNext(self, needle, defvalue=None): 
    # same code as before, but instead of return None or falling off the end, 
    # just return defvalue. 

당신은 이것을 할 수있다 :

+0

실제로 프로그래밍에 흥미로운 점이 있습니다. 저는 70 개 이상의 열을 쓰는 것을 좋아하지 않으며, 한 줄짜리 솔루션을 정말 고맙게 생각합니다. 여기서 문제는 명시적인 단어 수보다 압축에 관한 문제입니다. 나는 당신의 대답을 받아들입니다. 당신이 나의 바이너리 질문에 '예/아니오'라고 대답 할 때. 그럼에도 불구하고, @Ignacio가 지적한 바와 같이 또는을 사용하는 것은 결국 가장 좋은 해결책입니다. – Rubens

+0

'None'을 반환하는 것은'null'을 반환하는 것과 동일하므로 [마찬가지로] (http://en.wikipedia.org/wiki/Void_safety). –

+1

@Rubens : 1 라인 솔루션을 작성하는 파이썬 적 방법은 명시적인 기능으로 복잡한 모든 것을 마무리하는 것입니다. 'findNext'에'defval'을 추가 할 수 있다면 그렇게하십시오; 할 수 없다면 래퍼를 작성하십시오. 서로 다른 언어는 다른 관용구 스타일을 가지고 있습니다 (예를 들어 하스켈에서는 한 번만 호출 할 함수를 코드 냄새라고 부름). 다른 언어는 관용구를보다 강하게 준수합니다 (예 : perl에서 "한 가지 방법이 있습니다 그것 "은 버그가 아니라 기능으로 간주됩니다). 그러나 파이썬을 선택했다면 관용적 인 파이썬을 배워야합니다. – abarnert

20

if ... else을 전혀 사용하지 마십시오. 대신 파이썬의 병합 연산자를 활용하십시오.

value = info.findNext("b") or "Oompa Loompa" 
+1

[확실하게 바로 가기] (http : // docs.python.org/2/library/stdtypes.html#boolean-operations-and-or-not), @Rubens. 'x 또는 y'는'if bool (x) then x else y'와 같은 코드로 컴파일되어야합니다. 'bool'은'.__ nonzero __()'를 호출합니다. –

+1

이 작업을 수행 할 수는 있지만 사용자가 의미하는 것은 아닙니다. 5 개의 키 스트로크를 절약하는 데 충분한 시간을 할애한다면'findNext' 메소드를 수정하여 기본값을 취하십시오. 그렇지 않으면 명시 적으로 작성하십시오. – abarnert