2017-12-15 5 views
2

a, b 또는 c 세 가지 값 중 하나를 반환 할 수있는 함수가 있습니다.python : if/elif 문을 통한 값 파이프

def f(): 
    return x # a, b, or c 

내가 f()의 반환 값에 따라 서로 다른 문을 실행해야합니다 A, B 또는 C.이 작업을 수행하는 가장 좋은 방법은, 내가 알고 있다는 것입니다 :

v = f() 
if v == a: 
    # Do A 
elif v == b: 
    # Do B 
else: 
    # Do C 

없이 이 새로운 변수 v을 도입하면 f()의 반환 값을 평가하는 다른 방법이 있습니까?
이와 비슷한 것입니까?

if f() == a: 
    # Do A 
elif _value_from_above == b: 
    # Do B 
else: 
    # Do C 
+2

왜이 작업을 수행 하시겠습니까? 임시 변수를 만드는 것이 잘못된 이유는 무엇입니까? – darthbith

+0

@darthbith 내가 만드는 변수의 양을 최소화하려고합니다. 나는 개인적인 취향이 더 있다고 생각한다. – slybloty

답변

3
원하지 무엇을 아마

하지만, 하나의 옵션은 함수의 사전 사용하는 것입니다

def do_a(); 
    .. 
def do_b(); 
    .. 
def do_c(); 
    .. 

strategy = { 
    a: do_a, 
    b: do_b 
    c: do_c 
} 

strategy[f()]() 

을하지만, 일반적으로 당신은 사전 항목이 발견되지 않은 경우 처리 일부 오류, 싶어하는 경우 당신은 아마도 어쨌든 별도의 변수로 끝날 것입니다. 게다가 각 사례를 자체 함수로 추출해야합니다.

두 경우가있는 경우

은 어쩌면 관련성, 당신은 삼항 연산자 사용할 수 있습니다 : 당신이 이미 알고 플러스 귀하의 질문에 두 개 이상의 케이스, 플러스 돈 많은 사람들이 가능성이 비록

do_a() if f() == a else do_b() 

을 어쨌든 삼항 연산자를 좋아하지 않습니다.

C#/Java/C++ 등의 switch 문 또는 Haskell/OCaml/F #/Scala/Erlang 등의 패턴 일치 문이있는 언어를 사용할 수 있습니다. 패턴 일치 구문은 다음과 같습니다.

match f() with 
| a -> 
    // do something 
    // and maybe something else too 
| b -> 
    // do some other thing 
    // and yet some other thing 

그러나이 기능은 Python에는 없습니다.

+0

if else 블록은 조건부로 ** 코드 **를 실행하도록 설계되었습니다. 삼항 연산자는 조건부로 ** 값 **으로 평가하도록 설계되었습니다. 삼중 연산자에 문제가있는 사람들은 사람들이 하나의 명령문이나 다른 명령문을 실행하기 위해 그것을 사용할 때 그것을 싫어할 것이라고 확신합니다. 그 명령은'else else' 문을위한 것입니다. –

+0

@ TadhgMcDonald-Jensen 당신이 옳았어요. 내가 사용했던 방식이 끔찍한 데요. 많은 사람들이 가치 평가에 사용 되더라도 문제가있는 것 같습니다. 이상적으로 나는 가능한 한 많은 순수한 함수를 사용하는 것을 선호하며 절대적으로 필요한 경우에만 "수행 중"의 상태 (상태 변경)를 선호한다. – junichiro

1

/elif와 Python에 switch 문이 없으면이 작업을 수행 할 방법이 없습니다. 임시 변수가 필요합니다.

a, b 및 c의 정확한 값을 알고 있으면 디스패치 테이블을 대신 사용할 수 있습니다. 좀 더 장황 하긴하지만 가능한 브랜치가 많으면 더 빠르고 더 쉽게 따라 할 수 있습니다.

  • return DISPATCH_TABLE[f()]()
  • 와 그 모든 코드를 교체 해당 기능 C, A, B를 매핑하는 사전을 확인

    • 각 지점
    • 하는 기능을 확인하십시오

      는 디스패치 테이블을 만들려면

    몇 가지 예가 here입니다.

    1

    만 (더 계산없이) 답변을 매핑 할 경우에, 당신은 (준이치로의 대답과 유사) 간단한 매핑 기능으로 해결할 수 :

    import random 
    
    def f(): 
        foo = ['a', 'b', 'c', 'd', 'e'] 
        return random.choice(foo) 
    
    if __name__ == '__main__': 
        from_to = dict(a=2, b=1, c=3, d=4, e=5) 
        print(from_to.get(f(), None)) 
    

    을 경우 당신이 f()에서 예상치 못한 값이 from_to.get(f(), None)의 기본값은 None