Файл: Задача по следующим критериям Сравнить получившиеся коды программ.docx

ВУЗ: Не указан

Категория: Решение задач

Дисциплина: Не указана

Добавлен: 05.12.2023

Просмотров: 182

Скачиваний: 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 построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.

Возможности и особенности:

  1. Классы являются одновременно объектами со всеми ниже приведёнными возможностями.

  2. Наследование, в том числе множественное.

  3. Полиморфизм (все функции виртуальные).

  4. Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.

  5. Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.

  6. Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).

  7. Свойства (имитация поля с помощью функций).

  8. Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).

  9. Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)

  10. Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)

  11. Полная интроспекция.

  12. Классовые и статические методы, классовые поля.

  13. Классы, вложенные в функции и классы.



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 "", line 1, in

AttributeError: 'X' object has no attribute 'wrongMethod'

>>> X.wrongMethod = lambda self : 'im here' # добавим его

>>> y.wrongMethod() # так как доступ к методу приводит к поиску по __dict__ класса,

'im here' # то wrongMethod становится доступным всем экземплярам