我参加了一个介绍编程课程,并且正在处理一些几周没有的任务。这个要求我提取三个文本文件 - 名称,标题和描述 - 并使用它们随机生成"幻想角色"名。我的代码运行并按照我的要求运行,但我觉得它很混乱,可以清理一下。请记住,这是一个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()
答案 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()
它在许多方面仍然类似于您的代码,但是,大部分内容已被重写。现在详细了解一些更激烈的变化。
generatePerson
中。这使得在将来生成随机人或其他东西的方法发生变化时更容易维护。random.choice
选择随机字符串的逻辑。generatePerson
中使用默认参数的技巧,以避免每次创建随机名称时从三个文件中读取。你现在应该知道的这个技巧的唯一部分是默认参数的值只在Python中创建一次。dumpFile
,而是选择传递一个字符串,然后我可以立即写入该文件。这更有意义,因为我generatePerson
返回该人的格式化字符串而不是[title, firstName, lastName, description]
。main
我使用列表推导来创建一个包含10个随机名称的列表。在那里,我使用str.join
创建了一个包含所有十个名称的字符串,这些名称适合传递给dumpFile
和print
。我相信这是(几乎)我所做的所有改变。如果我遗漏了某些内容,或者您需要进一步澄清我提到的任何内容,请对我的答案发表评论或仅ask a new question。