可以跳过斜体文字。
首先:请原谅我,如果我要求的是基本知识,也很容易找到答案,或任何类似的东西,可能会让我的帖子让任何人烦恼。我是编程新手,刚开始有一个不读考试的借口。 我正在尝试制作一个程序,它可以模仿从人类部落到人类更先进的部落的进化。我的目标是在未来的某个时间制作一个非常简单的文明游戏,专注于人而不是建筑和单位。从头开始,对目前的编程几乎一无所知,我知道这是一项我可能永远无法完成的任务。希望我会在途中学到一些东西。 因为我的知识是如此有限,我的问题将是笨拙和严重的。对不起,谢谢你的阅读。
目前的问题: 我创建了一个类,它可以创建代表人的对象。
此课程目前看起来像这样:
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)
现在,问题:
我找到了一种方法将一个数字组合成一个字符串,这可能允许我在循环中放入一个创建对象名称的系统,如settler1,settler2,settler3,但我这样做是为了做类似的事情。
x=settler
y=(some counter)
z=x+str(y)
这是我能用的东西吗?我知道使用名称创建对象的唯一方法是编写类似
的内容settler1=Settler("F")
或
w=Settler("F")
是否可以使用变量z的内容来命名?
是否可以直接从对象获取这些值,直接遍历所有对象并从中计算平均值?
或者换句话说:如果我有200个对象,是否有某种方法可以将所有对象的IQ添加到一起?
感谢阅读(如果有人这么做的话)。所有建设性的反馈将不胜感激。
答案 0 :(得分: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
答案 1 :(得分: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)
输出类似于:
Doe, male, iq 114.0 Doe, male, iq 110.0 Polly-Parrot, male, iq 89.0 Smith, male, iq 96.0 Polly-Parrot, male, iq 83.0 Mueller, female, iq 118.0 Mueller, female, iq 90.0 Smith, female, iq 90.0 Smith, female, iq 103.0 Mueller, female, iq 89.0 Smith, female, iq 87.0
如果您有更多问题,请告诉我们。
答案 2 :(得分:0)
回答你的第二个问题,让我们说你有一个名为people
的定居者名单(这是列表理解)......
iqs = [person.iq for person in people]
total_iq = sum(iqs)
答案 3 :(得分:0)
不确定这是否是最佳方式,但是:
您可以使用循环生成的名称将对象存储在dict中。
举个例子:
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
这应该返回dict group_of_vars中所有对象的iq属性的总和。