Python (programovací jazyk)

right|thumb|Ukážka kódu v Pythone

**Python** je interpretovaný, interaktívny programovací jazyk, ktorý vytvoril Guido van Rossum, pôvodne ako skriptovací jazyk pre Amoeba OS schopný systémových volaní. Python je často porovnávaný s jazykmi Tcl, Perl, Scheme, Java a Ruby. Python je vyvíjaný ako open source projekt, a je v súčasnosti pri verzii 3.14.

## Charakteristika
Python je multi-paradigmový jazyk podobne ako Perl, na rozdiel od Smalltalku alebo Haskellu. To znamená, že namiesto toho aby nútil programátora používať určitý štýl programovania, umožňuje používanie viacerých. Python podporuje objektovo orientované, štruktúrované aj funkcionálne programovanie. Je to dynamicky typový jazyk, podporuje veľké množstvo vysokoúrovňových dátových typov a na správu pamäte používa garbage collection.

Aj keď sa Python často označuje ako „skriptovací jazyk“, používa sa na vývoj mnohých veľkých softvérových projektov ako sú aplikačný server Zope a systémy na zdieľanie súborov Mnet a BitTorrent. Tak isto ho široko využíva Google. Zástanci Pythónu ho radšej volajú vysokoúrovňovým dynamickým programovacím jazykom, lebo pojem „skriptovací jazyk“ sa asociuje s jazykmi, ktoré sa používajú len na jednoduché shell skripty alebo s jazykmi ako JavaScript: jednoduchšími a na väčšinu účelov menej spôsobilými ako „skutočné“ programovacie jazyky ako Python.

Ďalšou dôležitou vlastnosťou Pythonu je to, že sa dá jednoducho rozširovať. Nové zabudované moduly môžu byť jednoducho napísané v C alebo C++. Python tiež môže byť použitý ako rozširovací jazyk pre existujúce moduly a aplikácie, ktoré potrebujú programovateľné rozhranie.

Aj keď návrhár Pythonu je trochu nepriateľský k funkcionálnemu programovaniu a k tradícii Lispu, sú tu viditeľné paralely medzi filozofiou Pythonu a filozofiou minimalistických jazykov Lispovej rodiny ako sú Scheme. Kvôli tomu veľa bývalých programátorov v Lispe považuje Python za príťažlivý.

Názov jazyka vôbec nevznikol z názvu druhu hada. Autor nazval jazyk podľa populárneho britského satirického seriálu Monty Python’s Flying Circus. Ale napriek tomu sa názov jazyka často asociuje práve s hadom a nie so seriálom.

## Dátové typy a štruktúry
Python podporuje základné dátové typy, ako celé čísla a čísla s pohyblivou desatinnou čiarkou, ale podporuje aj celé čísla neobmedzenej dĺžky a komplexné čísla.

Taktiež podporuje bežné operácie s reťazcami s jednou výnimkou: reťazce sú v Pythone nemenným typom, takže operácie, ktoré by inak menili reťazec (napríklad zámena znakov), namiesto toho vracajú nový reťazec.

V Pythone premenné nemajú typ, majú iba hodnoty. Teda Python je dynamicky typový jazyk na rozdiel od Java a C. Všetky hodnoty sa odovzdávajú odkazom a nie hodnotou.

Medzi dynamicky typovými jazykmi má Python stredne prísnu typovú kontrolu. Implicitné konverzie sú definované pre číselné typy, takže môžeme napríklad vynásobiť komplexné číslo celým bez explicitného pretypovania. Ale nie je tu implicitná konverzia medzi číslami a reťazcami.

### Kolekcie
Jedným z fundamentálnych aspektov Pythonu je koncept kolekčných (alebo kontajnerových) typov. Vo všeobecnosti kolekcia je objekt, ktorý obsahuje iné objekty tak, že k nim môžeme pristupovať pomocou indexov alebo kľúčov. Kolekcie majú dve základné formy: mapované typy a sekvenčné typy.

Mapované typy sú nezoradené premenné typy implementované v podobe asociatívneho poľa, ktoré mapuje množinu objektov alebo kľúčov na elementy v množine hodnôt podobne ako matematické funkcie.

Iným typom kolekcií sú zoradené postupnosti – sekvenčné typy, ktoré reprezentujú zoznamy, tuple a reťazce. Všetky sekvenčné typy sú indexované pozične (od 0 po dĺžku – 1) a všetky okrem reťazcov môžu obsahovať objekty ľubovoľného typu (reťazce môžu obsahovať iba znaky, ktoré sú v Pythone reprezentované ako jednoznakové reťazce). Reťazce a tuple sú nemenné, zatiaľ čo zoznamy sú premenné, teda môžeme pridávať, odoberať alebo meniť elementy.

Python tak isto poskytuje rozsiahle možnosti manipulácie s kolekciami ako je zabudovaný operátor na kontrolu, či kolekcia obsahuje daný objekt, a jednoduchá iterácia pomocou „`for element in list`“.

### Objektový systém
Systém dátových typov Pythonu je dobre integrovaný so systémom tried. Zabudované dátové typy nie sú skutočnými triedami, ale triedy môžu od nich dediť. Takže je možné rozširovať reťazce, asociatívne polia alebo celé čísla.

Jazyk podporuje rozsiahlu introspekciu typov a tried. Typy môžeme prečítať a porovnávať, teda, ako v Smalltalku, typy sú tiež objektmi. Atribúty objektu môžeme extrahovať ako asociatívne pole.

Operátory môžu byť v Pythone predefinované pomocou zadefinovania špeciálnej členskej funkcie, napríklad definovanie `__add__` v triede dovolí používať operátor `+` na inštancie triedy.

## Syntax
Python bol navrhovaný tak, aby bol dobre čitateľný. Má jednoduché vizuálne rozmiestnenie, často používa anglické kľúčové slová tam, kde iné jazyky používajú interpunkciu a má nápadne menej syntaktických konštrukcií ako mnohé iné štruktúrované jazyky ako C, Perl alebo Pascal.

Napríklad Python má len dva tvary cyklov: `for`, ktorý prechádza elementmi zoznamu alebo iterátoru a `while`, ktorý sa opakuje, kým hodnota výrazu je true. Chýba mu komplexný `for` v štýle C a `do`...`while`, aj keď sa samozrejme dajú ekvivalentne vyjadriť. Takisto má na vetvenie iba `if`...`elif`...`else` – žiadne `switch` alebo `goto` (goto bolo implementované ako vtip pre 1. apríl 2004 ako prídavný modul).

### Syntaktická významnosť odsadenia
Jedným z nezvyčajných aspektov syntaxe Pythona je spôsob, akým sa určujú bloky v programe. Je to aspekt syntaxe Pythonu, o ktorom počuli aj programátori, ktorí inak nepoznajú Python, keďže je dosť unikátny medzi jazykmi rozšírenými v súčasnosti (iný jazyk zdieľajúci túto vlastnosť je Haskell).

V jazykoch, ktoré používajú blokovú štruktúru zdedenú po ALGOL)e (vrátane Pascalu, C, Perlu a mnohých iných) bloky kódu sú oddelené pomocou zátvoriek alebo kľúčových slov ako `begin` a `end` v Pascale. Avšak vo všetkých týchto jazykoch programátori obyčajne používajú odsadzovanie kódu v bloku od kraja, aby vizuálne oddelili blok od ostatného kódu.

Python na rozdiel od toho požičiava vlastnosť z málo známeho jazyka ABC – namiesto interpunkcie alebo kľúčových slov používa samotné odsadzovanie na určenie bloku. Ozrejmí to krátky príklad. Tu je rekurzívna funkcia v C a v Pythone, ktorá robí to isté – vypočíta faktoriál celého čísla.

*Faktoriál v C:*

```c
int factorial(int x) {
     if (x == 0) {
         return 1;
     } else {
         return x * factorial(x-1);
     }
 }
```


*Faktoriál v Pythone:*

```python
def factorial(x):
     if x == 0:
         return 1
     else:
         return x * factorial(x-1)
```


*Faktoriál v Pythone za použitia lambdy:*

```python
factorial = lambda x: 1 if x==0 else x*factorial(x-1)
```


### Dokumentačné reťazce
Reťazec umiestnený hneď za definíciou triedy alebo funkcie alebo na začiatku modulu sa stáva asociovaným dokumentačným reťazcom (tzv. docstring). Existujú nástroje na automatické vytváranie dokumentácie vo formáte HTML založenej na dokumentačných reťazcoch.

### Funkcionálne programovanie
Ako už bolo spomenuté, ďalším kladom Pythonu je dostupnosť funkcionálneho štýlu programovania. Ako sa dá očakávať, umožňuje to oveľa priamočiarejšiu prácu so zoznamami a inými kolekciami. Jedna z takýchto konštrukcií je *list comprehension*, prebratá z funkcionálneho jazyka Haskell, ako je vidieť tu na výpočte prvých piatich mocnín čísla dva:


```python
numbers = [1, 2, 3, 4, 5]
 powers_of_two = [2**n for n in numbers]
```


Algoritmus quicksort môže byť tiež elegantne vyjadrený pomocou list comprehensions:


```python
def qsort(L):
     if L == []: return []
     return qsort([x for x in L[1:] if x< L[0] ]) + L[0:1] + \
         qsort([x for x in L[1:] if x>=L[0] ])
```


Keďže Python umožňuje odovzdávať funkcie ako argumenty, je možné vyjadriť aj ďalšie funkcionálne konštrukcie.

#### Lambda
Pomocou kľúčového slova `lambda` môžeme vytvárať malé anonymné funkcie. Bloky `lambda` v Pythone môžu obsahovať len jeden výraz a nemôžu obsahovať príkazy. Tu je funkcia, ktorá vracia súčet svojich dvoch argumentov: 
```python
lambda a, b: a+b
```


#### Exec
Python umožňuje vykonanie kódu, ktorý je napr. obsahom premennej, pomocou funkcie `exec`. V zásade je tak možné spúšťať program, ktorý bude akoby meniť sám seba.
Príklad:

```python
premenna="""print "ahoj svet"; premenna="print 'tak ahoj';stale=False" """

 stale=True

 # keby sme nepoznali obsah premennej "premenna" mohli by sme sa domnievat, ze v dalsom riadku bude stale vykonavane to iste
 while stale: exec premenna

 """ Prebehnu vsak iba dva cykly a vypis bude:

 ahoj svet
 tak ahoj

  Co sa udialo? premenna "premenna" sa vykona prvykrat - cosi vypise a zmeni svoj obsah
  vykona sa druhykrat, ale druhykrat uz je jej obsahom zmena premennej "stale" na False
  (plus tlac ineho textu ako v prvom cykle) takze vykonanie tretikrat uz nebude  
 """
```


#### Generátory
Generátory v Pythone sú mechanizmom pre tzv. „lenivé vyhodnocovanie“ funkcií, ktoré by inak vracali neúmerne veľké alebo výpočtovo náročné zoznamy.

Príklad:


```python
def generate_ints(N):
     for i in xrange(N):
         yield i
```


Teraz môžeme použiť generátor generate_ints:


```python
for i in generate_ints(N):
     print i
```


Definícia generátora vyzerá rovnako ako definícia funkcie, len namiesto kľúčového slova `return` je použité `yield`. Volanie generátora môžeme použiť namiesto zoznamu, alebo inej štruktúry, cez elementy ktorej chceme postupne prechádzať. Vždy, keď cyklus *for* v príklade potrebuje ďalší prvok, zavolá sa generátor, ktorý dá ďalší prvok.

### Objektovo orientované programovanie
Python má rozsiahlu podporu pre objektovo orientované programovanie. Podporuje nielen polymorfizmus tried dediacich od tej istej triedy ako v staticky typových jazykoch, ale aj plný polymorfizmus pre všetky objekty. Všetko v Pythone je objekt vrátane tried, funkcií, čísel a modulov. Python tiež podporuje metatriedy – pokročilý nástroj na rozšírenie funkcionality tried. Samozrejme podporuje dedičnosť vrátane viacnásobnej dedičnosti. Má obmedzenú podporu pre súkromné premenné.

### Spracovanie výnimiek
Python podporuje spracovanie výnimiek vo význame testovania chýb a iných výnimočných udalostí v programe. Takto je možné zachytiť aj výnimku spôsobenú syntaktickou chybou.

Výnimky dovoľujú stručnejšiu a spoľahlivejšiu kontrolu chýb ako iné spôsoby ohlasovania chýb alebo výnimočných udalostí. Výnimky nerobia kód neprehľadným ako testovanie vráteného kódu chyby v C a môžu sa jednoducho šíriť volajúcimi funkciami, ak chyba musí byť ohlásená vyššej úrovni programu.

## Štandardná knižnica
Python má rozsiahlu štandardnú knižnicu, ktorá ho robí vhodným na veľa úloh. Moduly štandardnej knižnice môžu byť rozšírené vlastnými modulmi napísanými v C alebo v Pythone. Štandardná knižnica je dobre prispôsobená písaniu aplikácií pracujúcich s Internetom, lebo podporuje množstvo štandardných formátov a protokolov (napríklad MIME a HTTP). Tak isto sú tam moduly pre vytváranie grafického užívateľského rozhrania, pripájanie sa k relačným databázam a manipulovanie s regulárnymi výrazmi.

Väčšia časť štandardnej knižnice je kompatibilná medzi platformami, teda programy môžu pracovať v UNIX, Windows, Macintosh a iných platformách bez zmeny.

## Ďalšie vlastnosti
Interpreter Pythonu tiež podporuje interaktívny režim, v ktorom výrazy môžu byť zadávané z terminálu a môžeme okamžite vidieť výsledok. Je to výhoda pre tých, ktorí sa učia jazyk, ale aj pre skúsených vývojárov: časti kódu môžu byť testované v interaktívnom režime pred tým, ako budú integrované do programu. Interaktívny shell pre python ipython, ktorý podporuje okrem iného aj code highlighting a automatické dopĺňanie výrazov, môže slúžiť priam ako náhrada systémového shellu. To môže byť užitočné zvlášť pre platformu Windows, ktorej štandardný shell je veľmi nepraktický.

Python tak isto obsahuje vstavaný debugger, profiler a nástroje na testovanie (unit testing framework).

## Popularita
Od roku 2003 sa Python sústavne umiestňuje v prvej desiatke najobľúbenejších programovacích jazykov v indexe TIOBE Programming Community Index, kde je od februára 2021 tretím najpopulárnejším jazykom (po jazykoch Java a C). Bol zvolený za programovací jazyk roka (za „najvyšší nárast hodnotení za rok“) v rokoch 2007, 2010, 2018 a 2020 (jediný jazyk, ktorý to dokázal štyrikrát).

Empirická štúdia zistila, že skriptovacie jazyky, ako napríklad Python, sú produktívnejšie než konvenčné jazyky, ako sú C a Java, pri problémoch s programovaním, ktoré zahŕňajú manipuláciu so reťazcom a vyhľadávanie v slovníku, a zistila, že spotreba pamäte bola často „lepšia ako pri Jave a nie oveľa horšia ako pri C alebo C++“.

Medzi veľké organizácie, ktoré používajú Python, patria Wikimedia Foundation, Google, Yahoo!, CERN, NASA, Facebook, Amazon, Instagram, Spotify a niektoré menšie subjekty ako ILM a ITA. Sociálna sieť Reddit bola napísaná väčšinou v jazyku Python.

## Podporované platformy
Aj keď Python bol originálne programovaný pre platformu Amoeba OS, táto verzia je „mŕtva“ (nie je udržiavaná). Najpopulárnejšie platformy, na ktorých pracuje Python, sú Linux, BSD, Mac OS X, Microsoft Windows a Java (Java verzia je kompletne oddelená implementácia). Mac GUI pre Python je spravované externým projektom nazývaným MacPython a bolo zahrnuté do Mac OS 10.3 „Panther“. Ďalšie podporované platformy sú:
* Mac Classic
* SPARC Solaris
* tak isto ďalšie Unixy, napr. Irix
* OS/2
* Amiga
* AROS
* AS/400
* BeOS
* BSD
* OS/390
* z/OS
* QNX
* VMS
* Psion
* RISC OS (predtým Acorn)
* VxWorks
* PlayStation 2
* Sharp Zaurus
* Windows CE/Pocket PC
* PalmOS
* S60
Ale väčšina knižníc pre Python je dostupná iba pre Linux, BSD, Mac OS X a Windows.

## Referencie

## Iné projekty

## Externé odkazy
* Oficiálna stránka projektu
* Odborné (cz) stránky o Pythonu
* www.py.cz PyCZ, „vše, co má alespoň něco společného s Pythonem“
* učebnica programovania v pythone, česky + anglicky
* Rozšírenie PyDev do IDE Eclipse pre vývoj v Pythone


Kategória:Programovacie jazyky
Kategória:Skriptovacie jazyky
Kategória:Viacplatformový softvér