如何优化我的简单代码(python)?

时间:2016-06-23 04:24:41

标签: python arrays random

我参加了一个介绍编程课程,并且正在处理一些几周没有的任务。这个要求我提取三个文本文件 - 名称,标题和描述 - 并使用它们随机生成"幻想角色"名。我的代码运行并按照我的要求运行,但我觉得它很混乱,可以清理一下。请记住,这是一个INTRO课程,在课堂上刚刚涵盖了基本的布尔逻辑,循环,数组等;不是课程,面向对象或任何高级的东西(我试图自己学习一些)。

import random
def main():
    for i in range(10):        
        # Load names, titles, descriptions into arrays
        names = loadFile('names.txt')
        title = loadFile('titles.txt')
        descriptor = loadFile('descriptors.txt')
        # Generate random number based on list length
        nameListLength = len(names)
        titleListLength = len(title)
        descListLength = len(descriptor)
        firstNameIndex = random.randrange(nameListLength)
        lastNameIndex = random.randrange(nameListLength)
        randTitleIndex = random.randrange(titleListLength)
        randDescriptor = random.randrange(descListLength)
        # Choose random list entry
        firstName = names[firstNameIndex]
        lastName = names[lastNameIndex]
        title2 = title[randTitleIndex]
        description = descriptor[randDescriptor]
        nameList = [title2, firstName, lastName, description]
        dumpFile(nameList)
        print(title2, firstName, lastName, 'the', description)
    print()
    print('These names have been written to \"CharacterNames.txt\".')

def dumpFile(nameList):
    title = str(nameList[0])
    firstName = str(nameList[1])
    lastName = str(nameList[2])
    descriptor = str(nameList[3])
    outfile = open('CharacterNames.txt', 'a')
    outfile.write(title + ' ' + firstName + ' ' + lastName + ' ' +
                  'the' + ' ' + descriptor + '\n')
    outfile.write('\n')
    outfile.close()

def loadFile(nameFile):   
    nameList = open(nameFile, 'r')
    nameArray = []
    for line in nameList:       
        name = line
        name = name.rstrip('\n')
        nameArray.append(name)
    nameList.close()
    return nameArray   

main()

2 个答案:

答案 0 :(得分:0)

在'之前移动文件操作。循环 - 无需重新读取文件10次。这应该使应用程序运行得更快。

答案 1 :(得分:0)

我看到让其他人查看你的代码并重写它的价值。我有点忽略了你对#34;任何先进的东西的限制,"虽然我不认为任何一个对你来说太复杂了。这是我的重写:

import random

def generatePerson(names=loadFile('names.txt'),
                   titles=loadFile('titles.txt'),
                   descriptons=loadFile('descriptors.txt')):
    firstName = random.choice(names)
    lastName = random.choice(names)
    title = random.choice(titles)
    description = random.choice(descriptons)
    return '{} {} {} the {}'.format(title, firstName, lastName, description)

def main():
    people = [generatePerson() for _ in range(10)]
    dumpFile('\n\n'.join(people))
    print('\n'.join(people))
    print('\nThese names have been written to "CharacterNames.txt".')

def dumpFile(data, filename='CharacterNames.txt'):
    with open(filename, 'a') as outfile:
        outfile.write(data)

def loadFile(nameFile):
    with open(nameFile, 'r') as nameList:
        return nameList.read().splitlines()

if  __name__ == '__main__':
    main()

它在许多方面仍然类似于您的代码,但是,大部分内容已被重写。现在详细了解一些更激烈的变化。

  1. 我将与三个列表中的随机字符串相关的代码移动到了自己的函数generatePerson中。这使得在将来生成随机人或其他东西的方法发生变化时更容易维护。
  2. 我大大简化了使用random.choice选择随机字符串的逻辑。
  3. 我使用了generatePerson中使用默认参数的技巧,以避免每次创建随机名称时从三个文件中读取。你现在应该知道的这个技巧的唯一部分是默认参数的值只在Python中创建一次。
  4. 我没有将列表传递给dumpFile,而是选择传递一个字符串,然后我可以立即写入该文件。这更有意义,因为我generatePerson返回该人的格式化字符串而不是[title, firstName, lastName, description]
  5. 这主要是我的偏好,但我并不喜欢for循环,所以在main我使用列表推导来创建一个包含10个随机名称的列表。在那里,我使用str.join创建了一个包含所有十个名称的字符串,这些名称适合传递给dumpFileprint
  6. 我相信这是(几乎)我所做的所有改变。如果我遗漏了某些内容,或者您​​需要进一步澄清我提到的任何内容,请对我的答案发表评论或仅ask a new question