Гайд Рейтинг результатов

  • 79
  • 4
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сегодня мы напишем приложение-пример, которое будет принимать от пользователя его имя и результат, после чего - форматировать и записывать в файл список из 10 лучших результатов. Это достаточно простое приложение, однако на его примере мы попрактикуемся в работе с файлами в Python, генерации списков, продвинутой работе со строками, расширенном использовании метода sort, обработке исключительных ситуаций.

Узнаем имя и результат пользователя:

Код:
Развернуть Свернуть Копировать
name = input('Your name: ')
score = input('Your score: ')

Тепер открываем файл с результатами, eсли файла не существует - создадим его и заполним демо-данными:

Код:
Развернуть Свернуть Копировать
try:
    scores = open("scores.txt")
except (OSError, IOError):
    scores = open('scores.txt', 'w')
    scores.write('1. AAA 1000\n2. CCC 700\n3. BBB 200')
    scores.close()
    scores = open("scores.txt")


Читаем содержимое файла и форматируем список content. В файле хранятся записи формата:
Позиция. Имя Результат

Посмотреть вложение 2126

Список content генерируется следующим образом:

Код:
Развернуть Свернуть Копировать
scores = open("scores.txt")
content = ['{} {}'.format(s.split()[1],
                          s.split()[2]) for s in scores.read().split('\n')]
scores.close()
Код:
Развернуть Свернуть Копировать
text = ''
for i, item in enumerate(content[:10], start=1):
    text += '{}. {}\n'.format(i, item)

На первой строке мы открываем файл scores.txt, на последней - закрываем. Самое интересное происходит посередине. Мы читаем содержимое файла и создаем список из строк формата 'Имя Результат'. Далее мы добавляем в этот список строку содержащую введенные нами имя и результат.

Код:
Развернуть Свернуть Копировать
content.append('{} {}'.format(name, score))


После этого, наша задача отсортировать весь список на основе результата. Для этого воспользуемся встроенной функцией sort.

Код:
Развернуть Свернуть Копировать
content.sort(key=get_key, reverse=True)

reverse=True означает, что список будет форматироваться от большего к меньшему. В Python функция sort позволяется нам работать очень гибко, одним из параметров, которые она принимает, является ключевой аргумент key, которым мы можем задать функцию на основе которой будет производится сортировка. Давайте напишем такую функцию (обратите внимание, что функция должна быть определена до строки content.sort...):

Код:
Развернуть Свернуть Копировать
def get_key(item):
    return int(item.split()[1])

Код:
Развернуть Свернуть Копировать
Готово! Список отсортирован. Теперь нужно перезаписать файл scores.txt, заполнив его десятью лучшими результатами. Для начала создадим переменную text:

Код:
Развернуть Свернуть Копировать
text = '\n'.join(['{}. {}'.format(i, item) for i, item in enumerate(content[:10], start=1)])

Эта запись может напугать новичка, но по сути это более корректный вариант создания строки из списка. Мы могли бы заменить ее записью:


Код:
Развернуть Свернуть Копировать
text = ''
for i, item in enumerate(content[:10], start=1):
    text += '{}. {}\n'.format(i, item)



Однако такой вариант это по сути лишняя трата процессорного времени и лишние строки в коде.

Напечтаем то, что у нас получилось, чтобы получить хоть какую-то визуализацию, и запишем переменную в файл:

Код:
Развернуть Свернуть Копировать
print(text)
scores = open("scores.txt", 'w')
scores.write(text)
scores.close()

Все работает, как и ожидалось!
Посмотреть вложение 2127


Получаем вот такую картину
Посмотреть вложение 2129
 
Назад
Сверху Снизу