Практические задания#

Векторы#

Реализуйте класс 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
  • *реализуйте индексацию списка.