irgit
Этот фрагмент кода лучше записывать как класс (class) или как функцию (def)?
Тут надо сделать подачу ссылки снаружи
irgit
Не могу понять, в чем принципиальная разница?
Функция - это алгоритм, принимающий что-то на вход и выдающий что-то на выход.
Объект - это несколько функций, объединённых в группу, которые работают над одним общим набором данных.
Класс - это шаблон для создания объектов.
Например, класс list описывает такие объекты, у которых есть внутреннее содержимое и методы append(), pop(), insert(), которые работают с этим внутренним содержимым.
>>> lst = []
>>> lst
[]
>>> lst.append(1)
>>> lst.append(2)
>>> lst.append(3)
>>> lst
[1, 2, 3]
>>> lst.pop()
3
>>> lst.pop()
2
>>> lst.pop()
1
>>> lst
[]
>>>
Таким образом при одном описании класса списка у двух разных объектов-списков, созданных по этому описанию, будет разное внутреннее содержимое. Методы одного списка работают только с его содержимым, а методы другого списка работают только с его содержимым. То есть класс один, а объектов с его помощью можно создавать много и они все будут индивидуальными.
Понятие исполнителя тебе нужно узнать. Это можно прочитать в книжке “Программирование для математиков” Кушниренко-Лебедев
Вот когда ты знаешь, что такое исполнитель, ты можешь создать дерево исполнителей, которые управляют друг другом.
В данном случае (примере со списком) исполнитель список добавляет исполнители числа в свою индивидуальную область данных.
Пример исполнителя TwoLists, который хранит внутри себя два исполнителя list и управляет ими таким образом, чтобы перемещать исполнители int из одного в другой.
>>> class TwoLists:
...
... def __init__(self):
... self.lst1 = [1, 2, 3]
... self.lst2 = [4, 5, 6]
...
... def move(self):
... self.lst2.append(self.lst1.pop())
...
... def show(self):
... return self.lst1, self.lst2
...
>>> two_lists = TwoLists()
>>>
>>> two_lists.show()
([1, 2, 3], [4, 5, 6])
>>>
>>> two_lists.move()
>>> two_lists.show()
([1, 2], [4, 5, 6, 3])
>>>
>>> two_lists.move()
>>> two_lists.show()
([1], [4, 5, 6, 3, 2])
>>>
Исполнитель TwoLists управляет двумя исполнителями list определённым образом, известным только ему. Снаружи, когда мы вызываем методы move() и show(), мы не знаем, что эти методы делают внутри. Также, когда мы используем объект TwoLists, мы не знаем, что внутри TwoLists хранятся исполнители list. В этом фишка исполнителей - они хранят в себе семантику, а наружу предоставляют только интерфейс для управления ими.
Исполнители можно делать разные, с любой семантикой и любыми интерфейсами. Список - хороший, наглядный пример исполнителя. Мы не знаем, как он устроен, но мы можем им пользоваться для выполнения задач. Мы можем поместить в него данные и убрать из него данные, при этом мы не знаем, как он их хранит внутри себя, мы не знаем, какими исполнителями он для этого пользуется внутри себя.
Дерево исполнителей может приводить к очень забубённому поведению, которое сразу так и не осмыслишь. Но при этом можно гарантировать, что всё выполнится ими точно до миллиметра.