2012-11-06 60 views
1

斜體文本可以跳過。命名自動生成的對象,python

首先:如果我要求的是基本知識,也很容易找到答案,或者任何類似的東西,可能會讓我的帖子煩人任何人,請原諒我。我剛剛接觸編程,剛開始有一個藉口不去讀書。 我正試圖製作一個程序,它可以模仿從人類部落進化到更好的人類部落。我的目標是在未來一段時間內製作一個非常簡單的文明類遊戲,專注於人而不是建築物和單位。從頭開始,現在對編程幾乎一無所知,我知道這是我可能永遠不會完成的任務。希望我會在路上學到一些東西。 因爲我的知識是如此有限,我的問題將是笨拙和嚴重製定。對不起,感謝您的閱讀。

當前問題: 我做了一個讓對象代表人物的類。

類看起來像這樣的時刻:

class Settler: 
    settlerCount = 0 
    iqlistfemale = [] 
    iqlistmale = [] 
    maleCount = 0 
    femaleCount = 0 
    surnameMale = [] 
    surnameFemale = [] 

    def __init__(self, sex): 
     if sex=="m" or sex=="f" or sex=="M" or sex=="F": 
      self.name = choice(surnames) 
      Settler.settlerCount += 1 
      self.iq=round(random.normalvariate(100,10)) 
      if sex=="m" or sex=="M": 
       self.sex = "Male" 
       Settler.iqlistmale=Settler.iqlistmale+[self.iq] 
       Settler.surnameMale += [self.name] 
       Settler.maleCount += 1 
      else: 
       self.sex = "Female" 
       Settler.iqlistfemale=Settler.iqlistfemale+[self.iq] 
       Settler.surnameFemale += [self.name] 
       Settler.femaleCount += 1 

後來將包含更多方式的屬性,這僅僅是一個開始。

我也做了一個循環,會問你一大堆男性創建,然後創建一定數量的女性。

環路的事情是這樣的:

x=int(input("Number of male Settlers to generate? (1-20) ")) 
if x >0 and x <21: 
    tellergenerator=0 
    while tellergenerator<x: 
     Settler("M") 
     tellergenerator=tellergenerator+1 

else: 
    print("Wrong input!") 



x=int(input("Number of female Settlers to generate? (1-20) ")) 
if x >0 and x <21: 
    tellergenerator=0 
    while tellergenerator<x: 
     Settler("F") 
     tellergenerator=tellergenerator+1 

else: 
    print("Wrong input!") 

而且,我做了一個高清的東西,讓你打電話的信息,對象的屬性:

def displaySettler(self): 
     print("Name:", self.name, "Sex:", self.sex, "IQ:", self.iq) 

現在,問題:

  1. 主要問題:我的環路的東西做工精細,MEA它會創建我想要創建的正確性別的對象的數量。據我所知,我的問題是它創建了沒有名字的對象。這意味着我不能執行displaySettler()調用,因爲它需要我做nameofobject.displaySettler()。我如何使用某種循環函數來創建一堆對象,使這些對象具有名稱。

我已經找到一種方法來一些組合爲一個字符串,這可能讓我投入循環,產生像settler1,settler2,settler3對象名稱的系統,但我做到這一點的方法是做類似

x=settler 
y=(some counter) 
z=x+str(y) 

這是我可以使用的東西嗎?我知道有名稱,以創建我的對象的唯一方法是通過編寫類似

settler1=Settler("F") 

w=Settler("F") 

是有可能使用變量z的內容來命名的東西嗎?

  1. 我還想問一下以下問題:正如你從我的課堂上看到的,我正在做一堆列表。我想我必須爲每個性別的每個屬性列出一個列表,其中包含所有對象的特定屬性。我希望這些列表能夠計算每個屬性的總體平均值,以及類似的事情。

是否可以直接從對象中獲取這些值,並直接通過所有對象並計算平均值?

或者換句話說:如果我有200個物體,有沒有辦法讓所有物體的智商加在一起?

感謝您的閱讀(如果有人有這麼遠)。所有建設性的反饋將非常感激。

回答

3

您需要讓您的人員生成器將生成的人員記錄在數據結構(如列表或字典)中,然後從該創建的結構中訪問這些人員。代替你的while循環的,試試:

people = [] 
for i in range(x): 
    people.append(Settler('M')) # or 'F', for the other loop 

然後你可以使用:

people[n].displaySettler() # where n is any integer from 0 to x-1 
+0

這就是我剛剛寫的,只是改變是我會使用'for _ in range(x)'因爲'i'沒有使用 –

+0

這只是一個樣式點。我更喜歡''我''',但每個他們自己。 –

+0

非常好!非常感謝你。我甚至設法把這些東西放到一個班級裏,這樣我就可以隨時結交新朋友^^ /bow –

0

響應你的第二個問題,讓我們說,你有定居者的名單稱爲people(這是一個列表理解)...

iqs = [person.iq for person in people] 
total_iq = sum(iqs) 
0

編輯:Sr2222打我。我認爲我們正在使用相同的想法。

不知道這是最好的方法,但是:

您能夠存儲在一個字典對象,利用循環生成的名稱。

舉個例子:

group_of_vars = {} 
for name in range(5): 
    entry = 'object_'+str(name) 
    group_of_vars[name] = entry 

print group_of_vars 

print group_of_vars 
{0: 'object_0', 1: 'object_1', 2: 'object_2', 3: 'object_3', 4: 'object_4 

因此

>>> print group_of_vars[1] 
object_1 

因此,通過使用這方面的知識,你可以把變量名(生成自動或手動)的列表,並保持在一個列表。然後在for循環中引用列表的名稱作爲範圍,並引用該列表中的每個變量。

至於獲得加在一起,你可以做的對象的所有IQ的總和(下面我前面的例子,假設在字典中的條目與智商屬性值的對象)

sum = 0 
for name in group_of_vars: 
    sum += group_of_vars[name].iq 

>>> print sum 

這應該返回字典group_of_vars中所有對象的iq屬性的總和。