关于语句:Python if,elif,else

Python if, elif, else chain alternitive

本问题已经有最佳答案,请猛点这里访问。

我正在使用语音识别库创建一个类似siri的程序。我希望将来我能用代码和Arduino来控制我房间里的东西。我的问题是:

我已经完成了基本的语音识别代码,但是为了让程序理解某些命令,我必须通过一个非常长的列表来运行语音,其中包括如果elif elif else命令,那么这个列表可能会很慢。由于大多数情况下,它将在else产生,因为命令将无法识别,因此我需要一个更快的替代方法来替代一长串if-elif-else语句。我也在用TTS引擎和你交谈。

这是到目前为止我的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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参数和cases为整数值。例如。

1
2
3
4
5
6
7
8
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)

一个有趣的观点是,当其他语句完成得最多时,最有效的if-elif-elif-else语句的方法是什么?声明虽然get更"优雅",但实际上可能比下面的代码慢。但是,这可能是因为post处理的是直接操作,而不是函数调用。牛传染性胃肠炎病毒

1
2
3
4
5
6
7
8
9
10
11
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)