2014-04-30 2 views
1

저는 파이썬에서 초보자이지만 C에서 숙련 된 개발자입니다. 나는 C 코드에서 switch/case에 해당하는 스크립트를 작성했습니다. 사전 구현을해야했습니다. 기본적으로 사전은 문자/함수 쌍으로 설정됩니다. 키보드에서 문자를 읽습니다.파이썬 사전 동작

여기에 코드를입니다

... 
def func1(): 
    print "func1" 

def func2(Val): 
    print "func2 " + Val 

def func3(Val): 
    print "func3 " + Val 

key=getch() 
if key in ['s', 't', 'a']: 
    print key 
    {'a' : func1(), 
    's' : func2("Hello"), 
    't' : func3("Bye")                
    }[key] 
... 

내가지고있어 결과는 ehen 키 t

func1 
func2 Hello 
func3 Bye 

아닌 마지막 함수 호출

을 누르면입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

문제는 사전에 함수를 호출 할 때 이미 호출하는 것입니다. 이 시도 :

if key in ['s', 't', 'a']: 
    print key 
    {'a' : lambda: func1(), 
    's' : lambda: func2("Hello"), 
    't' : lambda: func3("Bye")                
    }[key]() 

lambda 식 (호출 기능의 다른 종류의() 함수가 매개 변수가없는 경우, 당신은 또한 단지 ()없이, 'a' : func1을 할 수있는) 각각의 매개 변수를 포함하여 실제 함수 호출을, 포장을 만듭니다 . 그런 다음 키에 해당하는 람다를 가져 와서 호출합니다 (() 이후에 [key] 뒤에 추가 문자가 있음).

또는, 당신은 또한 키를 확인하기 전에 DICT를 만들 수 있습니다

functions = {'a' : lambda: func1(), 
      's' : lambda: func2("Hello"), 
      't' : lambda: func3("Bye") } 
if key in functions: 
    functions[key]() 
+0

감사합니다 토비아스을. 논리가 작동합니다. 그러나, 나는 func1 대신 func1()을 사전에 넣어서 작동시켜야했습니다. 그것이 오래된 파이썬 버전인지 아닌지는 모르겠다. 이 람다 함수를 완전히 이해하기 위해서 조사해야만합니다 ... – Indy

+0

예, 'func1'은 오타였습니다. 'func1()'에 정정. 비록 func1을 사용하면 실제로 람다없이 갈 수 있습니다 (업데이트 참조). 그럼이게 당신 문제를 해결 했나요? –

+0

오, 그래, 해결되었습니다. 당신의 도움을 주셔서 감사합니다! – Indy