Python if,elif,else链的替代方案

4
我正在使用语音识别库创建一个类似于Siri的程序。我希望将来可以使用Arduino代码控制房间里的物品。这是我的问题:
我已经完成了基本的语音识别代码,但为了让程序理解某些命令,我需要通过一个非常长的if-elif-elif-elif-else命令列表运行语音,这可能会很慢。由于大部分时间它将以else结束,因为命令将不会被识别,所以我需要比长串的if-elif-else语句更快的替代方法。我还在使用tts引擎与您交流。
以下是我的代码:
import pyttsx
import time


engine = pyttsx.init()
voices = engine.getProperty("voices")
spch = "There is nothing for me to say"
userSaid = "NULL"



engine.setProperty("rate", 130)
engine.setProperty("voice", voices[0].id)


def speak():
    engine.say(spch)
    engine.runAndWait()
def command():
    **IF STATEMENT HERE**

r = sr.Recognizer()
with sr.Microphone() as source:
    r.adjust_for_ambient_noise(source) 
    print("CaSPAR is calibrated")
    audio = r.listen(source)
try:
    userSaid = r.recognize_google(audio)
except sr.UnknownValueError:
    spch = "Sorry, I did'nt hear that properly"
except sr.RequestError as e:
    spch = "I cannot reach the speech recognition service"

speak()
print "Done"

2
欢迎来到 Stack Overflow。您的问题被判定为“过于宽泛”:可能有太多的答案,或者好的答案会太长而无法在此格式中呈现。请添加细节以缩小答案集或隔离可以在几段落内回答的问题。请参阅 http://stackoverflow.com/help/how-to-ask。 - Selcuk
2
我们需要了解更多关于您的代码如何工作的信息,才能提供合理的答案。 - Mr. E
1
请查看之前类似问题的Aya提供的答案:https://dev59.com/7GQn5IYBdhLWcg3wAjPJ - abhi
@Falafel 我之前看过这个问题,因为我对Python相对较新,所以我没有完全理解如何使用建议。 - HRLD
1个回答

2

尝试使用字典设置,其中键是您要测试的值,该键的条目是要处理的函数。 Python 的一些教材指出,这比一系列 if ... elif 语句更加优雅,并且立即选取条目而无需测试每个可能性。请注意,由于每个键可以是任何类型,因此这比类似于 C 中的 switch 语句更好,后者要求 switch 参数和 case 是整数值。例如。

def default(command)
    print command, ' is an invalid entry'

mydict = {'create':mycreate, 'delete':mydelete, 'update':myupdate}

action = mydict.get(command, default)
# set up args from the dictionary or as command for the default.
action(*args)

有趣的一点是,当else发生的最多时,构建if-elif-elif-else语句的最有效方法是什么?指出,虽然get方法更“优雅”,但实际上可能比下面的代码慢。不过,这可能是因为该帖子涉及直接操作而不是函数调用。结果可能因人而异。

def default(command)
    print command, ' is an invalid entry'

mydict = {'create':mycreate, 'delete':mydelete, 'update':myupdate}

if command in mydict:
    action = mydict.[command]
    # set up args from the dictionary .
    action(*args)
else:
    default(command)

1
不要检查键是否存在,而是使用字典的.get方法来获取默认值,例如一个空操作lambda或通知打印语句。 - cat
1
@cat 完成。这就是为什么我添加了在设置参数时的注释。 - sabbahillel
@cat 我还指出了一篇帖子,比较了这两种方法的时间,并将该信息添加到了帖子中。 - sabbahillel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接