python中的While循环(新手)
您好,我是python的新手,我很难理解这个简单的while循环。这个程序应该计算细菌翻倍所需的时间python中的While循环(新手),python,Python,您好,我是python的新手,我很难理解这个简单的while循环。这个程序应该计算细菌翻倍所需的时间 time = 0 population = 1000 # 1000 bacteria to start with growth_rate = 0.21 # 21% growth per minute while population < 2000: population = population + growth_rate * population print popu
time = 0
population = 1000 # 1000 bacteria to start with
growth_rate = 0.21 # 21% growth per minute
while population < 2000:
population = population + growth_rate * population
print population
time = time + 1
print "It took %d minutes for the bacteria to double." % time
print "...and the final population was %6.2f bacteria." % population
我不明白的是,为什么最终结果大于2000,因为它应该在2000年之前停止。我是不是搞错了?您的代码是:“只要人口少于2000,计算下一代的人口,然后再次检查”。因此,它总是计算一代人太多
试试这个:
while True:
nextGen = population + growth_rate * population
if nextGen > 2000: break
population = nextGen
print population
time = time + 1
编辑:
或者为了得到准确的结果:
print (math.log (2) / math.log (1 + growth_rate) )
所以整个计划可以是:
import math
population = 1000
growth_rate = 0.21 # 21% growth per minute
t = math.log (2) / math.log (1 + growth_rate)
print 'It took {} minutes for the bacteria to double.'.format (t)
print '...and the final population was {} bacteria.'.format (2 * population)
我认为这是一个简单的数学问题——你期望时间是一个整数,尽管它可能是一个浮点数。当人口达到2000时,循环无法停止,因为按照您的计算方式,它从来没有2000的值。在循环的倒数第二次迭代中,人口少于2000,因此有另一次迭代。在最后一次迭代中,人口超过2000,因此循环退出 如果人口每次增加1,那么你是对的;循环将在2000年退出。您可以使用更简单的版本查看此行为:
i = 0
while i < 10:
i += 1
print i
i=0
当我<10时:
i+=1
打印i
改变
i
增加的量,以查看其变化。A,而循环是“入口控制”循环的一个示例。这意味着在进入循环之前检查条件。因此,这意味着如果您的循环条件在上一次迭代中被违反,而不是在开始时,那么您的循环将在第一次违反之后而不是之前终止
下面是一个简单的例子:
>>> a = 1
>>> while a < 5:
... a = a+3
... print a
...
4
7
>a=1
>>>而a<5:
... a=a+3
... 打印
...
4.
7.
因此,如果您希望循环必须在a大于或等于5之前退出,则必须在循环本身中进行检查,然后断开循环:
>>> a = 1
>>> while a < 5:
... a = a+3
... if a < 5:
... print a
... else:
... break
...
4
>a=1
>>>而a<5:
... a=a+3
... 如果a<5:
... 打印
... 其他:
... 打破
...
4.
所以您的代码就在这里:
while population < 2000:
population = population + growth_rate*population
人口<2000时:
人口=人口+增长率*人口
假设我们进入这个循环,人口=1800,增长率=0.21。这满足while循环进入另一个循环的所有要求。但是,在下一行中,您将设置population=1800+(.21)*1800,这等于2178。所以,当你打印出人口,它会说2178,即使它高于2000
你能做的就是这样:
while population < 2000:
if population == population + growth_rate * population < 2000:
population = population + growth_rate * population
time = time + 1
else:
break
print population
人口<2000时:
如果人口==人口+增长率*人口<2000年:
人口=人口+增长率*人口
时间=时间+1
其他:
打破
印刷人口
因为在您上次迭代之前(#4)它低于2000。
迭代#1:1210.0
迭代#2:1464.1
迭代#3:1771.561
迭代#4:2143.58881
另一种方法是在While循环中添加一个中断(假设您所关心的是打印的数字不高于2000),尽管可能不那么优雅:
人口<2000时:
人口=人口+增长率*人口
如果人口>=2000:
打破
其他:
印刷人口
时间=时间+1
我认为您现在将获得正确的输出。一旦人口
大于等于2000,它将停止循环。最后一次迭代是使其大于2000,即2143。有趣的是,你的结果中可以分裂细菌;)您的代码不是也在做同样的事情吗,只是使用了更糟糕的编码风格?你的代码是:“永远计算下一代的人口,除非人口大于或等于2000”。@Ben:不,这也不会产生正确的结果。它会给你们提供2000多人口的前一代的人口,你们都绝对正确。现在太早了。我现在已经修好了。@jazzpi,它会给出OP建议他们遇到的问题。它不会给出“正确”的结果,你必须对此进行分数运算。@Ben我想OP想知道的是为什么循环运行了太多的一次迭代,而不是如何将他的增长表示为一个随时间变化的函数。你不能将一个=
符号放在if
语句中。而人口<2000:
如果人口是一个浮点数,就可以正常工作。“问题”是最后一次迭代将使人口超过2000。感谢您给出一个使用+=
运算符的示例。
while population < 2000:
if population == population + growth_rate * population < 2000:
population = population + growth_rate * population
time = time + 1
else:
break
print population
while population < 2000:
population = population + growth_rate * population
if population >= 2000:
break
else:
print population
time = time + 1
time = 0
population = 1000 # 1000 bacteria to start with
growth_rate = 0.21 # 21% growth per minute
while population != 2*population:
population = population + (growth_rate * population )
time = time + 1
print "It took %d minutes for the bacteria to double." % time