Python如果,elif,else链交替

时间:2016-02-18 14:29:35

标签: python if-statement speech-recognition siri

我正在使用语音识别库来创建类似Siri的程序。我希望将来我可以使用Arduino代码来控制我房间的东西。这是我的问题:

我已经制定了基本的语音识别代码,但是为了使程序能够理解某些命令,我​​必须通过很长的if-elif-elif-elif-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"

1 个答案:

答案 0 :(得分: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)

一个有趣的观点是Most efficient way of making an if-elif-elif-else statement when the else is done the most?表示虽然get更“优雅”,但它实际上可能比下面的代码慢。但是,这可能是因为帖子涉及直接操作而不是函数调用。 YMMV

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)