你在这个问题上做得很好。您清楚地说明了问题,最重要的是,您添加了足够的代码来运行代码,这样我们就可以了解程序的行为方式以及出了什么问题。在这种情况下,什么都不会出错,这很好:)
考虑到您提到这是一个学校项目,我不会为您提供完整的复制/粘贴解决方案,但希望能详细说明如何自行解决。
现在根据问题,您不知道如何对排行榜进行排序。我自己运行了几次程序(因为我不耐烦?删除了睡眠之后),看到你的排行榜文件看起来像这样:
90 - somename
38 - anothername
48 - yetanothername
要显示这个,你必须做两件事:
- 打开文件并读取数据
- 将文件中的数据转换为程序可用的数据
第一步似乎是您已经知道的,因为您已经使用open() 写入文件。阅读非常相似。
如果您是编程新手,下一步就不那么明显了。该文件被读取为文本数据,您需要按数字对其进行排序。对于计算机,text "10" 与 number 10 不同(注意引号)。您可以通过打开 Python shell 来尝试:
>>> 10 == 10
True
>>> 10 == "10"
False
>>> "10" == 10
False
文本与数字的排序方式不同。因此,您的解决方案之一是将文本转换为数字。
您还将以行的形式获取数据(使用readlines() 或splitlines(),具体取决于您的使用方式。这些行需要拆分为分数和名称。文件中的模式是这样的:
<score> - <name>
请务必注意,您将文本 " - " 作为两者之间的分隔符(包括空格)。查看 Python 函数 str.split() 和 str.partition()。这些函数可以应用于任何文本值:
>>> "hello.world".split(".")
['hello', 'world']
>>> "hello.world".partition(".")
('hello', '.', 'world')
您可以使用它来将线条“切割”成多段。
完成之后,你必须记住前面关于将文本转换为数字的要点。
作为最后一步,您需要对值进行排序。
从文件中读取时,可以将转换后的数据加载到 Python 列表中,然后进行排序。
一个方便的解决方案是创建一个列表,其中该列表的每个元素都是一个 元组,其中包含字段(score, name)。像这样,您可以直接对列表进行排序,而无需任何神秘的技巧。
最后,排序后,可以打印到屏幕上。
总结
- 打开文件
- 以“行”的形式从文件中读取数据
- 创建一个新的空列表。
- 遍历每一行并...
- ...将线分成多个部分,分别得到分数和名称
- ...将分数转换为数字
- ...从第 3 点将这两个值追加到新列表中
- 从第 3 点开始对列表进行排序
- 打印出列表。
一些一般的想法
您可以通过使用更多功能来改进和简化代码
您已经表明您知道如何使用函数。但是看看 cmets #THIS IS ROUND1 到 #THIS IS ROUND5。每一轮的代码行都是一样的。通过将这些行移到一个函数中,您将节省很多代码。这有两个好处:您只需要在一个地方进行代码更改(改进或修复)。其次,您保证所有块的行为都相同。
为此,您需要考虑块需要哪些变量(这些将是新的函数参数)以及结果将是什么(这将是函数返回值)。
一个简单的重复示例:
print("round 1")
outcomes = []
value1 = random(1, 100)
value2 = random(1, 100)
if value1 > value2:
outcomes.append("A")
else:
outcomes.append("B")
print("round 2")
outcome = ""
value1 = random(1, 100)
value2 = random(1, 100)
if value1 > value2:
outcomes.append("A")
else:
outcomes.append("B")
用函数重写
def run_round(round_name):
print(round_name)
value1 = random(1, 100)
value2 = random(1, 100)
if value1 > value2:
return "A"
else:
return "B"
outcomes = []
result_1 = run_round("round 1")
outcomes.append(result_1)
result_2 = run_round("round 2")
outcomes.append(result_2)
如您所见,第二个代码要短得多,并且没有更多重复。您的代码将有更多的函数参数。在编程中,以这样一种方式组织代码通常是一个挑战,即函数只有很少的参数并且没有复杂的返回值。虽然,只要它有效没有人会看得太仔细;)
询问密码的安全方式
您可以使用模块getpass() 中的getpass() 以安全的方式提示输入密码:
from getpass import getpass
password = getpass()
但是请注意,如果您使用的是 PyCharm,这会导致一些超出本文范围的问题。在这种情况下,请坚持使用input()。
睡觉
“sleep()”调用很好,让您有机会关注程序,但会使测试程序变慢。考虑使用较小的值(逗号值是可能的),或者更好的是,编写您自己的函数,您可以“短路”进行测试。像这样的:
import time
ENABLE_SLEEP = True
def sleep(s):
if ENABLE_SLEEP:
time.sleep(s)
print("some code")
sleep(1)
print("more code")
sleep(4)
然后,您可以随时使用自己的sleep() 函数等待。这样,您只需将变量 ENABLE_SLEEP 设置为 False,您的代码就会快速运行(用于测试)。