Практические задания
Contents
Практические задания#
Векторы#
Реализуйте класс Vector3D
, который будет поддерживать все линейные операции: сложение, вычитание, умножение на число, а также скалярное *
и векторное произведение @
.
Алгебра функций#
Доработайте пример из подраздела Вызов объекта. __call__ следующим образом.
Реализуйте класс Function
, который должен инкапсулировать в себе функцию одного аргумента и сам быть вызываемым, а кроме этого
поддерживать действие арифметических операций на функции. Считать, что, например, \((f + g)(x) = f(x) + g(x)\), \((-f)(x)=-f(x)\) и т.п.
h = f + g # h(x) = f(x) + g(x)
поддерживать композицию как прямым вызовом класса
Composition
, так и с помощью какого-нибудь свободного оператора (например,<<
, чтобы подчеркнуть порядок вызова функций).
h = f << g # h(x) = f(g(x))
Конструктор класса
Composition
должен принимать произвольное количество функций на вход:
f = Composition(f1, f2, f3, f4) # f(x) = f1(f2(f3(f4(x))))
*Предусмотрите следующее увеличение производительности последующих вызовов объекта. Если в композиции подряд встречаются взаимообратные функции (например,
Composition(math.log, math.exp)
), то или уберите их, или замените их на тождественную функцию.
Composition(abs, math.log, math.exp, math.sin)
# то же самое, что и
Composition(abs, math.sin)
Продумайте иерархию классов: количество и роль классов, в каком отношении они должны находится.
from collections.abc import Callable
class Function(Callable):
pass
Односвязный список#
Реализуйте структуру данных связанный список в виде типа данных LinkedList
, узлы которого должны содержать в себе данные и ссылку на следующий элемент. Кроме этого должна быть возможность
итерироваться по
LinkedList
в цикле,добавлять элементы в конец списка,
удалять первый элемент списка с заданным значением в данных.
from collections.abc import Iterable
class LinkedList(Iterable):
def __iter__(self):
pass
def append(self, value):
pass
def delete_first(self, value):
pass
*реализуйте индексацию списка.