Python用字典模拟Switch Case时所有关联函数均被执行的原因咨询
问题:字典模拟Switch Case时所有函数被提前执行的原因及解决方法
你遇到的问题是在尝试用字典实现类似Switch Case的逻辑时,不管选择哪个选项,所有函数的输出都被打印出来了。先来看下你的代码和实际输出:
你的代码
def addWord(): print "Add word" def searchWord(): print "Search word" def displayAll(): print "display all" #Executing the choice def switch_choice(choice): switcher = { 1:addWord(), 2:searchWord(), 3:displayAll() }.get(choice,"Invalid input") #MAIN print "Enter your choice" print "1.Add new word" print "2.Search for a word" print "3.Display all words" choice=input() switch_choice(choice)
实际输出
Enter your choice 1.Add new word 2.Search for a word 3.Display all words 1 Add word Search word display all
问题原因
核心问题出在字典的定义上:你在字典中写1:addWord()的时候,加了括号的函数调用会立即执行。也就是说,当switcher这个字典被创建的瞬间,addWord()、searchWord()、displayAll()这三个函数就全部被运行了,这和你后面输入的choice没有任何关系——不管你选1、2还是3,这三个函数在字典初始化时就已经执行完毕了。
而.get(choice)只是在这三个函数执行后的返回值里(这里函数没有return,所以返回None)找对应key的值,根本没起到“根据选择执行对应函数”的作用。
解决方法
要实现真正的“根据选择调用对应函数”,你需要把字典的值改成函数本身(不要加括号),也就是存储函数的引用,等获取到对应的函数后再调用它。
修正后的代码如下:
def addWord(): print "Add word" def searchWord(): print "Search word" def displayAll(): print "display all" #Executing the choice def switch_choice(choice): switcher = { 1: addWord, 2: searchWord, 3: displayAll } # 获取对应的函数,不存在则用处理无效输入的匿名函数 selected_func = switcher.get(choice, lambda: print("Invalid input")) selected_func() # 调用选中的函数 #MAIN print "Enter your choice" print "1.Add new word" print "2.Search for a word" print "3.Display all words" choice = input() switch_choice(choice)
修正逻辑说明
- 字典中存储的是函数对象(比如
1: addWord),此时函数不会执行,只是把函数的引用存在字典里; - 通过
.get(choice)获取到对应的函数后,再用selected_func()来执行它; - 对于无效输入,我们用
lambda定义了一个匿名函数来处理默认情况,这样所有分支的逻辑都是“获取函数→调用函数”,更统一。
现在再运行代码,输入1只会打印Add word,输入2打印Search word,输入3打印display all,输入其他值会打印Invalid input,完全符合你的预期。
内容的提问来源于stack exchange,提问作者rittik
相关产品推荐
相关产品推荐

