Реализуйте модуль для языка программирования Python для работы с массивами.
Предусмотрите следующие возможности модуля:
- создание динамических массивов для чисел разных типов(целые (
long
), числа с плавающей точкой (double
)); - создание пустого массива;
- создание массива, заполненного заранее заданными данными;
- реализуйте следующие функции для работы с массивом:
- добавление элемента в конец массива (
append
); - вставка элемента в нужную позицию (
insert
); - удаление первого вхождения элемента в массив (
remove
); - удаление первого вхождения элемента в массив с возвратом (
pop
); - инвертирование массива (
__reversed__
для поддержки функцииreversed
); - определение длины массива (поддержка функции
len
); - определение количества памяти, занимаемой массивом (
sys.getsizeof
,__sizeof__
); - сравнение со стандартным массивом из модуля array или списком (
__eq__
);
- добавление элемента в конец массива (
- возможность итерирования по массиву;
- алгоритм бинарного поиска, возвращающий индекс найденного элемента
или
None
если ничего не найдено
Не забудьте предусмотреть функцию изменения размера, которая будет работать "под капотом".
Для большей справки можно обратиться к
документации модуля
array
стандартной библиотеки Python.
Модуль dynamic_array
необходимо реализовать как Си расширение для
Python. Это можно выполнить с помощью Cython - специальной надстройки
для Python, позволяющей вызывать функции из Си напрямую, а также
обладающей приближенным к Python синтаксисом. Документацию по Cython
см. в полезных материалах. Также можно сразу реализовать этот модуль на
языке Си и подключить его к Python с помощью Cython.
Обратите внимание, что при реализации на Cython или Си обертка на Python
вокруг массива не нужна. Здесь dynamic_array
содержит обертку
только для тестов.
Метод инициализации класса Array
должен принимать два аргумента:
- код типа в виде строки,
'd'
для чисел с плавающей точкой и'i'
для целых чисел; - набор инициализирующих данных, которые сразу будут занесены в массив.
Интерфейс методов и функций должен быть аналогичен методам модуля
array
стандартной библиотеки Python.
Модуль binary_search
, содержащий реализацию бинарного поиска
разрешается реализовать на Python. Этот модуль должен поддерживать
работу с объектами из dynamic_array
.
search(array: Iterable, item: Any=False) -> Optional[int]:
В файлах dynamic_array.py
и binary_search.py
размещены упрощенные
шаблоны классов и функций. В Файлах test_dynamic_array.py
и
test_binary_search.py
размещены тесты для проверки решения. Тесты
можно запустить с помощью модуля unittest
или pylint
.
В файле my_array.pyx
приведен пример реализации расширения для Python
на Cython. Для компиляции этого модуля необходимо создать файл
setup.py
пример которого можно найти в текущей директории. Затем
достаточно выполнить команду:
python setup.py build_ext --inplace
По завершении выполнения компиляции и при отсутствии ошибок появятся файлы:
my_array.c
my_array.cp39-win_amd64.pyd
- а также директория
build
В файле my_array.cp39-win_amd64.pyd
будет содержаться скомпилированный
модуль, его можно использовать как обычный модуль Python. Для удобства
его можно переименовать в my_array.pyd
.
Для прохождения тестов вам понадобиться pytest
и плагин
pytest-timeout
. Установить их можно командами:
python -m pip install pytest
python -m pip install pytest-timeout
Также нужен файл conftest.py
расположите его рядом с тестами.
Подробнее об этом файле можно узнать в
документации.
Запустить тесты можно командой:
pytest test_dynamic_array.py -s
Пример входных данных для бинарного поиска:
Исходный список: [-3, 0, 2, 5, 5]
, 0
Результат: 1
Исходный список: [-3, 0, 2, 5, 5]
, 5
Результат: 3
Исходный список: [-3, 0, 2, 5, 5]
, 10
Результат: None
Оценка выставляется в соответствии со следующими требованиями:
- Общие требования:
- код работы проходит проверку утилитой
pylint
с конфигурационным файлом.pylintrc
. - код работы успешно проходит тесты, если таковые имеются.
- наличие документации к модулям, функциям, классам и методам.
- наличие аннотации типов.
- код работы проходит проверку утилитой
- На оценку 3 балла:
- реализовать методы
append
,insert
,remove
,__eq__
.
- реализовать методы
- На оценку 4 балла:
- дополнительно реализовать методы
pop
,reverse
.
- дополнительно реализовать методы
- На оценку 5 балла:
- реализовать все методы, указанные в описании к работе.