Python if,elif,else链替代
Python if, elif, else chain alternitive
我正在使用语音识别库创建类似 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"
尝试使用字典设置,其中键是您正在测试的值,并且该键的条目是要处理的函数。 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? 声明虽然获取更多 "elegant" 它实际上可能比下面的代码慢。但是,这可能是因为 post 处理直接操作而不是函数调用。 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)
我正在使用语音识别库创建类似 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"
尝试使用字典设置,其中键是您正在测试的值,并且该键的条目是要处理的函数。 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? 声明虽然获取更多 "elegant" 它实际上可能比下面的代码慢。但是,这可能是因为 post 处理直接操作而不是函数调用。 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)