python 中的无限 while 循环 - 条件冲突
Infinite while loop in python - with conflicting conditions
我在 'while loop' 函数中导致的拼写错误让我想到了以下问题
from time import sleep
from random import randint
def control_pressure():
pressure = measure_pressure()
while True:
if pressure <= 500:
break
while pressure > 500 and pressure <= 700:
run_standard_safeties()
pressure = measure_pressure()
while pressure > 100: # Here is the typo
run_critical_safeties()
pressure = measure_pressure()
print("Wow! The system is safe...")
def measure_pressure():
pressure = randint(450, 800)
print(f"psi={pressure}", end="; ")
return pressure
def run_standard_safeties():
print("Running standard safeties...")
sleep(0.2)
def run_critical_safeties():
print("Running critical safeties...")
sleep(0.7)
if __name__ == "__main__":
control_pressure()
在上面,我打错了字并检查了压力> 100,而条件。但是在函数的第一部分的前面,它检查了压力 <= 500,然后中断。因此从技术上讲,任何小于或等于 500 的值都应该 return 为真并在不达到压力 > 100 条件的情况下中断函数。
但是这个功能一直没有停止。为什么会这样?
谢谢
如果初始数字高于 100 和高于 500,它将进入第二个循环并且永远不会停止,因为它始终高于 100,因为您是从 450-800 中随机取一个。
最好按顺序描述您的场景。
任何大于 500 的初始压力都会绕过 break
并继续到第一个内循环。由于您得到一个随机值 450..800
(350
的范围 - 这里的范围可能相差一个,但它们足够接近以至于无关紧要),这个概率约为 300/350
(分子来自 500..800
范围)或 85%.
第一个内循环将 运行 只要您获得的压力在 500..700
范围内,概率约为 200/350
或 57%。
在某些时候,您将退出第一个内循环并进入第二个内循环。您 将 输入它,因为范围 450..800
中的所有值都大于一百。
这意味着,当然,您也永远不会 退出 该循环,因为在该点之后您获得的压力不会是一百或更少,这是需要的退出循环。
顺便说一句,您实际上可以避免这种循环中的循环结构,方法是意识到您在每个循环的每次迭代中都承受压力,这样就可以变得普遍。
假设您的拼写错误是在您的意思是 700
的地方使用 100
(因为它以相互排斥的范围行进),可以简化为:
def control_pressure():
while True:
pressure = measure_pressure()
if pressure <= 500:
print("Wow! The system is safe...")
return
if pressure <= 700:
run_standard_safeties()
else:
run_critical_safeties()
或者,如果你想使用 :=
海象运算符(a)(我认为在 Python 3.8+ 中可用),你可以通过获取和检查压力作为 while
语句的一部分进一步缩短它:
def control_pressure():
while (pressure := measure_pressure()) > 500:
if pressure <= 700:
run_standard_safeties()
else:
run_critical_safeties()
print("Wow! The system is safe...")
(a) 之所以这样称呼,是因为顺时针旋转90°,眯着眼看,像海象,长着两只眼睛,两只大象牙。
它基本上(在这种情况下)允许您将一个值赋给一个变量作为检查所述变量的一部分,以便该值也可用于以后的检查。
我在 'while loop' 函数中导致的拼写错误让我想到了以下问题
from time import sleep
from random import randint
def control_pressure():
pressure = measure_pressure()
while True:
if pressure <= 500:
break
while pressure > 500 and pressure <= 700:
run_standard_safeties()
pressure = measure_pressure()
while pressure > 100: # Here is the typo
run_critical_safeties()
pressure = measure_pressure()
print("Wow! The system is safe...")
def measure_pressure():
pressure = randint(450, 800)
print(f"psi={pressure}", end="; ")
return pressure
def run_standard_safeties():
print("Running standard safeties...")
sleep(0.2)
def run_critical_safeties():
print("Running critical safeties...")
sleep(0.7)
if __name__ == "__main__":
control_pressure()
在上面,我打错了字并检查了压力> 100,而条件。但是在函数的第一部分的前面,它检查了压力 <= 500,然后中断。因此从技术上讲,任何小于或等于 500 的值都应该 return 为真并在不达到压力 > 100 条件的情况下中断函数。
但是这个功能一直没有停止。为什么会这样?
谢谢
如果初始数字高于 100 和高于 500,它将进入第二个循环并且永远不会停止,因为它始终高于 100,因为您是从 450-800 中随机取一个。
最好按顺序描述您的场景。
任何大于 500 的初始压力都会绕过 break
并继续到第一个内循环。由于您得到一个随机值 450..800
(350
的范围 - 这里的范围可能相差一个,但它们足够接近以至于无关紧要),这个概率约为 300/350
(分子来自 500..800
范围)或 85%.
第一个内循环将 运行 只要您获得的压力在 500..700
范围内,概率约为 200/350
或 57%。
在某些时候,您将退出第一个内循环并进入第二个内循环。您 将 输入它,因为范围 450..800
中的所有值都大于一百。
这意味着,当然,您也永远不会 退出 该循环,因为在该点之后您获得的压力不会是一百或更少,这是需要的退出循环。
顺便说一句,您实际上可以避免这种循环中的循环结构,方法是意识到您在每个循环的每次迭代中都承受压力,这样就可以变得普遍。
假设您的拼写错误是在您的意思是 700
的地方使用 100
(因为它以相互排斥的范围行进),可以简化为:
def control_pressure():
while True:
pressure = measure_pressure()
if pressure <= 500:
print("Wow! The system is safe...")
return
if pressure <= 700:
run_standard_safeties()
else:
run_critical_safeties()
或者,如果你想使用 :=
海象运算符(a)(我认为在 Python 3.8+ 中可用),你可以通过获取和检查压力作为 while
语句的一部分进一步缩短它:
def control_pressure():
while (pressure := measure_pressure()) > 500:
if pressure <= 700:
run_standard_safeties()
else:
run_critical_safeties()
print("Wow! The system is safe...")
(a) 之所以这样称呼,是因为顺时针旋转90°,眯着眼看,像海象,长着两只眼睛,两只大象牙。
它基本上(在这种情况下)允许您将一个值赋给一个变量作为检查所述变量的一部分,以便该值也可用于以后的检查。