Пайтон

Пайтон
Python
Класс языка:

функциональный, объектно-ориентированный, императивный, аспектно-ориентированный

Тип исполнения:

интерпретация байт-кода, компиляция в MSIL, компиляция в байт-код Java

Появился в:

1990 г.

Автор(ы):

Гвидо ван Россум

Последняя версия:

3.0.1, 2.6.2

Тестовая версия:

3.1 Release Candidate 1

Типизация данных:

строгая, динамическая

Основные реализации:

CPython, IronPython, PyPy, Stackless

Испытал влияние:

Lisp, C, Icon

Повлиял на:

Boo, ECMAScript

Логотип Python, 1990—2005

Python ([ˈpaɪθən]; па́йсон, па́йтон, пито́н) — высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Питона минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.

Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).

Эталонной реализацией Питона является интерпретатор CPython, поддерживающий большинство активно используемых платформ.[1] Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.[2] Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Питона на самом Питоне, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.

Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI,

Содержание

Философия

Разработчики языка Python придерживаются определённой философии программирования, называемой «Дзэном Питона»[3], и её текст выдаётся интерпретатором Питона по команде import this (работает один раз). Автором этой философии считается Тим Пейтерс.

Вольный перевод текста философии:

  • Красивое лучше уродливого.
  • Явное лучше неявного.
  • Простое лучше сложного.
  • Сложное лучше усложнённого.
  • Плоское лучше вложенного.
  • Разрежённое лучше плотного.
  • Удобочитаемость важна.
  • Частные случаи не настолько существенны, чтобы нарушать правила.
  • Однако практичность важнее чистоты.
  • Ошибки никогда не должны замалчиваться.
  • За исключением замалчивания, которое задано явно.
  • В случае неоднозначности сопротивляйтесь искушению угадать.
  • Должен существовать один — и, желательно, только один — очевидный способ сделать это.
  • Хотя он может быть с первого взгляда не очевиден, если ты не голландец.
  • Сейчас лучше, чем никогда.
  • Однако, никогда чаще лучше, чем прямо сейчас.
  • Если реализацию сложно объяснить — это плохая идея.
  • Если реализацию легко объяснить — это может быть хорошая идея.
  • Пространства имён — великолепная идея, их должно быть много!


История

Разработка языка Python была начата в конце 1980-х годов[4] сотрудником голландского института CWI Гвидо ван Россумом. Для распределённой ОС 1991 года Гвидо опубликовал исходный текст в ньюсгруппе alt.sources[5]. С самого начала Python проектировался как объектно-ориентированный язык.

.py

Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Воздушный цирк Монти Пайтона». Впрочем, всё равно название языка чаще ассоциируют именно со змеёй, нежели с фильмом — пиктограммы файлов в Microsoft Windows и даже эмблема на сайте python.org изображает змеиные головы.

Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Python.[6]

3 декабря 2008 года[7], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Питона. На сегодня поддерживаются обе ветви развития (Python 3.0 и 2.x).

Влияние других языков на Python

Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования:

  • ABC — отступы для группировки операторов, высокоуровневые структуры данных (map)[8][9] (фактически, Python создавался как попытка исправить ошибки, допущенные при проектировании ABC);
  • Modula-3 — пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp);
  • Си, C++ — некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум — он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у C программистов к Python[8]);
  • Lisp — отдельные черты функционального программирования (lambda, map, reduce, filter и другие);
  • Fortran — срезы массивов, комплексная арифметика;
  • Miranda — Списочные выражения;
  • Icon —

    Портируемость

    Python портируем и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, все варианты FreeBSD и GNU/Linux), Plan 9, Mac OS и Mac OS X, Palm OS, OS/2, OS/390, Symbian и [10].

    По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME.[11] Однако на этих платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).

    При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft COM/DCOM). Более того, существует специальная версия Питона для виртуальной машины Java — Microsoft .NET, основные из которых —

    Типы и структуры данных

    Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Питоне имеются встроенные типы: булевые, строки, Unicode-строки, целые числа произвольной точности, числа с плавающей запятой, комплексные числа и некоторые другие. Из коллекций Python поддерживает кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии 2.4, множества. Все значения в Питоне являются объектами, в том числе функции, методы, модули, классы.

    Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.

    Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long, complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты — изменяемыми. Кортеж в Питоне является, по сути, неизменяемым списком.

    Синтаксис и семантика

    Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Питоне программ легко читаем. См. также: en:Python syntax and semantics.

    Операторы

    Набор операторов достаточно традиционен. Вот некоторые из них:

    • условный оператор if (если). Альтернативный блок после else (иначе). Если условий и альтернатив несколько, можно использовать elif (сокр. от else if).
    • оператор цикла while (пока).
    • оператор цикла for (для). Внутри цикла возможно применение break и continue для прерывания цикла и перехода сразу к следующей итерации соответственно.
    • оператор определения класса class.
    • оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат), а в случае генератора — yield (давать).
    • оператор обработки исключений try — except — else или try — finally (Начиная с версии 2.5 можно использовать finally, except и else в одном блоке).
    • оператор pass ничего не делает. Используется для пустых блоков кода.

    Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Питоне отсутствуют операторные скобки begin/end как в языке Паскаль или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторые критики языка считают такое поведение неинтуитивным и неудобным.

    Выражения

    Выражение является полноправным оператором в Питоне. Состав, синтаксис, ассоциативность и приоритет операций достаточно привычны для языков программирования и призваны минимизировать употребление скобок.

    Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с printf() из Си), которая использует тот же символ, что и взятие остатка от деления:

    >>> print ("Здравствуй, %s!" % "Мир")
    Здравствуй, Мир!
    

    Python имеет удобные цепочечные сравнения. Такие условия в программах — не редкость:

    1 <= a < 10 and 1 <= b < 20
    

    Кроме того, логические операции (or и and) являются ленивыми: если для вычисления истинностного значения достаточно первого операнда, этот операнд и является результатом (в противном случае вычисляется второй операнд). Этот факт широко использовался до версии 2.5 вместо условной конструкции:

    (a < b) and "меньше" or "больше"
    

    Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):

    "строка" + 'строка'  """тоже строка"""  u"Юникод-строка"
    True or False            # булевы литералы
    3.14                     # число с плавающей запятой
    012 + 0xA                # числа в восьмеричной и шестнадцатеричной системах счисления
    1 + 2j                   # целое число и мнимое число
    [1, 2, "a"]              # список
    (1, 2, "a")              # кортеж
    {'a': 1, 'b': 'B'}       # словарь
    lambda x: x**2           # неименованная функция
    

    Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M исключительно. В качестве иллюстрации можно посмотреть этот пример.

    Имена

    Имя (идентификатор) может начинаться с латинской буквы любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print keyword.kwlist) и нежелательно переопределять встроенные имена. Имена, начинающиеся на подчёркивание, имеют специальное значение.

    В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.

    Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.

    Строки документации

    Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring (англ.). Строки документации остаются в коде на момент времени исполнения и в язык встроен доступ к документации[12], что используется современными doctest (англ.) для автоматического тестирования модуля.

    Директивы

    Начиная с Python 2.3, для использования в тексте программы символов, не входящих в ASCII, необходимо явно указывать кодировку исходного кода в начале модуля, например:

    # -*- coding: utf-8 -*-
    

    После этого можно, например, использовать кириллицу в Unicode-литералах.

    Возможности

    Интерактивный режим

    Подобно Лиспу и Прологу в режиме отладки, интерпретатор Питона имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран. Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.

    Так выглядит общение с Питоном в интерактивном режиме:

    >>> 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.[13]

    Объектно-ориентированное программирование

    Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Питоне является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.

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

    1. Классы являются одновременно объектами со всеми ниже приведёнными возможностями
    2. Наследование, в том числе множественное.
    3. Полиморфизм (все функции виртуальные).
    4. Инкапсуляция (два уровня — общедоступные и скрытые методы и поля).
    5. Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
    6. Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
    7. Свойства (имитация поля с помощью функций).
    8. Управление доступа к полям (эмуляция полей и методов, частичный доступ, и т. п.).
    9. Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)
    10. Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
    11. Полная интроспекция.
    12. Классовые и статические методы, классовые поля.
    13. Классы, вложенные в функции и классы.

    Функциональное программирование

    Python поддерживает парадигму функционального программирования, в частности:

    • функция является объектом
    • функции высших порядков
    • рекурсия
    • развитая обработка списков (списковые выражения, операции над последовательностями, итераторы)
    • аналог замыканий
    • частичное применение функции
    • возможность реализации других средств на самом языке (например, карринг)

    Модули и пакеты

    Программное обеспечение (приложение или библиотека) на Питоне оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в папках так и в ZIP архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Питоне, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().

    Интроспекция

    Основная статья: Интроспекция в Питоне

    Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.

    Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках Питона, таких как: PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.

    Обработка исключений

    Обработка исключений поддерживается в Python посредством операторов try, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:

    try:
        #здесь код, который может вызвать исключение
        raise ExceptionType("message")
    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 — «Ошибки никогда не должны умалчиваться») и являются одним из средств поддержки «утиной типизации».

    Иногда вместо явной обработки исключений удобнее использовать блок

    Итераторы

    В программах на Питоне широко используются итераторы. Цикл for может работать как с последовательностью, так и с итератором. Все коллекции, как правило, предоставляют итератор. Объекты определённого пользователем класса тоже могут быть итераторами. Подробнее об итераторах можно узнать в разделе о функциональном программировании. Модуль itertools стандартной библиотеки содержит много полезных функций для работы с итераторами.

    Генераторы

    Одной из интересных возможностей языка являются генераторы — функции, сохраняющие внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: сопрограммы). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений. См. пример: генератор чисел Фибоначчи.

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

    Управление контекстом выполнения

    В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib. См.: пример.

    Оператор может применяться в тех случаях, когда до и после некоторых действий должны обязательно выполняться некоторые другие действия, независимо от возбуждённых в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода вывода закончено и т. п. Оператор улучшает читаемость кода, а значит, помогает предотвращать ошибки.

    Декораторы

    Начиная с версии 2.4 Python позволяет использовать т. н. декораторы[14] (не следует путать с одноимённым шаблоном проектирования) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). После долгих дебатов для декораторов стал использоваться символ @ в строках, предшествующих определению функции или метода. Следующий пример содержит описание статического метода без применения декоратора:

    def myWonderfulMethod():
        return "Некоторый метод"
    myWonderfulMethod = staticmethod(myWonderfulMethod)
    

    и с помощью декоратора:

    @staticmethod
    def myWonderfulMethod():
        return "Некоторый метод"
    

    Декоратор является ничем иным, как функцией, получающей в качестве первого аргумента декорируемую функцию или метод. Декораторы можно считать элементом аспектно-ориентированного программирования.

    С версии 2.6 декораторы можно использовать с классами, аналогично функциям.

    Другие возможности

    В 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 "<stdin>", line 1, in <module>
    AttributeError: 'X' object has no attribute 'wrongMethod'
    >>> X.wrongMethod = lambda self : 'im here' # добавим его
    >>> y.wrongMethod() # так как доступ к методу приводит к поиску по __dict__ класса,
    'im here' # то wrongMethod становится доступным всем экземплярам
    

    Библиотеки

    Стандартная библиотека

    Python поставляется «с батарейками в комплекте».

    Богатая стандартная библиотека является одной из привлекательных сторон Питона. Здесь имеются средства для работы со многими сетевыми протоколами и форматами Интернета, например, модули для написания серверов и клиентов, для разбора и создания почтовых сообщений, для работы с операционной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др.

    Модули расширения и программные интерфейсы

    Помимо стандартной библиотеки существует множество библиотек, предоставляющих интерфейс ко всем системным вызовам на разных платформах; в частности, на платформе Win32 поддерживаются все вызовы Win32 API, а также COM в объёме не меньшем, чем у Visual Basic или веб, базы данных, обработка изображений, обработка текста, численные методы, приложения операционной системы и т. д.).

    Для Python принята спецификация программного интерфейса к базам данным DB-API 2 и разработаны соответствующие этой спецификации пакеты для доступа к различным СУБД: Oracle, Firebird (Interbase), Microsoft SQL Server, sqlite. На платформе Microsoft Windows доступ к БД возможен через ADOdb). Коммерческий пакет mxODBC для доступа к СУБД через UNIX разработан eGenix.[15] Для Питона написано много ORM: SQLObject, SQLAlchemy, Dejavu,

    Библиотека NumPy[16] для работы с многомерными массивами позволяет достичь производительности научных расчётов, сравнимой со специализированными пакетами. BLAS, level 1-3 и БПФ). Numarray[17] специально разработан для операций с большими объёмами научных данных.

    На стадии разработки[18] находится

    Python предоставляет простой и удобный программный интерфейс C API для написания собственных модулей на языках Си и Си++. Такой инструмент как SWIG, pyste[19], SIP[20], pyfort[21]), до предоставления более удобных API (boost::python[22], CXX[23] и др.). Инструмент стандартной библиотеки ctypes позволяет программам Питона напрямую обращаться к динамическим библиотекам/[24], weave[25]).

    Другой подход состоит во встраивании интерпретатора Python в приложения. Python легко встраивается в программы на Java, C/C++, Ocaml. Взаимодействие Python-приложений с другими системами возможно также с помощью XML-RPC, COM.

    С помощью Pyrex[26] возможна компиляция Python-подобного (добавлена возможность типизации) языка кода в эквивалентный С код и связывание с внешними модулями.

    Экспериментальный проект shed skin[27][28] предполагает создание компилятора для трансформации неявно типизированных Python программ в оптимизированный С++ код. Начиная с версии 0.22 shed skin позволяет компилировать отдельные функции в модули расширений. Полная компиляция (по состоянию на 1 июля 2007 года) далека от завершения.

    Python и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Python в коммерческих разработках и не налагает никаких обязательств кроме указания авторских прав.

    Графические библиотеки

    С Питоном поставляется библиотека Tcl/графическим интерфейсом.

    Существуют расширения, позволяющие использовать все основные GUI библиотеки — wxPython[29], основанное на библиотеке PyGTK для Gtk, Qt и другие. Некоторые из них, например, PyQt, также предоставляют широкие возможности по работе с базами данных, графикой и сетями, используя все возможности библиотеки, на которой основаны.

    Для создания игр и приложений, требующих нестандартного интерфейса, можно использовать библиотеку Pygame. Она также предоставляет обширные средства работы с мультимедиа: с её помощью можно управлять звуком и изображениями, воспроизводить видео. Предоставляемое pygame аппаратное ускорение графики [30], копирующей семантику С-библиотеки для OpenGL. Есть также PyOgre[31], обеспечивающая привязку к Ogre — высокоуровневой объектно-ориентированной библиотеке 3D-графики. Кроме того, существует библиотека pythonOCC[32] обеспечивающая привязку к среде 3D-моделирования и симуляции OpenCascade[33].

    Примеры программ

    В статье «Примеры программ на языке Python» собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.

    Профилирование и оптимизация кода

    В стандартной библиотеке Python имеется профайлер (модуль profile), который можно использовать для сбора статистики о времени работы отдельных функций. Для решения вопроса о том, какой вариант кода работает быстрее, можно использовать модуль timeit. Производимые в следующей программе измерения позволяют выяснить, какой из вариантов конкатенации строк более эффективен:

    from timeit import Timer
    def case1():  # А. инкрементальные конкатенации в цикле
        s = ""
        for i in range(10000):
            s += str(i)
     
    def case2():  # Б. через промежуточный список и метод join
        s = []
        for i in range(10000):
            s.append(str(i))
        s = "".join(s)
     
    def case3():  # В. списковое выражение и метод join
        return "".join([str(i) for i in range(10000)])
     
    def case4():  # Г. генераторное выражение и метод join
        return "".join(str(i) for i in range(10000))
     
    for v in range(1,5):
        print (Timer("func()","from __main__ import case%s as func" % v).timeit(200))
    

    Как и в любом языке программирования, в Питоне имеются свои приемы оптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.

    Здесь есть несколько очевидных правил:

    • Не нужно оптимизировать программу, если скорость её выполнения достаточна.
    • Используемый алгоритм имеет определённую временную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.
    • Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Питоне есть встроенная функция sort().
    • Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них.

    Python имеет следующие особенности и связанные с ними правила оптимизации:

    • Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.
    • Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным, или чем доступ к полям.
    • Оптимизатор psyco может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Питон.
    • В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать критические участки, скажем, на языке Си или Pyrex.

    Инструмент под названием Pychecker[34] поможет проанализировать исходный код на Питоне и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[35] призван решать близкие задачи но имеет уклон в сторону проверки стиля кода.

    Сравнение с другими языками

    Наиболее часто Python сравнивают с Ruby. Эти языки также являются интерпретируемыми и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Python может успешно применяться для написания скриптов (сценариев). Как и Ruby, Python является хорошо продуманной системой для ООП.

    Средства функционального программирования частично позаимствованы из Icon.

    В среде коммерческих приложений скорость выполнения программ на Python часто сравнивают с [36]

    Несмотря на то, что Python обладает достаточно самобытным синтаксисом, одним из принципов дизайна этого языка является принцип наименьшего удивления.

    Недостатки

    См. также списки недостатков языка Python.[37]

    Низкое быстродействие

    Питон, как и многие другие интерпретируемые языки, не применяющие, например, JIT-компиляторов, имеют один общий недостаток — сравнительно невысокую скорость выполнения программ.[38] Однако, в случае с Python этот недостаток компенсируется уменьшением времени разработки программы[38]. В среднем программа написанная на Питоне в 2—4 раза меньше чем её Си++ или байт-кода (файлы .pyc и .pyo) позволяет интерпретатору не тратить лишнее время на перекомпиляцию кода модулей при каждом запуске, в отличие, например, от языка

    Нужно отметить, что уже существуют проекты реализаций языка Питон, вводящие высокопроизводительные виртуальные машины в качестве компилятора заднего плана. Примерами таких реализаций может служить PyPy, базирующийся на LLVM; более ранней инициативой является проект

    Множество программ/библиотек для интеграции с другими языками программирования (см. выше) предоставляют возможность использовать другой язык для написания критических участков.

    В самой популярной реализации языка Python интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях Forth, LISP или КПК и некоторых моделях мобильных телефонов.

    Отсутствие статической типизации

    Отсутствие статической типизации является не столько недостатком интерпретатора, сколько выбором дизайнера языка. Дело в том, что в Python принята так называемая «Утиная типизация». В силу этого типы передаваемых значений недоступны на этапе компиляции, и ошибки вроде AttributeError могут возникать во время исполнения. Отсутствие статической типизации также является одной из основных причин низкого быстродействия.

    Существуют модули, которые позволяют контролировать типы параметров функций на этапе исполнения, например typecheck[39] или method signature checking decorators[40]. Добавление необязательной статической типизации параметров функции запланированно для Python3000.[41][42] При этом, однако, непосредственно интерпретатор не будет проверять типы, а только добавлять соответствующую информацию к метаданным функции для её (информации) последующего использования модулями расширений.

    Отсутствие статической типизации и некоторые другие причины не позволяют реализовать в Python механизм перегрузки функций на этапе компиляции. Возможности Python позволяют реализовать динамическую перегрузку на этапе исполнения, что, конечно, замедляет вызов, так как разрешение производится при каждом обращении и является, в общем случае, довольно сложной процедурой. Отсутствие перегрузки в Python стараются компенсировать использованием виртуальных функций.

     len = lambda x : x.__len__()  # это только пример
    

    Реализации и описание[43][44], пример реализации простой перегрузки также есть в примерах программ на Python.

    Планы по поддержке перегрузки в Python3000.[41][45] Перегрузка функций реализована различными сторонними библиотеками, в том числе PEAK[46][47] предоставляет чрезвычайно богатый возможностями механизм перегрузки функций с использованием произвольных правил.

    Невозможность модификации встроенных классов

    По сравнению с int, str, float, list и другие, что, однако, позволяет Python потреблять меньше оперативной памяти и быстрее работать. Ещё одной причиной введения такого ограничения является необходимость согласования с модулями расширения. Многие модули (в целях оптимизации быстродействия) преобразуют Python-объекты элементарных типов к соответствующим C типам вместо манипуляций с ними посредством C API.

    Глобальная блокировка интерпретатора (GIL)

    GIL (Global Interpreter Lock) — проблема, присущая CPython, Stackless и PyPy, но отсутствующая в IronPython. При своей работе основной интерпретатор Python постоянно использует большое количество потоково-небезопасных данных. В основном это словари, в которых хранятся атрибуты объектов. Для избежания разрушения этих данных при совместной модификации из разных потоков перед началом исполнения нескольких инструкций (по умолчанию 100) поток интерпретатора захватывает GIL, а по окончанию освобождает. Вследствие этой особенности в каждый момент времени может исполняться только один поток Python кода, даже если в компьютере имеется несколько процессоров или процессорных ядер (GIL также освобождается на время выполнения блокирующих операций, таких как ввод-вывод, изменения/проверка состояния синхронизирующих примитивов и других — таким образом, если один поток блокируется, другие могут исполняться). Была предпринята попытка перехода к более гранулированным синхронизациям, однако из-за частых захватов/освобождений блокировок эта реализация оказалась слишком медленной.[48] В ближайшем будущем переход от GIL к другим техникам не предполагается, однако есть python-safethread[49] — CPython без GIL и с некоторыми другими изменениями (по утверждениям его авторов на однопоточных приложениях скорость соответствует 60-65 % от скорости оригинального CPython).

    Эта проблема имеет два основных варианта решения. Первый — отказ от совместного использования изменяемых данных. При этом данные дублируются в потоках и необходимость обеспечения их синхронизации (если таковая нужна) лежит на программисте.[50] Этот подход ведёт к увеличению потребления оперативной памяти (однако не настолько сильно, как при использовании процессов).

    Второй подход — обеспечение более гранулированной синхронизации — для отдельных структур данных. В этом случае падает производительность вследствие увеличения числа освобождений/захватов блокировок.

    Если необходимо параллельное исполнение нескольких потоков Python кода, то можно воспользоваться процессами, например, модулем processing[51], который имитирует семантику стандартного модуля threading, но использует процессы вместо потоков. Есть множество модулей, упрощающих написание параллельных и/или распределённых приложений на Python, таких как parallelpython[52], Pypar[53], pympi[54] и других. GIL освобождается при исполнении кода большинства расширений, например numpy/

    Реализации

    CPython является основной, но не единственной реализацией языка программирования Python. Существуют также следующие реализации:

    JVM в качестве среды исполнения. Позволяет прозрачно использовать [55]

    PyS60 — реализация Питона для (некоторых) смартфонов фирмы Nokia.

    Microsoft .NET и MSIL, таким образом предоставляя полную интеграцию с .NET системой.[56]

    Stackless[57] — также написанная на С реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии.

    Python for .NET[58] — ещё одна реализация Python для .NET. В отличии от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на C#. Позволяет использовать .NET сборки из Python кода.

    PyPy[59] — реализация Python, написанная на Python. Позволяет легко проверять новые возможности. В PyPy кроме стандартного CPython включены возможности Stackless (англ.), Psyco (англ.), модификация АСТ «на лету» и многое другое. В проект интегрированы возможности анализа Python кода и трансляция в другие языки и байтокоды виртуальных машин (C, LLVM, Javascript, .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция интерпретатора на C, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза медленнее чем CPython при отключённом

    python-safethread[49] — версия CPython без

    Unladen Swallow[60] - Начатый JIT-компилятора на базе LLVM

    tinypy[61] — минималистическая версия Python. Часть возможностей CPython не реализована.

    Дальнейшая разработка

    Python Enhancement Proposal («PEP») — это документ со стандартизированным дизайном, предоставляющий общую информацию о языке Python, включая новые предложения, описания и разъяснения возможностей языка. PEP предлагаются как основной источник для предложения новых возможностей и для разъяснения выбора того или иного дизайна для всех основных элементов языка. Выдающиеся PEP рецензируются и комментируются BDFL.

    График и совместимость

    Серии Python 2.x и Python 3.x в течение нескольких выпусков будут существовать параллельно, при этом серия 2.x будет использоваться для совместимости и скорее всего в неё будут включены некоторые возможности серии 3.x. PEP 3000 содержит больше информации о планируемых выпусках.

    Python 3.0 обратно не совместим с предыдущей серией 2.x. Код Python 2.x скорее всего будет выдавать ошибки при исполнении в Python 3.0. Динамическая типизация Python вместе с планами изменения нескольких методов словарей делает механический перевод из Python 2.x в Python 3.0 очень сложным. Однако, утилита «2to3» уже способна сделать большинство работы по переводу кода, указывая на подозрительные ей части с помощью комментариев и предупреждений. PEP 3000 рекомендует держать исходный код для серии 2.x, и делать выпуски для Python 3.x с помощью «2to3». Полученный код не следует редактировать, пока программа должна быть работоспособной в Python 2.x.

    Возможности

    Основные изменения, внесённые в версии 3.0:[62][63]

    • Синтаксическая возможность для аннотации параметров и результата функций (например, для передачи информации о типе или документирования).
    • Полный переход на unicode для строк.
    • Введение нового типа «неизменяемые байты» и типа «изменяемый буфер». Оба необходимы для представления бинарных данных.
    • Новая подсистема ввода-вывода (модуль io), имеющая отдельные представления для бинарных и текстовых данных.
    • Абстрактные классы, абстрактные методы (доступно уже в 2.6).
    • Иерархия типов для чисел.
    • Выражения для словарей и множеств {k: v for k, v in a_dict} и {el1, el2, el3} (по аналогии со списковыми выражениями).
    • Изменения print из встроенного выражения во встроенную функцию. Это позволит модулям делать изменения, подстраиваясь под разное использование функции, а также упростит код. В Python 2.6 эта возможность активируется вводом from __future__ import print_function.
    • Перемещение reduce (но не map или filter) из встроенного пространства в модуль functools (использование reduce существенно менее читаемо по сравнению с циклом).
    • Удаление некоторых устаревших возможностей, поддерживаемых в ветке 2.x для совместимости, в частности: классы старого стиля, целочисленное деление с обрезанием результата как поведение по умолчанию, строковые исключения, неявный относительный импорт, оператор exec и т. п.
    • Реорганизация стандартной библиотеки.
    • Новый синтаксис для метаклассов.
    • Изменен синтаксис присваиваний. Стало возможным, например, присваивание (a, *rest, b) = range(5). С другой стороны, формальные параметры функций вроде def foo(a, (b, c)) более недопустимы.

    Специализированные подмножества/расширения Python

    На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них:

    RPython[64] — созданная в рамках проекта PyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. RPython код можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET[65], LLVM. На RPython написан интерпретатор PyPy.

    Pyrex[26] — ограниченная реализация Python, но несколько меньше, чем RPython. PyReX расширен возможностями статической типизации типами из языка С и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке С.

    Cython[66] — расширенная версия Pyrex.

    pyastra[67] — компилятор Python кода в ассемблер для PIC архитектуры.

    Проект shed-skin[28] — предназначен для компиляции неявно статически типизированного Python кода в оптимизированный код на языке С++, проект далёк от завершения.

    Применение

    Основная статья: Использование Python

    Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ.

    Python используется во многих крупных компаниях.[68]

    Примечания

    1. http://www.python.org/about/
    2. http://www.python.org/2.5/license.html
    3. http://www.python.org/peps/pep-0020.html
    4. http://www.artima.com/intv/pythonP.html
    5. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY
    6. http://www.python.org/dev/peps/
    7. http://python.org/download/releases/3.0/
    8. 1 2 http://www.python.org/doc/essays/foreword/
    9. http://www.artima.com/intv/python2.html
    10. Python on Android (англ.). www.damonkohler.com. Проверено 19 декабря 2009.
    11. Port-Specific Changes: Windows (англ.). Python v2.6.1 documentation. What’s New in Python 2.6. Python Software Foundation. Проверено 11 декабря 2008.
    12. …целостность больших проектов на Python строится на двух вещах: тесты и doc-строка
    13. http://ipython.scipy.org/
    14. PEP318
    15. http://egenix.com/
    16. http://numpy.scipy.org
    17. http://www.stsci.edu/resources/software_hardware/numarray
    18. PEP333
    19. http://www.boost.org/libs/python/pyste/index.html
    20. http://www.riverbankcomputing.co.uk/sip/
    21. http://pyfortran.sourceforge.net/
    22. http://www.boost.org/libs/python/doc/
    23. http://cxx.sourceforge.net/
    24. http://pyinline.sourceforge.net/
    25. http://www.scipy.org/Weave
    26. 1 2 http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
    27. http://sourceforge.net/projects/shedskin
    28. 1 2 http://shed-skin.blogspot.com/
    29. http://www.wxpython.org/
    30. http://pyopengl.sourceforge.net/
    31. http://www.ogre3d.org/wiki/index.php/PyOgre
    32. http://www.pythonocc.org/
    33. http://www.opencascade.org/
    34. http://pychecker.sourceforge.net/
    35. http://www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857
    36. Результаты одной из попыток сравнения
    37. http://zephyrfalcon.org/labs/python_pitfalls.html
    38. 1 2 Наиболее полное и достаточно объективное сравнение характеристик различных интерпретаторов и компиляторов, постоянно обновляется
    39. http://oakwinter.com/code/typecheck/
    40. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/426123
    41. 1 2 PEP-3107
    42. PEP-3100
    43. http://alpha.sec.ru/~aiv/python/overload/
    44. http://python.com.ua/doc/overload.html
    45. PEP-3124
    46. http://peak.telecommunity.com/DevCenter/FrontPage
    47. PEAK-Rules
    48. http://www.artima.com/weblogs/viewpost.jsp?thread=211200
    49. 1 2 http://code.google.com/p/python-safethread/
    50. http://perldoc.perl.org/perlthrtut.html
    51. http://pypi.python.org/pypi/processing
    52. http://www.parallelpython.com/
    53. http://datamining.anu.edu.au/~ole/pypar/
    54. http://pympi.sourceforge.net/
    55. http://www.jython.org/
    56. http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython
    57. http://www.stackless.com/
    58. http://pythonnet.sourceforge.net/
    59. http://codespeak.net/pypy
    60. http://code.google.com/p/unladen-swallow/
    61. http://www.tinypy.org/
    62. http://docs.python.org/dev/3.0/whatsnew/3.0.html
    63. http://docs.python.org/3.0/index.html
    64. http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python
    65. http://codespeak.net/pypy/dist/pypy/doc/carbonpython.html
    66. http://www.cython.org/
    67. http://pyastra.sourceforge.net
    68. http://www.python.org/about/success/usa

    См. также


Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР
Синонимы:

Полезное


Смотреть что такое "Пайтон" в других словарях:

  • пайтон — сущ., кол во синонимов: 1 • язык (247) Словарь синонимов ASIS. В.Н. Тришин. 2013 …   Словарь синонимов

  • пайтон арба — (Қ орда: Қарм., Сыр., Шиелі, Арал) адам мініп жүру үшін жасалған төрт дөңгелекті күймелі арба. Бұрынғы уақытта байлар көбіне п а йт о н а р б а м е н жүретін Қ орда., Қарм.) …   Қазақ тілінің аймақтық сөздігі

  • Монти Пайтон и Священный Грааль — Monty Python And The Holy Grail …   Википедия

  • Монти Пайтон — «Пайтоны» в 1969 году. Передний ряд: Терри Джонс, Джон Клиз, Майкл Пейлин. Задний ряд: Грэм Чепмен, Эрик Айдл, Терри Гиллиам. Монти Пайтон (англ …   Википедия

  • Чёрный Рыцарь (персонаж Монти Пайтон) — Значимость предмета статьи поставлена под сомнение. Пожалуйста, покажите в статье значимость её предмета, добавив в неё доказательства значимости по частным критериям значимости или, в случае если частные критерии значимости для… …   Википедия

  • Испанская инквизиция (Монти Пайтон) — «Испанская инквизиция»: слева направо  кардинал Бигглз (Терри Джонс), кардинал Хименес (Майкл Пейлин), кардинал Фэнг (Терри Гильям). «Испанская …   Википедия

  • Монти Пайтон и Святой Грааль — Монти Пайтон и Священный Грааль Monty Python And The Holy Grail Жанр комедия Режиссёр Терри Гиллиам Терри Джонс Продюсер …   Википедия

  • Монти Пайтон и Святой Грааль (фильм) — Монти Пайтон и Священный Грааль Monty Python And The Holy Grail Жанр комедия Режиссёр Терри Гиллиам Терри Джонс Продюсер …   Википедия

  • Монти Пайтон и Священный Грааль (фильм) — Монти Пайтон и Священный Грааль Monty Python And The Holy Grail Жанр комедия Режиссёр Терри Гиллиам Терри Джонс Продюсер …   Википедия

  • Монти Пайтон и святой Грааль (фильм) — Монти Пайтон и Священный Грааль Monty Python And The Holy Grail Жанр комедия Режиссёр Терри Гиллиам Терри Джонс Продюсер …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»