Python:模型细菌生长,嵌套循环,逻辑错误

时间:2014-06-27 15:01:46

标签: python while-loop

我必须将细菌生长模拟为光密度的函数。问题很简单:对于用户指定的每小时,表格中每个单元格的OD增加5%;当细胞达到OD为1.0时,过量的细胞分布到溢出细胞的细胞N,E,S和W.如果它们都是1.0,则不再发生增长。 OD表是方形的,可以是任何尺寸,它不包围。

在下面的代码中:

array3是OD的初始表,length是行和列的数量。我知道我在嵌套的while循环中出现了逻辑错误,因为只有第一行更新,而且只有一次:

elapsed=0
i=0
j=0
hours = input('how many hours do you want to run the experiment for?\n')
increase = 1.05

while elapsed <= hours:
    while i<length:
        while j<length:
            if array3[i, j]<1.0:
                array3[i, j]*=increase
                j+=1
            if array3[i, j]>=1.0:
                array3[i, j]=1.0
                excess=((array3[i, j]*increase)-1)/4
                array3[(i-1), j]+=excess
                array3[(i+1), j]+=excess
                array3[i, (j-1)]+=excess
                array3[i, (j+1)]+=excess
                j+=1
        i+=1
    elapsed+=1

1 个答案:

答案 0 :(得分:1)

正如评论中已经指出的那样,问题是您在循环中增加了计数器变量,但是在下一次迭代之前不会将它们重置为原始值。在i = 0之前添加while i<length(和j类似)可以解决您的问题,但我建议使用for循环,循环遍历range变量应该采用的值。

for elapsed in range(hours):
    for i, j in itertools.product(range(length), repeat=2):
        if array3[i, j] < 1.0:
            array3[i, j] = min(1.0, array3[i, j] * increase)
        else:
            excess = ((array3[i, j] * increase) - 1) / 4
            for di, dj in [(+1,0), (-1,0), (0,+1), (0,-1)]:
                if 0 <= i+di < length and 0 <= j+dj < length:
                    array3[i+di, j+dj] = min(1.0, array3[i+di, j+dj] + excess)

如你所见,我做了一些改动:

  • itertools非常有用,例如用于迭代两个变量的乘积,例如ij
  • 您可以使用min内置函数来限制1.0
  • 的增长
  • 循环遍历ij的所有“增量”,而不是为所有4个邻居设置相同的代码