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,都将无限期地运行,并在我的列表中仅为一个事件创建多个条目。 那么,我如何让代码块只运行一次然后等待更改而不是在等待更改时不断重复? 提前致谢。
-
请阅读SO上的异步编程主题
-
您可能不需要使用while,是否可以使用if语句进行此操作?
-
它需要不断运行。 此外,没有设置时间延迟将起作用,因为此应用程序是基于传感器的。
-
你有没有想过你这样做的方式是错的?
您可以使用状态机:您的程序处于以下两种状态之一:"等待高/低值"并且行为恰当:
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的答案也可能是合适的(除非它强制您在两个"等待"循环中复制代码)。
-
为什么局部变量优于全局变量?该变量仅用于此函数,但我将所有全局变量放在同一区域中,因此如果需要,可以轻松找到它们。
-
尽可能避免全局变量的原因是,除非您阅读"大量"代码,否则对这些变量的更改是不可见的。"很多"意味着"与使用局部变量时必须阅读的内容相比太多"。在实践中,情况甚至更糟,有全局变量:你读代码,你不明白为什么有while on == True尽管on似乎没有改变,所以你开始怀疑全局变量在某处更新。然后你必须检查你正在看的循环中的每一个调用,等等。
-
具体地说,使用局部变量而不是全局变量通常并不复杂(并且总是更易读)。
-
很公平,我明白你在说什么。我现在正在编写的程序将会很短,所以在这种情况下我不认为全局变量会成为一个问题,但我确实看到它在处理大型程序时会变成一团糟。
-
"那么,如何让代码块只运行一次然后等待更改而不是在等待更改时不断重复?提前感谢。"我认为你的答案并没有解决问题。 @EOL
-
@Elyasin您能否扩展一下这个答案如何解决问题?例如,当value_ind低于阈值时,调用calculate_time_open()(一次),然后waiting_for_high_value切换到True。因此,当我们等待更改时(value_ind此时超过阈值),calculate_time_open()将不再被调用,因此这个"块""仅运行一次"。据我所知,这就是问题所要求的。
-
你是对的@EOL。对不起,我的大脑和我一起玩耍。我不能改变我的投票。如果你编辑,我可以提出你的答案。
-
@Elyasin感谢您查看此内容。我确实编辑了我的答案。谢谢。
这个怎么样?
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) |
-
@EOL我刚刚意识到我们都忽略了一些东西 -"on = True"部分。如果需要,那么你的解决方案可以轻松处理,我可能会用if not on: return替换pass,具体取决于更大的图片。
-
好的,谢谢。
-
@StefanPochmann我是一个新的程序员,我不明白pass究竟是什么。在文档中,它说它什么都不做,这不是一个非常好的描述。 pass暂停程序吗?如果pass什么都不做,那有什么意义呢?没有它,程序是否会以相同的方式运行? on == True也很糟糕,只有on更好。
-
@ user1917407你能给我链接到你看到的pass文档吗?
-
@StefanPochmann docs.python.org/2/tutorial/controlflow.html请参见4.5:"pass语句不执行任何操作。"
-
@ user1917407是的,直接跟着它的下一句话甚至没有换行说明了目的。
-
@StefanPochmann我是一个新的程序员,我不明白究竟是什么传递。通过暂停程序吗?如果它什么都不做的话,有什么意义呢?
-
@ user1917407它什么都没做。没有!不,它不会停止程序,因为这会做一些事情。它的唯一目的是成为源代码中的某些东西,这样Python就不会对你的循环感到困惑,所以它是空的。
-
如果有人问问题,你为什么甚至会在这个论坛上回答问题?什么对你来说很简单,对每个人来说可能并不简单,放松。
-
"那么,如何让代码块只运行一次然后等待更改而不是在等待更改时不断重复?提前感谢。"我认为你的答案并没有解决问题。 @ user1917407
-
@Elyasin为什么不呢?
-
我错了。 我认为你是对的。 我不知道为什么,但昨晚,当我看到答案时,我确信自己不正确。 对不起。 如果你可以编辑答案,我会upvote(现在直到答案被编辑,对我来说投票被锁定,对不起)。
-
@Elyasin好的,编辑。