Форум сайта python.su
Друзья,
Занимаюсь по книге Доусона “Программируем на Python”. Запнулся на 7 главе, задание 3 (сохранение рекордов в текстовом файле). Не могу вывести таблицу рекордов пользователю. Подскажите пожалуйста, в чем может быть проблема.
Traceback (most recent call last):
_challenge.py“, line 126, in <module>
main()
_challenge.py”, line 90, in main
welcome(title)
_challenge.py“, line 62, in welcome
display_highscores()
_challenge.py”, line 74, in display_highscores
score, name = line
ValueError: too many values to unpack (expected 2)
Функции:
# добавляем запись в таблицу рекордов def add_highscore(name, score): highscore_file = open_file("highscore.txt", "a") entry = (score, name) highscore_file.writelines(str(entry)) highscore_file.close()
# выводим таблицу рекордов def display_highscores(): highscore_file = open_file("highscore.txt", "r") print("Таблица рекордов\n") print("Имя\tОчки") for line in highscore_file: score, name = line print(name, "\t", score) highscore_file.close()
Отредактировано seriy_volk (Янв. 13, 2015 17:49:42)
Офлайн
У тебя line это одна строка из файла, она присваивается переменной score, а переменной name ты ничего не присваиваешь, хотя указал, что будешь. Отсюда и ошибка.
Отредактировано alex925 (Янв. 13, 2015 18:08:45)
Офлайн
Почему тогда тут работает? (из примеров к книге)
scores = [] # display high-score table elif choice == "1": print("High Scores\n") print("NAME\tSCORE") for entry in scores: score, name = entry print(name, "\t", score)
Отредактировано seriy_volk (Янв. 13, 2015 18:14:06)
Офлайн
Потому что видимо scores хранит набор последовательностей (кортежи, спики), которые распаковываются и присваиваются 2 твоим переменным.
Вот пример:
а ссылается на последовательность (кортеж), если мы используем множественное присваивание, то он автоматически распаковывается и значения присваиваются переменным.
>>> a = ('1', '2', '3') >>> x, y, z = a >>> x '1' >>> y '2' >>> z '3'
Отредактировано alex925 (Янв. 13, 2015 18:28:57)
Офлайн
Ничего более умного, чем сделать без кортежей не придумал. Но так или иначе оно работает. Хотел еще опционально сортировку таблицы рекордов запилить, но она косячит. Может есть какие рекомендации?
def display_highscore(): highscore_file = open_file("highscore.txt", "r") print("Таблица рекордов\n") print("Очки\tИмя") highscore = highscore_file.read() print(highscore) highscore_file.close()
def add_highscore(name, score): highscore_file = open_file("highscore.txt", "a") entry = (score, "\t", name, "\n") highscore_file.writelines(entry) highscore_file.close()
def sort_highscore(): lines = [] # sort this highscores highscore_file = open_file("highscore.txt", "r") for line in highscore_file: lines.append(line) lines.sort(reverse=True) highscore_file.close() # write sorted highscores highscore_file = open_file("highscore.txt", "w") for line in lines: highscore_file.write(line) highscore_file.close()
Офлайн
seriy_volk
Покажи содержимое фала highscore
Офлайн
alex925
seriy_volkПокажи содержимое фала highscore
500 R 500 D 300 E 1100 Boom 100 T 100 D 0 D
Отредактировано seriy_volk (Янв. 13, 2015 21:39:09)
Офлайн
seriy_volkДа есть, не надо изобретать велосипеды, если чуть поменять функцию display_highscores, то все будет работать. Вот, держи:
Может есть какие рекомендации
def display_highscores(): highscore_file = open_file("highscore.txt", "r") print("Таблица рекордов\n") print("Имя\tОчки") for line in highscore_file.strip(): score, name = line.split(' ') print(name, "\t", score) highscore_file.close()
Офлайн