0

プログラムをより効率的にしたい、「for ループ」を使用することを考えていましたが、コードに実装する方法がわかりません。また、ファイルへの書き込み部分が非常に長いので、短くしたいです。

    import random

    def character_attributes():
        initial_value = 10
        character1_strength = initial_value + (random.randint(1,12) // random.randint(1,4))
        character1_skill = initial_value + (random.randint(1,12) // random.randint(1,4))
        character2_strength = initial_value + (random.randint(1,12) // random.randint(1,4))
        character2_skill = initial_value + (random.randint(1,12) // random.randint(1,4))

        print("Character 1 now has a strength attribute of {0}".format(character1_strength))
        print("Character 1 now has a skill attribute of {0}".format(character1_skill))
        print("Character 2 now has a strength attribute of {0}".format(character2_strength))
        print("Character 2 now has a skill attribute of {0}".format (character2_skill))

        myfile = open('character_attribute_data.txt', 'w')
        myfile.writelines('Character 1 has a strength attribute of : ')
        myfile.writelines(str(character1_strength))
        myfile.writelines('\n')
        myfile.writelines('Character 1 has a skill attribute of: ')
        myfile.writelines(str(character1_skill))
        myfile.writelines('\n')
        myfile.writelines('Character 2 has a strength attribute of : ')
        myfile.writelines(str(character2_strength))
        myfile.writelines('\n')
        myfile.writelines('Character 2 has a strength attribute of : ')
        myfile.writelines(str(character2_skill))
        myfile.close()
4

2 に答える 2

2

高速という意味では、これ以上の効率は得られないと思います。すべての文字列操作に Python 関数を使用しており、Python ではほとんど改善されません。

しかし、あなたのコードは開発速度に関してそれほど効率的ではありません。'Character' を 'Person' で変更したい場合、8 行のコードを変更する必要があるとします。たとえば、unutbu の回答は、はるかに優れた解決策のヒントを提供します。これは、moooeeeep で指摘されているように、文字のクラスを導入するなどして改善できます。これが純粋な装飾であると考えている場合でも、保守できない現在のコードとは対照的に、変更 (見つけた最適化など) を行うことができるため、長期的にはパフォーマンスを向上させるのに役立ちます。

もう 1 つのポイントは、このコードで実際にパフォーマンスの問題が発生するとは信じがたいということです。数行を単一のファイルに書き込むだけです。必要のないものを最適化しないように十分に注意してください (時期尚早の最適化)。パフォーマンスの問題が発生した場合にのみ、ボトルネックを分析し、最悪のものを改善しようとします。

編集: 申し訳ありませんが、私は質問に対する moooeeeep コメントを意味しました: これは、属性情報を保持するクラスを使用して unutbu から例を拡張するプロトタイプです:

import random

class Character(object):
    '''
    This class holds all the information concerning a character, it's attributes, 
    the character number, ...
    '''
    def __init__(self, character_number, initial_value):
        '''
        Initialize a new character object with character_number and initial_value
        '''
        self.strength = initial_value + (random.randint(1,12) // random.randint(1,4))
        self.skill = initial_value + (random.randint(1,12) // random.randint(1,4))
        self.character_number = character_number

    def get_attributes_dict(self):
        '''
        return a dictionary with the attributes names and their values for this character
        '''
        return {'strength': self.strength,
                'skill': self.skill
                }


def writeout_character_attributes(characters_list):
    '''
    this function writes a complete list of character into a file
    '''
    #The 'with' statement is used here, because it automatically closes the 
    #file at the end of this block, so you cannot forget it 
    with open('character_attribute_data.txt', 'w') as myfile:
        #iterate over the character in the list
        for character in characters_list:
            #get all the attributes for the current character
            attributes = character.get_attributes_dict()
            #iterate over the attributes names and values, 
            #defined in the character class
            for attribute_name, val in attributes.items():
                msg = "Character {i} now has a {attribute_name} attribute of {val}".format(
                    i= character.character_number, attribute_name=attribute_name, val=val)
                print(msg)
                myfile.write(msg+'\n')


def get_list_of_characters(initial_value):
    list_of_characters = []
    # we want two characters with numbers 1 and 2
    for i in range(1, 3):
        #create a new character
        character = Character(i, initial_value)
        #add this character to the list of characters
        list_of_characters.append(character)
    return list_of_characters

if __name__ == '__main__':
    list_of_characters =  get_list_of_characters(10)
    writeout_character_attributes(list_of_characters)

コード行が減ったわけではないかもしれませんが、たとえば、属性を追加したり、キャラクター クラスに複雑なロジックを追加したりする方がはるかに簡単です。

于 2013-07-07T21:48:27.777 に答える
0

これによりコードが効率化されるわけではありませんが、コードが短くなります。

import random

def random_val(initial_value):
    return  initial_value + (random.randint(1,12) // random.randint(1,4))

def character_attributes():
    initial_value = 10
    with open('character_attribute_data.txt', 'w') as myfile:
        for i in range(1, 3):
            attributes = {
                'strength': random_val(initial_value)
                'skill': random_val(initial_value)}
            for key, val in attributes.items():
                msg = "Character {i} now has a {key} attribute of {val}".format(
                    i=i, key=key, val=val)
                print(msg)
                myfile.write(msg+'\n')
于 2013-07-07T20:58:27.557 に答える