Python

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Python
Python logo and wordmark.svg
Парадигма: декілька парадигм: імперативна, функціональна, об'єктно-орієнтована
Розробник: Гвідо ван Россум
Останній реліз: 3.4.2 / 8 жовтня 2014; 74 дні тому[1]
2.7.8 / 31 травня 2014; 204 дні тому[2]
Діалекти: Python 3.4,
Python 2.7
Під впливом від: ABC, C, Haskell, Icon, Lisp, Modula-3, Perl, Smalltalk, Tcl
Вплинула на: Boo, Groovy, D
ОС: Багатоплатформова
Ліцензія: Python Software Foundation License
Звичайні розширення файлів: .py, .pyw, .pyc, .pyo, .pyd
Сторінка інтернет: www.python.org

Python (рекомендоване прочитання — «Па́йтон», запозичено назву[3] з британського шоу Монті Пайтон) — інтерпретована об'єктно-орієнтована мова програмування високого рівня з динамічною семантикою.[4] Розроблена в 1990 році Гвідо ван Россумом. Структури даних високого рівня разом із динамічною семантикою та динамічним зв'язуванням роблять її привабливою для швидкої розробки програм, а також як засіб поєднання існуючих компонентів. Python підтримує модулі та пакети модулів, що сприяє модульності та повторному використанню коду. Інтерпретатор Python та стандартні бібліотеки доступні як у скомпільованій так і у вихідній формі на всіх основних платформах. В мові програмування Python підтримується декілька парадигм програмування, зокрема: об'єктно-орієнтована, процедурна, функціональна та аспектно-орієнтована.

Зміст

Переваги[ред.ред. код]

Серед основних її переваг можна назвати такі:

  • чистий синтаксис (для виділення блоків слід використовувати відступи);
  • переносимість програм (що властиве більшості інтерпретованих мов);
  • стандартний дистрибутив має велику кількість корисних модулів (включно з модулем для розробки графічного інтерфейсу);
  • можливість використання Python в діалоговому режимі (дуже корисне для експериментування та розв'язання простих задач);
  • стандартний дистрибутив має просте, але разом із тим досить потужне середовище розробки, яке зветься IDLE і яке написане на мові Python;
  • зручний для розв'язання математичних проблем (має засоби роботи з комплексними числами, може оперувати з цілими числами довільної величини, у діалоговому режимі може використовуватися як потужний калькулятор).

Python має ефективні структури даних високого рівня та простий, але ефективний підхід до об'єктно-орієнтованого програмування. Елегантний синтаксис Python, динамічна обробка типів, а також те, що це інтерпретована мова, роблять її ідеальною для написання скриптів та швидкої розробки прикладних програм у багатьох галузях на більшості платформ.

Інтерпретатор мови Python і багата стандартна бібліотека (як вихідні тексти, так і бінарні дистрибутиви для всіх основних операційних систем) можуть бути отримані з сайту Python www.python.org, і можуть вільно розповсюджуватися. Цей самий сайт має дистрибутиви та посилання на численні модулі, програми, утиліти та додаткову документацію.

Інтерпретатор мови Python може бути розширений функціями та типами даних, розробленими на C чи C++ (або на іншій мові, яку можна викликати із C). Python також зручна як мова розширення для прикладних програм, що потребують подальшого налагодження.

Історія[ред.ред. код]

Гвідо ван Россум, автор Python

Розробка мови Python була розпочата в кінці 1980-х років[5] співробітником голландського інституту CWI Гвідо ван Россумом. Для розподіленої ОС Amoeba потрібна була розширювана скриптова мова, і Гвідо почав писати Python на дозвіллі, запозичивши деякі напрацювання для мови ABC (Гвідо брав участь у розробці цієї мови, орієнтованої на навчання програмуванню). У лютому 1991 року Гвідо опублікував вихідний текст в групі новин alt.sources[6]. Мова почала вільно поширюватися через Інтернет, і сподобалася іншим програмістам. З 1991 року Python є цілком об'єктно-орієнтованим. Python також запозичив багато рис таких мов, як C, C++, Modula-3 і Icon, й окремі риси функціонального програмування з Ліспу.

.py

Назва мови виникла зовсім не від виду плазунів. Автор назвав мову на честь популярного британського комедійного серіалу 70-х років «Повітряний цирк Монті Пайтона». Втім, все одно назву мови частіше асоціюють саме зі змією, ніж з фільмом — піктограми файлів в KDE або в Windows, і навіть емблема на сайті python.org зображують зміїну голову.

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

3 грудня 2008 року[8], після тривалого тестування, вийшла перша версія Python 3000 (або Python 3.0, також використовується скорочена Py3k). У Python 3000 усунено багато недоліків архітектури з максимально можливим (але не повним) збереженням сумісності зі старими версіями. На сьогодні підтримуються обидві гілки розвитку (Python 3.2 і 2.7).

Філософія[ред.ред. код]

Розробники мови Python є прихильниками певної філософії програмування, яку називають «The Zen of Python» («Дзен Пайтона»)[9]. Її текст можна отримати у інтерпретаторі Python за допомогою команди import this (лише один раз за сесію). Автором цієї філософії вважається Тім Пейтерс.

Текст філософії:

  • Гарне краще, ніж потворне.
  • Явне краще, ніж неявне.
  • Просте краще, ніж складне.
  • Складне краще, ніж заплутане.
  • Плоске краще, ніж вкладене.
  • Розріджене краще, ніж щільне.
  • Легкість читання має значення.
  • Особливі випадки не настільки особливі, аби порушувати правила.
  • При цьому практичність важливіше бездоганності.
  • Помилки ніколи не повинні замовчуватися.
  • Якщо не замовчуються явно.
  • Зустрівши двозначність, відкинь спокусу вгадати.
  • Має існувати один — і, бажано, тільки один — очевидний спосіб зробити це.
  • Хоча спочатку він може бути і не очевидним, якщо ви не голландець[10].
  • Зараз краще, ніж ніколи.
  • Хоча ніколи, як правило, краще, ніж прямо зараз.
  • Якщо реалізацію важко пояснити — ідея погана.
  • Якщо реалізацію легко пояснити — ідея, можливо, хороша.
  • Простори імен — чудова річ! Будемо робити їх побільше!
Оригінальний текст (англ.)
  • Beautiful is better than ugly.
  • Explicit is better than implicit.
  • Simple is better than complex.
  • Complex is better than complicated.
  • Flat is better than nested.
  • Sparse is better than dense.
  • Readability counts.
  • Special cases aren’t special enough to break the rules.
  • Although practicality beats purity.
  • Errors should never pass silently.
  • Unless explicitly silenced.
  • In the face of ambiguity, refuse the temptation to guess.
  • There should be one — and preferably only one — obvious way to do it.
  • Although that way may not be obvious at first unless you’re Dutch.
  • Now is better than never.
  • Although never is often better than 'right now'.
  • If the implementation is hard to explain, it’s a bad idea.
  • If the implementation is easy to explain, it may be a good idea.
  • Namespaces are one honking great idea — let’s do more of those!

Вплив інших мов на Python[ред.ред. код]

З'явившись порівняно пізно, Python створювався під впливом багатьох мов програмування:

  • ABC — поле для угруповання операторів, високорівневі структури даних (map)[11][12] (фактично, Python створювався як спроба виправити помилки, допущені при проектуванні ABC);
  • Modula-3 — пакети, модулі, використання else спільно з try та except, іменовані аргументи функцій (на це також вплинув Common Lisp);
  • С, C++ — деякі синтаксичні конструкції (як пише сам Гвідо ван Россум — він використовував найбільш несуперечливі конструкції з С, щоб не викликати неприязнь у Сі-програмістів до Python[11]);
  • Smalltalk — об'єктно-орієнтоване програмування;
  • Lisp — окремі риси функціонального програмування (lambda, map, reduce, filter та інші);
  • Fortran — зрізи масивів, комплексна арифметика;
  • Miranda — спискові вирази;
  • Java — модулі logging, unittest, threading (частина можливостей оригінальному модуля не реалізована), xml.sax стандартної бібліотеки, спільне використання finally та except при обробці виключень, використання @ для декораторів;
  • Icon — генератори.

Більша частина інших можливостей Python (наприклад, байт-компіляція вихідного коду) також була реалізована раніше в інших мовах.

Портованість[ред.ред. код]

Python портований і працює майже на всіх відомих платформах — від КПК до мейнфреймів. Існують порти під Microsoft Windows, всі варіанти UNIX (включаючи FreeBSD та GNU/Linux), Plan 9, Mac OS та Mac OS X, iPhone OS 2.0 і вище, Palm OS, OS/2, Amiga, AS/400 та навіть OS/390, Symbian та Android[13].

У міру старіння платформи її підтримка в основній гілці мови припиняється. Наприклад, з серії 2.6 припинена підтримка Windows 95, Windows 98 та Windows ME.[14] Однак на цих платформах можна використовувати попередні версії Python — тепер спільнота активно підтримує версії Python починаючи від 2.3 (для них виходять виправлення).

При цьому, на відміну від багатьох портованих систем, для всіх основних платформ Python має підтримку характерних для даної платформи технологій (наприклад, Microsoft COM/DCOM). Більше того, існує спеціальна версія Python для віртуальної машини Java — Jython, що дозволяє інтерпретатору виконуватися на будь-якій системі, яка підтримує Java, при цьому класи Java можуть безпосередньо використовуватися з Python й навіть бути написаними на ньому. Також кілька проектів забезпечують інтеграцію з платформою Microsoft.NET, основні з яких — IronPython та Python.Net.

Типи й структури даних[ред.ред. код]

Python підтримує динамічну типізацію, тобто, тип змінної визначається лише під час виконання. З базових типів слід зазначити підтримку цілих чисел довільної довжини і комплексних чисел. Python має багату бібліотеку для роботи з рядками, зокрема, кодованими в юнікоді.

З колекцій Python підтримує кортежі (tuples), списки (масиви), словники (асоціативні масиви) і від версії 2.4, множини.

Система класів підтримує множинне успадкування і метапрограмування. Будь-який тип, включаючи базові, входить до системи класів, й за необхідності можливе успадкування навіть від базових типів.

Можливості[ред.ред. код]

Інтерактивний режим[ред.ред. код]

Подібно Ліспу та Прологу в режимі відлагодження, інтерпретатор Python має інтерактивний режим роботи, при якому введені з клавіатури оператори відразу ж виконуються, а результат виводиться на екран. Цей режим цікавий не тільки новачкам, але й досвідченим програмістам, які можуть протестувати в інтерактивному режимі будь-яку ділянку коду, перш ніж використовувати його в основній програмі, або просто використовувати як калькулятор з великим набором функцій.

Так виглядає спілкування з Python в інтерактивному режимі:

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

Об'єктно-орієнтоване програмування[ред.ред. код]

Дизайн мови Python побудований навколо об'єктно-орієнтованої моделі програмування. Реалізація ООП в Python є елегантною, потужною та добре продуманою, але разом з тим, достатньо специфічною в порівнянні з іншими об'єктно-орієнтованими мовами.

Можливості та особливості:

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

Функціональне програмування[ред.ред. код]

Python підтримує парадигму функціонального програмування, зокрема:

  • Функція є об'єктом.
  • Функції вищих порядків.
  • Рекурсія.
  • Розвинена обробка списків (спискові вирази, операції над послідовностями, ітератори).
  • Аналог замикань.
  • Часткове застосування функції.
  • Можливість реалізації інших засобів на самій мові (наприклад, каррінг).

Модулі та пакети[ред.ред. код]

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

Інтроспекція[ред.ред. код]

Python підтримує повну інтроспекцію часу виконання. Це означає, що для будь-якого об'єкта можна отримати всю інформацію про його внутрішню структуру.

Застосування інтроспекції (метапрограмування) є важливою частиною того, що називають «pythonic style», і широко застосовується в бібліотеках і фреймворках Python, таких як 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» — «Помилки ніколи не повинні ігноруватися») та є одним із засобів підтримки «качиної типізації».

Іноді, замість явної обробки винятків, зручніше використовувати блок with (доступний, починаючи з Python 2.5).

Ітератори[ред.ред. код]

У програмах на 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 дозволяє використовувати, так звані, Декоратори[16] (не слід плутати з однойменним шаблоном проектування) для підтримки існуючої практики перетворення функцій та методів у місці визначення (декораторів може бути декілька). Після довгих дебатів для декораторів став використовуватися символ @ у рядках, що передують визначенню функції або методу. Наступний приклад містить опис статичного методу без застосування декоратора:

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 поставляється «з батарейками в комплекті».

Багата стандартна бібліотека є однією з привабливих сторін Python. Тут є засоби для роботи з багатьма мережевими протоколами та форматами Інтернету, наприклад, модулі для написання HTTP-серверів та клієнтів, для розбору та створення поштових повідомлень, для роботи з XML тощо Набір модулів для роботи з операційної системою дозволяє писати крос-платформні застосунки. Існують модулі для роботи з регулярними виразами, текстовими кодуваннями, мультимедійними форматами, криптографічними протоколами, архівами, серіалізацією даних, підтримки юніт-тестування та ін.

Модулі розширення та програмні інтерфейси[ред.ред. код]

Крім стандартної бібліотеки існує безліч бібліотек, що надають інтерфейс до всіх системних викликів на різних платформах; зокрема, на платформі Win32 підтримуються всі виклики Win32 API, а також COM в обсязі не меншому, ніж у Visual Basic або Delphi. Кількість прикладних бібліотек для Python в самих різних областях без перебільшення величезна (веб, бази даних, обробка зображень, обробка тексту, чисельні методи, програми операційної системи і т. д.).

Для Python прийнята специфікація програмного інтерфейсу до баз даних DB-API 2 та розроблено відповідні цієї специфікації пакети для доступу до різних СУБД: PostgreSQL, Oracle, Sybase, Firebird (Interbase), Informix, Microsoft SQL Server, MySQL та sqlite. На платформі Microsoft Windows доступ до БД можливий через ADO (ADOdb). Комерційний пакет mxODBC для доступу до СУБД через ODBC для платформ Windows і UNIX розроблений eGenix[17]. Для Python написано багато ORM: (SQLObject, SQLAlchemy, Dejavu, Django), виконані програмні каркаси для розробки веб-застосунків (Django, Pylons).

Бібліотека NumPy для роботи з багатовимірними масивами дозволяє досягти продуктивності наукових розрахунків, порівнянної зі спеціалізованими пакетами. SciPy використовує NumPy і надає доступ до великого спектру математичних алгоритмів (матрична алгебра — BLAS, level 1-3 і LAPACK; БПФ).

Бібліотека WSGI[18] — інтерфейс шлюзу з веб-сервером (Python Web Server Gateway Interface).

Python надає простий і зручний програмний інтерфейс C API для написання власних модулів на мовах Сі та C++. Такий інструмент як SWIG дозволяє майже автоматично отримувати прив'язки для використання C/C++ бібліотек в коді на Python. Можливості цього та інших інструментів варіюються від автоматичної генерації (C/C++/Fortran)-Python інтерфейсів за спеціальними файлів (SWIG, pyste[19], SIP[20], pyfort[21]), до надання зручніших API (boost::python[22], CXX[23] та ін.) Інструмент стандартної бібліотеки ctypes дозволяє програмам Python безпосередньо звертатися до динамічних бібліотек/DLL, написаним на C. Існують модулі, що дозволяють вбудовувати код на С/C++ прямо у вихідні файли Python, створюючи розширення «на льоту» (pyinline[24], weave[25]). Для підключення математичних функцій, особливо з застосуванням NumPy, наразі офіційно рекомендованим є Cython[26]

Інший підхід полягає у вбудовуванні інтерпретатора Python у застосунки. Python легко вбудовується в програми на Java, C/C++, Ocaml. Взаємодія Python-застосунків з іншими системами можлива також за допомогою CORBA, XML-RPC, SOAP, COM.

За допомогою Pyrex[27] можлива компіляція Python-подібної мови (додана можливість типізації) у еквівалентний Сі-код і зв'язування із зовнішніми модулями.

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

Python та переважна більшість бібліотек до нього безкоштовні й поставляються у вихідних кодах. Більше того, на відміну від багатьох відкритих систем, ліцензія ніяк не обмежує використання Python в комерційних розробках та не накладає ніяких зобов'язань крім вказівки авторських прав.

Графічні бібліотеки[ред.ред. код]

З Python поставляється бібліотека tkinter на основі Tcl/Tk для створення крос-платформних програм з графічним інтерфейсом.

Для науково-технічної мети найбільшого поширення набуло використання matplotlib — бібліотеки з інтерфейсом, аналогічним MATLAB Plot Tool.

Існують розширення, що дозволяють використовувати всі основні GUI бібліотеки — wxPython[30], засноване на бібліотеці wxWidgets, PyGTK для GTK+, PyQt та PySide для Qt та інші. Деякі з них також надають широкі можливості для роботи з базами даних, графікою та мережами, використовуючи всі можливості бібліотеки, на якій базуються.

Для створення ігор та програм, що вимагають нестандартного інтерфейсу, можна використовувати бібліотеку Pygame. Вона також надає великі засоби роботи з мультимедіа: з її допомогою можна керувати звуком і зображеннями, відтворювати відео. Надаване pygame апаратне прискорення графіки OpenGL має більш високорівневий інтерфейс в порівнянні з PyOpenGL[31], що копіює семантику С-бібліотеки для OpenGL. Є також PyOgr[32], що забезпечує прив'язку до Ogre — високорівневої об'єктно-орієнтованої бібліотеки 3D-графіки. Крім того, існує бібліотека pythonOCC[33] , що забезпечує прив'язку до середовища 3D-моделювання та симуляції OpenCascade.[34]

Для роботи з растровою графікою використовується бібліотека Python Imaging Library.

Приклади програм[ред.ред. код]

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

Порівняння з іншими мовами[ред.ред. код]

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

Засоби функціонального програмування частково запозичені з Scheme та Icon.

У середовищі комерційних застосунків швидкість виконання програм на Python можуть порівнювати з Java-застосунками.[35]

Попри те, що Python має досить самобутній синтаксис, одним із принципів дизайну цієї мови є принцип найменшого подиву.

Недоліки[ред.ред. код]

Див також списки недоліків мови Python[36].

Низька швидкодія[ред.ред. код]

Python, як і багато інших інтерпретованих мов, які не застосовують, наприклад, JIT-компілятори, мають загальний недолік — порівняно невисоку швидкість виконання програм.[37] Однак, у випадку з Python цей недолік компенсується зменшенням часу розробки програми.[37] У середньому, програма, написана на Python, в 2-4 рази компактніша, ніж її аналог на C++ або Java.[37] Збереження байт-коду (файли .pyc і .pyo) дозволяє інтерпретатору не витрачати зайвий час на перекомпіляцію коду модулів при кожному запуску, на відміну, наприклад, від мови Perl. Крім того, існує спеціальна JIT-бібліотека psyco[38] (проте призводить до збільшення споживання оперативної пам'яті). Ефективність psyco сильно залежить від архітектури програми.

Існують проекти реалізацій мови Python, що вводять високопродуктивні віртуальні машини (ВМ) як компілятора заднього плану. Прикладами таких реалізацій може служити PyPy, що базується на LLVM; більш ранньою ініціативою є проект Parrot. Очікується, що використання ВМ типу LLVM призведе до тих самих результатів, що й використання аналогічних підходів для реалізацій мови Java, де низька обчислювальна продуктивність в основному подолана.[39]

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

У найпопулярнішій реалізації мови Python інтерпретатор досить великий і більш вимогливий до ресурсів, ніж в аналогічних популярних реалізаціях Tcl, Forth, LISP або Lua, що обмежує його застосування у вбудованих системах. Тим не менше, Python знайшов застосування в КПК і деяких моделях мобільних телефонів.[40]

Відсутність статичної типізації[ред.ред. код]

Відсутність статичної типізації є не стільки вадою інтерпретатора, скільки вибором розробника мови. Справа в тому, що в Python прийнята так звана «Качина типізація». У силу цього типи переданих значень недоступні на етапі компіляції, та помилки на зразок AttributeError можуть виникати під час виконання. Відсутність статичної типізації також є однією з основних причин низької швидкодії.

Існують модулі, які дозволяють контролювати типи параметрів функцій на етапі виконання, наприклад typecheck[41] або method signature checking decorators[42]. Додавання необов'язковою статичної типізації параметрів функції заплановано для Python3000.[43][44] При цьому, однак, безпосередньо інтерпретатор не буде перевіряти типи, а тільки додавати відповідну інформацію до метаданих функції для її (інформації) подальшого використання модулями розширень.

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

len = lambda x : x.__len__() # це лише приклад

Реалізації та опис[45][46], приклад реалізації простого перевантаження також є в прикладах програм на Python.

Плани з підтримки перевантаження в Python3000.[43][47] Перевантаження функцій реалізована різними сторонніми бібліотеками, в тому числі PEAK[48][49] надає надзвичайно багатий можливостями механізм перевантаження функцій з використанням довільних правил.

Неможливість модифікації вбудованих класів[ред.ред. код]

У порівнянні з Ruby та деякими іншими мовами, в Python відсутня можливість модифікувати вбудовані класи, такі, як int, str, float, list та інші, що, однак, дозволяє Python споживати менше оперативної пам'яті і швидше працювати. Ще однією причиною введення такого обмеження є необхідність узгодження з модулями розширення. Багато модулів (з метою оптимізації швидкодії) перетворять Python-об'єкти елементарних типів до відповідних Сі-типів замість маніпуляцій з ними за допомогою Сі-API.

Глобальне блокування інтерпретатора (GIL)[ред.ред. код]

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

Ця проблема має два основних варіанти вирішення. Перший — відмова від спільного використання змінюваних даних. При цьому дані дублюються в нитях і необхідність забезпечення їхньої синхронізації (якщо така потрібна) лягає на програміста.[52] Цей підхід веде до збільшення споживання оперативної пам'яті (однак не настільки сильно, як при використанні процесів).

Другий підхід — забезпечення більш гранульованої синхронізації — для окремих структур даних. У цьому випадку падає продуктивність внаслідок збільшення числа звільнень/захоплень блокувань.

Якщо необхідно паралельне виконання декількох нитей Python-коду, то можна скористатися процесами, наприклад, модулем processing[53], який імітує семантику стандартного модуля threading, але використовує процеси замість нитей. Є безліч модулів, що спрощують написання паралельних та/або розподілених застосунків на Python, таких як parallelpython[54], Pypar[55], pympi[56] та інші. GIL звільняється при виконанні коду більшості розширень, наприклад, NumPy/SciPy, дозволяючи на час розрахунків виконуватися іншому Python-ниті. Іншим рішенням може бути використання IronPython або Jython, позбавлених даного недоліку.

Реалізації[ред.ред. код]

Python портований на всі відомі платформи — від КПК до мейнфреймів. Існують порти під Windows[57], всі варіанти UNIX[58] (включно з Linux), Plan 9[59], Mac OS і Mac OS X[60], Palm OS[61], OS/2[62], Amiga, AS/400[63] і навіть OS/390[64] і Symbian[65].

При цьому, на відміну від багатьох портованих систем, на кожній платформі Python підтримує характерні для даної платформи технології (наприклад, Microsoft COM). Крім того, існує спеціальна версія Python для віртуальної машини Java — Jython, що дозволяє інтерпретатору виконуватися на будь-якій системі, що підтримує Java, класи Java можуть безпосередньо використовуватися з Python і навіть бути написаними на Python. Нещодавно почалася розробка системи, спрямованої на повнішу інтеграцію з платформою .NET — Iron Python.

Подальша розробка[ред.ред. код]

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.

Нещодавно розробники оголосили про офіційне припинення розвитку гілки Python 2.x. Остання випущена версія Python 2.7. Далі розробка буде вестися лише у гілці Python 3.x.

Можливості[ред.ред. код]

Основні зміни, внесені до версії 3.0:[66][67]

  • Синтаксична можливість для анотації параметрів і результату функцій (наприклад, для передачі інформації про тип або документування).
  • Повний перехід на 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[68] — створена в рамках проекту PyPy значно обмежена реалізація Python без динамізму часу виконання та деяких інших можливостей. RPython код можна компілювати в безліч інших мов/платформ — C, JavaScript, Lisp, .NET[69], LLVM. На RPython написаний інтерпретатор PyPy.
  • Pyrex[27] — обмежена реалізація Python, але трохи менше, ніж RPython. PyReX розширено можливостями статичної типізації типами з мови С і дозволяє вільно змішувати типізований та не типізований код. Призначений для написання модулів розширень, компілюється в код на мові С.
  • Cython[70] — розширена версія Pyrex.
  • pyastra[71] — компілятор Python коду в асемблер для PIC архітектури.
  • shed-skin[29] — призначений для компіляції неявно статично типізованого Python коду в оптимізований код на мові С++, проект далекий від завершення.

Застосування[ред.ред. код]

Python — стабільна та поширена мова. Вона використовується в багатьох проектах та в різних якостях: як основна мова програмування або для створення розширень та інтеграції додатків. На Python реалізована велика кількість проектів, також вона активно використовується для створення прототипів майбутніх програм.

Python використовується в багатьох великих компаніях.[72]

Документація та підручники[ред.ред. код]

Опис стандартних об'єктів та модулів, дивіться Python Library Reference. Python Reference Manual містить формальніше визначення мови. Щоб писати розширення на C та C++, читайте Extending and Embedding the Python Interpreter та Python/C API Reference .

Див. також[ред.ред. код]

Примітки[ред.ред. код]

  1. «Python 3.4.2». Python Software Foundation. 
  2. «Python 2.7.8». Python Software Foundation. 
  3. http://www.python.org/doc/essays/foreword/
  4. Guido van Rossum, Python Reference Manual, release 2.4.4, 18 October 2006.
  5. The Making of Python
  6. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY
  7. Index of Python Enhancement Proposals (PEPs)
  8. Python 3.0 Release
  9. PEP 20 — The Zen of Python
  10. Жартівливий натяк на національність Гвідо
  11. а б Foreword for «Programming Python» (1st ed .)
  12. The Making of Python
  13. «Python on Android» (англійською). www.damonkohler.com. Архів оригіналу за 2011-01-28. Процитовано 2009-12-19. 
  14. «Port-Specific Changes: Windows». Python v2.6.1 documentation. What's New in Python 2.6 (англійською). Python Software Foundation. Архів оригіналу за 2011-01-28. Процитовано 2008-12-11. 
  15. http://ipython.scipy.org
  16. PEP318
  17. — Professional Python Software, Skills and Services
  18. PEP333
  19. Pyste Documentation
  20. http://www.riverbankcomputing.co.uk/sip/
  21. http://pyfortran.sourceforge.net/
  22. Boost.Python
  23. PyCXX: Write Python Extensions in C
  24. PyInline: Mix Other Languages directly Inline with your Python
  25. Weave
  26. Cython: C-Extensions for Python
  27. а б Pyrex
  28. Shedskin | Download Shedskin software for free at SourceForge.net
  29. а б Shed Skin — An Optimizing Python-to-C++ Compiler
  30. wxPython
  31. http://pyopengl.sourceforge.net/
  32. PyOgre: Ogre Wiki
  33. pythonOCC, 3D CAD/CAE/PLM development framework for the Python programming language
  34. Open CASCADE Technology, 3D modeling & numerical simulation
  35. Результати однієї зі спроб порівняння
  36. zephyrfalcon.org::labs::10 Python pitfalls
  37. а б в «Python/C++ GNU g++». Computer Language Benchmarks Game. ???. Архів оригіналу за 2011-01-28. Процитовано 2009-07-01. 
  38. Psyco (англ.) — JIT-компілятор для Python, що дозволяє збільшити швидкість роботи програм в 3-10 разів
  39. «unladen-swallow. A faster implementation of Python». code.google. Архів оригіналу за 2011-01-28. Процитовано 2009-06-22. «Goals: ... Produce a version of Python at least 5x faster than CPython» 
  40. Python for S60 — OpenSource
  41. Typechecking module for Python
  42. Method signature checking decorators «Python recipes» ActiveState Code
  43. а б PEP-3107
  44. PEP-3100
  45. http://alpha.sec.ru/~aiv/python/overload/
  46. http://python.com.ua/doc/overload.html
  47. PEP-3124
  48. FrontPage — The PEAK Developers Center
  49. PEAK-Rules
  50. Python 3000 FAQ
  51. — Project Hosting on Google Code
  52. perlthrtut — perldoc.perl.org
  53. Python Package Index: processing 0.52
  54. Parallel Python — Home
  55. http://datamining.anu.edu.au/~ole/pypar/
  56. pyMPI.sourceforge.net: Putting the py in MPI
  57. Python for Windows [1]
  58. Python for Шаблон:UNIX [2]
  59. Python for Plan 9[3]
  60. Python for Mac OS X[4]
  61. Python for Palm OS[5]
  62. Python for Other Platforms | SourceForge.net[6]
  63. Python for Other Platforms | SourceForge.net[7]
  64. Python for Other Platforms | SourceForge.net[8]
  65. Python for Other Platforms | SourceForge.net[9]
  66. What's New In Python 3.0 — Python v3.0.1 documentation
  67. Overview — Python v3.0.1 documentation
  68. PyPy (coding-guide)
  69. PyPy (carbonpython)
  70. Cython: C-Extensions for Python
  71. Pyastra: python assembler translator
  72. Python Success Stories

Посилання[ред.ред. код]