Наши функции обращения обычно излишни по той же причине — язык Python предоставляет быстрые инструменты обращения, выполняющие преобразования непосредственно на месте и реализующие итеративный алгоритм, и вам, вероятно, правильнее будет использовать их, когда это возможно:
>>> L = [2, 4, 1, 3, 5]
>>> L.reverse()
>>> L
[5, 3, 1, 4, 2]
>>> L = [2, 4, 1, 3, 5]
>>> list(reversed(L))
[5, 3, 1, 4, 2]
Этот тезис специально несколько раз повторялся в данной главе, чтобы подчеркнуть ключевые моменты в работе Python: несмотря на большое количество исключений из правил, обычно лучше не изобретать колесо, если в этом нет явной необходимости. В конце концов, встроенные инструменты часто являются более удачным выбором.
Поймите правильно: иногда действительно бывают нужны объекты, которые добавляют новые возможности к встроенным типам или выполняют что-то более индивидуальное. Например, классы множеств, с которыми мы познакомились выше, вводят инструменты, не поддерживаемые сегодня в Python непосредственно; двоичные деревья могут поддерживать алгоритмы, обеспечивающие более высокую эффективность, чем словари и множества; а реализация стека на основе деревьев кортежей оказалась действительно более быстрой, чем основанная на встроенных списках, в стандартных схемах применения. Иногда также возникает потребность в реализации собственных графов и функций перестановки.
Кроме того, как мы уже видели, инкапсуляция в классах позволяет изменять и расширять внутреннее устройство объекта, не трогая остальной части системы. Несмотря на то, что для решения большинства тех же проблем можно создавать подклассы от встроенных типов, тем не менее, в конечном итоге получаются те же самые нестандартные структуры данных.
Однако поскольку в Python есть набор встроенных, гибких и оптимизированных типов данных, реализация собственных структур данных часто не настолько необходима, как в хуже оснащенных низкоуровневых языках программирования. Прежде чем начать писать новый тип данных, обязательно спросите себя, не будет ли встроенный тип или функция лучше согласовываться с идеями Python.
Дополнительные структуры данных вы также найдете в относительно новом модуле collections, входящем в стандартную библиотеку Python. Как упоминалось в предыдущей главе, этот модуль реализует именованные кортежи, упорядоченные словари и многое другое. Он описан в руководстве по стандартной библиотеке Python, но исходный программный код этого модуля, как и многих других модулей в стандартной библиотеке, может также служить источником дополнительных примеров.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011