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

您好,我是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 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