当前位置: 首页 > 知识库问答 >
问题:

如何避免每个命令的如果?[关闭]

南门刚捷
2023-03-14

我正在为自己建立一个虚拟助手,如果像这里举个例子,要求个人执行每一个命令是错误和无效的:

WAKE = 'hello'


while True:
    print("Mic ready")
    text = voice.get_audio()
    if WAKE in text:
        if "note" in text:
            voice.speak("What do you want to note?")
            print("What do you want to note?")
            text = voice.get_audio()
            Vcm.note(text)
        else if "timer" in text:
            voice.speak("How long is that timer supposed to run?")
            print("How long is that timer supposed to run?")
            text = voice.get_audio()
            Vcm.timer(text)
        else:
            voice.speak("At your service")
            print("At your service")
            text = voice.get_audio()

有没有更有效的方法来检查要执行的命令?

共有2个答案

屠德宇
2023-03-14
while True:
    print("Mic ready")
    text = voice.get_audio()
    if WAKE in text:
        words = text.split(" ")
        for word in words:
            command = commands.get(word)
            if command:
                command(text)
                break
        else:
            vcm.default()
    ```
commands = {
'note': lambda text: note(text)

}

郁景龙
2023-03-14

您可以将命令分成函数:

def note():
    #note body

def timer():
    #timer body

def default():
    #default body

然后将命令包装到字典中:

commands = {
    'note': lambda: note(),
    'timer': lambda: timer()
}

并分别定义默认值:

default_command = lambda: default()

然后您可以检查文本中的内容:

for word in text:
   command = commands.get(word, None)
   if command not None:
       command()
       break
else:
    default_command()

不确定这是否是您想要的,但如果您有许多命令,它可能会使您的代码更加稀疏。

编辑:

根据lambda函数的bool值是否为false?,lambda表达式表现为true。所以你也可以简化最后一点!

for word in text:
    command = commands.get(word, None)
    if command:
        command()
        break
else:
    default_command()
 类似资料:
  • 我正在使用对进行“printf调试”。在命令运行一次且之前没有任何命令更改后,将缓存结果,并且不提供输出。 我可以用从不执行的部分来更改命令,例如追加< code > | | echo some changing number],这对于每次运行都很烦人,或者关闭构建缓存,这会影响更多的< code >运行,从而减慢< code>Dockerfile的开发。 有没有办法只禁用一个 的缓存而没有任何描

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 创建表(int(10)不为空AUTO_INCREMENT,int(30),varchar(30),varchar(4)不为空,int(2)不为空,主键()); 创建表(varchar(10),主键()); 创建表(int(10),int(30),varchar(30),varchar(4),int(2), varchar(10), varchar(2)not null默认'p'); 分隔符$$ 为

  • 例如,我们从我们的合作伙伴那里得到这样一条json消息: 合作伙伴希望客户端接收这样的消息(没有换行符,但有) 但我们的生态系统中有一系列的微服务,json需要经过4到5个微服务,在客户端能够获得它之前进行处理。因此,我们的合作伙伴应该给我们,而不是,以便客户在结果中得到。但我想知道,在源消息中添加8个反斜杠来转义每个微服务的“”是否是解决此问题的唯一方法。我认为这不是一个很好的解决方案,因为如果