Python е език за програмиране от високо ниво, интерпретативен, интерактивен, обектно ориентиран, създаден от Гуидо ван Росум в началото на 90-те години. Кръстен е на телевизионното шоу на BBC Monty Python’s Flying Circus. Често бива сравняван с Tcl, Perl, Scheme, Java и Ruby.

История Идеята за Python се заражда в края на 1980-теVenners, Bill (13 януари 2003). The Making of Python. Artima Developer. Artima. Посетен на 22 март 2007. години, като реалното осъществяване започва през декември 1989 г.van Rossum, Guido (20 януари 2009). A Brief Timeline of Python. The History of Python. Google. Посетен на 20 януари 2009. от Гуидо ван Росум в CWI (Centrum Wiskunde & Informatica – международно признат изследователски институт по математика и компютърни науки, локализиран в Амстердам, Холандия). Python имал за цел да се превърне в наследник на ABC (език за програмиране, от своя страна вдъхновен от SETL), който да бъде способен да обработва изключения и да е съвместим с операционната система Amoeba.Why was Python created in the first place?. General Python FAQ. Python Software Foundation. Посетен на 22 март 2007. Ван Росум е основният автор на Python, а неговата продължаваща централна роля в развитието на езика е ясно отразена в титлата, дадена му от Python общността – „пожизнен доброжелателен диктатор“ (benevolent dictator for life, BDFL).

Структура и функционалност

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

Python позволява разделянето на една програма на модули, които могат да се използват отново в други програми. Също така притежава голям набор от стандартни модули, които да се използват като основа на програмите. Съществуват и вградени модули, които обезпечават такива събития и елементи като файлов вход/изход (I/O), различни системни функции, сокети (sockets), програмни интерфейси към GUI библиотеки като Tk и др.

Поради факта, че Python е интерпретативен език, се спестява значително време за разработка, тъй като не са необходими компилиране и свързване (linking) за тестването на дадено приложение. Програмната му идеология е сходна с тази на Java и всяко приложение, написано на него, е сравнително лесно преносимо и в други платформи (или операционни системи).

Програмите, написани на Python, са доста компактни и четими, като често те са и по-кратки от своите еквиваленти, написани на C/C++. Това е така, понеже: наличните сложни типове данни позволяват изразяването на сложни действия с един-единствен оператор; групирането на изразите се извършва чрез отстъп, вместо чрез начални и крайни скоби или някакви ключови думи (друг език, използващ такъв начин на подредба, е Haskell); не са необходими декларации на променливи или аргументи; Python съдържа прости конструкции, характерни за функционалния стил на програмиране, които му придават допълнителна гъвкавост.

Всеки модул на Python се компилира преди изпълнение до код за съответната виртуална машина. Този код се записва за повторна употреба като .pyc файл.

Програмите, написани на Python, представляват съвкупност от файлове с изходен код. При първото си изпълнение този код се компилира до байткод, а при всяко следващо се използва кеширана версия. Байткодът се изпълнява от интерпретатор на Python. Ще отбележим още и следните особености:

Езикът е строго типизиран (strong typing) – при несъответствие между типовете е необходимо изрично конвертиране. Езикът поддържа и динамична типизация (dynamic typing) – типовете на данните се определят по време на изпълнението. Работата се основава на принципа duck typing – типът на обектите се оценява според техните свойства. Поддържа се garbage collector – вътрешната реализация на езика се грижи за управлението на паметта. Блоковете се формират посредством отстъп. Като разграничител между програмните фрагменти се използва нов ред.

Версии Езикът се обновява често. Версия 3 съдържа много промени и поради това е несъвместима с по-старите реализации на езика. Повечето налични библиотеки и програми са написани и работят за версия 2.

Python използва номенклатура major.minor.micro за официалните издания на езика. Например, за версията Python 3.1.2 final, major версията е 3, minor версията е 1, а micro версията е 2.

Примерна програма Изходен код на примерна Hello, World! програма:

print('Hello, World!')Програма за изчисляване на факториeла на цяло положително число:n = int(input('Type a number, and its factorial will be printed: '))

if n < 0: raise ValueError('You must enter a non-negative integer')

factorial = 1 for i in range(2, n + 1): factorial *= i

print(factorial)

Аритметични операции Python притежава обичайните аритметични оператори (+, -, *, /, %), а ** е допълнителен оператор, който се използва за степенуване, например 5**3 == 125. Поведението на операцията за деление се променя значително с течение на времето:Zadka, Moshe; van Rossum, Guido (11 март 2001). PEP 238 – Changing the Division Operator. Python Enhancement Proposals. Python Software Foundation. Посетен на 23 октомври 2013. Python 2.1 и по-ранни версии заимстват делението от езика C. Операторът / изпълнява целочислено деление, ако и двата операнда са цели числа, и деление с плаваща запетая в противния случай. Целочисленото деление закръглява към нулата, например 7 / 3 == 2 и -7 / 3 == -2. Python 2.2 променя целочисленото деление, така че да осъществява закръгляването надолу (към минус безкрайност), например 7 / 3 == 2 и -7 / 3 == -3. В тази версия е въведен операторът //, който извършва деление със закръгляване надолу (към по-ниската целочислена стойност). Неговото поведение може да се подразбере от следните примери: 7 // 3 == 2, -7 // 3 == -3, 7.5 // 3 == 2.0 и -7.5 // 3 == -3.0. Python 3.0 променя оператора /, така че той винаги да изпълнява ролята на деление с плаваща запетая. По-общо: във версиите преди Python 3.0 / представлява „класическо деление“, докато във версия 3.0 / е деление на реални числа, а // е деление със закръгляване надолу (към по-ниската целочислена стойност).

Макар и в противовес с повечето други езици, закръгляването надолу (в посока минус безкрайност) придава постоянство на изпълняваните операции. Например това означава, че равенството (a + b) // b == a // b + 1 е винаги вярно. Също така означава, че равенството b * (a // b) + a % b == a е валидно както за положителните, така и за отрицателните стойности на a. Въпреки това поддържането на валидността на представеното равенство означава, че докато резултатът от a % b е в интервала [0, b) при положителна стойност на b, то при отрицателна стойност на b трябва да бъде в интервала (b, 0].Why Python's Integer Division Floors. Посетен на 25 август 2010.

Python предлага функция round за закръгляване на десетични към цели числа. Версиите преди Python 3.0 използват закръгляване далеч от нула: round(0.5) би дало като резултат 1.0 (закръгляване нагоре), съответно round(-0.5) връща −1.0 (закръгляване надолу).round, The Python standard library, release 2.7, §2: Built-in functions. Посетен на 14 август 2011 Python 3.0 използва закръгляване към най-близкото четно число: round(1.5) връща като резултат 2, съответно round(2.5) отново е равно на 2.round, The Python standard library, release 3.2, §2: Built-in functions. Посетен на 14 август 2011

Python позволява използването на булеви изрази с множество релации на равенство по начин, който е в съответствие със стандартната употреба на равенства в математиката. Например изразът a < b < c проверява дали a е по-малко от b и дали b е по-малко от c. Езиците, произхождащи от C, интерпретират този израз по различен начин: първо се пресмята a < b, връщащо като резултат 0 или 1, след което тази стойност се сравнява с c.

Поради своята богата математическа библиотека Python често е използван като скриптов език с научна насоченост за решаване на различни задачи от приложната математитка, например обработка и управление на числови данни.

Преглед на функциите За разлика от много други езици, Python не изисква декларации на променливи, те се създават при инициализацията им. Python разполага с вградени в самия език структури като: комплект (tuple), списък (list) и речник **(dictionary/map). Типът на променливата се определя от типа на присвоените стойности, в това отношение прилича на BASIC и се различава от много други програмни езици. Присвояването на различни стойности е коректно и това води до промяна на типа на променливата спрямо последната и присвоена стойност.

Комплект (tuple) Комплектът се състои от елементи, които могат да бъдат произволни: прости константи или обекти. Елементите на комплекта не е задължително да са еднородни.

Комплектите (подобно на символните низове) са непроменливи: не е възможно да се присвои стойност на даден елемент от комплекта. Възможно е създаването на комплект, който съдържа в себе си променливи обекти – например списък (list).

Комплектите могат да бъдат вложени един в друг. Дефинират се чрез изброяване със запетайка, поставени в кръгли скоби.

(1, 4, 1, 78) (3.14, 'string', -5)

Всички елементи са индексирани от нулата. За получаването на i-тия елемент трябва да се посочи името на комплекта и след това индексът i в квадратни скоби.

Пример: t = (0, 1, 2, 3, 4) print(t, t[-1], t[-3]) Резултат: 0 4 2

По този начин комплектът може да се нарече вектор – константа, ако елементите му са били еднородни.

Списък (list) Списъците са съставен (compound) тип данни, групиращ стойности (елементи), които сами по себе могат да бъдат от различен тип и могат да бъдат подменени след тяхната декларация. Възможно е присвояване на изрезки, като това може да промени и размера на списъка. Може да се вмъква друг списък в настоящия, да се добавят единични елементи, премахват и т.н.

Дефинира се чрез изброяване на елементите със запетая, поставени между квадратни скоби. Пример: [2, 4.87, ‘s’] [‘string’, (2,4,1), [5,8]] Достъп до елементите се осъществява както и в комплекта. Пример: list = [1, ‘w’, (2,8), [0,3,4]] print list, list, list[-2], list[-1] Резултат: 1 w (2,8) 0

Речник (dictionary/map) Речникът е неподредено множество от двойки (ключ, стойност), като ключа е константа от всеки тип (най-вече символни низове). Комплекти могат да бъдат използвани за ключове само в случай, че не използват променливи обекти. Не може да се използва списък (list), тъй като той притежава възможността да се променя.

Основните операции са: Съхраняване на стойност под някакъв ключ (съхраняването на две стойности под един и същи ключ е невъзможно, запазва се втората такава подадена със съответния ключ). Извличане на стойността при подаване на ключа. Премахване на двойка ключ – стойност чрез „del“. Методът keys() на обект от тип речник връща списък с всички използвани ключове, а has_key() проверява дали даден ключ е в речника.

Чифт големи скоби „{ }“ създават празен речник. Пример: d = {'a': 1, 'b': 3, 5: 3.14, 'name': 'John'} d['b'] = d print d['a'], d['b'], d, d['name'] Резултат: 1 3.14 3.14 John За да добавите нова двойка „ключ“:„стойност“, е достатъчно да присвоите на елемент с нов ключ съответната стойност: d['new'] = 'new value' print d Резултат: {'a':1, 'b':3, 5:3.14, 'name':'John', 'new':'new value'}

Python не поддържа указатели, динамична памет и адресна аритметика (подобно на Java). Присвояване от една променлива към друга (Пример: a = 2; b = a;) има своите особености в Python. В случаи на присвояване на обекти от тип числа или низове се създава нов обект (под „нов обект“ да се разбира памет за съхранение на стойност от всеки тип). Копираното съдържание се присвоява от променливата 'а' в променливата 'b'(семантика на копирането – променливите от двете страни на оператора значат два независими обекта).