Python 3: 不循环的重新运行当前函数
Python 3: Rerun the current function without any loop
我有一个名为 Cycle()
的函数,它根据温度调节泵应该 运行 的速度。这是它的表示形式:
def Cycle(self, arg1, arg2, arg3, arg4):
if arg1 < arg2:
self.pumpSpeed = 100
elif ....:
print("Successfully cooled down. Returning to normal")
elif ....:
self.pumpSpeed = 45
elif ....:
print("Solar circuit cooled down. Returning to normal")
elif ....:
self.pumpSpeed = 0
.
.
so on...
您可以看到在某些情况下 PumpSpeed
正在设置,同时在其他情况下只提供打印语句,系统必须等待下一个周期来决定 PumpSpeed
应该是什么。
我运行这样的方式如下:
for i in range(0,10):
fetchNewArgs()
Obj.cycle(arg1, arg2, arg3, arg4)
sleep(5)
问题是系统可能需要再等待 5 秒才能确定冷却后新的泵速应该是多少。
解决方案应该是在所需条件下实施 continue
,但问题是这不是循环,所以不能。
有什么方法可以让运行 Cycle()
仅在特定条件下立即发挥作用,而无需再等待 5 秒?
基于@Quamrana 的回答必须进一步限制范围:
- 睡眠时间是可变的,并不总是 5,因此返回睡眠时间的部分增加了复杂性。如果不是这种情况,那肯定行得通。
- 第一个声明中显然不清楚的重要事项。我使用
Rerun
这个词的原因是我想使用具有相同参数的循环。下一次,争论可能会改变。修改了原来的循环函数来显示。
一个选项是 return 来自 cycle
方法的 sleep
时间的值:
def Cycle(self, arg1, arg2, arg3, arg4):
default_sleep_time = 5
# ...
elif ...:
default_sleep_time = 0.001 # very short sleep
# ...
return default_sleep_time
for i in range(0,10):
sleep_time = Obj.cycle(arg1, arg2, arg3, arg4)
sleep(sleep_time)
另一种选择是 return 是否睡觉的布尔值:
def Cycle(self, arg1, arg2, arg3, arg4):
do_sleep = True
# ...
elif ...:
do_sleep = False
# ...
return do_sleep
for i in range(0,10):
if Obj.cycle(arg1, arg2, arg3, arg4):
sleep(5)
改变了问题的性质,函数本身也可以修改为循环:
def Cycle(self, arg1, arg2, arg3, arg4):
do_loop = True
while do_loop
# ...
elif ...:
do_loop = False
# ...
当大多数路由需要循环时,以上方法有效。或者,如果大多数人想退出,可以在循环内重置 do_loop
标志:
def Cycle(self, arg1, arg2, arg3, arg4):
do_loop = True
while do_loop
do_loop = False
# ...
elif ...:
do_loop = True
# ...
我有一个名为 Cycle()
的函数,它根据温度调节泵应该 运行 的速度。这是它的表示形式:
def Cycle(self, arg1, arg2, arg3, arg4):
if arg1 < arg2:
self.pumpSpeed = 100
elif ....:
print("Successfully cooled down. Returning to normal")
elif ....:
self.pumpSpeed = 45
elif ....:
print("Solar circuit cooled down. Returning to normal")
elif ....:
self.pumpSpeed = 0
.
.
so on...
您可以看到在某些情况下 PumpSpeed
正在设置,同时在其他情况下只提供打印语句,系统必须等待下一个周期来决定 PumpSpeed
应该是什么。
我运行这样的方式如下:
for i in range(0,10):
fetchNewArgs()
Obj.cycle(arg1, arg2, arg3, arg4)
sleep(5)
问题是系统可能需要再等待 5 秒才能确定冷却后新的泵速应该是多少。
解决方案应该是在所需条件下实施 continue
,但问题是这不是循环,所以不能。
有什么方法可以让运行 Cycle()
仅在特定条件下立即发挥作用,而无需再等待 5 秒?
基于@Quamrana 的回答必须进一步限制范围:
- 睡眠时间是可变的,并不总是 5,因此返回睡眠时间的部分增加了复杂性。如果不是这种情况,那肯定行得通。
- 第一个声明中显然不清楚的重要事项。我使用
Rerun
这个词的原因是我想使用具有相同参数的循环。下一次,争论可能会改变。修改了原来的循环函数来显示。
一个选项是 return 来自 cycle
方法的 sleep
时间的值:
def Cycle(self, arg1, arg2, arg3, arg4):
default_sleep_time = 5
# ...
elif ...:
default_sleep_time = 0.001 # very short sleep
# ...
return default_sleep_time
for i in range(0,10):
sleep_time = Obj.cycle(arg1, arg2, arg3, arg4)
sleep(sleep_time)
另一种选择是 return 是否睡觉的布尔值:
def Cycle(self, arg1, arg2, arg3, arg4):
do_sleep = True
# ...
elif ...:
do_sleep = False
# ...
return do_sleep
for i in range(0,10):
if Obj.cycle(arg1, arg2, arg3, arg4):
sleep(5)
改变了问题的性质,函数本身也可以修改为循环:
def Cycle(self, arg1, arg2, arg3, arg4):
do_loop = True
while do_loop
# ...
elif ...:
do_loop = False
# ...
当大多数路由需要循环时,以上方法有效。或者,如果大多数人想退出,可以在循环内重置 do_loop
标志:
def Cycle(self, arg1, arg2, arg3, arg4):
do_loop = True
while do_loop
do_loop = False
# ...
elif ...:
do_loop = True
# ...