Тестовые задания по Python
Здесь собраны реальные тестовые задания, которые дают соискателям на стажировках и junior-позициях. Эти задания помогут лучше подготовиться к отбору, потренироваться и пополнить портфолио
KosyanMedia • Лёгкая сложность
Тестовое задание по Python от компании KosyanMedia
Тестовое задание в команду гейтов (Python) В папке два XML – это ответы на запросы, сделанные к API партнёра via.com. [RS_Via-3.xml](/backend/Python/KosyanMedia/RS_Via-3.xml) [RS_ViaOW.xml](/backend/Python/KosyanMedia/RS_ViaOW.xml) Необходимо их распарсить и вывести списком отличия между результатами двух запросов по маршрутам (тег Flights). * Какие рейсы входят в маршрут * Время начала и время конца маршрута * Цена маршрута * Что изменилось по условиям? * Добавился ли новый маршрут? Язык реализации — python3 Используемые библиотеки и инструменты — всё на твой выбор. Оценивать будем умение выполнять задачу имея неполные данные о ней, умение самостоятельно принимать решения и качество кода.
AppBooster • Высокая сложность
Тестовое задание по Python от компании AppBooster
Тестовое задание: backend Мы создаём мобильные приложения и иногда для тестирования гипотез приходится запускать AB-тесты. Для этого нам нужна система, представляющая собой простейшее REST API, состоящее из одного эндпойнта. API и распределение Мобильное приложение при запуске генерирует некоторый уникальный ID клиента (который сохраняется между сессиями) и запрашивает список экспериментов, добавляя HTTP-заголовок `Device-Token`. В ответ сервер отдаёт список экспериментов. Для каждого эксперимента клиент получает: * Ключ: имя эксперимента. В клиенте есть код, который будет изменять какое-то поведение в зависимости от значения этого ключа * Значение: строка, одна из возможных опций (см. ниже) Важно, чтобы девайс попадал в одну группу и всегда оставался в ней. Эксперименты 1. Цвет кнопки У нас есть гипотеза, что цвет кнопки «купить» влияет на конверсию в покупку * Ключ: `button_color` * Опции: * `#FF0000` → 33.3% * `#00FF00` → 33.3% * `#0000FF` → 33.3% Так после 600 запросов к API с различными `DeviceToken` каждый цвет должны получить по 200 девайсов 2. Стоимость покупки У нас есть гипотеза, что изменение стоимости покупки в приложении может повлять на нашу маржинальную прибыль. Но чтобы не терять деньги в случае неудачного эксперимента, 75% юзеров будут получать старую цену и только на малой части аудитории мы протестируем изменение: * Ключ `price` * Опции: * `10` → 75% * `20` → 10% * `50` → 5% * `5` → 10% Требования и ограничения 1. Если девайс однажды получил значение, то он всегда будет получать только его 1. Эксперимент проводится только для новых девайсов: если эксперимент создан после первого запроса от девайса, то девайс не должен ничего знать об этом эксперименте Задание 1. Спроектируйте, опишите и реализуйте API 2. Добавьте эксперименты (1) и (2) в приложение 3. Создайте страницу для статистики: простая таблица со списком экспериментов, общее количество девайсов, участвующих в эксперименте и их распределение между опциями Можно использовать любые тенхологии и библиотеки Плюсом будет: * Наличие тестов * Задеплоенная версия приложения * Скорость ответа от сервера <100ms
Python • Средняя сложность
Тестовое задание по Python от компании Python
Задание 1. Разработать функцию определения счета в игре Задача В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча. Разработайте функцию get_score(game_stamps, offset), которая вернет счет на момент offset в списке game_stamps. Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности. ```Python 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 ``` Результат 1. Ссылка на [gist](https://gist.github.com/) с исходным кодом функции. Задание 2. Разработать тесты для функции определения счета в игре Задача Для разработанной в предыдущем задании функции get_score(game_stamps, offset) разработайте unit-тесты на фреймворке [unittest](https://docs.python.org/3/library/unittest.html). Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки. Результат 1. Ссылка на [gist](https://gist.github.com/) с исходным кодом тестов. Задание 3. Разработать парсер смартфонов Задача Разработать парсер, который будет собирать информацию о версиях операционных систем в топ-100 смартфонах с самым высоким рейтингом пользователей в каталоге [ozon.ru](http://ozon.ru/). На сайте [ozon.ru](http://ozon.ru/) в категории “Электроника -> Телефоны и смарт-часы” с сортировкой “Высокий рейтинг” нужно собрать информацию о первых 100 смартфонах попавших в выборку. Перейти на страницу с каждым из них и забрать информацию о версии операционной системы из характеристик. По собранным данным построить распределение моделей по версиям операционных систем в порядке убывания, например: ```txt Android 8 — 12 Android 10 — 9 iOS 14 — 8 … ``` Для парсинга следует использовать язык программирования Python, фреймворк Scrapy, для скачивания динамических частей сайта следует использовать Scrapy+Selenium. В выполнении задания может помочь scrapy proxy rotation middleware. Для расчета распределения следует использовать фреймворк Pandas. Результат 1. Ссылка на [gist](https://gist.github.com/) с распределение моделей устройств по версиям операционных систем в plain-text формате. 2. Ссылка на [github-репозиторий](https://github.com/) с публичным доступом с исходными кодами решения.
OstrovokTech • Лёгкая сложность
Тестовое задание по Python от компании OstrovokTech
Тестовые задания для Python Задача 1: Что может быть проще SQL? Вам дана таблица в postgres, которая представляет из себя список сотрудников с их зарплатами и отделами. Необходимо написать запрос, который будет выбирать человека с максимальной зарплатой из каждого отдела. В качестве тестовых данных можете использовать [дамп таблицы](employee.sql), пример схемы: ``` postgres=# \d employee Table "public.employee" Column | Type | Modifiers ------------+-----------------------+----------- id | integer | not null name | character varying(30) | department | character varying(30) | salary | integer | Indexes: "employee_pkey" PRIMARY KEY, btree (id) ``` Если нам нужна информация о всех сотрудниках, имеющих максимальную зарплату в отделе(в случае, когда она одинаковая): ``` SELECT m.name, m.department, t.mx FROM (SELECT department, max(salary) as mx from employee GROUP BY department) t JOIN employee m on m.department = t.department and t.mx = m.salary; ``` Если достаточно информации о любом из сотрудников с максимальной зарплатой: ``` SELECT DISTINCT ON (department) department, name, salary from employee ORDER BY department, salary DESC; ``` Запустить запросы, посмотреть результ: ``` make sql ``` Задача 2: Smashing Wallpaper Downloader Есть прекрасный сайт Smashing Magazine, который каждый месяц выкладывает отличные обои для десктопа. Заходить каждый месяц и проверять, что там нового дело не благородное, поэтому давайте попробуем автоматизировать эту задачу. Требуется написать cli утилиту, которая будет качать все обои в требуемом разрешение за указанный месяц-год в текущую директорию пользователя. Вот [тут](https://www.smashingmagazine.com/tag/wallpapers/) находятся все обои, а [здесь](https://www.smashingmagazine.com/2017/04/desktop-wallpaper-calendars-may-2017/) находятся обои за май 2017. Условия: * Python 3.5+ * Любые сторонние библиотеки * PEP8 * Если останется время, то можете покрыть её тестами с помощью py.test (: Подготовить среду, установить зависимости(откроет консоль внутри контейнера) ``` make getwallpapers_env ``` Запустить скрипт загрузки обоев в консоли из предыдущей команды: ``` ./getwallpapers.py 022018 640x480 ``` Запустить тесты ``` make getwallpapers_test ``` Особенности: * Если обои доступны в вариантах с календарём и без, утилита скачает оба. * Не все обои доступны во всех разрешениях, если конкретных обоев запрошенного разрешения нет, утилита их пропустит.
без ограничений.
Чтобы получить полный доступ,
вам необходимо зарегистрироваться.