2015-12-02 179 views
0

我想制作一个数据记录代码,供用户输入动物的数量和年龄,出生率以及他们存活下一代的机会。我曾尝试使用收益,但是当我运行该程序,变量保持为0Python变量不会改变

在这里,我已经开始变量

Gen0_J=0 
Gen0_A=0 
Gen0_S=0 
Birth_rate=0 
Srate_J=0 
Srate_A=0 
Srate_S=0 
New_generations=5 

我的第一个功能

def generation_values(): 
    Gen0_J=int(input("How many juveniles in Generation 0? ")) 
    Gen0_A=int(input("How many adults in Generation 0? ")) 
    Gen0_S=int(input("How many seniles in Generation 0? ")) 
    Srate_J=float(input("What is the survival rate for juveniles? ")) 
    Srate_A=float(input("What is the survival rate for adults? ")) 
    Srate_S=float(input("What is the survival rate for seniles? ")) 
    Birth_rate=int(input("What is the birth rate? ")) 
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate 

显示变量

def display_values(): 
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J) 
    print("The amount of adults in Generation 0 is",Gen0_A) 
    print("The amount of seniles in Generation 0 is",Gen0_S) 
    print("The birth rate in Generation 0 is",Birth_rate) 
    print("The survival rate for juveniles in Generation 0 is",Srate_J) 
    print("The survival rate for adults in Generation 0 is",Srate_A) 
    print("The survival rate for seniles in Generation 0 is",Srate_S) 

generation_values() 
display_values() 

然而,变量保持在0

How many juveniles in Generation 0? 5 
How many adults in Generation 0? 6 
How many seniles in Generation 0? 7 
What is the survival rate for juveniles? 0.75 
What is the survival rate for adults? 1 
What is the survival rate for seniles? 0 
What is the birth rate? 2 

The amount of juveniles in Generation 0 is 0 
The amount of adults in Generation 0 is 0 
The amount of seniles in Generation 0 is 0 
The birth rate in Generation 0 is 0 
The survival rate for juveniles in Generation 0 is 0 
The survival rate for adults in Generation 0 is 0 
The survival rate for seniles in Generation 0 is 0 
+4

在函数内创建的变量不会更改在函数外创建的变量的值,即使它们具有相同的名称。 – Kevin

+0

'return'不会将这些值放在更大的范围内,它们需要分配给值以实现。 (这可能会有所帮助)(/ questions/291978/python-scoping-rules的简短描述)。 – SuperBiasedMan

回答

1

变量的作用域不正确。 [在函数内部,类内部或模块内部声明的变量在程序中的较高级别上不可访问 - a short description of python scoping rulessuper_biased_man在注释中发布] - 在这种情况下,您在generation_values()中分配的变量是在本地定义。

确实不是这样做的正确方法,但是在 generation_values()中声明变量全局将解决您的问题:(定义什么是实现此目标的“理想方式”取决于您的位置编程&的研究将带我们太远)

Gen0_J=0 
Gen0_A=0 
Gen0_S=0 
Birth_rate=0 
Srate_J=0 
Srate_A=0 
Srate_S=0 
New_generations=5 


def generation_values(): 

    global Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate 

    Gen0_J=int(input("How many juveniles in Generation 0? ")) 
    Gen0_A=int(input("How many adults in Generation 0? ")) 
    Gen0_S=int(input("How many seniles in Generation 0? ")) 
    Srate_J=float(input("What is the survival rate for juveniles? ")) 
    Srate_A=float(input("What is the survival rate for adults? ")) 
    Srate_S=float(input("What is the survival rate for seniles? ")) 
    Birth_rate=int(input("What is the birth rate? ")) 
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate 


def display_values(): 
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J) 
    print("The amount of adults in Generation 0 is",Gen0_A) 
    print("The amount of seniles in Generation 0 is",Gen0_S) 
    print("The birth rate in Generation 0 is",Birth_rate) 
    print("The survival rate for juveniles in Generation 0 is",Srate_J) 
    print("The survival rate for adults in Generation 0 is",Srate_A) 
    print("The survival rate for seniles in Generation 0 is",Srate_S) 

generation_values() 
display_values() 

的处理,这将是该变量作为参数传递给你的函数,并与指定的值返回他们的另一种方法......但是也有很多的他们和传递他们可能会混淆你的代码。

你也可以将它们收集在一个元组中或者将它们包装在一个类中。

1

变量的范围不一致。

你可以这样来做:

def generation_values(): 
    Gen0_J=int(input("How many juveniles in Generation 0? ")) 
    Gen0_A=int(input("How many adults in Generation 0? ")) 
    Gen0_S=int(input("How many seniles in Generation 0? ")) 
    Srate_J=float(input("What is the survival rate for juveniles? ")) 
    Srate_A=float(input("What is the survival rate for adults? ")) 
    Srate_S=float(input("What is the survival rate for seniles? ")) 
    Birth_rate=int(input("What is the birth rate? ")) 
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate 

def display_values(Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate): 
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J) 
    print("The amount of adults in Generation 0 is",Gen0_A) 
    print("The amount of seniles in Generation 0 is",Gen0_S) 
    print("The birth rate in Generation 0 is",Birth_rate) 
    print("The survival rate for juveniles in Generation 0 is",Srate_J) 
    print("The survival rate for adults in Generation 0 is",Srate_A) 
    print("The survival rate for seniles in Generation 0 is",Srate_S) 

Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate = generation_values() 
display_values(Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate) 

将是第一步。

这样,“main”命名空间中的变量就与函数中的变量分开。

下一个步骤,以去除重复可以不计较在主命名空间中的变量的分离,只是将它们当作一个元组:

data = generation_values() 
display_values(*data) 

进一步步骤,消除重复和intoduce清晰度可以包括:

  • 装配在一个对象(namedtuple或其他物体)
  • 数据要求和outout中的数据对象的方法
+0

非常感谢! *数据有什么作用? –

+0

它解开元组'data',使其组件作为独立参数传递给被调用函数。请参阅[这里](https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists)。 – glglgl

0

正如其他人所说的,问题是函数内部的变量赋值会创建新的变量,而不是将值赋给全局变量。这就是为什么global关键字存在。

在这种情况下,我会考虑使用一个类,因为你有一些相关的状态值,你一起操作。

class GenerationData(object): 

    def __init__(self, gen_number): 
     self.number = gen_number 
     self.birth_rate = 0 
     self.num_juveniles, self.num_adults, self.num_seniles = 0, 0, 0 
     self.juvenile_rate, self.adult_rate, self.senile_rate = 0.0, 0.0, 0.0 

    @classmethod 
    def read(cls, gen_number): 
     gen = cls(gen_number) 
     gen.num_juveniles = read_integer(
      'How many juveniles in Generation {}?'.format(gen_number)) 
     gen.num_adults = read_integer(
      'How many adults in Generation {}?'.format(gen_number)) 
     gen.num_seniles = read_integer(
      'How many seniles in Generation {}?'.format(gen_number)) 
     gen.juvenile_rate = read_float(
      'What is the survival rate for juveniles? ') 
     gen.adult_rate = read_float('What is the survival rate for adults? ') 
     gen.senile_rate = read_float('What is the survival rate for seniles? ') 
     gen.birth_rate = read_integer('What is the birth rate? ') 

    def display(self): 
     print('The amount of juveniles in Generation', self.number, 
       'is', self.num_juveniles) 
     print('The amount of adults in Generation', self.number, 
       'is', self.num_adults) 
     print('The amount of seniles in Generation', self.number, 
       'is', self.num_seniles) 
     print('The birth rate in Generation', self.number, 
       'is', self.birth_rate) 
     print('The survival rate for juveniles in Generation', self.number, 
       'is', self.juvenile_rate) 
     print('The survival rate for adults in Generation', self.number, 
       'is', self.adult_rate) 
     print('The survival rate for seniles in Generation', self.number, 
       'is', self.senile_rate) 


def read_integer(prompt): 
    return int(raw_input(prompt)) 


def read_float(prompt): 
    return float(raw_input(prompt)) 


first_generation = Generation.read(0) 
first_generation.display() 

当您操作生成数据时,这会使事情变得更加简单,因为它全部捆绑到一个对象中。