Разработчик Python
Чтобы принять участие в стажировке вам нужно заполнить анкету откликнувшись по ссылке https://forms.gle/e1fSe3ivDGouZ5177
Последняя часть вопросов в анкете отведена для ответов на задачи, которые описаны ниже на этой странице. Чаще всего в поле ответа нужно указать ссылку на gist с текстом ответа, либо ссылку на репозиторий, обращайте внимание на то, что нужно оставить в анкете в качестве результата. Если вместо требуемой ссылки вы приведете что-то другое, например текст ответа, ваш ответ с высокой вероятностью не будет засчитан.
Обязанности
- Разработка серверной части web-приложений (Python, Django, aiohttp, PostgreSQL, Celery).
- Разработка парсеров (Python, Scrapy, PostgreSQL, MongoDB).
- Обработка данных и аналитика (Python, Pandas, Numpy, Scipy, Jupyter).
Требования
- Базовые знания Python 3, знание PEP8.
- Теоретические знания Django, по крайней мере, на уровне прочтения Django Book.
- Готовность к изучению множества технологий разработки одновременно в свое личное время.
- Приветствуется владение чем-нибудь из перечисленного: JavaScript (также любые фреймворки), HTML, CSS (также lesscss, sass), Linux CLI, Docker, git, Vagrant, PyCharm (или другие IDE/редакторы).
- Приветствуется базовая грамотность в Computer Science, включая базы данных, сетевые технологии, технологические стеки построения веб-приложений, устройства операционных систем (в первую очередь семейства Linux). Ориентиры: https://yollection.ru/road/backend, https://yollection.ru/road/frontend.
- Режим работы удаленный с регулярными митингами онлайн, необходимо иметь возможность участия в онлайн-конференциях со звуком и видео.
Задание 1. Разработать функцию определения счета в игре
Задача
В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча.
Разработайте функцию get_score(game_stamps, offset), которая вернет счет на момент offset в списке game_stamps.
Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности.
from pprint import pprint
import random
import math
TIMESTAMPS_COUNT = 50000
PROBABILITY_SCORE_CHANGED = 0.0001
PROBABILITY_HOME_SCORE = 0.45
OFFSET_MAX_STEP = 3
INITIAL_STAMP = {
"offset": 0,
"score": {
"home": 0,
"away": 0
}
}
def generate_stamp(previous_value):
score_changed = random.random() > 1 - PROBABILITY_SCORE_CHANGED
home_score_change = 1 if score_changed and random.random() > 1 - \
PROBABILITY_HOME_SCORE else 0
away_score_change = 1 if score_changed and not home_score_change else 0
offset_change = math.floor(random.random() * OFFSET_MAX_STEP) + 1
return {
"offset": previous_value["offset"] + offset_change,
"score": {
"home": previous_value["score"]["home"] + home_score_change,
"away": previous_value["score"]["away"] + away_score_change
}
}
def generate_game():
stamps = [INITIAL_STAMP, ]
current_stamp = INITIAL_STAMP
for _ in range(TIMESTAMPS_COUNT):
current_stamp = generate_stamp(current_stamp)
stamps.append(current_stamp)
return stamps
game_stamps = generate_game()
pprint(game_stamps)
def get_score(game_stamps, offset):
'''
Takes list of game's stamps and time offset for which returns the scores for the home and away teams.
Please pay attention to that for some offsets the game_stamps list may not contain scores.
'''
# return home, away
Результат
- Ссылка на gist с исходным кодом функции.
Задание 2. Разработать тесты для функции определения счета в игре
Задача
Для разработанной в предыдущем задании функции get_score(game_stamps, offset) разработайте unit-тесты на фреймворке unittest.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.
Результат
- Ссылка на gist с исходным кодом тестов.
Задание 3. Разработать парсер смартфонов
Задача
Разработать парсер, который будет собирать информацию о версиях операционных систем в топ-100 смартфонах с самым высоким рейтингом пользователей в каталоге ozon.ru.
На сайте ozon.ru в категории “Электроника -> Телефоны и смарт-часы” с сортировкой “Высокий рейтинг” нужно собрать информацию о первых 100 смартфонах попавших в выборку. Перейти на страницу с каждым из них и забрать информацию о версии операционной системы из характеристик. По собранным данным построить распределение моделей по версиям операционных систем в порядке убывания, например:
Android 8 — 12
Android 10 — 9
iOS 14 — 8
…
Для парсинга следует использовать язык программирования Python, фреймворк Scrapy, для скачивания динамических частей сайта следует использовать Scrapy+Selenium. В выполнении задания может помочь scrapy proxy rotation middleware.
Для расчета распределения следует использовать фреймворк Pandas.
Результат
- Ссылка на gist с распределение моделей устройств по версиям операционных систем в plain-text формате.
- Ссылка на github-репозиторий с публичным доступом с исходными кодами решения.