Файл: Задача по следующим критериям Сравнить получившиеся коды программ.docx
Добавлен: 05.12.2023
Просмотров: 178
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
6. Возможности
6.1. Интерактивный режим
Подобно Лиспу и Прологу в режиме отладки, интерпретатор Питона имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран. Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.
Так выглядит общение с Питоном в интерактивном режиме:
>>> 2 ** 100 # возведение 2 в степень 100
1267650600228229401496703205376L
>>> from math import * # импорт математических функций
>>> sin(pi * 0.5) # вычисление синуса от половины пи
1.0
>>> help(sorted) # помощь по функции sorted
Help on built-in function sorted in module __builtin__:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
В интерактивном режиме доступен отладчик pdb и система помощи (вызывается по help()). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.
Кроме встроенной, существуют и улучшенные интерактивные оболочки IPython[18] и bpython[19].
6.2. Объектно-ориентированное программирование
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.
Возможности и особенности:
-
Классы являются одновременно объектами со всеми ниже приведёнными возможностями. -
Наследование, в том числе множественное. -
Полиморфизм (все функции виртуальные). -
Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами. -
Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти. -
Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических). -
Свойства (имитация поля с помощью функций). -
Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.). -
Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …) -
Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.) -
Полная интроспекция. -
Классовые и статические методы, классовые поля. -
Классы, вложенные в функции и классы.
6.3. Функциональное программирование
Python поддерживает парадигму функционального программирования, в частности:
-
функция является объектом -
функции высших порядков -
рекурсия -
развитая обработка списков (списковые выражения, операции над последовательностями, итераторы) -
аналог замыканий -
частичное применение функции -
возможность реализации других средств на самом языке (например, карринг)
6.4. Модули и пакеты
Программное обеспечение (приложение или библиотека) на Питоне оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Питоне, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().
6.5. Интроспекция
Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.
6.6. Обработка исключений
Обработка исключений поддерживается в Python посредством операторов try, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:
try:
# Здесь код, который может вызвать исключение
raise Exception("message") # Exception, это один из стандартных типов исключения (всего лишь класс),
# может использоваться любой другой, в том числе свой
except (Тип исключения1, Тип исключения2, …), Переменная:
# Код в блоке выполняется, если тип исключения совпадает с одним из типов
# (Тип исключения1, Тип исключения2, …) или является наследником одного
# из этих типов.
# Полученное исключение доступно в необязательной Переменной.
except (Тип исключения3, Тип исключения4, …), Переменная:
# Количество блоков except не ограниченно
raise # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное
except:
# Будет выполнено при любом исключении, не обработанном типизированными блоками except
else:
# Код блока выполняется, если не было поймано исключений.
finally:
# Будет исполнено в любом случае, возможно после соответствующего
# блока except или else
Совместное использование else, except и finally стало возможно только начиная с Python 2.5. Информация о текущем исключении всегда доступна через sys.exc_info(). Кроме значения исключения, Python также сохраняет состояние стека вплоть до точки возбуждения исключения — так называемый traceback.
В отличие от компилируемых языков программирования, в Python использование исключения не приводит к значительным накладным расходам (а зачастую даже позволяет ускорить исполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «дзена Python» — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «утиной типизации».
Иногда вместо явной обработки исключений удобнее использовать блок with (доступен, начиная с Python 2.5).
6.7. Итераторы
В программах на Питоне широко используются итераторы. Цикл for может работать как с последовательностью, так и с итератором. Все коллекции, как правило, предоставляют итератор. Объекты определённого пользователем класса тоже могут быть итераторами. Подробнее об итераторах можно узнать в разделе о функциональном программировании. Модуль itertools стандартной библиотеки содержит много полезных функций для работы с итераторами.
6.8. Генераторы
Одной из интересных возможностей языка являются генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений. См. пример: генератор чисел Фибоначчи.
При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (посредством метода next(), неявно вызываемого в for цикле) генератор продолжает исполнение функции от предыдущей точки останова до следующего оператора yield или return.
В Python 2.4 появились
генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:
>>> sum(i for i in xrange(1, 100) if i % 2 != 0)
2500
В этом примере суммируются все нечётные числа от 1 до 99.
Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода send() и возбуждать в его контексте исключения с помощью метода throw().
6.9. Управление контекстом выполнения
В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib. См.: пример.
Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.
6.10. Декораторы
Начиная с версии 2.4, Python позволяет использовать т. н. декораторы[20] (не следует путать с одноимённым шаблоном проектирования) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). После долгих дебатов для декораторов стал использоваться символ @ в строках, предшествующих определению функции или метода. Следующий пример содержит описание статического метода без применения декоратора:
def myWonderfulMethod():
return "Некоторый метод"
myWonderfulMethod = staticmethod(myWonderfulMethod)
и с помощью декоратора:
@staticmethod
def myWonderfulMethod():
return "Некоторый метод"
Декоратор является ничем иным, как функцией, получающей в качестве первого аргумента декорируемую функцию или метод. Декораторы можно считать элементом аспектно-ориентированного программирования.
С версии 2.6 декораторы можно использовать с классами, аналогично функциям.
6.11. Другие возможности
В Python есть ещё несколько возможностей, отличающих его от многих других языков высокой гибкостью и динамичностью.
Например, класс является объектом, а в операторе определения класса можно использовать выражения в списке родительских классов.
def getClass():
return dict
class D(getClass()):
pass
d = D()
Можно модифицировать многие объекты во время исполнения, например классы:
>>> class X(object): pass
…
>>> y = X()
>>> y.wrongMethod() # такого метода пока нет
Traceback (most recent call last):
File "
AttributeError: 'X' object has no attribute 'wrongMethod'
>>> X.wrongMethod = lambda self : 'im here' # добавим его
>>> y.wrongMethod() # так как доступ к методу приводит к поиску по __dict__ класса,
'im here' # то wrongMethod становится доступным всем экземплярам