Python (programovací jazyk)

Python
Logo Pythonu
Logo Pythonu
Paradigma multiparadigmatický
Vznik 1991
Autor Guido van Rossum
Vývojář Python Software Foundation
První vydání 20. února 1991
Poslední verze 3.12
Poslední nestabilní verze 3.13.0 2a
Typová kontrola silná, dynamická, duck-typing
Hlavní implementace CPython, Jython, IronPython, PyPy
Dialekty Stackless Python, RPython, Cython
Ovlivněn jazyky ABC, Perl, Lisp, Smalltalk, Tcl
Ovlivnil jazyky Ruby, Boo, Groovy
OS multiplatformní
Licence Python Software Foundation License
Web www.python.org

Python (anglická výslovnost [ˈpaiθən]) je vysokoúrovňový programovací jazyk, který v roce 1991[1] navrhl Guido van Rossum. Nabízí dynamickou kontrolu datových typů a podporuje různá programovací paradigmata, včetně objektově orientovaného, imperativního nebo 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 open source projekt, který zdarma nabízí instalační balíky pro většinu běžných platforem (Unix, MS Windows, macOS, Android); ve většině distribucí systému GNU/Linux je Python součástí základní instalace.

Mimo jiné je v něm implementován aplikační server Zope, instalátor a většina konfiguračních nástrojů Linuxové distribuce firmy Red Hat.

Python byl pojmenován podle komediální skupiny Monty Python,[2] kteří pomocí svých skečů ovlivnili internetovou subkulturu například slovem spam.

Logo Pythonu je zase přejato z významu slova python, které je v angličtině používáno jako označení pro krajtu.

Historie

Jazyk Python se vyvíjí a postupem času vznikly tři nekompatibilní major verze, Python (1), Python 2 a Python 3.

  • Python 1 se už nepoužívá. Python 0.9.0 byl vydán v roce 1991, Python 1.0 v roce 1994 a poslední verze 1.6.1 vyšla v roce 2000.
  • Python 2 je v útlumu. Verze 2.0 byla vydána v roce 2000, poslední verze 2.7.18 byla vydána 20. dubna 2020. Od 1. ledna 2020 je dle PEP 373 oficiálně nepodporován. V podobě 2.7.18 byla druhá řada Pythonu zmrazena a nadále se nevyvíjí. PEP 404 uvádí, že nevznikne verze 2.8.
  • Souběh řady 2 a 3. Python 2 a Python 3 byly mnoho let vyvíjeny paralelně. Do Pythonu 2 byly přeneseny některé nové vlastností z raných verzí Pythonu 3. Snahou bylo Python 2 a Python 3 k sobě co nejvíce přiblížit, aby byl usnadněn přechod řady existujících projektů z Pythonu 2 na Python 3. Byl to náročný úkol. Naplánovaný termín ukončení podpory Pythonu 2 se opakovaně oddaloval.
  • Verze 3.0 byla vydána téměř současně (o dva měsíce později) s verzí 2.6 v roce 2008.
  • Python 3 je aktivní řada. Poslední vydaná verze je 3.12. Řada 3 opravuje chybná a překonaná designová rozhodnutí. Např. Python 2 používá textové řetězce se zastaralým 8bitovým kódováním, Python 3 přešel na moderní a univerzální Unicode textové řetězce.

Vlastnosti

Python je dynamický interpretovaný jazyk. Někdy bývá zařazován mezi takzvané skriptovací jazyky. 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ého uživatelského rozhraní – viz například wxPython, který využívá wxWidgets, nebo PySide a PyQT pro Qt, a nebo PyGTK pro GTK+).

Python je hybridní jazyk (nebo také multiparadigmatický), to znamená, že umožňuje při psaní programů používat nejen objektově orientované paradigma, ale i procedurální a v omezené míře i 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.[zdroj?!] Tato skutečnost je dána tím, že jedním z jeho silných inspiračních zdrojů byl 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[zdroj?!] 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 syntaxe, na kterou se při vývoji jazyka hodně dbá. K definici 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ých prostorů, používá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ý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).

Programování v Pythonu klade velký důraz na produktivitu práce programátora. Myšlenky návrhu jazyka jsou shrnuty ve filosofii Pythonu.

Programy v Pythonu běží pomaleji oproti programovacímu jazyku C++.[3]

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.[4]

Pro Python je v provozu jeho vlastní repozitář balíčků s knihovnami, PyPI, který podporuje snadnou instalaci balíčků programem pip.

Různé implementace Pythonu

Standardní Python je implementován v jazyce 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.

CPython

Standardní Python je implementován v 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é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 jazyka C umožňují zabudovat interpret jazyka Python do jiné aplikace psané v jazycích C nebo C++. Takto zabudovaný 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. Kód napsaný v Jythonu běží v 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.2 je z března roku 2020.

IronPython

IronPython je implementace Pythonu pro prostředí .NET/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

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

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ýznamně rychlejší.

Cython

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í optimalizací lze výkon programu téměř na úroveň implementace takového programu přímo v jazyce C.[5] 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

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

RustPython je implementace Pythonu 3 v jazyce 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, 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ě match před metodou search, snažíme se používat „kotvy“ (^ a $) 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 |, přičemž jednotlivé alternativy rozlišíme použitím metody group aplikované na objekt vrácený metodou match.

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á transparentně optimalizovala kód Pythonu na výkon (JIT). Některé operace byly pomocí Psyco urychleny až řádově.[6] 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.

def add_two_numbers(x, y):
    print(x)
    return x + y

z = add_two_numbers(123, 456)
print(z)
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)

Úč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é Mandelbrotovy množiny.

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 LibreOffice, v 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 Javě) jej umožňuje používat jako skriptovací jazyk všude tam, kde lze používat skripty v Javě – například v editoru jEdit.

Příklady

Ukázkový program Hello world vypadá velmi jednoduše:

print("Hello, World!") # ve verzích 2.x print "Hello, World!"

Program pro výpočet obsahu kruhu ze zadaného poloměru v syntaxi Python 3:

# 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


Výpočet faktoriálu v porovnání s jazykem C:

Program v jazyce Python Odpovídající program v jazyce C
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)
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);
}

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.

a = [1, 2]
b = a

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:

del b[0]

Ve výsledku mají a a b stejnou „hodnotu“ [2]. Odkazování na stejný objekt lze zjistit konstrukcí:

a is b
# => True

Funkce se uchovává jako objekt

Funkce se chová jako běžný objekt, dokud není zavolána.

def funkce():
    print 'Python'

f = funkce
p = [1, 2, 'test', f]
p[3]()

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:

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.

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.

p = 1
p2 = ""
p3 = p # Kopie odkazu p

Č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.

class pokus: pass #prázdná třída

obj = pokus()
obj.field1 = 33
obj.field2 = 'str'

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[zdroj?!], 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:

def dohromady(a, b):
	return a + b

dohromady(2, 3) # vrátí 5
dohromady("ahoj", ' nazdar') # vrátí 'ahoj nazdar'

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 >>>.

Je-li očekáván pokračovací řádek zápisu dosud nedokončené konstrukce, pak je vstupní řádek uvozen znaky .... Dokončení zápisu konstrukce vyjadřujeme v interaktivním režimu zadáním prázdného řádku.

>>> def f(c, n):
... return c * n
...
>>> f(a, 5)
15

V interaktivním režimu většinou nepoužíváme příkaz print (ale nic nám v tom nebrání). Pokud chceme zobrazit obsah proměnné, stačí za úvodní znaky zapsat její jméno.

>>> a = 1 + 2
>>> a
3

Proměnná _ obsahuje poslední takto použitou hodnotu.

>>> f('x', a)
'xxx'
>>> len(_)
3

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)[7][8] jako základ vývoje přelomové verze Python 3.

Stabilní verze Python 3.0 byla vypuštěna v 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 print na funkci. Konstrukce print "hello" je neplatná, správný zápis je print("hello").

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 ("hruška" bude ekvivalentní s bývalou u"hruška"). Pro posloupnosti bajtů je zaveden nový typ bytes (immutable) a bytearray (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 raw_input byla přejmenována na input (bývalý input() zmizí), také iterativní varianty funkcí a metod nahradily svoje předchůdce, které vracely seznamy, takže například funkce range je v podstatě bývalá xrange, analogicky tomu je s file.readlines()/file.xreadlines(). Podobně další funkce, které dřív vraceli list, dnes vrací iterátor – např. dict.keys():

# 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']

Další viditelnější změnou je chování operátoru dělení / při použití s celými čísly:

# python 2.x
>>> 5 / 2
2
>>> 5 / 2 == 5 // 2
True

# python 3.x
>>> 5 / 2
2.5
>>> 5 // 2
2

Zmizí dict.has_key(). Zápis množin se zjednodušil, set([1, 2]) je možné napsat {1, 2}. Dále například přibyla řetězcům nová metoda format jako alternativa ke starému formátování řetězců procentovou notací.

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 lze navíc použít takzvané f-string
f"ID: 0s9d8f ({foo}, {3})"

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ř. 0777. Tento formát se stal neplatným a nový je analogický se zápisem hexadecimálních čísel (0x1ff). Správný zápis je tedy 0o777. Podobně je možné zapisovat i čísla v binární soustavě.

>>> 012
  File "<stdin>", line 1
    012
      ^
SyntaxError: invalid token
>>> 10 == 0xa == 0o12 == 0b1010
True

Podrobnější seznam změn najdete (anglicky) v dokumentu What’s New In Python 3.0.

Odkazy

Reference

  1. VAN ROSSUM, Guido. Python - zdrojové kódy. Python Foundation. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY. [online]. [cit. 2010-04-12]. Dostupné v archivu pořízeném dne 2016-02-17. 
  2. General Python FAQ — Python 3.10.5 documentation. docs.python.org [online]. [cit. 2022-06-11]. Dostupné online. 
  3. MCMURRAY, Alex. Python is 57x slower than C++ (and 45x worse for the planet). eFinancialCareers [online]. 2023-06-30 [cit. 2023-08-28]. Dostupné online. (anglicky) 
  4. KRČMÁŘ, Petr. Chyby v programovacích jazycích ohrožují bezpečnost aplikací. root.cz [online]. 12. 12. 2017. Dostupné online. ISSN 1212-8309. 
  5. TIŠNOVSKÝ, Pavel. Praktické použití nástroje Cython při překladu Pythonu do nativního kódu. Root.cz [online]. [cit. 2023-05-22]. Dostupné online. 
  6. http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=python&lang2=psyco[nedostupný zdroj]
  7. Python 3000 Status Update (Long!). www.artima.com [online]. [cit. 2023-05-22]. Dostupné online. 
  8. PEP 3000 – Python 3000 | peps.python.org. peps.python.org [online]. [cit. 2023-05-22]. Dostupné online. 

Externí odkazy

Dokumentace, učebnice

Zdroj