lambda x: x**2 # анонимная функция
(i for i in range(10)) # генератор
Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M, не включая. В качестве иллюстрации можно посмотреть пример работы с последовательностями. При этом индекс можно не указывать. Например, запись s[:M] означает, что в срез попадают все элементы с самого начала; запись s[N:] означает, что попадают все элементы до конца среза; запись s[:] означает, что попадают все элементы с начала и до конца.
Имена[править | править код]
Имя (идентификатор) может начинаться с буквы любого алфавита в Юникоде любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение[81].
В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.
Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.
Строки документации[править | править код]
Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring (англ.). Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[82](переменная __doc__), что используется современными IDE (Интегрированная среда разработки) (например, Eclipse).
В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest (англ.) для автоматического тестирования модуля.
Парадигмы программирования[править | править код]
Python — мультипарадигмальный язык программирования. Полностью поддерживаются объектно-ориентированное, структурное[83], обобщённое, функциональное программирование[25] и метапрограммирование[29]. Базовая поддержка аспектно-ориентированного программирования реализуется за счёт метапрограммирования[32]. Множество других методик, в том числе контрактное[84][85] и логическое программирование[86] можно реализовать с помощью расширений.
Объектно-ориентированное программирование[править | править код]
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Python является хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками. В языке всё является объектами — либо экземплярами классов, либо экземплярами метаклассов. Исключением является базовый встроенный метакласс type. Таким образом, классы на самом деле являются экземплярами метаклассов, а производные метаклассы являются экземплярами метакласса type. Метаклассы являются частью концепции метапрограммирования и предоставляют возможность управления наследованием классов, что позволяет создавать абстрактные классы, регистрировать классы или добавлять в них какой-либо программный интерфейс в рамках библиотеки или фреймворка[29].
Классы по своей сути представляют план или описание того, как создать объект, и хранят в себе описание атрибутов объекта и методов для работы с ним. Парадигма ООП основывается на инкапсуляции, наследовании и полиморфизме[87]. Инкапсуляция в Python представлена возможностью хранения публичных и скрытых атрибутов (полей) в объекте с предоставлением методов для работы с ними[87], при этом на самом деле все атрибуты являются публичными, но для пометки скрытых атрибутов существует соглашение об именовании[88]. Наследование позволяет создавать производные объекты без необходимости повторного написания кода, а полиморфизм заключается в возможности переопределения любых методов объекта (в Python все методы являются виртуальными[88]), а также в перегрузке методов и операторов. Перегрузка методов в Python реализуется за счёт возможности вызова одного и того же метода с разным набором аргументов[87]. Особенностью Python является возможность модифицировать классы после их объявления, добавляя в них новые атрибуты и методы[43], также можно модифицировать и сами объекты, в результате чего классы могут использоваться как структуры для хранения произвольных данных[88].
В Python поддерживается множественное наследование. Само по себе множественное наследование является сложным, и его реализации сталкиваются с проблемами разрешения коллизий имён между родительскими классами и с возможным повторным наследованием от одного и того же класса в иерархии. В Python методы вызываются согласно порядку разрешения методов (MRO), который основан на алгоритме C3-линеаризации[89], в обычных случаях при написании программ не требуется знать принцип работы данного алгоритма, понимание же может потребоваться при создании нетривиальных иерархий классов[90].
Возможности и особенности, специфичные для Python:
Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы.
Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
Свойства (имитация поля с помощью функций).
Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …).
Полная интроспекция.
Классовые и статические методы, классовые поля.
Классы, вложенные в функции и классы.
Возможность модифицировать объекты во время исполнения программы.
Обобщённое программирование[править | править код]
Языки с поддержкой динамической типизации и объектно-ориентированного программирования обычно не рассматриваются в рамках обобщённого программирования, поскольку задачи обобщённого программирования решаются за счёт отсутствия ограничений на типы данных[30][31]. В Python обобщённое программирование со строгой типизацией достигается использованием средств языка совместно со внешними анализаторами кода[91], такими как Mypy[92].
Функциональное программирование[править | править код]
Несмотря на то, что Python изначально не задумывался как язык функционального программирования[93], Python поддерживает программирование в стиле функционального программирования, в частности[94]:
функция является объектом первого класса,
функции высших порядков,
рекурсия,
фокус на работу со списками,
аналог замыканий,
частичное применение функции с помощью метода partial(),
возможность реализации других средств на самом языке (например, карринг).
Однако, в отличие от большинства языков, непосредственно ориентированных на функциональное программирование, Python не является чистым языком программирования и код не защищён от побочных эффектов[94][95].
В стандартной библиотеке Python существуют специальные пакеты operator и functools для функционального программирования[93].
Do'stlaringiz bilan baham: |