【问题标题】:Implementing a "Press any key to stop refreshing" loop in Python在 Python 中实现“按任意键停止刷新”循环
【发布时间】:2020-08-03 15:00:17
【问题描述】:

在 Python 中实现无限循环的最佳方法是什么,这样给定的函数会一次又一次地运行,直到用户按下一个键?我可以想到几种方法这个,其中一个涉及 Ctrl-C,另一个涉及线程:两者看起来都非常hacky,让我感觉我错过了一些非常明显的东西。

这是Ctrl-C 方法的一个最小工作示例:

def run():
    my_object = MyClass()
    my_object.lay_the_table()
    print("Telling my_object to keep refreshing... Use Ctrl-C to stop.")
    while True:
        my_object.refresh()
    my_object.tidy_away()

if __name__ == "__main__":
    run()

这种方法的缺点很明显:

  • 永远不会调用tidy_away() 方法。
  • 我无法想象邀请用户手动终止程序是一种好的做法。

但是有什么更好的方法呢?


我真的很惊讶我在 Stack Overflow 上找不到与这个问题类似的问题 - 对于 Python 。再说一次,很可能是我没有正确使用搜索功能!很高兴将此问题标记为重复,如果它为我指明了解决方案。

【问题讨论】:

标签: python loops


【解决方案1】:

使用 Ctrl+C 很好,但您应该使用异常处理。捕获KeyboardInterrupt,并使用finally 定义清理操作。

def run():
    my_object = MyClass()
    my_object.lay_the_table()
    print("Telling my_object to keep refreshing... Use Ctrl-C to stop.")
    try:
        while True:
            my_object.refresh()
    except KeyboardInterrupt:
        pass
    finally:
        my_object.tidy_away()

if __name__ == "__main__":
    run()

由于 Ctrl+C 发送interrupt,这实际上可能是最简单的方法。

【讨论】:

    【解决方案2】:

    要实现一个无限循环,如果满足条件就退出循环,只需:

    while True:
        run()
        if exitcondition == True:
            break
    

    这将使函数无限循环,直到满足退出条件,然后它将退出循环。如果您希望程序在退出条件后结束,请将“break”替换为quit()。

    【讨论】:

    • +1,但我希望你能原谅我给你一些建议。 (1) 您的解决方案假定让exitcondition 在所需时刻变为True 很简单,但这正是问题的难点。 (2) 我认为如果你写的更像是:while not exitcondition: \\ run(),你的代码会更优雅。如果没有别的,我的更短!
    • exitcondition == True 是多余的。只需使用if exitcondition:
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2018-10-11
    • 2016-04-11
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多