1

斜体のテキストはスキップできます。

まず第一に、私が求めているのが基本的な知識であること、答えを見つけやすいこと、または私の投稿が誰かに迷惑をかける可能性のある同様のものであることを許してください. 私はプログラミングを始めたばかりで、試験のために読まない言い訳をするためにプログラミングを始めました。私は、人間の部族からより高度な人間の部族への進化を模倣できるプログラムを作成しようとしています。私の目標は、将来的には、建物やユニットではなく人に焦点を当てた、非常にシンプルな Civilization のようなゲームを作成することです。ゼロから始めて、現時点ではプログラミングについてほとんど何も知らないので、これはおそらく決して完了することのないタスクであることを知っています. うまくいけば、途中で何かを学ぶことができます。私の知識は非常に限られているため、私の質問はぎこちなく、うまく定式化されていません。すみません、読んでくれてありがとう。

現在の問題: 人を表すオブジェクトを作成するクラスを作成しました。

現時点では、クラスは次のようになります。

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. 主な質問: 私のループは正常に動作します。つまり、作成したい正しい性別のオブジェクトを多数作成します。私の問題は、私が知る限り、名前のないオブジェクトを作成することです。これは、nameofobject.displaySettler() を実行する必要があるため、displaySettler() 呼び出しを実行できないことを意味します。ある種のループ関数を使用して一連のオブジェクトを作成し、それらのオブジェクトに名前を付けるにはどうすればよいですか。

数値を文字列に結合する方法を見つけました。これにより、解決者 1、解決者 2、解決者 3 などのオブジェクト名を作成するシステムをループに入れることができますが、その方法は次のようなことです。

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

2つのこと:

1) 2 つの異なるクラス、Male と Female を用意することをお勧めします。どちらも base class を拡張し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)

出力は次のようになります。

ドウ、男性、Iq 114.0
ドウ、男性、Iq 110.0
ポリーオウム、男性、iq 89.0
スミス、男性、Iq 96.0
ポリーオウム、男性、iq 83.0
ミューラー、女性、Iq 118.0
ミューラー、女性、Iq 90.0
スミス、女性、Iq 90.0
スミス、女性、Iq 103.0
ミューラー、女性、Iq 89.0
スミス、女性、Iq 87.0

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-11-06T20:32:23.370 に答える
0

2 番目の質問への回答として、入植者のリストがあったとしましょうpeople(これはリスト内包表記です)...

iqs = [person.iq for person in people]
total_iq = sum(iqs)
于 2012-11-06T20:21:55.940 に答える
0

編集:Sr2222は私を打​​ち負かしました。私たちは同じ考えを使用していると思います。

これが最善の方法かどうかはわかりませんが、次のとおりです。

ループから生成された名前を使用して、オブジェクトを 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 プロパティの合計を返す必要があります。

于 2012-11-06T20:21:56.563 に答える