2013-07-07 2 views
0

Я хочу, чтобы программа была более эффективной, я думал использовать «цикл цикла», но я не знаю, как ее реализовать в моем коде, а также для записи в файл очень долго, я хочу сделать это корочеесть ли способ сделать эту программу более эффективной?

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() 
+0

кто-то мне помогите :) –

+0

Я бы предложил создать класс для ваших символов, включая функции-члены, которые возвращают отформатированные строки для печатного выхода атрибутов (возможно, более loading '__repr __()') и другой метод, который выгружает эту строку в файл, которая в конечном итоге использует оператор 'with' для этой задачи. Но в конце концов, это не связано ни с эффективностью, ни с Python 3.x. – moooeeeep

+0

извините, что я имел в виду по эффективности меньше строк кода –

ответ

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') 
+0

извините, я не понимаю, что часть кода неплохая Я всего лишь новичок –

2

Я не думаю, что вы можете получить гораздо более эффективным в смысле высокой скорости. Вы используете функции python для всех манипуляций с строками, и вы вряд ли будете лучше разбираться в python.

Но ваш код не так эффективен в отношении скорости разработки. Представьте, что вы хотите изменить «Персонаж» на «Личность», тогда вам нужно изменить 8 строк кода. Ответ unutbu, например, дает вам подсказку для гораздо лучшего решения, и даже это можно улучшить, например, путем введения класса для символов, как указано moooeeeep. Даже если вы сейчас думаете, что это чистая косметика, в долгосрочной перспективе это поможет вам повысить производительность, так как вы сможете вносить изменения (например, найденную вами оптимизацию) в отличие от текущего кода, который не поддерживается.

Другое дело, я с трудом верю, что вы действительно сталкиваетесь с проблемами производительности с этим кодом. Он ничего не делает, кроме как писать несколько строк в один файл. Будьте очень осторожны, чтобы не оптимизировать то, что вам не нужно (преждевременная оптимизация). Только если вы столкнетесь с проблемами производительности, проанализируйте узкие места и попытайтесь улучшить худшее.

EDIT: К сожалению, я имел в виду 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) 

Пришло, возможно, не меньше строк кода, но гораздо проще, например, добавить больше атрибутов или добавить логику komplex в класс символов

+0

Можете ли вы добавить соответствующую ссылку для moooeeeep и/или краткую прототип для класса, который вы что может помочь ОП? благодаря! –

+0

+1 для добавления полезной информации –

Смежные вопросы