Python
Python (anglická výslovnost [ˈpaiθən]) je vysokoúrovňový, interpretovaný 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. Jako instalátor balíčků slouží např. pip,[2] který je přítomný ve většině instalacích Pythonu.[3] Tyto balíčky lze získat např. z repozitáře PyPI (Python Package Index).[4] V roce 2023 se jednalo o třetí nejpoužívanější programovací jazyk.[5] 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.[zdroj?] Nachází využití zejména pro vývoj webových aplikací (framework Django), datovou analýzu (frameworky Pandas nebo scikit-learn) a strojové učení (Pytorch, TensorFlow). Python byl pojmenován podle komediální skupiny Monty Python,[6] kteří pomocí svých skečů ovlivnili internetovou subkulturu například slovem spam. VyužitíPython nabízí široké spektrum využití, například:
Python má rozsáhlou komunitu, která přispívá k velkému množství otevřených zdrojů, projektů a knihoven, jež usnadňují vývoj v těchto i dalších oblastech. Jejich centrum je pypi.org (Python Package Index), které hostuje moduly Pythonu. Ty je možné z pypi.org snadno instalovat pomocí správce balíčků pip, jenž je standardní součástí instalace pythonu. Pypi.org v tuto chvíli hlásí přes půl milionu hostovaných balíčků. HistoriePostupem času vznikly tři nekompatibilní major verze, Python (1), Python 2 a Python 3.
Python 3 se i nadále vyvíjí. Pravidelně, jednou ročně v říjnu, vychází nová verze. Poslední verze jsou:
Vlastnosti![]() TypováníPython používá silný dynamický typový systém.[8] Silný typový systém zaručuje, že se typy nemohou nečekaně měnit, je zapotřebí je explicitně převést. Dynamický typový systém, na rozdíl od statického, nepřiřazuje proměnné typ, takže se může měnit za chodu programu.[9] Toho je docíleno tím, že v Pythonu je vše objekt a proměnná je jen ukazatel na tento objekt. Informaci o svém datovém typu si udržuje objekt sám a proměnná se nezabývá jeho paměťovými nároky a ty se nedeklarují předem. Jakákoliv proměnná může ukazovat na jakýkoliv objekt. Dynamické typové systémy mají oproti statickým systémům výhody větší flexibility a snazšího psaní kódu, ale platí za to horší optimalizovatelností a rychlostí výsledného programu. Jako další nevýhoda bývá uváděna horší možnost kontroly programu vůči chybám před spuštěním. Python ale umožňuje anotaci datových typů, takže je možné využít i statické analyzátory kódu, jako např. MyPy. K optimalizaci rychlosti běhu programu to ale využitelné není. V Pythonu nedochází k automatickému přetypování hodnot. To ve skutečnosti nejde vůbec, typ je napevno a navždy svázán s hodnotou a při tzv. přetypování dojde k vytvoření nového objektu. Výjimečně jsou podporovány interakce mezi různými datovými typy, ale typicky to vyvolává výjimku. Mezi takové výjimečné interakce patří násobení stringu číslem, které provádí zřetězení stringu. Tedy výraz 2 * 'abc' vytvoří nový objekt 'abcabc'. Ale pokus o sečtení čísla a stringu, tedy výraz 2 + 'abc' už vede k vyvolání výjimky. ParadigmaPython je hybridní (multiparadigmatický) jazyk, což znamená, že umožňuje při psaní programů používat různá programovací paradigma a kombinovat je. Primárně je Python objektově orientovaný a vše je v něm implementováno jako objekt, hodnoty, kontejnery, funkce i třídy. Python ale umožňuje i jednoduché procedurální programování, a v omezené míře i funkcionální programování. ProduktivitaVýznamnou vlastností skriptovacích jazyků je vysoká produktivita psaní programů za cenu nižšího výkonu programu a Python není výjimkou. Vyšší produktivita psaní programu se týká malých programů i 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 psaní rozsáhlých programů, jako jsou například přirozená podpora jmenných prostorů, používání modulů, tříd a výjimek, standardně dodávané prostředky pro psaní testů (unit testing), dokumentační řetězce (neplést s komentáři) a dalšími. Vysoké produktivitě napomáhá již zmíněná rozsáhlost a snadná dostupnost škály knihovních modulů, které umožňujících snadné řešení úloh z řady oblastí. Embedding a extendingPython je uzpůsoben k vkládání do jiných aplikací (embedding). Embedding umožňuje aplikace skriptovat v jazyce Python. Ten má přístup jak k API takové aplikace tak ke svému nepřebernému množství modulů, třeba AI. Takto lze aplikacím psaným v kompilovaných programovacích jazycích dodávat chybějící pružnost nebo pro ně snadno psát pluginy či v nich automatizovat jejich činnost. 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). Příklady aplikací s podporou skriptování v Pythonu
BezpečnostPython není vytvářen a koncipován jako bezpečný jazyk. To neznamená, že by se nedbalo zranitelností a ignorovaly se, ale že má vědomě řadu prvků, které mohou být nebezpečné při nevhodném použití nebo s nevhodným účelem. V žádném případě není Python určen ke spouštění cizího neověřeného kódu na rozdíl třeba od JavaScriptu. JavaScriptu v prohlížeči běžně předkládáme kódy prakticky s každou načtenou stránkou a máme poměrně vysokou rozumnou jistotu, že to nenapáchá žádnou škodu, a že JavaScript v prohlížeči nebude zneužitelný k napadení našeho počítače, protože je zcela odstíněn od operačního systému. Neplatí to už pro Node.js a ani pro Python. Python nemá žádný bezpečný sandbox. Ale je možné ho spouštět v externím bezpečném sandboxu, zřízeném pomocí prostředků operačního systému nebo virtuálních strojů. Je proto potřeba zabránit podstrčení a spuštění škodlivého kódu, což není jednoduché. Vzhledem k rozsáhlosti a komplexitě Pythonu je vektorů zranitelnosti mnoho. Rizikové jsou všechny externí knihovny, které si do Pythonu instalujeme. Každou takovou knihovnu lze považovat za cizí program a měli bychom k ní přistupovat jako k cizímu programu. Ty si do počítače také jen tak bez rozmyslu nenainstalujeme. A pokud ano, nemůžeme se divit následným možným problémům. Úložiště pip je veřejně přístupné, a i když se snaží řešit bezpečnost, rozhodně ji nezaručuje ani na úrovni škodlivého kódu, natož na úrovni nechtěných zranitelností. Je na našem zvážení, kterým projektům důvěřujeme. Těm známým, jako třeba Python ke knihovnám na disku přistupuje dynamicky, hledá je na různých místech, lze mu tak snadno podstrčit jiné, stačí mu v nastavení změnit cesty, kde je má hledat. Jakmile má někdo přístup k disku počítače a možnost měnit nastavení systému, třeba PATH cestu, je Python proti tomu bezbranný. Neimplementuje žádné digitální podpisy knihoven, bytového kódu a podobně. Je také snadné dopustit se zranitelností nesprávným psaním programů, kdy se nebezpečným stane náš vlastní program. Že má být velmi opatrně nakládáno s funkcí Kdybychom chtěli v Pythonu psát kriticky bezpečný software, třeba nějaké šifrování, měli bychom vědět, že modul Další možný zdroj útoků je funkce Na tato a mnohá další rizika upozorňuje článek Zabezpečení Pythonu.[10] Ten by si měl přečíst minimálně každý vývojář, jenž se rozhodne poskytovat veřejné rozhraní ke svému programu a tím jej vystaví snadným útokům. Je potřeba mít na mysli kybernetickou bezpečnost. Python a jeho ekosystém je tak rozsáhlý, že nelze zabezpečit, aby byl bezchybný. V roce 2017 došlo k bezpečnostním zkouškám několika populárních jazyků včetně Pythonu a u každého byly zjištěny nějaké zranitelnosti. U Pythonu bylo např. zjištěno, ž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.[11] SyntaxeVývojáři Pythonu se od začátku soustředí na srozumitelnost syntaxe jazyka a v tomto ohledu ho vylepšují dodnes. Mnoho vývojových vylepšení jazyka Python spočívá jen v tom, že umožňuje snadněji zapsat to, co už v něm bylo možno zapsat, ale složitějším způsobem. Např. na rozdíl od jazyků, jako je C nebo JavaScript, místo operátorů Vymezování bloků kódu odsazováním v Pythonu je postavena na myšlence, že odsazování kódu je nezbytné pro přehlednost kódu. Správné odsazování je nutné pro správnou funkčnost kódu. Toto rozhodnutí ale znemožňuje minifikaci, tj. odstranění znaků, které nejsou nutné pro funkčnost programu. Ta se používá např. při přenosu kódu přes Internet. Myšlenky návrhu jazyka jsou shrnuty ve filozofii Pythonu. KomentářeKomentáře jsou v Pythonu jednořádkové a začínají znakem # Toto je komentář
HodnotyV Pythonu jsou všechna data objekt: číslo, seznam, funkce, třída i modul. Každý objekt má svůj datový typ. Přehled vybraných datových typů:
Měnné objekty mohou změnit svou hodnotu, neměnné nemohou a proto mohou sloužit jako klíč do slovníku. Čísla typu Tento datový typ nedokáže všechna konečná desetinná čísla ukládat přesně, kvůli jejich nekonečnému rozvoji. V desítkové soustavě to známe třeba u zlomku 1/3, který je 0,3333 a dál až do nekonečna. V počítači jsou čísla uložena v dvojkové soustavě a u ní dochází také k nekonečnému rozvoji některých zlomků, ale jinému než v desítkové soustavě, takže to na první pohled není poznat. Například 1/10, tedy číslo 0.1 je v paměti počítače uloženo nepřesně. Ta nepřesnost je velmi malá, že není u jednoduché nepřesnosti vidět, ale jejich sčítáním se nepřesnost zvyšuje, až tato vidět je a může ovlivnit běh programu. >>> 0.1 == 0.1
True
>>> 0.1 + 0.1
0.2
>>> 0.1 + 0.1 == 0.2
True
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
>>> 0.1 + 0.1 + 0.1 == 0.3
False
Ta nepřesnost je velmi malá. Kdybychom například počítali něco v metrech, je to chyba menší než velikost atomu, ale přesto je to chyba a třeba při porovnávání už může vést k fatálně nečekanému výsledku. Pro potřeby přesného počítání proto máme v Pythonu i modul fraction a decimal pro přesné výpočty, které jsou ale pomalé. ProměnnéProměnná je pojmenovaný ukazatel na objekt. Protože datový typ je součástí hodnoty, není třeba ji nějak deklarovat. Ale možné to je, protože Python podporuje anotace datových typů. x = 5 # proměnné 'x' přiřadí hodnotu 5
y = [1, 2, 3] # proměnné 'y' přiřadí seznam hodnot 1, 2, 3
z = y # proměnné 'z' se přiřadí ten samý seznam hodnot 1, 2, 3
y[0] = x # první prvek seznamu 'y' je nastaven na hodnotu 5
z = y[:] # vytváří kopii seznamu 'y', kterou přiřazujeme k 'z'
z[0] = 0 # 'z' ukazuje na seznam 0, 2, 3; 'y' stále ukazuje na seznam 5, 2, 3
OperátoryPython má rozsáhlou skupinu standardních operátorů. Za pozornost stojí dva operátory pro dělení, kdy jeden dělí desetinně a druhý celočíselně a walrus operátor, který zkracuje psaní kódu. Aritmetické operátory
Porovnávací operátory
Logické operátory
Bitové operátory
Přiřazovací operátory
Přiřazovací bitové operátory
Identitní operátory
Členské operátory
Další operátory
Podívejme se blíže na běžné '/' a celočíselné '//' dělení, což patří mezi méně obvyklé operátory. 6 / 2 # výsledek je desetinné číslo 3.0
5 // 2 # výsledek je zaokrouhlené celé číslo 2
5.0 // 2 # výsledek je zaokrouhlené desetinné číslo 2.0
# pozor toto je matoucí, celočíselné dělení hodnotu zaokrouhlí
# ale protože jeden z operandů je float, výsledek je float
Walrus operátor byl přidán v Pythonu 3.8. Umožňuje současně přiřadit proměnné hodnotu a hned ji použít ve výrazu. # standardní způsob
den = ziskejDen()
if den in ('Sobota', 'Neděle'):
print(f'{den} je víkend.')
# vypíše např: Neděle je víkend.
# walrus způsob
if (den := ziskejDen()) in ('Sobota', 'Neděle'):
print(f'{den} je víkend.')
# vypíše např: Neděle je víkend.
# pozor, in má vyšší prioritu než :=
if den := ziskejDen() in ('Sobota', 'Neděle'):
print(f'{den} je víkend.')
# vypíše např: True je víkend. - nejprve se vyhodnotí in a jeho výsledek se vloží do den
# Přiřazenou proměnou je možno použít ve výrazu opakovaně:
if (den := ziskejDen()) == 'Sobota' or den == 'Neděle':
print(f'{den} je víkend.')
Větvení programu
Cykly programu
Struktura programu
Výjimky, ošetření chyb
Kontextový manažer
Práce s proměnnými
Ostatní
Rozhraní objektůV Pythonu si můžeme definovat pomocí tříd vlastní datové typy. Aby byly považovány za objekt určitého druhu, je nutné jim implementovat k tomu určené rozhraní, které se také nazývají protokoly. Pokud si budeme chtít definovat třeba vlastní číselný typ, například Uhel, budeme mu muset implementovat aritmetické rozhraní, aby je bylo možno např. násobit. Zde je seznam jednotlivých rozhraní. Základní metody objektů
Aritmetické operace
Porovnávací operace
Kontejnerové operace
Kontextové manažery
Rozhraní objektu file
Toto rozhraní krom objektu file (otevřeného souboru) implementuje řada dalších objektů, například objekty síťových soketů – pro práci se síťovými spojeními, kde mohou být data čtena a zapisována do soketu podobně jako do souboru, nebo objekty I/O proudů z modulu io – jako Asynchronní operace
Implementace iterátorů
Atributové a descriptor protokolyDynamický přístup k atributům
Implementace descriptoru
Specializované numerické metodyKonverze typů
Další speciální metodyHash a Boolean
Správa prostředků a kopírování
Vývojové prostředky pro PythonIDE – integrovaná vývojová prostředí
Editory s podporou Pythonu
Různé implementace PythonuStandardní 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. CPythonStandardní 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. JythonJython 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.3 je z března roku 2022. IronPythonIronPython 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.12 vydaná v roce 2022 a 3.4.0 vydaná v roce 2022. Negativně může být vnímána skutečnost, že implementace IronPython je vyvíjena firmou Microsoft pod Microsoft Public License. BrythonBrython 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 RPythonRPython 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ší. CythonCython 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.[12] 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. PyPyPyPy je alternativní interpret jazyka Python, který je zaměřen na výkon. Tento interpret je kompilován RPythonem. RPython 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í. PyPy navazuje na Psyco, což byl JIT kompilátor pro Python2. Poslední verze PyPy 7.3.14 z 2023 implementuje Python 2.7, a 3.7, 3.8 a 3.9. RustPythonRustPython je implementace Pythonu 3 v jazyce Rust. RustPython lze vložit do programů Rust a používat Python jako skriptovací jazyk pro aplikaci napsanou v Rustu, nebo jej lze zkompilovat do WebAssembly, a je možné spouštět RustPython v prohlížeči. RustPython je zdarma a open-source pod licencí MIT. RustPython má experimentální JIT kompiler, který není defaultně zapnut. Implementuje CPython 3.12. MicroPythonMicroPython je znovu napsaná odladěná štíhlá efektivní implementace Pythonu 3.4 (+ vybrané věci z 3.5 a vyšších) pro mikrokontrolery. Mikrokontroléry disponují omezeným množstvím pamětí a jsou výkonově limitovány. MicroPython je optimalizovaný pro taková prostředí. Je to implementace celého samotného jazyku a několika málo modulů ze standardní knihovny a pár modulů navíc pro práci s mikrokontrolery, například inline assembler. Stačí mu 256 kB úložného prostoru a 16 kB RAM. Na MicroPython a vývoj programů pro mikrokontrolery je specializováno jednoduché IDE Thonny pro Windows, Mac i Linux. Podporuje ale i plnohodnotný Python a z povahy věci umožňuje interprety snadno střídat, kód spouštět simulovaně nebo v mikrokontroleru. Pro začátečníky je Thonny dobrá volba. Standardní knihovny MicroPythonuNásledující standardní knihovny Pythonu byly „mikroifikovány“, aby odpovídaly filozofii MicroPythonu. Poskytují základní funkcionalitu tohoto modulu a jsou určeny jako náhrada standardní knihovny Pythonu. Nejsou s nimi ale plně kompatibilní.
Knihovny specifické pro MicroPythonFunkčnost specifická pro implementaci MicroPythonu je dostupná v následujících knihovnách.
K tomu je k dispozici řada knihoven specifická pro různý hardware dodávaných výrobci tohoto hardware. CircuitPythonCircuitPython je fork MicroPythonu a stejně jako on je specializován na programování mikrokontrolerů. Stojí za ním Adafruit, známý výrobce mikrokontrolerů a dalšího příslušenství pro ně. Důvodem pro rozvětvení MicroPythonu a vznik CircuitPythonu je vyšší uživatelská přívětivost CircuitPythonu pro naprosté začátečníky i za cenu některých omezení a ztráty výkonu.[13] MicroPython má blíže k hardware a vlastnosti tohoto hardware se projevují v kódu, který je bez úprav nepřenosný mezi různými druhy mikrokontrolerů. CircuitPython přidává další vrstvu, která tyto rozdíly odstraňuje, ale za cenu vyšších paměťových nároků a nižší rychlosti. CircuitPython se snaží také odstranit rozdíly dodávaných knihoven vůči CPythonu a učinit programování mikrokontrolerů ještě jednodušší. Je primárně zaměřen na vzdělávání. Dostupnost PythonuPython je dostupný pro různé hardwarové architektury pro různé operační systémy skrze různé distribuce. Standardní distribuceStandardní distribuce je dostupná zdarma na oficiálním webu. K dispozici jsou aktuální balíčky pro
A dále jsou v nabídce odkazy pro platformy: AIX, IBM i, OS/390, z/OS, RISC OS, Solaris, UEFI, VMX a HP-UX. Zpravidla se jedná o starší verze Pythonu a jsou to odkazy na jiné distribuce. Alternativní a komerční distribuceKomerčních distribucí pro Python je celá řada. Krom samotného Pythonu mohou obsahovat různá IDE a předinstalované ne-standardní knihovny, zaměřené na nějakou oblast. Jmenujme např. ActivePython od ActiveState, který vyvíjí i IDE Komodo, nejen pro Python, ale i další jazyky jako PHP, Go, Node.js a další a které je pro Windows, MacOS i Linux. Další známá distribuce je Anaconda, určená pro vědecké výpočty (data science, strojové učení aplikace, zpracování dat, prediktivní analýzy atd.). Na závěr zmiňme WinPython, tato distribuce se zaměřuje jen na platformu Windows a připravuje pro ni portable verzi Pythonu, tedy takovou, která se nemusí instalovat a jde rovnou spustit. Linuxové distribuceV Linuxových distribucích je zvykem, že si každá distribuuje svůj software sama. Proto každá Linuxová distribuce je i distribucí Pythonu. Není neobvyklé, že Python je v Linuxu už předinstalován a instalovat se vůbec nemusí. To se platí i pro oblíbenou platformu Raspberry Pi s linuxovým Raspbian OS. AndroidPro Android zmiňme dvě významné distribuce Pythonu. ![]() První je součástí Termuxu. Termux je emulátor terminálu s linuxovou distribucí, který se do Androidu instaluje jako běžná aplikace. Spuštěním Termuxu spustíme terminál s příkazovou řádkou. Příkazem To zajišťuje na Androidu kvalitní a stabilní produkční prostředí pro vývoj programů v jazyce Python (i jiných). Na obrázku je vidět snímek obrazovky Androidu. Ukazuje v Termuxu spuštěný vývojářský editor Vim. Základní klávesnice Hacker's keyboard je rozšířena o plně konfigurovatelnou klávesnici extra-keys Termuxu. Vim má obrazovku rozdělenou na tři okna. Uprostřed je kód Python Programu, v pravém okně je výstupní okno s chybovým hlášením a v levém okně je open ai pomáhající s vývojem programu a provádějící rutinní operace. Hlavní omezení vývoje Python aplikací na Termuxu spočívá v tom, že Termux v základu poskytuje pouze textové rozhraní, takže v něm nelze vyvíjet grafické aplikace, třeba s knihovnou pygame nebo Tkinter. Lze ale mít v Termuxu spuštěný server a vyvíjet aplikaci, která jako grafický frontend využívá Chrome. Také lze přes Termux api otvírat dialogová okna Androidu, přistupovat k notifikacím Andtoidu, což může pro některé jednoduché věci stačit. Termux má také podporu X Window Xystému a lze z něj provozovat grafický desktop vzdáleně, buď na jiném počítači, nebo přes VNC klienta přímo na tom samém Androidu.[14] Ale to je spíše zajímavost než produkční řešení pro práci, protože to není plnohodnotné řešení. Například toto grafické rozhraní nepodporuje hw akceleraci. Komu by toto omezení vadilo a chtěl by vyšší grafický výkon, třeba pro pokusy s pygame, může si nainstalovat placenou Pydroid 3.[15] To je IDE pro Python 3 na Androidu, které podporuje vývoj grafických aplikací a umožňuje používat pygame, Tkinter nebo Kiwi. Obsahuje terminál emulátor, pip, Cython, PDB, knihovny: numpy, scipy, matplotlib, jupyter, OpenCV, TensorFlow, PyTorch, Tkinter, pygame, Kivy a další. Dokonce i C, C++ a Fortran kompiler pro překlad Python modulů. Prostředí nicméně není odladěné a stabilní a je označeno jako educational Python 3 IDE. iOSPro iOS je k dispozici Python IDE Pythonista.[16] Ten obsahuje navíc knihovnu s podporou 2D grafiky, zvuku a multitouch funkcí a další knihovny specifických pro iOS. Z dalších distribucí lze alespoň jmenovat Pyto.[17] BBC micro:bit a další mikro systémyBBC micro:bit je populární výukový jednočipový mikropočítač o velikosti poloviny platební karty. Lze ho programovat mimo jiné i pomocí MicroPythonu. MicroPython byl původně vyvinut pro desku pyboard, ale dnes je použitý s širokou škálou mikrokontrolerů. Za vyjmenování stojí známé Lego Mindstorm EV3[18] a Raspberry Pi Pico[19]. MicroPython byl rozvětven a na jeho základě vznikl také podobný CircuitPython. VýkonVýkonnost programů napsaných v samotném Pythonu je nízká. Programy napsané v Pythonu běží pomaleji oproti programům napsaných v kompilovaných programovacích jazycích, jako je třeba jazyk C++.[20] Program v Pythonu může být pomalejší řádově desetinásobně, klidně i padesátkrát. To ho činí například nevhodným pro vývoj velkých a graficky náročných her nebo grafických kodeků a podobně. Ale jinak to v praxi často nevadí a to z řady důvodů:
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ě.[21] Tato knihovna je cca od roku 2010 neudržovaná a použitelná jen pro 32bitové prostředí a podporuje Python jen do verze 2.6. Na knihovnu Psyco navázal projekt PyPy, tedy alternativní interpret Pythonu, který obsahuje JIT kompiler a je účinnější než Psyco. Další, ještě účinnější způsob dosažení vyššího výkonu v Pythonu je použití transpileru Cython 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 v kódu pro získání maximálního výkonu pro použití s transkompilerem 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.
Jak je vidět, už jen samotný překlad rychlost zdvojnásobí. Doplnění C datových typů zrychlí program desetinásobně. Ale to není zadarmo, tímto krokem už přicházíme o užitečnou datovou flexibilitu Pythonu. Při plné optimalizaci dosahujeme téměř rychlosti jazyka C. PříkladyUká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
Charakteristika a použití jazykaProměnná je pojmenovaným odkazem na objektKaž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“ a is b
# => True
Funkce se uchovává jako objektFunkce 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í odkazyDo 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é deklarovatV 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ěhuMezi 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á kontrolaPř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čeInterpret 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 >>> def f(c, n):
... return c * n
...
>>> f(a, 5)
15
V interaktivním režimu většinou nepoužíváme příkaz >>> a = 1 + 2
>>> a
3
Proměnná >>> f('x', a)
'xxx'
>>> len(_)
3
Rozdíly mezi Pythonem 2 a 3Python 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. Navíc historickým vývojem některé technologie zastarávají a je třeba je nahradit nebo jim jazyk přizpůsobit. Výsledkem toho je nová nekompatibilní verze nebo pomalu zastarávající jazyk. Obojí přístup má svá rizika, jak změna tak ustrnulost. Python si vybral změnu a rozjel projekt Python 3000 (Py3k).[22][23] A zatím, co změna z verze jedna na verzi dva byla bezbolestná, protože Python v té době nebyl ještě tak rozšířený, změna na verzi tři byla velmi bolestná. Znamenalo to přepsat všechny významné knihovny a software a dlouho udržovat dvě verze knihoven pro Python 2 a 3 paralelně. Vývojáři Pythonu vynaložili mnoho práce, aby programátorům v Pythonu přechod usnadnili, přesto významně trval přes deset let a v malém trvá dodnes (2024), protože je stále možno se potkat s Pythonem 2. A i když Python 3 dnes už naprosto jasně dominuje a nový projekt začít dělat v Pythonu 2 snad už nikoho nenapadne, přesto je dobré mít nějaké povědomí o zásadních nekompatibilních změnách, které proběhly. Jsou dobře zdokumentovány, proto jen stručný přehled hlavních změn. Hlavní změny mezi Pythonem 2 a Pythonem 3, které přinesly nekompatibilitu v kódu
Podrobnější seznam změn lze najít (anglicky) v dokumentu What’s New In Python 3.0.[24] OdkazyReference
Externí odkazy
Dokumentace, učebnice
|
Portal di Ensiklopedia Dunia