关于python:是否有一个while循环的变体只会运行一次子句直到发生更改?

Is there a variation of the while loop that will only run the clause once until a change occurs?

抱歉标题,这是一个棘手的问题。 我正在使用Python。 基本上,我希望程序无限期地检查变量。 例如,如果变量超过100,我希望代码块A只运行一次,然后我希望程序什么都不做,直到变量回到100以下,然后运行代码块B,然后再等待,直到变量返回 在100以上,然后再次运行块A,并重复。

我写的当前设置如下:

1
2
3
4
5
6
while on = True:
    if value_ind >= 100:
        open_time = time()
    else:
        close_time = time()
        calculate_time_open(open_time, close_time)

这里显而易见的问题是,无论if / else代码块为true,都将无限期地运行,并在我的列表中仅为一个事件创建多个条目。 那么,我如何让代码块只运行一次然后等待更改而不是在等待更改时不断重复? 提前致谢。


您可以使用状态机:您的程序处于以下两种状态之一:"等待高/低值"并且行为恰当:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
THRESHOLD = 100

waiting_for_high_value = True  # False means: waiting for low value

while True:  # Infinite loop (or"while on", if"on" is a changing variable)
    if waiting_for_high_value:
        if value_ind >= THRESHOLD:
            open_time = time()
            waiting_for_high_value = False
    else:  # Waiting for a low value:
        if value < THRESHOLD:
            close_time = time()
            calculate_time_open(open_time, close_time)
            waiting_for_high_value = True

现在,您需要在循环期间的某处更新测试值value_ind。这最好通过局部变量完成(而不是通过将全局变量更改为不可见的副作用)。

PS:上面的答案可以推广到任意数量的状态,并且便于添加一些必须在等待时连续完成的代码。但是,在您的特定情况下,您可以在两个状态之间切换,也许在等待更改时没有太多事情可做,因此Stefan Pochmann的答案也可能是合适的(除非它强制您在两个"等待"循环中复制代码)。


这个怎么样?

1
2
3
4
5
6
7
8
9
10
11
while True:

    # wait until the variable goes over 100, then do block A once
    while value_ind <= 100:
        pass
    <block A here>

    # wait until the variable goes below 100, then do block B once
    while value_ind => 100:
        pass
    <block B here>

这解决了您的重复问题。你可能会更好地等待而不是经常检查变量,尽管这取决于你实际在做什么。

补充:这里是你的代码中的实际块A和B,并使用not,这可能使它更好。其中一个带括号可能更好地突出了这个条件。 (并且pass不在额外的一行......我认为这里没问题):

1
2
3
4
5
6
7
while True:
    while not value_ind > 100: pass
    open_time = time()

    while not (value_ind < 100): pass
    close_time = time()
    calculate_time_open(open_time, close_time)