Nazwa języka nie pochodzi od zwierzęcia, lecz od serialu komediowego emitowanego w latach siedemdziesiątych przezBBC – „Monty Python’s Flying Circus” (Latający cyrk Monty Pythona). Projektant, będąc fanem serialu i poszukując nazwy krótkiej, unikalnej i nieco tajemniczej, uznał tę za świetną[9].
Wersja 1.2 była ostatnią wydaną przez CWI. Od 1995 roku Van Rossum kontynuował pracę nad Pythonem wCorporation for National Research Initiatives (CNRI) wReston wWirginii, gdzie wydał kilka wersji Pythona, do 1.6 włącznie. W 2000 roku van Rossum i zespół pracujący nad rozwojem jądra Pythona przenieśli się do BeOpen.com, by założyć zespół BeOpenPythonLabs. Pierwszą i jedyną wersją wydaną przez BeOpen.com był Python 2.0.
Po wydaniu wersji 1.6 i opuszczeniu CNRI przez van Rossuma, który zajął się programowaniem komercyjnym, uznano za wysoce pożądane, by Pythona można było używać z oprogramowaniem dostępnym nalicencji GPL. CNRI iFree Software Foundation (FSF) podjęły wspólny wysiłek w celu odpowiedniej modyfikacji licencji Pythona. Wersja 1.6.1 była zasadniczo identyczna z wersją 1.6, z wyjątkiem kilku drobnych poprawek oraz licencji, dzięki której późniejsze wersje mogły być zgodne z licencją GPL. Python 2.1 pochodzi zarówno od wersji 1.6.1, jak i 2.0.
Choć w jego popularyzacji kładzie się nacisk na różnice w stosunku doPerla, Python jest pod wieloma względami do niego podobny. Jednakże projektanci Pythona odrzucili złożoną składnię Perla na rzecz bardziej oszczędnej i – ich zdaniem – bardziej czytelnej. Mimo że podobnie do Perla, Python jest czasem klasyfikowany jakojęzyk skryptowy, wykorzystuje się go do tworzenia dużych projektów jakserwer aplikacjiZope, system wymiany plikówMojo Nation, czy nawet oprogramowanie klasy ERP –Odoo.
W Pythoniewartości, a nie zmienne, posiadają typ – tak więc Python jest językiem z typami dynamicznymi, podobnie jakLisp, a w przeciwieństwie doJavy. W przeciwieństwie do wielu języków, wartości nie są przekazywane ani przez wartość, ani przez referencję, ale przez przypisanie[10].
W porównaniu z innymi językami programowania Python jest dość silnie typowany. Nie jest ani tak liberalny jak Perl, ani tak restrykcyjny jakOCaml. Reguły składniowe Pythona umożliwiają wyrażanie pojęć bez pisania dodatkowego kodu. Dla typów numerycznych zdefiniowana jest automatyczna konwersja, tak więc możliwe jest np. mnożenie liczby zespolonej przez liczbę całkowitą typulong bez rzutowania. Jednak w przeciwieństwie do Perla nie ma np. automatycznej konwersji pomiędzy napisami i liczbami; liczba nie jest prawidłowym argumentem dla operacji napisowej.
Python oferuje szeroki zakres podstawowych typów danych – w tym typy liczbowe (całkowite, zmiennoprzecinkowe,zespolone) oraz kolekcje.
Listy,krotki (ang.tuple) i napisy sąsekwencjami, w związku z czym udostępniają pewną liczbę wspólnych operacji (np. w identyczny sposób można iterować po kolejnych znakach napisu jak po elementach listy, czy też wskazywać elementy za pomocą indeksów). Listy to tablice o zmiennej liczbie elementów (z możliwością ich usuwania, dodawania i podmiany), zaś krotki to tablice o stałej liczbie elementów (bez możliwości usuwania, dodawania i podmiany)[11].
Innymi typami są kolekcje nieuporządkowane:słowniki (ang.dictionary, typdict) – znane w innych językach jako odwzorowania (ang.map) lub tablice asocjacyjne orazzbiory (ang.set) reprezentowane przez dwa typy: zbioru zmiennegoset i niezmiennegofrozenset. Słownikowe klucze oraz elementy zbiorów muszą być tzw. obiektami haszowalnymi (posiadającymi metodę__hash__()) – co na ogół oznacza, że muszą być niezmienne (niemutowalne); np. kluczem słownika nie może być lista ani zbiór zmienny (typuset) – może zaś być krotka bądź zbiór niezmienny (typufrozenset), o ile zawiera wyłącznie elementy niezmienne.
Python obsługuje typowy zestaw operacji na łańcuchach tekstowych. Łańcuchy w Pythonie są niezmienne. Każda operacja, która zmieniłaby zawartość napisu (np. zamiana małych liter na wielkie) zwróci nowy napis, pozostawiając oryginalny napis bez zmian[11].
Należy dodać, że podstawowe kolekcje w standardowej implementacji Pythona w C są wysoce zoptymalizowane pod kątem szybkości przeszukiwania, sortowania itp.
System typów w Pythonie jest silnie powiązany z systemem klas. Chociaż typy wbudowane nie są właściwie klasami, klasa może dziedziczyć z dowolnego typu. Można więc dziedziczyć klasy z napisów czy słowników, a nawet z liczb całkowitych. Ponadto możliwe jest dziedziczenie wielokrotne.
Język umożliwia rozległąintrospekcję typów i klas. Typy można odczytywać i porównywać – podobnie, jak wSmalltalku, typy (opisy typów) też są typem. Atrybuty obiektu można pobrać jako słownik.
W Pythonienie maenkapsulacji, jak to ma miejsce w C++ czy Javie, istnieją jednak mechanizmy pozwalające osiągnąć zbliżony efekt. Jednocześnie Python znacząco ułatwia introspekcję obiektów, tak więc właściwe użycie atrybutów obiektu pozostawia się programiście.
Dodatkowo każda funkcja, klasa i moduł mogą zostać opatrzone dokumentacją wkodzie źródłowym. Nie posiada ona wprawdzie rozbudowanych funkcji podobnych dojavadoc, ale jest dostępna w czasie wykonania programu, a więc i w trybie interaktywnym.
Emulowanie typów, przeciążanie operatorów, wywoływanie jako funkcje
Python pozwala dopasowywać własności danej klasy w szerokim zakresie. Implementując odpowiednie metody można sprawić, by obiekty danej klasy zachowywały się jak kolekcje, liczby, a nawet funkcje.
Przykład:
classEmulator:def__call__(self,x):print(f'Ten Emulator wywołano jako funkcję z parametrem x ={x}')def__getitem__(self,key):returnf'{key}-ty element w kontenerze klasy Emulator'e=Emulator()e('abc')e(123)print(e['def'])print(e[456])
Uruchomienie powyższego kodu da następujący rezultat:
Ten Emulator wywołano jako funkcję z parametrem x = abcTen Emulator wywołano jako funkcję z parametrem x = 123def-ty element w kontenerze klasy Emulator456-ty element w kontenerze klasy Emulator
Czytanie kodu zajmuje wielokrotnie więcej czasu niż pisanie, a czytelny program można łatwiej zrozumieć i rozwijać. Python został zaprojektowany tak, by zapewnić możliwie dużą czytelnośćkodu źródłowego. Posiada prosty układ tekstu, używa wcięć lub angielskich słów tam, gdzie inne języki korzystają ze znaków interpunkcyjnych i posiada zdecydowanie mniej konstrukcji składniowych, niż wiele języków strukturalnych, takich jakC,Perl czyPascal.
Dla czytelności, w Pythonie występują tylko dwa rodzaje pętli:for, w którejiteracja odbywa się po elementach listy (jak wperlowymforeach), orazwhile, która jest powtarzana, dopóki warunek logiczny jest spełniony. Python nie posiada składnifor w styluC,do...while, ani perlowegountil, choć można uzyskać ich złożone odpowiedniki.
Od wersji 2.5 Python posiadaoperator warunkowy, analogiczny dowarunek ? wartość1 : wartość2 znanego zC iJavy. Składnia:wartość1 if warunek else wartość2.
Cechą wyróżniającą Pythona spośród innych języków jest stosowanie wcięć do wydzielania bloków kodu. Jest to cecha unikatowa wśród powszechnie stosowanych języków programowania, jako pierwsza rzucająca się w oczyprogramistom niepiszącym w Pythonie.
W językach programowania wywodzących strukturę blokową odAlgola (niekoniecznie bezpośrednio) – np.Pascalu,C, czyPerlu – bloki kodu zaznaczane są klamrami lub słowami kluczowymi (C i Perl używają{ }, Pascal używabegin iend). Jednakże we wszystkich tych językach programiści tradycyjnie stosują wcięcia, by wyróżnić bloki w otaczającym kodzie.
Natomiast Python dziedziczy cechę mniej znanego językaABC – zamiast interpunkcji czy słów kluczowych używa samych wcięć do zaznaczania bloków. Wyjaśnić to można na prostym przykładzie zamieszczonym poniżej. Przedstawiona jest w nim funkcja licząca silnię wC i w Pythonie:
Dla niektórych programistów przyzwyczajonych do języków stylistycznie wzorowanych naAlgolu, gdzie spacja nie ma znaczenia składniowego, może to być mylące. Spotyka się czasem niepochlebne porównanie do sztywnego systemu kolumnowegokart perforowanych stosowanego w czasachfortranowych.
Istotnie, w swoim czasie możliwość stosowania zapisu, w którym decydujące były jedynie symbole, była dużym postępem. Jednak dla programistów piszących w Pythonie stosowanie składniowo znaczących wcięć jest po prostu przedłużeniem konwencji, która i tak jest stosowana np. wC. Zwolennicy tego języka zwracają także uwagę na wadę „swobodnej” składni, polegającą na tym, że skoro wcięcia kodu są ignorowane, nie można wymusić jednej dobrej konwencji (stąd też konflikty między programistami, dotyczące stosowaniaspacji (i różnej ich liczby) lubtabulatorów, tzw.indentation wars). Nieprawidłowo wcięty kod może być mylący, gdyż czytający go programista ikompilator mogą go różnie zinterpretować.
Komentarze zaczynają się od znaku „#” i kończą z końcem wiersza. Komentarze wieloliniowe można wstawiać w postaci wielowierszowychstringów (ograniczonych przez""" lub''') bez żadnych działań (np. przypisań);stringi te nie są traktowane jako wyrażenia przez interpreter.
Wielowierszowystring umieszczony w pierwszej linii ciała funkcji lub klasy albo na początku modułu, traktowany jest jako tzw.docstring (napis dokumentacyjny) dla tegoż obiektu. System dokumentacji Pythona może automatycznie tworzyć sformatowaną dokumentację zdocstringów, dając w ten sposób ograniczoną wersjęliterate programming. Dokumentację można przeglądać w trybie interaktywnym interpretera za pomocą funkcjihelp lub z poziomuwiersza poleceń za pomocą skryptupydoc(inne języki).
Inną cechą Pythona jest dostępność składni funkcyjnej. Jak można oczekiwać, upraszcza to znacznie obróbkę list i innych kolekcji. Jedną z takich konstrukcji jestlista składana (ang.list comprehension), przejęte z funkcjonalnegoHaskella, jak w przedstawionym poniżej przykładzie obliczania pięciu pierwszychpotęg dwójki:
Wykorzystującprogramowanie funkcyjne, można skrócić implementacjęsilni do jednolinijkowca bez uciekania się dorekurencji. W poniższym przykładzie użyto operacji redukcji listy:
Nieco mylące dla zwolenników programowania funkcyjnego może być słowo kluczowelambda. Blokilambda mogą zawierać jedynie wyrażenia, nie instrukcje. Nie są one więc najbardziej ogólnym sposobem tworzenia funkcji. Zamiast tego można zdefiniować i zwrócić funkcję, używając nazwy w zasięgu lokalnym, jak w poniższym przykładzie prostej funkcji generującej inną funkcję (ang.curry):
Oba warianty funkcjizbuduj_sumator zachowują się identycznie: dla podanej liczbyx zwracają funkcję, która dla podanej liczbyy wydrukuje wyrażenie arytmetyczne. Choć pierwszy styl jest częściej spotykany, drugi może być czytelniejszy dla programistów wyspecjalizowanych w programowaniu funkcyjnym.
Unikalne cechy pythonowych operatorów logicznychand ior dają jeszcze jedną unikalną możliwość programowania funkcyjnego. Przy wykorzystaniu tych dwóch operatorów można w wyrażeniachlambda zaimplementować dowolne sterowanie przebiegiem[1]. Wykorzystuje się to zwykle tylko do stosunkowo prostych konstrukcji (patrz rozdział ooperatorach logicznych).
Generatory są w Pythonie mechanizmemleniwej ewaluacji funkcji, która w przeciwnym razie musiałaby zwracać obciążającą pamięć lub kosztowną w obliczaniu listę. Stosowanie generatorów jest podobne do strumieni wScheme:
defgeneruj_calkowite(n):foriinrange(n):yieldi
Można teraz użyć tego generatora:
foriingeneruj_calkowite(7):printi
Przed wykonaniem drugiego fragmentu kodu należy zdefiniować zmiennąN.
Definicja generatora przypomina definicję funkcji, ale zamiast słowa kluczowegoreturn używa sięyield. Jednakowoż generator jest obiektem przechowującym stan, mogącym wielokrotnie wchodzić do i opuszczać ten sam dynamiczny zakres. Wywołanie generatora może być użyte zamiast listy lub innej struktury, po której elementach będziemy iterować. Za każdym razem, gdy pętlafor w powyższym przykładzie potrzebuje następnego elementu, wywoływany jest generator, który daje następny element.
W wersji 2.4 dodanowyrażenia generatorowe (ang.generator expressions), analogiczne do listy składanej. Zapis:
obiekty posiadające metodę__bool__(), jeśli zwraca onaFalse
Wszystko inne jest prawdą logiczną.
Operatoryand ior zwracają wartość ostatnio obliczonego wyrażenia, np. „x==5 or 3” zwróci 3. W Pythonie często pisze się instrukcje w rodzajuprint(p or q), by wykorzystać tę cechę.
Wartości logiczne zwracane przez operatory porównania (==,>,!=,is itp.), operator zawierania (in) oraz operatornegacji (not) reprezentowane są przez obiektyTrue iFalse. Gdyby więc w powyższym przykładzie kolejność wyrażeń zamienić na „3 and x==5”, zwrócona zostałaby wartośćTrue, gdyż tak ewaluowane jestx==5. Operatory porównania można łączyć, np. „-1 < x < 0” zwróciTrue dlax z przedziału (-1, 0) – tak, jak w zapisie matematycznym, a inaczej niż np. wC++.
Od Pythona 2.3True iFalse są wbudowanymi obiektami typubool. Wcześniej do identyfikatorów tych przypisane były obiekty liczb całkowitych, odpowiednio 1 i 0.
Python udostępnia i intensywnie wykorzystuje obsługęwyjątków jako sposób wykrywania błędów.
Styl programowania w Pythonie zaleca stosowanie wyjątków zawsze, gdy może pojawić się błąd wykonania. Na przykład nie testuje się praw dostępu do pliku przed jego otwarciem, lecz po prostu próbuje się go otworzyć, przechwytując wyjątek w razie braku dostępu.
Obsługa wyjątków jest możliwa za pomocą wyrażeniatry-except[12][13].
Poniżej znajduje się kod, który oczekuje od użytkownika podania liczby. Jeśli zostanie podana inna wartość (np. „xyz”), to kod wypisuje informację o błędzie i prosi o podanie nowej wartości.
najpierw wykonywany jest kod znajdujący się w blokutry.
jeśli nie wystąpi wyjątek, to kod znajdujący się w blokuexcept zostanie pominięty.
jeśli w czasie wykonywania kodu z blokutry pojawi się wyjątek, to pozostałe operacje z tego bloku zostaną pominięte.
jeśli typ wyjątku odpowiada określonemu w klauzuliexcept (na podstawie powyższego przykładu:ValueError), to wykonywany jest kod określony w blokuexcept.
jeśli pojawi się wyjątek, który nie został określony w klauzuliexcept, to jest on przekazywany do nadrzędnych wyrażeńtry. W przypadku kiedy żaden z blokówtry-except dostępnych w programie nie przechwytuje danego wyjątku, to jest on nazywany nieobsłużonym wyjątkiem (ang.unhandled exception). W takiej sytuacji wykonanie programu zakończy się z błędem.
W wersji 2.4 wprowadzono nowy element składni – notacjędekoratora. Przykład: w starszych wersjach Pythona, by uzyskaćmetodę statyczną klasy, należało napisać:
Python posiada rozbudowanąbibliotekę standardową, umożliwiającą jego stosowanie do wielu zadań. Twórcy języka stosują politykę tzw.Batteries Included, czyli dostarczenia wraz z pakietem instalacyjnym możliwie dużej liczby narzędzi. Moduły standardowej biblioteki można uzupełniać modułami pisanymi w C lub w Pythonie. Biblioteka standardowa jest szczególnie dobrze dostosowana do tworzenia aplikacji sieciowych, jako że obsługuje znaczną liczbę standardowych formatów i protokołów (np.MIME,HTTP). Dołączone są także moduły do tworzeniaGUI (na bazieTcl/Tk), obróbkiwyrażeń regularnych, nawet prosty serwerWWW z obsługąCGI.
Większa część biblioteki standardowej dostępna jest na wszystkich platformach, dzięki czemu nawet duże aplikacje mogą często być uruchamiane bez konieczności modyfikacji naUniksach, podWindows, naMacintoshu i innych platformach. Przeciwnie, niż np. dlaJavy, nie ogranicza się zestawu dostępnych funkcji do części wspólnej dla różnych platform; np. nauniksach dostępna jest funkcjaos.fork(), choć nie ma jej np. w Windows[14].
Podobnie, jak w wypadku innych języków, opracowany został szereg standardów tworzeniaAPI pomocniczego, np. sterownikówrelacyjnych baz danych. Ze względu na w pełni dynamiczny system typów nie ma konieczności dołączania do biblioteki standardowej „interfejsu bazowego”, jak to ma miejsce np. w przypadkuJDBC. Twórca biblioteki zewnętrznej musi po prostu zapewnić, by stworzone przez niego moduły, funkcje i klasy posiadały odpowiednie atrybuty.
PythonIDLE (Integrated Development and Learning Environment) działające na systemieUbuntu
Interpreter Pythona posiada takżetryb interaktywny, w którym wyrażenia można wprowadzać z terminala, otrzymując natychmiast wyniki. Zgodnie z założeniem twórców Pythona ułatwiać ma to naukę programowania, gdyż pozwala wypróbowywać fragmenty kodu ze skutkiem natychmiastowym. Standardowy shell nie jest jednakże zbyt wygodny ani nie posiada zbyt wielu funkcji (brak np. uzupełniania TAB-em) – braków tych jest pozbawionyIPython, będący częścią pakietuSciPy.
Wraz z Pythonem rozpowszechniana jest także bibliotekaunittest dotestów jednostkowych, pozwalająca na tworzenie wyczerpujących testów poprawności tworzonego oprogramowania[15].
↑Mark Summerfield: Rapid GUI Programming with Python and Qt. Cytat: If you are new to Python: Welcome! You are about to discover a language that is clear to read and write, and that is concise without being cryptic.. (ang.). Brak numerów stron w książce
↑Mark Summerfield: Rapid GUI Programming with Python and Qt. Cytat: Python is a very expressive language, which means that we can usually write far fewer lines of Python code than would be required for an equivalent application written in, say, C++ or Java.. (ang.). Brak numerów stron w książce
↑Python Software Foundation: 26.4. unittest – Unit testing framework. [dostęp 2017-03-07]. Cytat: The unittest module provides a rich set of tools for constructing and running tests. (ang.).