Мова програмування Python. Концепції, механізми та приклади використання
Python як інтерпретована об'єктно-орієнтована мова програмування високого рівня з динамічною семантикою, оцінка її головних переваг та недоліків, загальна характеристика та можливості, сфери та тенденції застосування на сьогодні. Графічні бібліотеки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | украинский |
Дата добавления | 09.06.2012 |
Размер файла | 51,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Python (рекомендоване прочитання - «Python», запозичено назву з британського шоу Монті Пайтон) - інтерпретована об'єктно-орієнтована мова програмування високого рівня з динамічною семантикою. Розроблена в 1990 році Гвідо ван Россумом. Структури даних високого рівня разом із динамічною семантикою та динамічним зв'язуванням роблять її привабливою для швидкої розробки програм, а також як засіб поєднання існуючих компонентів. Python підтримує модулі та пакети модулів, що сприяє модульності та повторному використанню коду. Інтерпретатор Python та стандартні бібліотеки доступні як у скомпільованій так і у вихідній формі на всіх основних платформах. В мові програмування Python підтримується декілька парадигм програмування, зокрема: об'єктно-орієнтована, процедурна, функціональна та аспектно-орієнтована.
Філософія
Серед основних її переваг можна назвати такі:
· чистий синтаксис (для виділення блоків слід використовувати відступи);
· переносимість програм (що властиве більшості інтерпретованих мов);
· стандартний дистрибутив має велику кількість корисних модулів (включно з модулем для розробки графічного інтерфейсу);
· можливість використання Python в діалоговому режимі (дуже корисне для експериментування та розв'язання простих задач);
· стандартний дистрибутив має просте, але разом із тим досить потужне середовище розробки, яке зветься IDLE і яке написане на мові Python;
· зручний для розв'язання математичних проблем (має засоби роботи з комплексними числами, може оперувати з цілими числами довільної величини, у діалоговому режимі може використовуватися як потужний калькулятор).
Python має ефективні структури даних високого рівня та простий, але ефективний підхід до об'єктно-орієнтованого програмування. Елегантний синтаксис Python, динамічна обробка типів, а також те, що це інтерпретована мова, роблять її ідеальною для написання скриптів та швидкої розробки прикладних програм у багатьох галузях на більшості платформ.
Інтерпретатор мови Python і багата стандартна бібліотека (як вихідні тексти, так і бінарні дистрибутиви для всіх основних операційних систем) можуть бути отримані з сайту Python www.python.org, і можуть вільно розповсюджуватися. Цей самий сайт має дистрибутиви та посилання на численні модулі, програми, утиліти та додаткову документацію.
Інтерпретатор мови Python може бути розширений функціями та типами даних, розробленими на C чи C++ (або на іншій мові, яку можна викликати із C). Python також зручна як мова розширення для прикладних програм, що потребують подальшого налагодження.
Історія
Розробка мови Python була почата в кінці 1980-х років співробітником голландського інституту CWI Гвідо ван Россумом. Для розподіленої ОС Amoeba потрібна була розширювана скриптова мова, і Гвідо почав писати Python на дозвіллі, запозичивши деякі напрацювання для мови ABC (Гвідо брав участь у розробці цієї мови, орієнтованої на навчання програмуванню). У лютому 1991 року Гвідо опублікував вихідний текст в групі новин alt.sources. Мова почала вільно поширюватися через Інтернет, і сподобалася іншим програмістам. З 1991 року Python є цілком об'єктно-орієнтованим. Python також запозичив багато рис таких мов, як C, C++, Modula-3 і Icon, й окремі риси функціонального програмування з Ліспу.
Назва мови виникла зовсім не від виду плазунів. Автор назвав мову на честь популярного британського комедійного серіалу 70-х років «Повітряний цирк Монті Пайтон». Втім, все одно назву мови частіше асоціюють саме зі змією, ніж з фільмом - піктограми файлів в KDE або в Windows, і навіть емблема на сайті python.org зображують зміїну голову.
Наявність дружньої спільноти користувачів вважається, поряд з дизайнерською інтуїцією Гвідо, одним з головних факторів успіху Python. Розвиток мови відбувається згідно з чітко регламентованими процесами створення, обговорення, відбору та реалізації документів PEP (Python Enhancement Proposal) - пропозицій щодо розвитку Python.
3 грудня 2008 року, після тривалого тестування, вийшла перша версія Python 3000 (або Python 3.0, також використовується скорочена Py3k). У Python 3000 усунено багато недоліків архітектури з максимально можливим (але не повним) збереженням сумісності зі старими версіями. На сьогодні підтримуються обидві гілки розвитку (Python 3.2 і 2.7).
Вплив інших мов на Python
З'явившись порівняно пізно, Python створювався під впливом багатьох мов програмування:
· ABC - поле для угруповання операторів, високорівневі структури даних (map) (фактично, Python створювався як спроба виправити помилки, допущені при проектуванні ABC);
· Modula-3 - пакети, модулі, використання else спільно з try та except, іменовані аргументи функцій (на це також вплинув Common Lisp);
· Сі, C++ - деякі синтаксичні конструкції (як пише сам Гвідо ван Россум - він використовував найбільш несуперечливі конструкції з С, щоб не викликати неприязнь у Сі-програмістів до Python);
· 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.
У міру старіння платформи її підтримка в основній гілці мови припиняється. Наприклад, з серії 2.6 припинена підтримка Windows 95, Windows 98 та Windows ME. Однак на цих платформах можна використовувати попередні версії 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.
Об'єктно-орієнтоване програмування
Дизайн мови 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 дозволяє використовувати, так звані, Декоратори (не слід плутати з однойменним шаблоном проектування) для підтримки існуючої практики перетворення функцій та методів у місці визначення (декораторів може бути декілька). Після довгих дебатів для декораторів став використовуватися символ @ у рядках, що передують визначенню функції або методу. Наступний приклад містить опис статичного методу без застосування декоратора:
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. Тут є засоби для роботи з багатьма мережевими протоколами та форматами Інтернету, наприклад, модулі для написання 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. Для Python написано багато ORM: (SQLObject, SQLAlchemy, Dejavu, Django), виконані програмні каркаси для розробки веб-застосунків (Django, Pylons).
Бібліотека NumPy для роботи з багатовимірними масивами дозволяє досягти продуктивності наукових розрахунків, порівнянної зі спеціалізованими пакетами. SciPy використовує NumPy і надає доступ до великого спектру математичних алгоритмів (матрична алгебра - BLAS, level 1-3 і LAPACK; БПФ).
WSGI - інтерфейс шлюзу з веб-сервером (Python Web Server Gateway Interface).
Python надає простий і зручний програмний інтерфейс C API для написання власних модулів на мовах Сі та C++. Такий інструмент як SWIG дозволяє майже автоматично отримувати прив'язки для використання C/C++ бібліотек в коді на Python. Можливості цього та інших інструментів варіюються від автоматичної генерації (C/C++/Fortran) - Python інтерфейсів за спеціальними файлів (SWIG, pyste, SIP, pyfort), до надання більш зручних API (boost:python, CXX та ін.) Інструмент стандартної бібліотеки ctypes дозволяє програмам Python безпосередньо звертатися до динамічних бібліотек/DLL, написаним на C. Існують модулі, що дозволяють вбудовувати код на С/C++ прямо у вихідні файли Python, створюючи розширення «на льоту» (pyinline, weave). Для підключення математичних функцій, особливо з застосуванням NumPy, наразі офіційно рекомендованим є Cython.
Інший підхід полягає у вбудовуванні інтерпретатора Python у застосунки. Python легко вбудовується в програми на Java, C/C++, Ocaml. Взаємодія Python-застосунків з іншими системами можлива також за допомогою CORBA, XML-RPC, SOAP, COM.
За допомогою Pyrex можлива компіляція Python-подібного мови (додана можливість типізації) у еквівалентний Сі-код і зв'язування із зовнішніми модулями.
Експериментальний проект shed skin передбачає створення компілятора для трансформації неявно типізованих Python програм у оптимізований С++ код. Починаючи з версії 0.22 shed skin дозволяє компілювати окремі функції в модулі розширень. Повна компіляція (станом на 1 липня 2007) далека від завершення.
Python та переважна більшість бібліотек до нього безкоштовні й поставляються у вихідних кодах. Більше того, на відміну від багатьох відкритих систем, ліцензія ніяк не обмежує використання Python в комерційних розробках та не накладає ніяких зобов'язань крім вказівки авторських прав.
Графічні бібліотеки
З Python поставляється бібліотека tkinter на основі Tcl/Tk для створення крос-платформних програм з графічним інтерфейсом.
Для науково-технічної мети найбільшого поширення набуло використання matplotlib - бібліотеки з інтерфейсом, аналогічним MATLAB Plot Tool.
Існують розширення, що дозволяють використовувати всі основні GUI бібліотеки - wxPython, засноване на бібліотеці wxWidgets, PyGTK для GTK+, PyQt та PySide для Qt та інші. Деякі з них також надають широкі можливості для роботи з базами даних, графікою та мережами, використовуючи всі можливості бібліотеки, на якій базуються.
Для створення ігор та програм, що вимагають нестандартного інтерфейсу, можна використовувати бібліотеку Pygame. Вона також надає великі засоби роботи з мультимедіа: з її допомогою можна керувати звуком і зображеннями, відтворювати відео. Надаване pygame апаратне прискорення графіки OpenGL має більш високорівневий інтерфейс в порівнянні з PyOpenGL, що копіює семантику С-бібліотеки для OpenGL. Є також PyOgr, що забезпечує прив'язку до Ogre - високорівневої об'єктно-орієнтованої бібліотеки 3D-графіки. Крім того, існує бібліотека pythonOCC, що забезпечує прив'язку до середовища 3D-моделювання та симуляції OpenCascade.
Для роботи з растровою графікою використовується бібліотека Python Imaging Library.
Порівняння з іншими мовами
Найчастіше Python порівнюють з Perl та Ruby. Ці мови також є інтерпретованими та мають приблизно однакову швидкість виконання програм. Як і Perl, Python може успішно застосовуватися для написання скриптів (сценаріїв). Як і Ruby, Python є добре продуманою системою для ООП.
Засоби функціонального програмування частково запозичені з Scheme та Icon.
У середовищі комерційних застосунків швидкість виконання програм на Python можуть порівнюювати з Java-застосунками.
Незважаючи на те, що Python має досить самобутній синтаксис, одним із принципів дизайну цієї мови є принцип найменшого подиву.
Недоліки
Низька швидкодія
Пітон, як і багато інших інтерпретованих мов, не застосовують, наприклад, JIT-компілятори, мають загальний недолік - порівняно невисоку швидкість виконання програм. Однак, у випадку з Python цей недолік компенсується зменшенням часу розробки програми. У середньому, програма, написана на Python, в 2-4 рази компактніше, ніж її аналог на C++ або Java. Збереження байт-коду (файли.pyc і.pyo) дозволяє інтерпретатору не витрачати зайвий час на перекомпіляцій коду модулів при кожному запуску, на відміну, наприклад, від мови Perl. Крім того, існує спеціальна JIT-бібліотека psyco, що дозволяє прискорити виконання програм (проте призводить до збільшення споживання оперативної пам'яті). Ефективність psyco сильно залежить від архітектури програми.
Існують проекти реалізацій мови Python, що вводять високопродуктивні віртуальні машини (ВМ) як компілятора заднього плану. Прикладами таких реалізацій може служити PyPy, що базується на LLVM; більш ранньої ініціативою є проект Parrot. Очікується, що використання ВМ типу LLVM призведе до тих самих результатів, що й використання аналогічних підходів для реалізацій мови Java, де низька обчислювальна продуктивність в основному подолана.
Безліч програм/бібліотек для інтеграції з іншими мовами програмування надають можливість використовувати іншу мову для написання критичних ділянок.
У найпопулярнішій реалізації мови Python інтерпретатор досить великий і більш вимогливий до ресурсів, ніж в аналогічних популярних реалізаціях Tcl, Forth, LISP або Lua, що обмежує його застосування у вбудованих системах. Тим не менше, Python знайшов застосування в КПК і деяких моделях мобільних телефонів.
Відсутність статичної типізації
Відсутність статичної типізації є не стільки вадою інтерпретатора, скільки вибором розроблювача мови. Справа в тому, що в Python прийнята так звана «Качина типізація». У силу цього типи переданих значень недоступні на етапі компіляції, та помилки на зразок AttributeError можуть виникати під час виконання. Відсутність статичної типізації також є однією з основних причин низького швидкодії.
Існують модулі, які дозволяють контролювати типи параметрів функцій на етапі виконання, наприклад typecheck або method signature checking decorators. Додавання необов'язковою статичної типізації параметрів функції заплановано для Python3000. При цьому, однак, безпосередньо інтерпретатор не буде перевіряти типи, а тільки додавати відповідну інформацію до метаданих функції для її (інформації) подальшого використання модулями розширень.
Відсутність статичної типізації і деякі інші причини не дозволяють реалізувати в Python механізм перевантаження функцій на етапі компіляції. Можливості Python дозволяють реалізувати динамічну перевантаження на етапі виконання, що, звичайно, уповільнює виклик, так як вирішення яку саме функцію викликати проводиться при кожному зверненні і є, в загальному випадку, досить складною процедурою. Відсутність перевантаження в Python намагаються компенсувати використанням віртуальних функцій.
len = lambda x: x.__len__() # це лише приклад
Перевантаження функцій реалізована різними сторонніми бібліотеками, в тому числі PEAK надає надзвичайно багатий можливостями механізм перевантаження функцій з використанням довільних правил.
Неможливість модифікації вбудованих класів
У порівнянні з Ruby та деякими іншими мовами, в Python відсутня можливість модифікувати вбудовані класи, такі, як int, str, float, list та інші, що, однак, дозволяє Python споживати менше оперативної пам'яті і швидше працювати. Ще однією причиною введення такого обмеження є необхідність узгодження з модулями розширення. Багато модулів (з метою оптимізації швидкодії) перетворять Python-об'єкти елементарних типів до відповідних Сі-типів замість маніпуляцій з ними за допомогою Сі-API.
Глобальне блокування інтерпретатора (GIL)
GIL (Global Interpreter Lock) - проблема, притаманна CPython, Stackless та PyPy, але відсутня в Jython та IronPython. При своїй роботі основний інтерпретатор Python постійно використовує велику кількість нитє-небезпечних даних. В основному це словники, в яких зберігаються атрибути об'єктів. Для уникнення руйнування цих даних при спільній модифікації з різних нитей перед початком виконання декількох інструкцій (за замовчуванням 100) нить інтерпретатора захоплює GIL, а після закінчення звільняє. Внаслідок цієї особливості в кожен момент часу може виконуватися тільки одна нить Python текстів, навіть якщо на комп'ютері є кілька процесорів або процесорних ядер (GIL також звільняється на час виконання блокуючих операцій, таких як введення-виведення, зміни/перевірка стану синхронізуючих примітивів та інших - таким чином, якщо одна нить блокується, інші можуть виконуватися). Була зроблена спроба переходу до більш гранульованої синхронізації, проте через часті захоплення/звільнення блокувань ця реалізація виявилася занадто повільною. У найближчому майбутньому перехід від GIL до інших технік не передбачається, однак є python-safethread - CPython без GIL і з деякими іншими змінами (за твердженнями його авторів, на однонитевих застосунках швидкість відповідає 60-65% від швидкості оригінальному CPython).
Ця проблема має два основних варіанти вирішення. Перший - відмова від спільного використання змінюваних даних. При цьому дані дублюються в нитях і необхідність забезпечення їхньої синхронізації (якщо така потрібна) лягає на програміста. Цей підхід веде до збільшення споживання оперативної пам'яті (однак не настільки сильно, як при використанні процесів).
Другий підхід - забезпечення більш гранульованої синхронізації - для окремих структур даних. У цьому випадку падає продуктивність внаслідок збільшення числа звільнень/захоплень блокувань.
Якщо необхідно паралельне виконання декількох нитей Python-коду, то можна скористатися процесами, наприклад, модулем processing, який імітує семантику стандартного модуля threading, але використовує процеси замість нитей. Є безліч модулів, що спрощують написання паралельних та/або розподілених застосунків на Python, таких як parallelpython, Pypar, pympi та інші. GIL звільняється при виконанні коду більшості розширень, наприклад, NumPy/SciPy, дозволяючи на час розрахунків виконуватися іншому Python-ниті. Іншим рішенням може бути використання IronPython або Jython, позбавлених даного недоліку.
Реалізації
Python портований на всі відомі платформи - від КПК до мейнфреймів. Існують порти під Windows, всі варіанти UNIX (включно з Linux), Plan 9, Mac OS і Mac OS X, Palm OS, OS/2, Amiga, AS/400 і навіть OS/390 і Symbian.
При цьому, на відміну від багатьох портованих систем, на кожній платформі 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:
· Синтаксична можливість для анотації параметрів і результату функцій (наприклад, для передачі інформації про тип або документування).
· Повний перехід на 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 - створена в рамках проекту PyPy значно обмежена реалізація Python без динамізму часу виконання та деяких інших можливостей. RPython код можна компілювати в безліч інших мов/платформ - C, JavaScript, Lisp.NET, LLVM. На RPython написаний інтерпретатор PyPy.
· Pyrex - обмежена реалізація Python, але трохи менше, ніж RPython. PyReX розширено можливостями статичної типізації типами з мови С і дозволяє вільно змішувати типізований та не типізований код. Призначений для написання модулів розширень, компілюється в код на мові С.
· Cython - розширена версія Pyrex.
· pyastra - компілятор Python коду в асемблер для PIC архітектури.
· shed-skin - призначений для компіляції неявно статично типізованого Python коду в оптимізований код на мові С++, проект далекий від завершення.
Застосування
Python - стабільна та поширена мова. Він використовується в багатьох проектах та в різних якостях: як основна мова програмування або для створення розширень та інтеграції застосувань. На Python реалізована велика кількість проектів, також він активно використовується для створення прототипів майбутніх програм.
Python використовується в багатьох великих компаніях: IBM, CERN, DreamWorks, Firaxis Games, Google, Industrial Light & Magic, NASA, Nokia, CCP Games, Wargaming.net та інших.
Веб-програмування та веб-проекти
· CherryPy - середовище для розробки веб-застосувань
· Django - середовище для розробки веб-застосувань
· web2py - середовище для розробки веб-застосувань (web2py)
· Google App Engine - Google-хостинг, використовує Python для серверних застосувань
· GAE framework - Django-подібний фреймворк, повністю сумісний з Google App Engine
· Gevent - бібліотека для мережевих і веб застосувань. Реалізована на Greenlet і Libev.
· Karrigell - середовище для розробки веб-застосувань (Karrigell)
· Mailman - популярна програма для роботи зі списками розсилки
· MoinMoin - вікі-движок для інтранету та інтернету
· PlanetPlanet - Движок для синдикації rss-потоків
· Plone - система управління вмістом вебсайтів (CMS) на платформі Zope
· Pylons - середовище для розробки веб-застосувань
· Pythomnic - середовище для розробки розподілених мережевих сервісів
· reddit - Движок блогу реалізований на web.py
· SEPY - редактор мови ActionScript
· TurboGears - середовище для розробки веб-застосувань
· Twisted - подієво-орієнтований мережевий фреймворк
· web.py - середовище для розробки веб-застосувань (web.py)
· Webware - середовище для розробки веб-застосувань
· Zope - сервер для побудови CMS, порталів і власних видів веб-застосувань, а також платформа для їх розробки
· Bnw.im - інстант-блог на основі xmpp. (Bnw.im)
Графіка
· imgSeek - програма для ведення архіву фотографічних зображень з пошуком по вмісту і безліччю інших можливостей. (ImgSeek)
· Matplotlib - візуалізація наукових даних в стилі MATLAB
· PyNGL - модуль для візуалізації наукових даних з упором на високоякісну 2D візуалізацію в геонаук.
· sK1 - форк і наступник зупиненого проекту Skencil, що володіє розширеними професійними можливостями.
· Skencil - багатоплатформний редактор векторної графіки для UNIX-систем
· UniConvertor - багатоплатформний конвертор форматів векторної графіки. Підпроект в проекті sK1.
Розробка програмного забезпечення
· A-a-p - складання програм
· Bazaar - децентралізована система керування версіями
· Boa - середовище візуальної розробки
· Buildbot - система для управління зборкою вихідних текстів
· Meld - програма для пошуку відмінностей в текстових файлах і перенесення відмінностей між файлами
· Mercurial - децентралізована система керування версіями
· PythonCard - середовище візуальної розробки
· Scons - складання програм
· Trac - вікі і багтрекер інтегровані з системою управління версіями Subversion
· ViewCVS - програма для перегляду репозиторіїв CVS через веб-браузер
· Wing IDE - середовище розробки програм на Python
Інші області застосування
· Anaconda - інсталятор операційних систем Fedora, Red Hat Enterprise Linux і деяких інших дистрибутивів, що базуються на останньому (написаний з використанням Python, C, PyGTK).
· BitTorrent - перший клієнт-сервер для популярного протоколу файлообмінних мереж.
· clamwin - антивірус для ОС Microsoft Windows на базі ClamAV.
· Deluge - торрент-клієнт.
· Dropbox - застосування для прозорої синхронізації даних на безлічі комп'ютерів.
· Entropy - Система управління пакетами для Linux систем, частина дистрибутива Sabayon Linux.
· ERP5 - ERP-система (система управління ресурсами підприємства).
· EVE Online - комп'ютерна гра жанру MMORPG, для написання клієнта і сервера якої використаний Stackless Python.
· Gajim - клієнт обміну миттєвими повідомленнями по протоколу XMPP.
· IPython - командна оболонка, заміна стандартної оболонки Python.
· OpenERP - ERP-система (система управління ресурсами підприємства).
· Portage - система пакетів, використовувана Gentoo Linux.
· Severance: Blade of Darkness - комп'ютерна гра.
· SoundConverter - конвертер аудіоформатів.
· Sunflower - файловий менеджер.
· Tryton - ERP, CRM, Бухгалтерська система.
· Unknown Horizons - комп'ютерна гра, суміш жанрів містобудівна симулятор і стратегія в реальному часі, натхненна серією ігор Anno.
· yum - Високорівнева система управління пакетами ПО, надбудова над RPM, застосовується в Fedora / RHEL та їх клонах.
Проекти, що використовують Python як скриптову мову
· Вікіпедія використовує Python для написання ботів;
· Battle for Wesnoth - покрокова стратегічна гра «Битва за Веснот», Python використовується для створення скриптів AI;
· Blender - міжплатформенний 3D редактор, Python використаний для підтримки скриптів-плагінів;
· Civilization IV - популярна стратегічна гра;
· GIMP - растровий графічний редактор, для написання скриптів використовується Python
· Середовище робочого столу GNOME використовує Python для написання плагінів для ряду застосувань:
o Gnumeric - табличний процесор для UNIX-систем;
o Desktop - пошуковий інструмент середовища GNOME;
o gedit - текстовий редактор;
· Greyhawk: Temple of Elemental Evil - гра для ОС Windows від фірми Troika Games, Python використаний для скриптова підтримки ігрового движка;
· Houdini - High-end пакет 3D анімації розробляється компанією Side Effects Software (Toronto, Canada). Відмінною особливістю Houdini є чисто процедурний підхід до моделювання та анімації. Починаючи з версії Houdini 9.0 мову програмування Python пропонується як альтернатива стандартному HScript і вбудованому мови виразів;
· Immunity Debugger - відладчик, заснований на OllyDbg, з можливістю підключення скриптів на мові Python. Призначений для аналізу шкідливого ПО, і реверс-інжинірингу бінарних файлів;
· Kig - інтерактивна геометрія;
· Maya - High-end редактор тривимірної графіки. Починаючи з версії Maya 8.5 Python використовується як скриптової мови нарівні з MEL (Maya Embedded Language). Крім того, Maya Python API (інтерфейс до C + + Maya API для Python) використовується для створення розширень до Maya, а також для пакетної обробки даних;
· Minions of Mirth - MMORPG гра, Python використаний як основну мову для написання логіки сервера і клієнта;
· OpenOffice.org - набір офісних програм, альтернатива Microsoft Office, Python використовується для написання скриптів нарівні з VBA, JavaScript, BeanShell;
· QuArK - редактор ігрових рівнів;
· Vampire: The Masquerade - Bloodlines - рольова гра з елементами action, розроблена компанією Troika Games на движку Source від Valve Software, Python активно використовується для написання сценарію рівнів;
· Vim - текстовий редактор, надає багатий API для автоматизації та розширення функціональності;
· WinCVS - GUI для роботи з системою CVS в ОС Microsoft Windows, використовує Python для підтримки скриптів.
Приклади програм
Знаходження 10 слів, що найчастіше зустрічаються на веб-сторінці
Даний приклад виключно демонстраційний, оскільки його можна значно поліпшити.
from urllib2 import urlopen
# з модуля urllib2 імпортуємо функцію urlopen
u = urlopen («http://python.org») # відкриваємо URL на читання
words = {} # пов'язуємо ім'я words з порожнім словником
# (словник - невпорядкований асоціативний масив)
for line in u: # читаємо u по рядках
line = line.strip («\n») # відкидаємо початкові та кінцеві прогалини
for word in line.split(«»): # ріжемо кожен рядок на слова, обмежені пробілами
try: # блок обробки виключень
words[word] += 1 # намагаємося збільшити words[word] на одиницю
except KeyError: # якщо не вийшло (раніше words[word] не було)
words[word] = 1 # присвоюємо одиницю
# Тепер словник words містить кількість слів на сторінці.
# Наприклад, words може містити («яблуко»: 5, «апельсин»: 12, «груша»: 8)
pairs = words.items()
# робимо з словника список пар
# pairs == [(«яблуко», 5), («апельсин», 12), («груша», 8)]
pairs.sort (lambda a, b: b[1] - a[1]) # сортуємо за спаданням другого елемента пари
for p in pairs [:10]: # друкуємо перші 10 елементів списку
print p[0], p[1]
Приклади роботи з послідовностями
Ілюструють особливості індексації елементів і зрізів: при взятті зрізу нумеруються не самі елементи, а проміжки між ними.
>>> l = ['A', 'B', 'C', 'D', 'E'] # початковий список
>>> # 0 1 2 3 4 # пронумеровані проміжки між елементами
>>> # -5 -4 -3 -2 -1 # нумерація з кінця
>>> l [0:2] # зріз від нульового до другого проміжку
['A', 'B']
>>> l [1: - 2] # зріз від другого до другого з кінця елемента
['B', 'C']
>>> l [1:2] # кожен другий елемент починаючи з першого
['B', 'D']
>>> l[: - 1] # всі елементи в зворотному порядку
['E', 'D', 'C', 'B', 'A']
Опції подібні range() підтримують те ж саме правило:
>>> range (2, 5)
[2, 3, 4]
>>> range(5)
[0, 1, 2, 3, 4]
Реалізація перевантаження функцій
Це приклад простої реалізації підтримки перевантаження функцій на Python. Вона демонструє як, використовуючи вже наявні в Python засоби, можна обійти одне з обмежень базової реалізації. Підтримується мінімум можливостей (тільки фіксована кількість позиційних аргументів, немає іменованих аргументів, відсутнє приведення типів (наприклад int->float) і т. п.), але працює досить швидко.
import sys # для отримання об'єктів з вищерозташованих фреймів стеку
class CannotResolve(Exception):pass
# клас-виняток для випадку незнаходження функції
class Resolver(object): # клас, який реалізує дозвіл на етапі виконання
emess = «Can't found appropriate signature of func% s() for call with» + \
«params % r» # повідомлення про помилку
def __init__(self, name): # конструктор
self.function_map = {} # словник, що відображає типи параметрів на функції
self.default = None # функція за замовчуванням
self.name = name # ім'я функції для виведення повідомлень про помилки
def __call__(self,*dt): # імітуємо функцію, приймаючу будь-яку кількість
# позиційних параметрів
cls = tuple (map(type, dt)) # створюємо tuple з типів переданих аргументів
# Функція type повертає тип свого параметру
# Map викличе type для кожного елементу з dt
try:
x = self.function_map[cls] # намагаємося отримати функцію зі словника;
except KeyError: # якщо такої немає,
if self.default is not None: # використовуємо функцію за замовчуванням
x = self.default
else: # якщо її немає - створюємо виняток
raise CannotResolve (self.emess% (self.name, cls))
return x(*dt) # викликаємо функцію і повертаємо результат
def overload(*dt): # декоратор для перевантаження в якості параметрів
# приймає типи параметрів
def closure(func):
name = func.__name__ # отримуємо ім'я функції
fr = sys._getframe(1). f_locals.get (name, Resolver (name))
# Опускаємося на один крок вниз по стеку і знаходимо локальну
# змінну з ім'ям функції. Якщо ж її немає, то використовуємо новий
# Resolver-об'єкт
fr.function_map[dt] = func # додаємо нову функцію до словнику викликів
return fr
return closure
def overdef(func): # для створення функції за вмовчанням
name = func.__name__ # аналогічно як і у функції overload
fr = sys._getframe(1).f_locals.get (name, Resolver (name))
fr.default = func
return fr
# Тепер скористаємося отриманими декораторами;
@ Overdef # це буде функція за вмовчанням
def f (*dt, **mp):
print «Default call» # якщо немає явного return, то повернеться None
@overload (int) # єдиний параметр - ціле число
def f(x):
return x + 1
@overload (str) # єдиний параметр - рядок
def f(x):
return x + «1»
@overload (str, int) # рядок і ціле
def f (x, y):
return x + str(y)
print f(1) # надрукує: 2
print f («1») # надрукує: 11
f (2,2) # надрукує: Default call
Керування контекстом виконання
Наступний приклад з PEP343 ілюструє застосування оператора with для захисту блоку коду від одночасного виконання двома потоками:
from __future__ import with_statement # активує оператор with в коді
from contextlib import contextmanager
from threading import Lock
# Опис менеджера контексту
@contextmanager
def locked(lock):
lock.acquire()
try:
yield
finally:
lock.release()
# Визначення блокування
myLock = Lock()
# Застосування оператора
with locked(myLock):
print «Блок коду охороняється.»
Генератор чисел Фібоначчі
Приклад генератора чисел Фібоначчі і його використання:
def fibonacci(max): # генератор (а не функція, тому що
# оператор return замінений на yield)
a, b = 0, 1
while a < max:
yield a # return a, + запам'ятовуємо місце рестарту для наступного виклику
a, b = b, a + b
# паралельне присвоювання, що виконується одночасно і паралельно
for n in fibonacci(100): # використовуємо генератор fibonacci() як ітератор
print n, # друкуємо всі числа Фібоначі менші 100 через пробіл
Альтернативний синтаксис доступу до елементів словника
Можна визначити словник, який в додаток до звичайного синтаксису доступу по ключу d[key] може надавати синтаксично більш наглядний доступ до атрибуту d.key у разі алфавітно-цифрових ключів:
class Entity(dict): # успадковуємо клас від __builtin__.dict
def __getattr__(self, key): # цей метод буде викликаний, якщо атрибут
# з ім'ям key не буде знайдений у екземпляра класу
try:
return self[key] # намагаємося повернути елемент словника
except KeyError, k: # якщо такого елементу немає, то генеруємо
raise AttributeError, k # виняток AttributeError.
# За домовленістю __getattr__
# не має створювати інших винятків
def __setattr__(self, key, value): # цей метод буде викликаний при присвоєнні
self [key] = value # атрибуту key значення value,
def __delattr__(self, key): # а цей при видаленні атрибуту.
try: # з допомогою del mydict.g
del self[key]
except KeyError, k:
raise AttributeError, k
def __repr__(self): # використовується функцією repr
return self.__class__.__name__ + «(» + dict.__repr__(self) +»)»
d = Entity (a=1)
d.b_100 = 100
assert d.a == d['a'] and d.b_100 == d ['b_100']
Функтор з генерацією байтокоду
Приклад ефективної реалізації функтора, заснований на генерації байтокоду під час виконання. Цей приклад демонструє такі можливості/особливості Python:
Можливість реалізації специфічних засобів функціонального програмування напрацюваннями, вже наявними в мові
Працювати з байтокодом в Python досить просто
Найчастіше генерація байтокоду здатна значно прискорити виконання.
Це лише приклад, він реалізує всього одну операцію - додавання і має декілька інших обмежень.
#-
import byteplay # спеціальний модуль для зручної роботи з Python-байтокодом
import new # для створення функції під час виконання
import functools # для update_wrapper
import inspect # для отримання інформації про параметри, що приймаються функцією
#-
class FastFunctor (object):
def __init__(self, func, code = None):
self.func = None # тут будемо зберігати результуючу функцію
self.ofunc = func # а тут вихідну (original) функцію
if code is None:
# Конструюємо байтокод для виклику функції
self.code = [(byteplay.LOAD_CONST, func)]
rparams = inspect.getargspec(func) [0]
# отримуємо список параметрів, що приймаються функцією
self.code.extend((byteplay.LOAD_FAST, i) for i in rparams)
self.code.append((byteplay.CALL_FUNCTION, len(rparams)))
else:
# Якщо ж функтор створений з іншого функтора,
# то тільки копіюємо переданий байткод
self.code = code
# Створюємо новий об'єкт коду
self.ocode = bp. Code.from_code (func.func_code)
def __add__(self, obj): # цей метод викликається для операції '+'
code = self.code[:] # копіюємо байткод
if isinstance (obj, FastFunctor): # якщо додаємо об'єкт - функтор,
# просто дописуємо його код до нашого.
# після свого виконання він «залишить» у вершині стеку результат
code.extend (obj.code)
else:
# інакше завантажуємо об'єкт в стек
code.append((byteplay.LOAD_CONST, obj))
# Дописуємо байткод, що додає два верхніх елементи стеку
code.append((byteplay.BINARY_ADD, None))
# Створюємо новий функтор, з байтокодом отримання суми
return self.__class__(self.ofunc, code = code)
def __call__(self, * dt, ** mp):
# цей метод буде викликаний для операції виклику object()
return self.fast() (* dt, ** mp) # конструюємо і викликаємо функцію
def fast(self): # конструюємо функцію з байтокода
if self.func is None: # якщо функція не була створена раніше
Подобные документы
Об'єктно-орієнтована мова Python - сучасна мова програмування, проста у вивченні та використанні. Наявність повної стандартної бібліотеки. Середовища програмування на Python. Механізм функціонування інтерпретатора. Колекції даних, комбіновані оператори.
презентация [753,2 K], добавлен 06.02.2014Аналіз предметної області та відомих реалізацій гри 2048. Універсальна мова моделювання UML в процесі проектування гри. Розробка алгоритмів функціонування модулів гри "2048". Оператори мови програмування Python. Особливості середовища Visual Studio.
курсовая работа [1,2 M], добавлен 17.02.2021Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.
курсовая работа [510,9 K], добавлен 14.03.2013Ведення обліку даних, що поступають на вхід стандартного інтерфейсу RS-232(COM-порт). Програма для графічного відображення вхідних даних у вигляді графіку та збереження отриманих даних. Візуальна об'єктно-орієнтована мова програмування високого рівня.
дипломная работа [292,4 K], добавлен 07.06.2010Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.
курсовая работа [123,3 K], добавлен 14.03.2013Розробка програми на мові програмування С++ з використанням об'єктно-орієнтованого програмування. Робота з файлами, графікою, класами, обробка числової інформації. Графічні засоби мови програмування. Алгоритм задачі та допоміжні програмні засоби.
курсовая работа [102,5 K], добавлен 14.03.2013Загальні принципи побудови заданої системи, її внутрішня структура та стандарти, основні етапи розробки та сучасні тенденції, оцінка функціональності. Магістраль крейта. Команди та програмування в системі КАМАК, оцінка її головних переваг і недоліків.
курсовая работа [33,7 K], добавлен 16.12.2015Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016Галузі застосування та принцип роботи мови програмування "Пролог". Керування процесом пошуку рішень, типи даних та використання списків. Рекурсивні процедури та цикли за допомогою пошуку з поверненням. Виконання арифметичних та логічних операцій.
курс лекций [99,7 K], добавлен 06.07.2011Мова C++ є як одна з найпоширеніших сучасних мов програмування. Базові засоби мови С++, її специфічні риси. Технологія складу програм, специфіка організації процесу програмування. Модульне програмування. Особливості об’єктно-орієнтованого програмування.
курсовая работа [49,6 K], добавлен 26.03.2010