2016-06-11 80 views
1

我正在运行一个人口模型,并且总是出现错误的数字,因为我将变量设置为新值,但是当我想使用旧变量时,循环自动更新自己并使用新的。使用计算在while循环中设置新变量PYTHON

juvenile_population = 10 
adult_population = 10 
senile_population = 1 
juvenile_survival = 1 
adult_survival = 1 
senile_survival = 0 
birth_rate = 2 
generations = 5 


counter = 0 
while counter < generations: 
    juvenile_population = adult_population * birth_rate 
    adult_population = juvenile_population * juvenile_survival 
    senile_population = (adult_population * adult_survival) (senile_population * senile_survival) 
    total_population = juvenile_population + adult_population + senile_population 



    print("Juvenile: ",juvenile_population) 
    print("Adult: ",adult_population) 
    print("Senile: ",senile_population) 
    print("Total: ",total_population) 
    counter += 1 

一位朋友说要设置新的命名变量,但是在一个循环之后,你会不会再次遇到同样的问题?我希望变量能够更新,但只有在它们已经被打印之后,如果这是有意义的。 有什么建议吗?

+0

最简单的方法是你的朋友建议:使用新变量进行存储和打印,然后在完成打印时将它们分配给旧变量。否则,您可以使用答案中给出的建议,并立即进行所有计算 – Aquiles

+0

感谢您的澄清+关于我的朋友对新变量所说的更多提示。我的代码正在工作:) – Ollie

回答

0

每@Selcuk,你可以直接使用变量拆包,但即使有更好的格式,它看起来笨拙:

juvenile_population, adult_population, senile_population, total_population = (adult_population * birth_rate, 
                      juvenile_population * juvenile_survival, 
                      (adult_population * adult_survival) (senile_population * senile_survival), 
                      juvenile_population + adult_population + senile_population) 

我的建议是要么写一个辅助功能,并保持“喜欢”的价值观这样的字典:

populations = {'juvenile': 10, 
       'adult':  10, 
       'senile': 1 
       } 
survivals = {'juvenile': 1, 
      'adult':  1, 
      'senile':  0} 
birth_rate = 2 
generations = 5 

def update_population(pops): 
    juvie = pops['adult'] * birth_rate 
    adults = pops['juvenile'] * survivals['juvenile'] 
    seniles = pops['adult'] * survivals['adult'] + (pops['senile'] * survivals['senile']) 
    return {k:v for k,v in zip(['juvenile','adult','senile'],[juvie,adults,seniles])} 

counter = 0 
while counter < generations: 
    populations = update_population(populations.copy()) 
    total_population = sum(populations.values()) 



    print("Juvenile: ",populations['juvenile']) 
    print("Adult: ",populations['adult']) 
    print("Senile: ",populations['senile']) 
    print("Total: ",total_population) 
    counter += 1 
1

您正在用新值覆盖现有值。使用Python可以将所有四行合并成一个像这样的:

juvenile_population, adult_population, senile_population, total_population = adult_population * birth_rate, juvenile_population * juvenile_survival, (adult_population * adult_survival) (senile_population * senile_survival), juvenile_population + adult_population + senile_population 

这将在一次分配中的所有值,而不首先覆盖它们。