我如何摆脱这种无限循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何摆脱这种无限循环?相关的知识,希望对你有一定的参考价值。

##
numOfYears = 0
## Ask user for the CPI
cpi = input("Enter the CPI for July 2015: ")
## If they didn't enter a digit, try again
while not cpi.isdigit():
    print("Bad input")
    cpi = input("Enter the CPI for July 2015: ")
## Convert their number to a float
cpi = float(cpi)
while cpi <= (cpi * 2):
    cpi *= 1.025
    numOfYears += 1
## Display how long it will take the CPI to double
print("Consumer prices will double in " + str(numOfYears) + " years.")

有没有办法获取用户输入cpi的数字并加倍,以便while cpi <= (cpi * 2)不会给我一个无限循环?另外,有没有办法允许用户输入浮点数,以便它不返回Bad input错误?非常感谢所有帮助。

答案

其他人已经解释了为什么你会得到无限循环:你将cpi与其当前值而不是原始值进行比较。但是,还有更多:

  1. numOfYears的结果独立于cpi
  2. 你根本不需要循环,只需使用logarithms

所以您可以将代码更改为:

from math import ceil, log
numOfYears = ceil(log(2) / log(1.025))

根据1.025的年变化率,这给你几年的CPI加倍。


关于你的另一个问题:

此外,有没有办法允许用户输入浮点数,以便它不会返回“输入错误”错误?

你应该只要try一旦它工作就转换为float和break

while True:
    try:
        cpi = float(input("Enter the CPI for July 2015: "))
        break
    except ValueError:
        print("Bad input")

但正如我所说,对于你在该脚本中计算的内容,你根本不需要那个数字。

另一答案

您应该将给定的值保存为输入

cpi = float(cpi)
target_cpi = cpi * 2
while cpi <= target_cpi:
    cpi *= 1.025
    numOfYears += 1

以上是关于我如何摆脱这种无限循环?的主要内容,如果未能解决你的问题,请参考以下文章

当没有更多数据时如何停止无限循环(分页)

通过Android应用程序向Apache服务器发送请求,摆脱无限循环

跨线程异常抛出

如何终止嵌套循环

无限循环 - 延迟 - 单独的线程

.htaccess 不存在的 url 的无限循环