虽然python循环不能正常工作?

时间:2017-10-27 08:48:01

标签: python python-3.x while-loop

我正在通过使用python自动化无聊的东西来学习python,并且随着我在最初章节的进展,我决定尝试编写与作者目的不同的代码。在毒理学课上,老师说一种蜗牛每年死亡率高达12%。所以我决定制作一个代码来计算它。

我制作的代码是:

number= input('Number of individuals: ')  #tells the number of individuals in the beggining
count = 0 #tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ')  #% of individuals lost in each generation
percent=int(percent)

#while number > 1:
 #   number= number*(percent*0.01)
  #  number=round(number,-1)
   # count = count +1
    #print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
    #if number == 1:
     #   print(' it took ' + str(count) + ' generations to end with the species')


while True:
    if number == 1:
        print(' it took ' + str(count) + ' generations to end with the species')
    if number >1:
        number= number*(percent*0.01)
        number=round(number,-1)
        count = count +1
        print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
    if number == 0 :
        break

我试图制作的第一个代码是在评论中,我试图用另一种方法来尝试解决我的问题。

我的问题是: 我想输入个人数量和损失百分比。最后(因为个体不能与自己交配,这是1),我希望它告诉我结束这个物种所需的世代数。当程序循环比它假定的时间多一个时(和之前我使用round()函数它甚至循环更多次)问题开始了,因为我不想要0值,并且当它达到1时我想要它告诉我用它结束了多少代。

我试图寻找答案,但因为我是初学者,我可能无法正确理解正确搜索的条款。 我看到它的方式,程序应该像我想的那样运行,但我想我错过了一些我没有得到的东西。

5 个答案:

答案 0 :(得分:0)

看看这个。

number = input('Number of individuals: ')  # tells the number of individuals in the beggining
count = 0  # tells the nuumber of generations
number = int(number)
percent = input('% of loss per generation ')  # % of individuals lost in each generation
percent = int(percent)

while number > 1:
    number = number * (1 - percent * 0.01)
    number = int(number)
    count = count + 1
    print('generation ' + str(count) + ':' + str(number) + ' individuals')
print(' it took ' + str(count) + ' generations to end with the species')

包括@Alans的建议。

永无止境的循环问题的发生是因为最终只有一小部分人死于“死亡”。在您的round(number, -1)四舍五入后,例如从5个人中死亡0.3人,所以4.7仍然存在,但是四舍五入使他们再次成为5人。 int(number)向下舍入。

答案 1 :(得分:0)

让我们在评论中讨论代码,因为它是一个更好的解决方案,只需要一些改进。您的代码中存在两个主要问题

1)为什么要打印number * 0.1而不是number?它显示1应该显示10,我相信这是误导你的主要问题。

print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')

2)以下两行必须不在循环中,因为实际上你可以传递1到und将永远不会看到结果消息。这些行必须放在循环之后:

if number == 1:
    print(' it took ' + str(count) + ' generations to end with the species')

这是我们的结果:

number= input('Number of individuals: ')  # tells the number of individuals in the beggining
count = 0 # tells the nuumber of generations
number=int(number)
percent=input('% of loss per generation ')  # % of individuals lost in each generation
percent=int(percent) * 0.01

while number > 1:
    number = number * percent
    number = round(number)
    count = count +1
    print('generation ' + str(count) + ':' + str(number) + ' individuals')

print(' it took ' + str(count) + ' generations to end with the species')

<强>更新

如果您不介意,可以应用一些次要代码样式改进代码:

更新#2:

我只修复了循环,但正如@Alan在评论中指出的那样,你计算了错误。百分比应为1 - int(percent) * 0.01

number = input('Number of individuals: ')  # tells the number of individuals in the beggining
number = int(number)
percent = input('% of loss per generation ')  # % of individuals lost in each generation
percent = 1 - int(percent) * 0.01

count = 0 # tells the nuumber of generations
while number >= 2:
    number = number * percent
    count += 1
    print('generation {}: {} individuals'.format(count, round(number)))    

print(' it took {} generations to end with the species.'.format(count))

尝试代码https://repl.it/NWi4/2

更新#3:

我修改了代码块以改进舍入。它是round(number, -1),导致了数十的四舍五入。

答案 2 :(得分:0)

首先,你以错误的方式计算了活蜗牛的数量,每个迭代蜗牛都应该有(100% - 损失%)*蜗牛。 第二件事是条件和圆函数。您的代码很容易陷入损失不足以使前一个数字在舍入后降低的点,例如。 4 * 0.88 = 3.52,四舍五入后再次为4。因此,您可以根据问题的性质从舍入或使用楼层辞职。问题是我们如何治疗0.52的蜗牛?

对于12%的损失和100个人,花了37代才结束了没有四舍五入的物种,并且在使用地板时花了24代才结束物种。

以下代码应该有效。

import numpy as np
while True:
        if number <= 1: # <= covers values below 1
            print(' it took ' + str(count) + ' generations to end with the species')
            break;
        if number > 1:
            number = number*(1-percent*0.01) # number left is 1 - minus loss percent
            # number = np.floor(number) # optional floor
            count = count + 1
            # print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')

答案 3 :(得分:0)

您的代码有两个问题:

  1. 错误的舍入 - 您正试图以负值(如-2)进行舍入。四舍五入时需要使用正数。
  2. 每次迭代减少数量
  3. number = number - number*percent*0.01
    

    只需在代码中更改以上两项内容即可。

    更改后的代码:

    number= input('Number of individuals: ')  #tells the number of individuals in the beggining
    count = 0 #tells the nuumber of generations
    number=int(number)
    percent=input('% of loss per generation ')  #% of individuals lost in each generation
    percent=int(percent)
    
    while True:
        if number <= 1:
            print(' it took ' + str(count) + ' generations to end with the species')
            break
        if number > 1:
            number = number - number*percent*0.01
            number = round(number,2)
    
            count = count +1
            print('generation ' + str(count) + ':' + str(number*0.1) + ' individuals')
            print "Number is ",number
        if number == 0 :
            break
    

    <强>输出:

    Number of individuals: "10"
    % of loss per generation "2"
    generation 1:0.98 individuals
    Number is  9.8
    generation 2:0.96 individuals
    Number is  9.6
    generation 3:0.941 individuals
    Number is  9.41
    generation 4:0.922 individuals
    Number is  9.22
    generation 5:0.904 individuals
    Number is  9.04
    generation 6:0.886 individuals
    Number is  8.86
    generation 7:0.868 individuals
    Number is  8.68
    generation 8:0.851 individuals
    Number is  8.51
    generation 9:0.834 individuals
    Number is  8.34
    generation 10:0.817 individuals
    Number is  8.17
    generation 11:0.801 individuals
    Number is  8.01
    generation 12:0.785 individuals
    Number is  7.85
    generation 13:0.769 individuals
    Number is  7.69
    generation 14:0.754 individuals
    Number is  7.54
    generation 15:0.739 individuals
    Number is  7.39
    generation 16:0.724 individuals
    Number is  7.24
    generation 17:0.71 individuals
    Number is  7.1
    generation 18:0.696 individuals
    Number is  6.96
    generation 19:0.682 individuals
    Number is  6.82
    generation 20:0.668 individuals
    Number is  6.68
    generation 21:0.655 individuals
    Number is  6.55
    generation 22:0.642 individuals
    Number is  6.42
    generation 23:0.629 individuals
    Number is  6.29
    generation 24:0.616 individuals
    Number is  6.16
    generation 25:0.604 individuals
    Number is  6.04
    generation 26:0.592 individuals
    Number is  5.92
    generation 27:0.58 individuals
    Number is  5.8
    generation 28:0.568 individuals
    Number is  5.68
    generation 29:0.557 individuals
    Number is  5.57
    generation 30:0.546 individuals
    Number is  5.46
    generation 31:0.535 individuals
    Number is  5.35
    generation 32:0.524 individuals
    Number is  5.24
    generation 33:0.514 individuals
    Number is  5.14
    generation 34:0.504 individuals
    Number is  5.04
    generation 35:0.494 individuals
    Number is  4.94
    generation 36:0.484 individuals
    Number is  4.84
    generation 37:0.474 individuals
    Number is  4.74
    generation 38:0.465 individuals
    Number is  4.65
    generation 39:0.456 individuals
    Number is  4.56
    generation 40:0.447 individuals
    Number is  4.47
    generation 41:0.438 individuals
    Number is  4.38
    generation 42:0.429 individuals
    Number is  4.29
    generation 43:0.42 individuals
    Number is  4.2
    generation 44:0.412 individuals
    Number is  4.12
    generation 45:0.404 individuals
    Number is  4.04
    generation 46:0.396 individuals
    Number is  3.96
    generation 47:0.388 individuals
    Number is  3.88
    generation 48:0.38 individuals
    Number is  3.8
    generation 49:0.372 individuals
    Number is  3.72
    generation 50:0.365 individuals
    Number is  3.65
    generation 51:0.358 individuals
    Number is  3.58
    generation 52:0.351 individuals
    Number is  3.51
    generation 53:0.344 individuals
    Number is  3.44
    generation 54:0.337 individuals
    Number is  3.37
    generation 55:0.33 individuals
    Number is  3.3
    generation 56:0.323 individuals
    Number is  3.23
    generation 57:0.317 individuals
    Number is  3.17
    generation 58:0.311 individuals
    Number is  3.11
    generation 59:0.305 individuals
    Number is  3.05
    generation 60:0.299 individuals
    Number is  2.99
    generation 61:0.293 individuals
    Number is  2.93
    generation 62:0.287 individuals
    Number is  2.87
    generation 63:0.281 individuals
    Number is  2.81
    generation 64:0.275 individuals
    Number is  2.75
    generation 65:0.269 individuals
    Number is  2.69
    generation 66:0.264 individuals
    Number is  2.64
    generation 67:0.259 individuals
    Number is  2.59
    generation 68:0.254 individuals
    Number is  2.54
    generation 69:0.249 individuals
    Number is  2.49
    generation 70:0.244 individuals
    Number is  2.44
    generation 71:0.239 individuals
    Number is  2.39
    generation 72:0.234 individuals
    Number is  2.34
    generation 73:0.229 individuals
    Number is  2.29
    generation 74:0.224 individuals
    Number is  2.24
    generation 75:0.22 individuals
    Number is  2.2
    generation 76:0.216 individuals
    Number is  2.16
    generation 77:0.212 individuals
    Number is  2.12
    generation 78:0.208 individuals
    Number is  2.08
    generation 79:0.204 individuals
    Number is  2.04
    generation 80:0.2 individuals
    Number is  2.0
    generation 81:0.196 individuals
    Number is  1.96
    generation 82:0.192 individuals
    Number is  1.92
    generation 83:0.188 individuals
    Number is  1.88
    generation 84:0.184 individuals
    Number is  1.84
    generation 85:0.18 individuals
    Number is  1.8
    generation 86:0.176 individuals
    Number is  1.76
    generation 87:0.172 individuals
    Number is  1.72
    generation 88:0.169 individuals
    Number is  1.69
    generation 89:0.166 individuals
    Number is  1.66
    generation 90:0.163 individuals
    Number is  1.63
    generation 91:0.16 individuals
    Number is  1.6
    generation 92:0.157 individuals
    Number is  1.57
    generation 93:0.154 individuals
    Number is  1.54
    generation 94:0.151 individuals
    Number is  1.51
    generation 95:0.148 individuals
    Number is  1.48
    generation 96:0.145 individuals
    Number is  1.45
    generation 97:0.142 individuals
    Number is  1.42
    generation 98:0.139 individuals
    Number is  1.39
    generation 99:0.136 individuals
    Number is  1.36
    generation 100:0.133 individuals
    Number is  1.33
    generation 101:0.13 individuals
    Number is  1.3
    generation 102:0.127 individuals
    Number is  1.27
    generation 103:0.124 individuals
    Number is  1.24
    generation 104:0.122 individuals
    Number is  1.22
    generation 105:0.12 individuals
    Number is  1.2
    generation 106:0.118 individuals
    Number is  1.18
    generation 107:0.116 individuals
    Number is  1.16
    generation 108:0.114 individuals
    Number is  1.14
    generation 109:0.112 individuals
    Number is  1.12
    generation 110:0.11 individuals
    Number is  1.1
    generation 111:0.108 individuals
    Number is  1.08
    generation 112:0.106 individuals
    Number is  1.06
    generation 113:0.104 individuals
    Number is  1.04
    generation 114:0.102 individuals
    Number is  1.02
    generation 115:0.1 individuals
    Number is  1.0
     it took 115 generations to end with the species
    

答案 4 :(得分:0)

根据Iosif Serafeimidis的回答,这将继续减少人口,直到减少量小于1。正如其他人所说,答案实际上取决于你想要表达的内容。请注意,round(number)将舍入到最接近的整数,而不是int(number),它会舍入到下一个最小的整数。这是修改后的版本:

number = input('Number of individuals: ')  # tells the number of individuals in the beginning
count = 0  # tells the nuumber of generations
number = int(number)
percent = input('% of loss per generation ')  # % of individuals lost in each generation
percent = int(percent)

while number > 1:
    reduction = number * (percent * 0.01)
    if reduction < 1:
        print('No further reductions possible')
        break
    number = round(number - reduction)
    count = count + 1
    print('generation ' + str(count) + ':' + str(number) + ' individuals')

print(' after ' + str(count) + ' generations, there were ' + str(number) + ' individuals')