Python: Porovnání verzí

Smazaný obsah Přidaný obsah
m →‎Výkon: ČJ za použití AWB
značky: revertováno možný vandalismus odstraněno <references /> editace z Vizuálního editoru
Řádek 2:
{{Aktualizovat|komentář=10 let nedotknutá poslední kapitola, která verzi 3 považuje za novou; v příkladech upřednostňovat verzi 3}}
{{Upravit část|poznámky=}}
VV:{{Infobox - programovací jazyk
| název = Python
| logo = Python_logo_and_wordmark.svg
Řádek 23:
| datum poslední testovací verze = Ve vývoji
}}
'''Python''' ([[Angličtina#V.C3.BDslovnost|anglická výslovnost]] [ˈpaiθən]) je vysokoúrovňový [[Skriptovací jazyk|skriptovací]] [[programovací jazyk]], který v&nbsp;roce [[1991]]<ref name="guido">{{Citace elektronické monografie
| příjmení = van Rossum
| jméno = Guido
| titul = Python - zdrojové kódy. Python Foundation. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY.
| url = http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY
| datum přístupu = 2010-04-12
| url archivu = https://web.archive.org/web/20160217132249/http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY
| nedostupné = ano
| datum archivace = 2016-02-17
}}</ref> navrhl [[Guido van Rossum]]. Nabízí [[Typová kontrola|dynamickou kontrolu datových typů]] a podporuje [[Multiparadigmatický programovací jazyk|různá programovací paradigmata]], včetně [[Objektově orientované programování|objektově orientovaného]], [[Imperativní programování|imperativního]], procedurálního nebo [[Funkcionální programování|funkcionálního]]. V roce 2018 vzrostla jeho popularita a zařadil se mezi nejoblíbenější jazyky. V řadě různých žebříčků dosahuje jedno z prvních třech míst, výjimkou nebývají první místa.
 
Python je vyvíjen jako [[Otevřený software|open source]] projekt, který zdarma nabízí instalační balíky pro většinu běžných [[Počítačová platforma|platforem]] ([[Unix]], [[Microsoft Windows|MS Windows]], [[OS X|macOS]], Android); ve většině [[Linuxová distribuce|distribucí]] systému [[GNU]]/[[Linux]] je Python součástí základní instalace.
Řádek 42 ⟶ 51:
== Vlastnosti ==
[[Soubor:Python 3. The standard type hierarchy.png|náhled]]
Phyton je ve skratce program '''kterým se programuje''' ale je placený a obsahuje '''32 GB místa'''
Python je dynamický [[interpretovaný jazyk]]. Někdy bývá zařazován mezi takzvané [[skriptovací jazyk]]y. Jeho možnosti jsou ale větší. Python byl navržen tak, aby umožňoval tvorbu rozsáhlých, plnohodnotných aplikací (včetně [[grafické uživatelské rozhraní|grafického uživatelského rozhraní]] – viz například [[wxPython]], který využívá [[wxWidgets]], nebo [[PySide]] a [[PyQT]] pro [[Qt (knihovna)|Qt]], a nebo [[PyGTK]] pro [[GTK+]]).
 
Python je hybridní jazyk (nebo také ''[[Multiparadigmatický programovací jazyk|multiparadigmatický]]''), to znamená, že umožňuje při psaní programů používat nejen [[objektově orientované programování|objektově orientované]] paradigma, ale i [[procedurální programování|procedurální]] a v omezené míře i [[funkcionální programování|funkcionální]], podle toho, komu co vyhovuje nebo se pro danou úlohu hodí nejlépe. Python má díky tomu vynikající vyjadřovací schopnosti. Kód programu je ve srovnání s jinými jazyky krátký a dobře čitelný.
 
K význačným vlastnostem jazyka Python patří jeho jednoduchost z hlediska učení. Bývá dokonce považován za jeden z nejvhodnějších programovacích jazyků pro začátečníky.{{Fakt/dne|20170327140858|}} Tato skutečnost je dána tím, že jedním z jeho silných inspiračních zdrojů byl programovací jazyk [[ABC (programovací jazyk)|ABC]], který byl jako jazyk pro výuku a pro použití začátečníky přímo vytvořen. Python ale současně bourá zažitou{{Fakt/dne|20170327140858|}} představu, že ''jazyk vhodný pro výuku není vhodný pro praxi a naopak''. Podstatnou měrou k tomu přispívá čistota a jednoduchost [[syntax]]e, na kterou se při vývoji jazyka hodně dbá. K definici [[blok (programování)|bloků]] se v Pythonu (na rozdíl od většiny jazyků) používá pouze odsazování.
 
Význačnou vlastností jazyka Python je produktivnost z hlediska rychlosti psaní programů. Týká se to jak nejjednodušších programů, tak aplikací velmi rozsáhlých. U jednoduchých programů se tato vlastnost projevuje především stručností zápisu. U velkých aplikací je produktivnost podpořena rysy, které se používají při [[programování ve velkém]], jako jsou například přirozená podpora [[Jmenný prostor|jmenných prostorů]], používání [[Výjimka (programování)|výjimek]], standardně dodávané prostředky pro psaní testů ([[unit testing]]) a dalšími. S vysokou produktivností souvisí dostupnost a snadná použitelnost široké škály knihovních modulů, umožňujících snadné řešení úloh z řady oblastí.
 
Python se snadno vkládá do jiných aplikací (embedding), kde pak slouží jako jejich skriptovací jazyk. Tím lze aplikacím psaným v [[kompilovaný programovací jazyk|kompilovaných programovacích jazycích]] dodávat chybějící pružnost. Jiné aplikace nebo aplikační knihovny mohou naopak implementovat rozhraní, které umožní jejich použití v roli pythonovského modulu. Jinými slovy, pythonovský program je může využívat jako modul dostupný přímo z jazyka Python (tj. extending, viz sekce [[#Spolupráce s jinými aplikacemi|Spolupráce s jinými aplikacemi]]).
 
[[Programování]] v Pythonu klade velký důraz na produktivitu práce [[programátor]]a. Myšlenky návrhu jazyka jsou shrnuty ve [[filosofie Pythonu|filosofii Pythonu]].
 
Nebezpečnou vlastností Pythonu je, že obsahuje nedokumentované funkce a lokální proměnné, které mohou být zneužity pro spuštění příkazu v operačním systému.<ref>{{Citace elektronického periodika
| příjmení = Krčmář
| jméno = Petr
| titul = Chyby v programovacích jazycích ohrožují bezpečnost aplikací
| periodikum = root.cz
| odkaz na periodikum =
| datum vydání = 12. 12. 2017
| datum přístupu =
| ročník =
| url = https://www.root.cz/clanky/chyby-v-programovacich-jazycich-ohrozuji-bezpecnost-aplikaci/
| issn = 1212-8309
}}</ref>
 
Pro Python je v provozu jeho vlastní repozitář balíčků s knihovnami, [[PyPI]], který podporuje snadnou instalaci balíčků programem [[pip (Python)|pip]].
 
== Různé implementace Pythonu ==
 
Standardní Python je implementován v jazyce [[C (programovací jazyk)|C]]. Tuto implementaci vyvíjí Python Software Foundation a tato implementace představuje a definuje standard jazyka Python. Existuje ale celá řada dalších implementací jazyka Python pro různá prostředí nebo další cíle.{{Autoritní data}}
 
=== CPython ===
Standardní Python je implementován v [[C (programovací jazyk)|jazyce C]], tato implementace je označována [[CPython]]. V ní probíhá další vývoj jazyka Python. Verze jazyka Python jsou zveřejňovány jak v podobě [[zdrojový kód|zdrojového kódu]], tak v podobě přeložených instalačních balíků pro různé cílové platformy.
 
Dostupnost zdrojového kódu a vlastnosti [[C (programovací jazyk)|jazyka C]] umožňují zabudovat interpret jazyka Python do jiné aplikace psané v jazycích [[C (programovací jazyk)|C]] nebo [[C++]]. Takto zabudovaný [[interpret (software)|interpret]] jazyka Python pak představuje nástroj pro pružné rozšiřování funkčnosti výsledné aplikace ''zvenčí''. Existuje i projekt pro užší spolupráci s C++ nazvaný [[Boost.Python]]
 
Z těchto důvodů – a s přihlédnutím k obecně vysokému výkonu aplikací psaných v jazyce C – je CPython nejpoužívanější implementací jazyka Python.
 
=== Jython ===
Jython je implementace Pythonu pro prostředí JVM. Je implementován v jazyce [[Java (programovací jazyk)|Java]]. Kód napsaný v Jythonu běží v [[Java Virtual Machine|JVM]] Javy a může používat všechny knihovny prostředí Java. V Javě lze naopak používat všechny knihovny napsané v Jythonu.
 
[[Jython]] je implementace CPythonu 2. Poslední stabilní verze Jythonu 2.7.1 je z roku 2017. Aktuální vývoj viz [http://www.jython.org/ stránky projektu].
 
=== IronPython ===
IronPython je implementace Pythonu pro prostředí [[.NET]]/[[Mono (platforma)|Mono]].
 
Za výhody lze považovat to, že se Python tímto stává jedním z jazyků pro platformu [[.NET]]. To současně znamená, že jej lze přímo využívat ve všech jazycích platformy [[.NET]]. Vzhledem k významu, jaký platformě [[.NET]] přikládá firma [[Microsoft]], lze očekávat, že význam implementace [[IronPython]] dále poroste. Vzhledem k vlastnostem jazyka Python lze také předpokládat, že se implementace [[IronPython]] stane dlouhodobě podporovanou.
 
I IronPython je implementace CPythonu 2. Poslední verze IronPythonu je 2.7.8 vydaná v roce 2018. Negativně může být vnímána skutečnost, že implementace [[IronPython]] je vyvíjena firmou [[Microsoft]] pod Microsoft Public License.
 
=== Brython ===
[https://brython.info/index.html Brython] je implementace Pythonu 3 v JavaScriptu. Jejím cílem je umožnit ve webovém prohlížeči programovat v jazyce Pythonu místo v JavaScriptu. Brython je transkompilátor, tedy překladač Python kódu do JavaScript kódu. Tento překlad se spouští automaticky na pozadí, programátor může psát Python kód rovnou do html stránky jako <script type='text/python'>. Možnosti Python programu jsou proto omezeny možnostmi prohlížeče a JavaScriptu. Nelze používat např. blokující volání time.sleep() nebo modul async. Místo toho jsou k dispozici alternativní moduly kompatibilní s webovými prohlížeči.
 
=== RPython ===
[https://rpython.readthedocs.io/en/latest/index.html RPython] je dialekt Pythonu pro velmi specifické využití. Pro vývoj dynamických jazyků a jejich interpretů. Syntaxe jazyka RPython vychází z jazyka Python, ale je velmi omezená. R v názvu znamená restricted. Teoreticky lze využít i k vývoji jiných programů, ale nepředpokládá se to. RPython není na rozdíl od CPythonu interpret, ale překladač. Jeho výsledkem je nativní spustitelný program, který je oproti interpretovaným programům významě rychlejší.
 
=== Cython ===
[https://cython.org/ Cython] je C rozšíření jazyka Python a transkompiler. Cython překládá zdrojový Python kód do C kódu, který se následně standardním překladačem překládá do binárního kódu. Výsledkem je tedy nativní program stejně jako u RPythonu. Na rozdíl od RPythonu je Cython univerzální a neklade si žádné omezení na syntaxi Pythonu, naopak ji rozšiřuje. Už přeložení čistého Python kódu Cythonem vede typicky k dvakrát rychlejšímu programu oproti interpretované verzi v CPythonu.
 
Pomocí [https://www.root.cz/clanky/prakticke-pouziti-nastroje-cython-pri-prekladu-pythonu-do-nativniho-kodu-1/ optimalizací] lze výkon programu téměř na úroveň implementace takového programu přímo v jazyce C. Cython přidává do syntaxe Pythonu možnost statických typů a dalších možností jazyka C, včetně používání funkcí ze standardních C knihoven. Výsledkem Cythonu může být buď spustitelný program nebo modul, v kterém mohou být implementovány výpočetně náročné funkce, které pak lze využívat ze standardního CPythonu. Viz kap. Výkon Pythonu.
 
=== PyPy ===
[https://www.pypy.org/features.html PyPy] je další alternativní interpret jazyka Python, který je zaměřen na výkon. Tento interpret využívá RPythonu a obsahuje vlastní implementaci JIT. Má i další výkonově užitečné vlastnosti, třeba stackless mód, který poskytuje výkonné mikro thready pro masivní paralelní programování. Poslední verze PyPy implementuje Python 2.7.13 a 3.6.9.
 
=== RustPython ===
[https://github.com/RustPython/RustPython RustPython] je implementace Pythonu 3 v jazyce [[Rust (programovací jazyk)|Rust]]. Tato implementace je označena jako vývojová a nevhodná pro produktivní nasazení. Implementuje CPython 3.5.
 
== Výkon ==
Výkonnost Pythonu je velmi nevyrovnaná. V praxi to často nevadí, protože výkon současných počítačů je dostatečně velký. Python se však někdy používá i pro zpracování rozsáhlých dat nebo na strojích s velmi omezenými prostředky, například na jednodeskových počítačích [[Raspberry Pi]], které mají několikanásobně nižší výkon než libovolné domácí PC, ať desktop nebo notebook.
 
Pokud narazíme na výkonnostní problémy, může optimalizace kódu v Pythonu přinést i více než řádové zlepšení – větší než u jiných programovacích jazyků. Je třeba používat takové datové struktury, které jsou pro požadované operace dostatečně efektivní. Je důležité minimalizovat počet vyvolání funkcí, například místo načítání souboru po znacích načítat celé řádky, místo zpracování řetězců v cyklu používat funkce pracující s celými řetězci, např. provádějící globální operace s regulárními výrazy. Výkonově kritické knihovny jsou implementovány v jazyce [[C (programovací jazyk)|C]], s kterým Python výborně spolupracuje, proto je obvykle lepší provést desítky tisíc volání mocné knihovní funkce než milion volání jednoduché funkce. Složité a kaskádované podmínky se snažíme upravit tak, aby se složité testy prováděly, až když je to nezbytné, případně aby se rychle vyloučily obvyklé případy. Při práci s regulárními výrazy dáváme přednost metodě <code>match</code> před metodou <code>search</code>, snažíme se používat „kotvy“ (<code>^</code> a <code>$</code>) a místo použití série regulárních výrazů raději použijeme jeden s více možnostmi spojenými symbolem <code>|</code>, přičemž jednotlivé alternativy rozlišíme použitím metody <code>group</code> aplikované na objekt vrácený metodou <code>match</code>.
 
V historii Pythonu vznikla řada optimalizačních technik.
 
V minulosti se pro zvýšení výkonu používala snadno použitelná knihovna [[Psyco]], která [[transparentnost (informatika)|transparentně]] [[Optimalizace (informatika)|optimalizovala]] kód Pythonu na výkon (JIT). Některé operace byly pomocí Psyco urychleny až řádově<ref name="gp4psyco">http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=python&lang2=psyco{{Nedostupný zdroj}}</ref>. Dnes je tato knihovna neudržovaná (cca od roku 2010) a použitelná jen pro 32bitové prostředí a podporuje Python jen do verze 2.6.
 
V současné době tuto knihovnu nahradily projekty jako PyPy, Cython a další, viz alternativní implementace Pythonu.
 
Nejúčinnější způsob dosažení výkonu v Pythonu je použití Cythonu s optimalizací kódu na výkon. Následující příklad ukazuje neoptimalizovanou a maximálně optimalizovanou funkci. Tedy změny, které je nutno učinit pro získání maximálního výkonu pro transkompiler Cython.
 
<syntaxhighlight lang="python3">
def add_two_numbers(x, y):
print(x)
return x + y
 
z = add_two_numbers(123, 456)
print(z)
</syntaxhighlight><syntaxhighlight lang="cython">
from libc.stdio cimport printf
 
cdef int add_two_numbers(int x, int y) nogil:
printf("%i\n", x)
return x + y
 
z = add_two_numbers(123, 456)
print(z)
</syntaxhighlight>
 
Účinnost těchto optimalizací je velmi vysoká. Takto optimalizovaný program dosahuje téměř výkonu aplikace napsané přímo v jazyce C. Viz benchmark, který porovnává výkon programu při výpočtu velké [[Mandelbrotova množina|Mandelbrotovy množiny]].
 
{| class="wikitable"
|+Benchmark výkonu funkce pro výpočet Mandelbrotovy množiny v sec.
!'''Rozlišení'''
!CPython 2
!CPython 3
!'''Jython'''
!'''RPython'''
!'''ANSI C'''
!'''Cython'''
 
(bez úprav)
!Cython
(typy)
!'''Cython'''
 
'''(plná optimalizace)'''
|-
|4096×4096
|150,31
|152,21
|203,18
|18,64
|4,75
|88,67
|16,42
|4,80
|}
 
== Spolupráce s jinými aplikacemi ==
Jak již bylo řečeno, Python se snadno vkládá do jiných aplikací, kde pak slouží jako jejich skriptovací jazyk. Lze ho najít např. v [[3D]] programu [[Blender]], v počítačové hře [[Civilization IV]], v kancelářském balíku [[OpenOffice.org]], v [[textový editor|textovém editoru]] [[Vim]]. Lze jej alternativně použít jako skriptovací jazyk aplikace [[GIMP]], existují pythonovská aplikační rozhraní pro celou řadu dalších projektů – například pro [[ImageMagick]]. Varianta [[Jython]] (implementace Pythonu v [[Java (programovací jazyk)|Javě]]) jej umožňuje používat jako skriptovací jazyk všude tam, kde lze používat skripty v [[Java (programovací jazyk)|Javě]] – například v editoru [[jEdit]].
 
== Příklady ==
Ukázkový program [[Hello world]] vypadá velmi jednoduše:
<syntaxhighlight lang="python">
print("Hello, World!") # ve verzích 2.x print "Hello, World!"
</syntaxhighlight>
 
Program pro výpočet obsahu kruhu ze zadaného poloměru v syntaxi Python 3:
<syntaxhighlight lang="python">
# toto je komentář a interpret jej ignoruje
 
import math # zpřístupní modul s matematickými funkcemi a konstantami (sin, cos, pi atp.)
 
vstup = input("Zadejte polomer: ") # zobrazí výzvu a načte nějaký řetězec. Ve verzi 2.x se místo funkce input používá funkce raw_input
r = float(vstup) # převede řetězec na desetinné číslo
S = r**2 * math.pi # umocní r na 2 a vynásobí jej pí
print("Výsledek je:", S) # zobrazí výsledek. Ve verzi 2.x se píše bez závorek
</syntaxhighlight>
 
 
Výpočet faktoriálu v porovnání s jazykem C:
 
{| width="100%"
!width="50%"|Program v jazyce Python
!width="50%"|Odpovídající program [[C (programovací jazyk)|v jazyce C]]
|-valign="top"
|
<syntaxhighlight lang="python">
def factorial(x):
if x <= 0:
return 1
else:
return x * factorial(x - 1)
 
def factorial_kratsi(x):
return 1 if x <= 0 else x * factorial_kratsi(x - 1)
</syntaxhighlight>
|
<syntaxhighlight lang="C">
int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
 
int factorial_kratsi(int x) {
return x <= 0 ? 1 : x * factorial_kratsi(x - 1);
}
</syntaxhighlight>
|}
 
== Charakteristika a použití jazyka ==
 
=== Proměnná je pojmenovaným odkazem na objekt ===
Každá proměnná se chápe jako pojmenovaný odkaz na objekt. Přesněji řečeno, jméno proměnné je svázáno s jinak bezejmenným objektem. Příkaz přiřazení nezajistí okopírování hodnoty navázaného objektu. Provede se pouze svázání nového jména s původním objektem.
<syntaxhighlight lang="python">
a = [1, 2]
b = a
</syntaxhighlight>
Jména ''a'' i ''b'' jsou nyní svázána se stejným objektem. Pokud objekt může být měněn, pak se změna provedená přes jméno ''b'' projeví i při následném přístupu přes jméno ''a''. Příklad – zrušíme první prvek seznamu přes jméno ''b'' a zobrazíme obsah seznamu přes jméno ''a'':
<syntaxhighlight lang="python">
del b[0]
</syntaxhighlight>
 
Ve výsledku mají ''a'' a ''b'' stejnou „hodnotu“ <code>[2]</code>. Odkazování na stejný objekt lze zjistit konstrukcí:
<syntaxhighlight lang="python">
a is b
# => True
</syntaxhighlight>
 
=== Funkce se uchovává jako objekt ===
Funkce se chová jako běžný objekt, dokud není zavolána.
<syntaxhighlight lang="python">
def funkce():
print 'Python'
 
f = funkce
p = [1, 2, 'test', f]
p[3]()
</syntaxhighlight>
Lze s ní manipulovat, ukládat do proměnných, polí, objektů. Přesněji řečeno, manipuluje se s odkazem na objekt funkce. S objektem funkce je možné podle potřeby svázat i nové jméno, případně ji i kdykoliv předefinovat.
 
=== Do složených datových struktur se ukládají odkazy ===
Do složených datových struktur se ukládají odkazy na objekty, nikoliv objekty samotné. Typ objektu není vázán na odkaz, ale je svázán až s odkazovaným objektem. Z toho vyplývá, že například do jednoho seznamu je možné současně uložit odkazy na objekty libovolného typu:
<syntaxhighlight lang="python">
a = [1, 2, 'pokus', u"UNICODE", ('a tak', u'dále...'), {'4':44, 5:55}]#od verze 3.0 není potřeba před řetězce psát U, protože všechny řetězce jsou Unicode.
</syntaxhighlight>
 
Jinými slovy, z technického hlediska jsou odkazy všechny stejného typu (interního), který nemá žádný vztah k typu odkazovaného objektu. Technicky lze tedy seznam považovat za homogenní [[datový typ]]. Z uživatelského pohledu to vypadá, že do seznamu můžeme vkládat hodnoty různého typu. Ještě jednou – do seznamu se nevkládají hodnoty daných typů, ale jen ''beztypové'' odkazy na příslušné objekty.
 
=== Proměnné není nutné deklarovat ===
V jiných jazycích se při deklaraci proměnné uvádí souvislost jména proměnné s typem ukládané hodnoty. V jazyce Python je proměnná jen pojmenovaným odkazem na nějaký objekt. Typ objektu je ale vázán na odkazovaný objekt, nikoliv na jméno. Potřeba deklarace proměnné ve významu určení souvisejícího typu dat tedy odpadá.
 
Existence, či neexistence jména přímo nesouvisí s existencí či neexistencí hodnotového objektu. Význam deklarace proměnné ve smyslu popisu existence související hodnoty tedy rovněž odpadá. Proměnná, jako pojmenovaný odkaz, vzniká v okamžiku, kdy se jméno objeví na levé straně přiřazovacího příkazu. Jméno proměnné může být později svázáno dalším přiřazením s jiným objektem zcela jiného typu.
<syntaxhighlight lang="python">
p = 1
p2 = ""
p3 = p # Kopie odkazu p
</syntaxhighlight>
 
=== Členské proměnné tříd mohou vznikat až za běhu ===
Mezi běžné praktiky při vytváření objektu patří i založení používaných členských proměnných. Tento obrat se ale v jazyce Python chápe jako užitečná technika, nikoliv jako nutnost. Členské proměnné (čili proměnné uvnitř objektu) mohou vznikat až za běhu.
<syntaxhighlight lang="python">
class pokus: pass #prázdná třída
 
obj = pokus()
obj.field1 = 33
obj.field2 = 'str'
</syntaxhighlight>
 
Existují ale techniky, které umožňují prostředky jazyka zamezit možnost dodatečného přidávání členských proměnných.
 
=== Dynamická silná typová kontrola ===
Při operacích nad objekty se zpravidla provádí silná [[typová kontrola]]{{Fakt/dne|20171208221300|}}, to znamená, že při operacích s typy nedochází k automatickému přetypování hodnot. Výjimkou jsou v Pythonu 2 datové typy int a long, kde nedochází k přetečení datového typu int, ale k automatickému přetypování hodnoty z int na long. Python 3 už podporuje pouze datový typ int, který má vlastnosti jako datový typ long v Pythonu 2.
 
Dále jsou v Pythonu 2 i Pythonu 3 podporovány aritmetické operace různých numerických datových typů. Například lze sečíst datové typy int a float, výsledkem bude datový typ float, 1 + 1.0 = 2.0. Na rozdíl od řady jiných interpretovaných dynamických jazyků nedochází k automatickému převodu číselných textových řetězců na čísla, proto 1 + '1' = výjimka.
 
Výjimku vyvolá každá nepodporovaná operace různých datových typů. Nepodporované je třeba dělení řetězců, proto 'abcd' / 2 = výjimka. Násobení podporované je, proto 'abcd' * 2 = 'abcdabcd'.
 
Datové typy se kontrolují dynamicky, to jest až během chodu programu, nikoliv při kompilaci kódu.
 
Python 3.x podporuje volitelné statické typové anotace, které umožňují externím nástrojům, jako je např. mypy, provádět statickou analýzu a kontrolu datových typů v python kódu. Samotný standardní interpret Pythonu s nimi v současné době nepracuje (ignoruje je), pouze umožňuje jejich syntaxi, takže se nevyužívají k optimalizaci rychlosti běhu rychlosti.
 
=== Ortogonalita operátorů ===
Při vývoji jazyka se kladl a klade důraz na to, aby operátory nebyly vázány na specifické datové typy (pokud je to možné). Přípustnost použití operátoru pro konkrétní operandy se navíc vyhodnocuje až za běhu. Prakticky to znamená, že například následující funkci, která v těle používá operátor ''plus'', je možné předat jednak číselné a jednak řetězcové argumenty:
<syntaxhighlight lang="python">
def dohromady(a, b):
return a + b
 
dohromady(2, 3) # vrátí 5
dohromady("ahoj", ' nazdar') # vrátí 'ahoj nazdar'
</syntaxhighlight>
 
Nejde jen o zajímavou hříčku. Běžné pythonovské funkce tím získávají vlastnosti, kterými se zabývá [[generické programování]].
 
=== Interaktivní režim překladače ===
Interpret jazyka Python můžeme spustit v interaktivním režimu. Tento režim se používá především pro ''rychlé pokusy''. Řádkový vstup je v takovém případě uvozen znaky <code>>>></code>.
 
Je-li očekáván pokračovací řádek zápisu dosud nedokončené konstrukce, pak je vstupní řádek uvozen znaky <code>...</code>. Dokončení zápisu konstrukce vyjadřujeme v interaktivním režimu zadáním prázdného řádku.
<syntaxhighlight lang="python">
>>> def f(c, n):
... return c * n
...
>>> f(a, 5)
15
</syntaxhighlight>
 
V interaktivním režimu většinou nepoužíváme příkaz <code>print</code> (ale nic nám v tom nebrání). Pokud chceme zobrazit obsah proměnné, stačí za úvodní znaky zapsat její jméno.
<syntaxhighlight lang="python">
>>> a = 1 + 2
>>> a
3
</syntaxhighlight>
 
Proměnná <code>_</code> obsahuje poslední takto použitou hodnotu.
<syntaxhighlight lang="python">
>>> f('x', a)
'xxx'
>>> len(_)
3
</syntaxhighlight>
 
== Python 3.0 ==
Python je vyvíjen s důrazem na pragmatičnost. To znamená, že vývoj jeho verzí je spíše evoluční. Přirozeným důsledkem takového přístupu je i zpětné hodnocení dobrých a horších vlastností jazyka. Jeho výsledkem byl projekt Python 3000 (Py3k)<ref name="Artima_Python3000StatusUpdate">http://www.artima.com/weblogs/viewpost.jsp?thread=208549</ref><ref name="PEP3000">http://www.python.org/dev/peps/pep-3000/</ref> jako základ vývoje přelomové verze Python 3.
 
Stabilní verze Python 3.0 byla vypuštěna v [[3. prosinec|3. prosince]] [[2008]]. Je zpětně nekompatibilní. Přechodovou verzí mezi Python 2.x a Python 3.0 představuje Python 2.7 (varování při použití syntaxe, která nebude ve verzi 3.0 platná). Současně byly vyvinuty nástroje pro usnadnění konverze starších zdrojových textů do podoby pro verzi Python 3.0.
 
Jednou z nejviditelnějších změn v Python 3.0 (pragmatický pohled z hlediska prostého uživatele) je převedení příkazu <code>print</code> na funkci. Konstrukce <code>print "hello"</code> je neplatná, správný zápis je <code>print("hello")</code>.
 
Velmi významnou změnou je důsledné oddělení abstrakcí ''řetězec'' a ''posloupnost bajtů''. Řetězce se důsledně změnily na typ unicode (<code>"hruška"</code> bude ekvivalentní s bývalou <code>u"hruška"</code>). Pro posloupnosti bajtů je zaveden nový typ <code>bytes</code> (immutable) a <code>bytearray</code> (mutable). Při vzájemném převodu mezi řetězcem a posloupností bajtů je nutné vždy uvádět požadované kódování. To by mělo vést k důslednému vyřešení problémů, které se projevovaly v souvislosti se znaky národních abeced.
 
Funkce <code>raw_input</code> byla přejmenována na <code>input</code> (bývalý <code>input()</code> zmizí), také iterativní varianty funkcí a metod nahradily svoje předchůdce, které vracely seznamy, takže například funkce <code>range</code> je v podstatě bývalá <code>xrange</code>, analogicky tomu je s <code>file.readlines()</code>/<code>file.xreadlines()</code>. Podobně další funkce, které dřív vraceli list, dnes vrací iterátor – např. <code>dict.keys()</code>:
<syntaxhighlight lang="python">
# python 2.x
>>> d = { 'a': 1, 'b': 7 }
>>> d.keys()
['a', 'b']
 
# python 3.x
>>> d.keys()
<dict_keys object at 0xb7c08540&>
>>> [ x for x in d.keys() ] # nebo list(d.keys())
['a', 'b']
</syntaxhighlight>
 
Další viditelnější změnou je chování operátoru dělení <code>/</code> při použití s celými čísly:
<syntaxhighlight lang="python">
# python 2.x
>>> 5 / 2
2
>>> 5 / 2 == 5 // 2
True
 
# python 3.x
>>> 5 / 2
2.5
>>> 5 // 2
2
</syntaxhighlight>
 
Zmizí <code>dict.has_key()</code>.
Zápis množin se zjednodušil, <code>set([1, 2])</code> je možné napsat <code>{1, 2}</code>. Dále například přibyla řetězcům nová metoda <code>format</code> jako alternativa ke starému formátování řetězců procentovou notací.
<syntaxhighlight lang="python">
foo=7 #společné pro všechny verze
 
#python 2.x
"ID: %s (%s, %s)" % ("0s9d8f", foo, 3)
# či
"ID: %(id)s (%(x)s, %(y)s)" % {'x': foo, 'y': 3, 'id': "0s9d8f"}
 
#python 3.0 přidává také notaci
 
"ID: {0} ({1}, {2})".format("0s9d8f", foo, 3)
# a
"ID: {id} ({x}, {y})".format(x=foo, y=3, id="0s9d8f")
 
# od verze 3.6 zle navíc použít takzvané f-string
f"ID: 0s9d8f ({foo}, {3})"
 
</syntaxhighlight>
 
Dalším příkladem porušení zpětné kompatibility je zavedení nové syntaxe pro oktalová čísla. Ta se dříve zapisovala s nulou na začátku, např. <code>0777</code>. Tento formát se stal neplatným a nový je analogický se zápisem hexadecimálních čísel (<code>0x1ff</code>). Správný zápis je tedy <code>0o777</code>. Podobně je možné zapisovat i čísla v binární soustavě.
<pre>
>>> 012
File "<stdin>", line 1
012
^
SyntaxError: invalid token
>>> 10 == 0xa == 0o12 == 0b1010
True
</pre>
 
Podrobnější seznam změn najdete (anglicky) v dokumentu [http://docs.python.org/3.0/whatsnew/3.0.html What’s New In Python 3.0].
 
== Odkazy ==
 
=== Reference ===
<references>
<ref name="guido">{{Citace elektronické monografie| jméno=Guido| příjmení=van Rossum| titul=Python - zdrojové kódy. Python Foundation. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY.| url=http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY| datum přístupu=2010-04-12| url archivu=https://web.archive.org/web/20160217132249/http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY| datum archivace=2016-02-17| nedostupné=ano}}</ref>
 
</references>
 
=== Externí odkazy ===
* {{Commonscat}}
* [https://www.python.org www.python.org] – oficiální web projektu (anglicky, [https://wiki.python.org/moin/CzechLanguage část česky])
* [https://python.cz python.cz] – Python CZ, rozcestník české komunity
* [http://www.py.cz www.py.cz] – PyCZ, komunitní český web
* [http://www.boost.org/libs/python/doc/ Boost.Python] – C++ knihovna pro spolupráci mezi C++ a Pythonem
 
==== Dokumentace, učebnice ====
* [https://docs.python.org/tutorial/ Oficiální tutorial] (anglicky)
* [https://docs.python.org Oficiální dokumentace] (anglicky)
* [https://macek.sandbox.cz/texty/python-tutorial-cz/tut/ Učebnice jazyka Python (aneb Létající cirkus)] (český překlad)
* [http://www.root.cz/serialy/letajici-cirkus/ Létající cirkus], [http://www.root.cz/data/letajici_cirkus.pdf PDF] – seriál na ROOT.CZ, 21 dílů
* [http://jaksenaucitprogramovat.py.cz Jak se naučit programovat] – Alan Gauld (český překlad)
* [http://python.wraith.cz/ Python – programování zábavou] – český web o Pythonu, základy, ukázky, praxe
* [http://diveintopython3.py.cz/ Ponořme se do Pythonu 3] – Mark Pilgrim (český překlad z originálního [http://diveintopython3.org/ Dive Into Python 3])
** vydáno též [https://knihy.nic.cz/#Python3 v edici CZ.NIC] – knižně i elektronicky
 
{{Programovací jazyky}}
{{Python}}
{{Autoritní data}}
 
[[Kategorie:Python| ]]