繁体   English   中英

如何使用命令打破“while True”循环?

[英]How do I Break a “while True” Loop With a Command?

我正在构建一个简单的计时器程序,当你告诉它时它应该关闭(使用 SpeechRecognition 模块),但到目前为止它只在听你的时候关闭,然后继续运行(它重复为“听,声音警报,重复”之类的方式)。

警报的 function 如下所示:

def alarms():
while True:
    h1 = '08:00 AM'
    h2 = '01:00 PM'
    h3 = '08:30 PM'
    t = time.strftime('%I:%M %p')
    text = record_audio()
    while t == h1 or t == h2 or t == h3:
        ps('alarm.mp3')
        time.sleep(1)
        if turn_off(text):
            print("hello")                      #This was just to test if it was listening to me
            break

如果您还需要 function 用于“关闭”部分,这里是:

    offWords = ['stop', 'will stop', 'i\'m here', 'turn off']
    text = text.lower()

    for phrase in offWords:                    #determines if what you said includes anything in the list
        if phrase in text:
            return True
    return False 

由于我还是初学者,所以我没有尝试过其他方法,但我觉得有什么比我在这里做的更有效。 该程序还有另外两个错误:

  1. 当您运行程序时,它会在警报响起之前等待您说些什么(警报应该是第一个弹出的内容)。
  2. 如果您说出“offWords”变量列表中的短语以外的任何内容,则警报会运行,但不会再停下来听。

我不知道它们是否与主要问题有关,但为了安全起见,我将它们包括在内。 我昨天花了一整天试图解决这个问题,任何帮助将不胜感激!

所以你的问题是'break'只从一个循环中逃脱; 你有两个嵌套循环。 因此,要脱离外循环,您需要在外循环上添加一个条件。 像这样,例如:

def alarms():
    on = True
    while on:
        h1 = '08:00 AM'
        h2 = '01:00 PM'
        h3 = '08:30 PM'
        t = time.strftime('%I:%M %p')
        text = record_audio()
        while t == h1 or t == h2 or t == h3:
            ps('alarm.mp3')
            time.sleep(1)
            if turn_off(text):
                on = False
                print("hello")
                break

现在,您正在检查警报是否仍然开启,而不是“当真”。 或者,由于这个 function 上面没有其他内容,您可以返回:

def alarms():
    while True:
        h1 = '08:00 AM'
        h2 = '01:00 PM'
        h3 = '08:30 PM'
        t = time.strftime('%I:%M %p')
        text = record_audio()
        while t == h1 or t == h2 or t == h3:
            ps('alarm.mp3')
            time.sleep(1)
            if turn_off(text):
                print("hello")
                return

这是一个有点烦人的问题,因为有时你想摆脱更复杂的嵌套循环,这样的修改并不总是那么实用; 你最终需要在外循环上额外添加一个“if not on: break”来进行检查。

为了解决这个问题,一些语言为您提供了“标记循环”或“中断”,以便您可以指定要转义的循环或要转义的循环数; 然而,如果这些被滥用会使代码不那么清晰,这就是为什么Python 不包含此功能的原因。

顺便说一句,您的第一个问题是由于您在响铃之前尝试录制 - 您可能希望在开始录制之前至少响一次。 对于第二个,想想内循环:你会一直呆在里面,对吧? 所以你会想要在里面录制,而不是在外面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM