1

可以跳过斜体文本。

首先:如果我要求的是基本知识,也很容易找到答案,或者任何类似的东西可能会让我的帖子对任何人感到厌烦,请原谅我。我是编程新手,刚开始有借口不为考试阅读。我正在尝试制作一个程序,可以模拟从人类部落到……嗯,更先进的人类部落的进化。我的目标是在未来的某个时间制作一款非常简单的类似文明的游戏,专注于人而不是建筑物和单位。从头开始,目前对编程几乎一无所知,我知道这是我可能永远无法完成的任务。希望我能在路上学到一些东西。因为我的知识非常有限,我的问题会很笨拙而且表述很糟糕。对不起,感谢阅读。

当前的问题:我创建了一个类来制作应该代表人的对象。

该类目前看起来像这样:

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 的东西,可以让你调用对象属性的信息:

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

现在,对于问题:

  1. 主要问题:我的循环东西工作正常,这意味着它创建了我想要创建的正确性别的对象数量。据我所知,我的问题是它创建了没有名称的对象。这意味着我不能调用 displaySettler(),因为它需要我调用 nameofobject.displaySettler()。我怎样才能使用某种循环函数来创建一堆对象,使这些对象具有名称。

我找到了一种将数字组合到字符串的方法,这可能允许我将一个创建对象名称的系统放入循环中,例如settler1、settler2、settler3,但我这样做的方式是执行类似的操作

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

那是我可以使用的东西吗?我知道用名称创建对象的唯一方法是编写类似

settler1=Settler("F")

或者

w=Settler("F")

是否可以使用变量 z 的内容来命名?

  1. 我还想问以下问题:正如您在我的课堂上看到的那样,我正在做一堆列表。我想我必须为每种性别的每个属性制作一个列表,其中包含所有对象的特定属性。我希望这些列表能够计算每个属性的总体平均值,诸如此类。

是否可以直接从对象中获取这些值,并直接遍历所有对象并从中计算平均值?

或者换一种说法:如果我有 200 个对象,有没有办法将所有对象的 IQ 加在一起?

感谢阅读(如果有人走到这一步)。所有建设性的反馈将不胜感激。

4

4 回答 4

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
于 2012-11-06T20:05:23.707 回答
1

两件事情:

1)最好有两个不同的类,男性和女性,它们都扩展了基类Settler。因此你避免了大部分的if sex = M then this else that东西

例子:

class Settler:
    def __init__(self, name):
        self.name = name
        self.iq = round(random.normalvariate(100,10))

class Male(Settler):
    def __str__(self):
        return '{0.name}, male, iq {0.iq}'.format(self)

class Female(Settler):
    def __str__(self):
        return '{0.name}, female, iq {0.iq}'.format(self)

请注意这两个类如何__str__以字符串形式“表示”自己。

2) 将所有关于对象列表的内容保留在对象定义之外。好的对象不知道它们外面发生了什么。例如,这是生成人员列表的方法:

def generate(klass, how_many):
    surnames = ['Doe', 'Smith', 'Mueller', 'Polly-Parrot']
    return [klass(random.choice(surnames)) for _ in range(how_many)]

people = generate(Male, 10) + generate(Female, 20)

[stuff for _ in range(N)]基本上意味着“做N次”。

最后,让我们把它们放在一起并打印一个人员列表:

for person in people:
    print(person)

输出将类似于:

母鹿,男性,智商 114.0
母鹿,男性,智商 110.0
波利鹦鹉,雄性,智商 89.0
史密斯,男,智商 96.0
波利鹦鹉,雄性,智商 83.0
穆勒,女,智商 118.0
穆勒,女性,智商 90.0
史密斯,女性,智商 90.0
史密斯,女,智商 103.0
穆勒,女,智商 89.0
史密斯,女,智商 87.0

如果您有更多问题,请告诉我们。

于 2012-11-06T20:32:23.370 回答
0

在回答您的第二个问题时,假设您有一个称为 Settler 的列表people(这是一个列表理解)...

iqs = [person.iq for person in people]
total_iq = sum(iqs)
于 2012-11-06T20:21:55.940 回答
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 的总和加在一起,您可以这样做(按照我之前的示例,假设 dict 中的条目是具有 iq 属性值的对象)

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

>>> print sum

这应该返回字典 group_of_vars 中所有对象的 iq 属性的总和。

于 2012-11-06T20:21:56.563 回答