Python: Porovnání verzí

Smazaný obsah Přidaný obsah
m aktualizovat, upravit; úpravy
m Robot: -zastaralá značka HTML; kosmetické úpravy
Řádek 10:
| autor = [[Guido van Rossum]]
| vývojář = [http://www.python.org/psf Python Software Foundation]
| první vydání = [[20. únor|20. února]]a [[1991]]
| poslední verze = 2.7.17 ([[24. říjen|24. říjen]] [[2019]])<br />3.8.2 ([[24. únor|24. únor]] [[2020]])
| typování = silná, dynamická, [[duck-typing]]
| implementace = [[CPython]], [[Jython]], [[IronPython]], [[PyPy]]
Řádek 29:
Mimo jiné je v&nbsp;něm [[implementace|implementován]] aplikační server [[Zope]], [[Instalace (software)|instalátor]] a většina konfiguračních nástrojů Linuxové distribuce firmy [[Red Hat]].
 
Python jazyk 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án v roce 2000, vydání poslední verze 2.7.18 je naplánováno na duben 2020.{{Aktualizovat po|20200431}} Od 1. ledna 2020 je dle PEP 373 oficiálně nepodporován. V podobě 2.7.18 bude druhá řada Pythonu zmrazena a nebude se nadále vyvíjet. PEP 404 uvádí, že nevznikne verze 2.8.
 
Python 3 je aktivní řada. Verze 3.0 byla vydána v roce 2008, je ve vývoji a poslední vydaná verze je 3.8.2. Řada 3 opravuje chybná a překonaná designová rozhodnutí. Např. Python 2 používá textové řetězce se zastaralým 8bit. kódováním, Python 3 přešel na moderní a univerzální [[Unicode]] textové řetězce.
 
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.
Řádek 87:
 
=== 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.
Řádek 117:
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</ref>. Dnes je tato knihovna neudržovaná (cca od roku 2010) a použitelná jen pro 32 bitové 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">
Řádek 174:
== Příklady ==
Ukázkový program [[Hello world]] vypadá velmi jednoduše:
<sourcesyntaxhighlight lang="python">
print "Hello, World!" # od verze 3.0 print("Hello, World!")
</syntaxhighlight>
</source>
 
Program pro výpočet obsahu kruhu ze zadaného poloměru v syntaxi Python 2:
<sourcesyntaxhighlight lang="python">
# toto je komentář a interpret jej ignoruje
 
Řádek 188:
S = r**2 * math.pi # umocní r na 2 a vynásobí jej pí
print "Výsledek je:", S # zobrazí výsledek
</syntaxhighlight>
</source>
 
Program pro výpočet obsahu kruhu ze zadaného poloměru v syntaxi Python 3:
<sourcesyntaxhighlight lang="python">
# toto je komentář a interpret jej ignoruje
 
Řádek 200:
S = r**2 * math.pi # umocní r na 2 a vynásobí jej konstantou π
print("Výsledek je:", S) # zobrazí výsledek
</syntaxhighlight>
</source>
 
Výpočet faktoriálu v porovnání s jazykem C:
Řádek 238:
=== 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.
<sourcesyntaxhighlight lang="python">
a = [1, 2]
b = a
</syntaxhighlight>
</source>
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'':
<sourcesyntaxhighlight lang="python">
del b[0]
print a
</syntaxhighlight>
</source>
Zobrazí se
<sourcesyntaxhighlight lang="python">
[2]
</syntaxhighlight>
</source>
 
=== Funkce se uchovává jako objekt ===
Funkce se chová jako běžný objekt, dokud není zavolána.
<sourcesyntaxhighlight lang="python">
def funkce():
print 'Python'
Řádek 261:
p = [1, 2, 'test', f]
p[3]()
</syntaxhighlight>
</source>
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:
<sourcesyntaxhighlight lang="python">
a = [1, 2, 'pokus', u"UNICODE", ('a tak', u'dále...'), {'4':44, 5:55}]
</syntaxhighlight>
</source>
 
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.
Řádek 276:
 
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.
<sourcesyntaxhighlight lang="python">
p = 1
p2 = ""
p3 = p # Kopie odkazu p
</syntaxhighlight>
</source>
 
=== Č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.
<sourcesyntaxhighlight lang="python">
class pokus: pass #prázdná třída
 
Řádek 290:
obj.field1 = 33
obj.field2 = 'str'
</syntaxhighlight>
</source>
 
Existují ale techniky, které umožňují prostředky jazyka zamezit možnost dodatečného přidávání členských proměnných.
Řádek 307:
=== 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:
<sourcesyntaxhighlight lang="python">
def dohromady(a, b):
return a + b
Řádek 313:
dohromady(2, 3) # vrátí 5
dohromady("ahoj", ' nazdar') # vrátí 'ahoj nazdar'
</syntaxhighlight>
</source>
 
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í]].
Řádek 321:
 
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.
<sourcesyntaxhighlight lang="python">
>>> def f(c, n):
... return c * n
Řádek 327:
>>> f(a, 5)
15
</syntaxhighlight>
</source>
 
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.
<sourcesyntaxhighlight lang="python">
>>> a = 1 + 2
>>> a
3
</syntaxhighlight>
</source>
 
Proměnná <code>_</code> obsahuje poslední takto použitou hodnotu.
<sourcesyntaxhighlight lang="python">
>>> f('x', a)
'xxx'
>>> len(_)
3
</syntaxhighlight>
</source>
 
== Python 3.0 ==
Řádek 354:
 
Funkce <code>raw_input</code> bude přejmenována na <code>input</code> (současný <code>input()</code> zmizí), také iterativní varianty funkcí a metod nahradí svoje předchůdce, které vracely seznamy, takže například funkce <code>range</code> bude v podstatě dnešní <code>xrange</code>, analogicky tomu bude s <code>file.readlines()</code>/<code>file.xreadlines()</code>. Podobně další funkce, vracející list, budou vracet iterátor – např. <code>dict.keys()</code>:
<sourcesyntaxhighlight lang="python">
# python 2.x
>>> d = { 'a': 1, 'b': 7 }
Řádek 365:
>>> [ x for x in d.keys() ] # nebo list(d.keys())
['a', 'b']
</syntaxhighlight>
</source>
 
Další viditelnější změnou je chování operátoru dělení <code>/</code> při použití s celými čísly:
<sourcesyntaxhighlight lang="python">
# python 2.x
>>> 5 / 2
Řádek 380:
>>> 5 // 2
2
</syntaxhighlight>
</source>
 
Zmizí <code>dict.has_key()</code>.
Zápis množin se zjednoduší, <code>set([1, 2])</code> bude možné napsat <code>{1, 2}</code>. Dále například přibude řetězcům nová metoda <code>format</code> jako alternativa ke současnému formátování řetězců procentovou notací.
<sourcesyntaxhighlight lang="python">
"ID: %s (%s, %s)" % ("0s9d8f", 0, 3)
# či
Řádek 394:
# a
"ID: {id} ({x}, {y})".format(x=0, y=3, id="0s9d8f")
</syntaxhighlight>
</source>
 
Dalším příkladem porušení zpětné kompatibility je zavedení nové syntaxe pro oktalová čísla. Ta se doposud zapisují s nulou na začátku, např. <code>0777</code>. Tento formát se stane neplatným a nový bude analogický se zápisem hexadecimálních čísel (<code>0x1ff</code>). Správný zápis bude tedy <code>0o777</code>. Podobně bude možné zapisovat i čísla v binární soustavě.