Python byl pojmenován podle komediální skupiny Monty Python,[3] kteří pomocí svých skečů ovlivnili internetovou subkulturu například slovem spam.
Využití
Python je univerzální programovací jazyk, který se stal velmi populárním.[4] Nabízí široké spektrum využití:
Vývoj webových aplikací
Díky frameworkům jako Django a Flask umožňuje snadný vývoj robustních webových aplikací.
Data Science a analýza dat
S knihovnami jako Pandas, NumPy a Matplotlib se stal jazykem volby pro analýzu a vizualizaci dat.
Machine Learning a umělá inteligence
Podporuje růst v oblasti AI díky knihovnám jako TensorFlow, PyTorch a Scikit-learn, které usnadňují vytváření a trénování modelů. Také je k dispozici modul openai, který v Pythonu zpřístupňuje API k populární AI ChatGPT a vývoj programů, které tuto AI využívají.
Automatizace a scripting
Python tradičně umožňuje automatizovat opakující se úkoly a procesy.
Vývoj desktopových aplikací
S nástroji jako PyQt, PyGObject a Tkinter lze vytvářet aplikace s grafickým uživatelským rozhraním.
Vývoj jednoduchých her
Knihovny jako Pygame, PyOpenGL nebo Panda3D umožňují vytváření jednoduchých her.
Sítě a vývoj protokolů
Python umožňuje vývoj síťových aplikací, včetně klientů a serverů pro různé síťové protokoly.
Vědecký výpočet
Knihovny jako SciPy a NumPy rozšiřují možnosti Pythonu v oblasti vědeckých výpočtů.
Mikrokontrolery
Díky MicroPythonu je možné snadno programovat mikrokontrolery, malinké počítače o rozměrech cca 1 cm², které jsou celé implementované v jednom čipu.
Edukace
Díky své jednoduchosti a čitelnosti je Python používán jako první programovací jazyk pro výuku programování. Například knihovna Pygame Zero je designovaná s ohledem na vzdělávání mladých vývojářů. Za zmínku stojí i jednoduché vývojové prostředí Thonny, které je zaměřeno na začátečníky.
Python má rozsáhlou komunitu, která přispívá k velkému množství otevřených zdrojů, projektů a knihoven, jenž 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ů.
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 ukončen, ale stále se s ním lze setkat a je stále k dispozici v linuxových distribucích. 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. 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. Řada 3 opravuje chybná a překonaná designová rozhodnutí, viz kap. Rozdíly mezi Pythonem 2 a 3.
Python 3 se i nadále vyvíjí. Pravidelně, jednou ročně v říjnu, vychází nová verze. Poslední verze jsou:
Verze
Vydána
Konec podpory
Novinky
3.8
2019-10-14
2024-10
Assignment Expression
3.9
2020-10-05
2025-10
Union operátor pro slovník, removeprefix() a removesufix u str
3.10
2021-10-04
2026-10
3.11
2022-10-24
2027-10
Exception Groups, BaseException dostala metodu add_note(), Error Locations, tomllib modul, rychlos zvýšena o 10 až 60 %.
3.12
2023-10-02
2028-10
vylepšení f-stringů, např. v expressions se nyní mohou nacházet escape sekvence (třeba \n nebo ikona {"\N{BLACK HEART SUIT}"}.
Vlastnosti
Python je interpretovaný jazyk s vysokou mírou abstrakce a interaktivním režimem. Je proto zařazován mezi skriptovací jazyky. To mu ovšem nezabránilo, aby se stal univerzálním jazykem s širokým využitím, viz kap. K čemu je dobrý Python.
Typování
Python používá silný dynamický typový systém. Tím dynamickým systémem je míněno, že proměnná není svázaná s datovým typem a typová kontrola probíhá až během chodu programu. 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í 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, ale to pro Python tak úplně neplatí, protože Python umožňuje anotaci datových typů, takže statické analyzátory kódu, jako např. MyPy, se mohou vyřádit i na Pythonu, pokud o to programátor stojí. K optimalizaci rychlosti běhu programu to ale využitelné není.
Silným systémem je míněno, že Python neumožňuje sčítat jablka s hruškami, tedy dva různé datové typy. V Pythonu nedochází k automatickému přetypování hodnot. To ve skutečnosti nejde vůbec, typ je na pevno a na vž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.
Paradigma
Python je také hybridní jazyk (neboli multiparadigmatický), což znamená, že umožňuje při psaní programů používat různá programovací paradigma a kombinovat je. Primárně je Python objektově orientované jazyk 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í a v omezené míře i funkcionální programování. Python má díky tomu vynikající vyjadřovací schopnosti. Jednoduché i komplexní věci se v něm zapisují jednoduše a přehledně. Za tímto účelem je vybaven řadou speciálních jazykových konstrukcí. Kód programu proto bývá krátký a srozumitelný. Jednoduchost a srozumitelnost jazyka usnadňují začátky programování. Na druhou stranu v celé šíři je Python mohutný a komplexní jazyk, a je náročné ho ovládnout kompletně. Začátečník pak může narazit na zdrojové kódy, kterým nemusí porozumět, pokud není vybaven znalostí příslušných jazykových konstrukcí.
Syntaxe
Jednoduché začátky ale převažují a Python se stal populárním jazykem nejen všeobecně, ale i při výuce programování (https://www.umimeinformatiku.cz/programovani-programovani-v-pythonu). Pokračuje tím v dávné tradici, protože jedním z jeho původních inspiračních zdrojů byl programovací jazyk ABC, který byl vytvořen jako jazyk pro výuku. Vý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. Projevuje se to mnoha drobnostmi. Třeba tím, že Python, na rozdíl od jazyků jako C nebo Javascript, místo operátorů „&&“ a „||“ používá operátory „and“ a „or“. Ty jsou pro anglicky mluvící začínající programátory srozumitelnější. Nebo když se ukázalo, že začínající uživatelé mívají u řetězců problém s funkcí strip() a používají ji nevhodně na nevhodné úkoly, byly doplněny funkce removeprefix() a removesufix(), které zjednodušují a zpřehledňují častý programátorský úkon. Největšího ohlasu se ale dočkala definice bloků kódu, tedy např. kde začíná a končí funkce, větev podmínky nebo cyklus a podobně. Ty se v Pythonu (na rozdíl od většiny jazyků) vytváří pouze odsazováním kódu. To je vlastnost, kterou někteří programátoři kritizují(). Většina jazyků na to používá složené závorky (C, Javascript) nebo různá klíčová slova ve smyslu begin a end.
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 a proto to dělají všichni programátoři, ať je to potřeba nebo ne. Tak proč by se tím odsazováním neměl řídit i jazyk. Není potřeba to vyznačovat bloky zvlášť pro člověka a zvlášť pro stroj. Protože se špatně odsazeným kódem přestává program v Pythonu fungovat, jsou všechny zdrojové kódy Pythonu vzorně odsazené a tím logicky více přehledné. Z edukativního hlediska a vytváření dobrých programátorských návyků je to prima věc. Ale má to i stinné stránky. Znemožňuje to automatické formátování kódu, protože když je program špatně odsazen, editor nemá podle čeho poznat, jak je to správně. Co jinde udělá editor sám, to programátor v Pythonu musí opravit ručně. Stěžuje to refaktoring kódu a vůbec kopírování kódu z místa na místo. Také se poslední dobou stalo módní u skriptovacích jazyků zhustit a zkrátit produkční kód na co nejvyšší míru, říká se tomu minifikace. Takový program ja pak napsán na jediném neuvěřitelně dlouhém řádku. Tak to u Pythonu také nejde.
Vý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 extending
Python 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
Vim – Textový editor.
Sublime Text – Textový editor.
Visual Studio Code – IDE.
Microsoft Office – Automatizace a rozšíření funkcí v Excelu.
LibreOffice – Kancelářský balík s podporou makro skriptů v Pythonu.
Scribus – DTP (sazba dokumentů)
Blender – 3D modelování a animace.
GIMP – Bitmapový editor
Inkscape – Vektorový SVG editor
Krita – Kreslící program
Autodesk Maya – 3D modelování, animace, vizuální efekty.
Natron – Tvorba vizuálních efektů
FreeCAD – Parametrický 3D modelář.
QGIS – Systém geografických informací (GIS).
Orange – Data mining, machine learning a vizualizace dat
Bezpečnost
Python 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 numpy s miliony stažení, se dá věřit více, než neznámým, protože jsou pod vysokou veřejnou kontrolou.
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í eval(), která jakýkoliv text spouští jako kód Pythonu, napadne asi každého. Ale že podobně je nebezpečný modul Pickle už každého netrkne i když v dokumentaci před tímto rizikem varuje. Je určen k serializaci a následně načítání jen našich vlastních dat, nikdy cizích.
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 random se nepovažuje za bezpečný s výjimkou funkce random.SysteRandom(), protože náhodnost výsledků není zas až tak moc náhodná. U hry to samozřejmě nevadí.
Další možný zdroj útoků je funkce input() a vůbec všechny, kterými do našeho programu mohou vstupovat data, která je nutno ošetřovat, aby jimi nebyl podstrčen škodlivý kód, tedy ochrana před útoky typu injection.
Na tato a mnohá další rizika upozorňuje článek Zabezpečení Pythonu. 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.[5]
Vývojové prostředky pro Python
IDE – integrovaná vývojová prostředí
PyCharm
Vývojář: JetBrains
Popis: Komplexní IDE pro Python, podpora pro správu projektů, debugging, integraci s verzovacími systémy a web vývoj.
Verze: Community (zdarma), Professional (placená)
Spyder
Vývojář: Open-source komunita
Popis: Zaměřené na vědecké programování, integruje podporu pro numerické výpočty a data visualisation. Součást Anaconda distribution.
Thonny
Vývojář: University of Tartu
Popis: Jednoduché IDE pro začátečníky, obsahuje debugger a rozhraní pro správu balíčků. Designováno pro výuku Pythonu.
Wing IDE
Vývojář: Wingware
Popis: Profesionální vývojové prostředí určené pro Python, nabízí výkonné nástroje pro debugging, editaci kódu a testování.
Editory s podporou Pythonu
IDLE
Vývojář: Python Software Foundation
Popis: Jednoduchý editor s debuggerem a interpretrem, implementovaný v Pythonu a gui knihovně TKinter, která je součástí instalace pythonu.
Vim
Vývojář: Komunita Vim
Popis: Vysoce konfigurovatelný textový editor, podpora pro Python možná přidáním pluginů a nastavení.
Emacs
Vývojář: GNU projekt
Popis: Rozšiřitelný textový editor a vývojové prostředí, s podporou Pythonu prostřednictvím různých balíčků.
Atom
Vývojář: GitHub
Popis: Konfigurovatelný textový editor, podpora balíčků pro rozšíření funkcionalit, včetně podpory pro Python.
Sublime Text
Vývojář: Sublime HQ
Popis: Komerční textový editor s rychlou editací kódu, rozsáhlou možností konfigurace a rozšíření.
Visual Studio Code
Vývojář: Microsoft
Popis: Rozšiřitelný editor kódu, podpora pro debugging, git integraci, syntax highlighting a intelligent code completion.
Jupyter Notebook
Vývojář: Project Jupyter
Popis: Webová aplikace pro tvorbu dokumentů s podporou živého kódu, rovnic, vizualizace a narativního textu.
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.3 je z března roku 2022.
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.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.
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. Poslední verze je Brython 3.12.1 a jeho interaktivní konzoli lze online vyzkoušet zde: https://brython.info/tests/console.html?lang=en
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.[6] 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 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. Většina Python kódu v něm běží dobře.
RustPython
RustPython 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. K dispozici je online demoverze: https://rustpython.github.io/demo/. RustPython má experimentální JIT kompiler, který není defaultně zapnut. Implementuje CPython 3.12.
MicroPython
MicroPython 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 MicroPythonu
Ná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í.
array – pole číselných dat
asyncio — asynchronní plánovač I/O
binascii – binární/ASCII převody
builtins – vestavěné funkce a výjimky
cmath – matematické funkce pro komplexní čísla
collections – datové typy kontejnerů a kolekcí
errno – systémové chybové kódy
gc – garbage collector
gzip – komprese a dekomprese gzip
hashlib – hashovací algoritmy
heapq – implementace heap fronty
io – vstupní/výstupní operace
json – Kódování a dekódování JSON
math – matematické funkce
os – základní služby „operačního systému“.
platform – přístup k identifikačním údajům základní platformy
random – generátor náhodných čísel
re – regulární výrazy
select – IO multiplexing, sledování více kom. kanálů současně
Funkčnost specifická pro implementaci MicroPythonu je dostupná v následujících knihovnách.
bluetooth – low level Bluetooth funkce
btree – jednoduchá databáze BTree
cryptolib – kryptografie
deflate – komprese a dekomprese
framebuf – manipulace s video vyrovnávací pamětí
machine – funkce související s hardwarem
micropython – přístup a ovládání interních částí MicroPythonu
neopixel – ovládání LED WS2812 / NeoPixel
network – konfigurace sítě
uctypes – low level práce s pamětí
vfs – virtuální souborový systém
K tomu je k dispozici řada knihoven specifická pro různý hardware dodávaných výrobci tohoto hardware.
CircuitPython
CircuitPython 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.[7]
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 Pythonu
Python je dostupný pro různé hardwarové architektury pro různé operační systémy skrze různé distribuce.
Standardní distribuce
Standardní distribuce je dostupná zdarma na oficiálním webu.
K dispozici jsou aktuální balíčky pro
Windows (32-bit, 64-bit a ARM64)
MacOS (64-bit)
Linux (jen zdrojové kódy)
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í distribuce
Komerčních distribucí pro Python je celá řada. Krom samotného Pyhonu 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é distribuce
V 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.
Android
Pro 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 pkg install python nainstalujeme standardní Python se vším všudy. Podobně lze nainstalovat i editor Vim a máme k dispozici plnohodnotné vývojové prostředí. Doinstalovat lze řada dalších standardních linuxových nástrojů i jazyků, včetně jazyka C s možnosti kompilace programů ze zdrojových kódů a možností je v Termuxu spustit. To umožňuje do Pythonu v Termuxu instalovat i kompilované knihovny napsané v C. Některé jsou k dispozici již přeložené v balíčkovém systému Termuxu a dostupné přes pkg. Jedná se o velké oblíbené knihovny jako numpy, scipy, torch, lxml, pillow, greenlet, pygobject, matplotlib a další.
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.
Termuxu 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. 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. 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.
iOS
Pro iOS je k dispozici Python IDE Pythonista. Ten obsahuje navíc knihovnu s podporou 2D grafiky, zvuku a multitouch funkcí a další knihovny specifických pro iOS. Z dalších distribucí můžeme alespoň jmenovat Pyto.
BBC micro:bit a další mikro systémy
BBC 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 a Raspberry Pi Pico. MicroPython byl rozvětven a na jeho základě vzniknul také podobný CircuitPython.
Výkon
Vý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++.[8]
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ů:
Počítače jsou tak rychlé, že to v některých případech stejně nepozorujeme. Kdo pozná rozdíl mezi výpočtem 0,01 sec a 0,0005 sec?
Vnější zdržení, třeba čekání na odezvu serveru, nebo i odezvu člověka, než zadá vstup, je tak vysoké, že zdržení které přidává Python je zanedbatelné.
Mnoho knihoven Pythonu využívá principu extending a je napsáno v kompilovaném jazyce C. Python slouží jen k předání dat této knihovně, která se rychle postará o zbytek. Toho se využívá například u grafického rozhraní nebo vědeckých a výpočetních knihoven, jako je např. Numpy.
Pomocí transpileru jde Python kód přeložit pomocí jazyka C a tím ho urychlit. Není to úplně triviální a je dobré kód i optimalizovat, ale pak se dostáváme téměř k rychlosti jazyka C. A z důvodu 3) víme, že stačí mít takto ošetřeny jen kritické, výkonově náročné, části kódu. Tedy spíše než celé programy stačí transpilovat jen ty náročné části programu. Programátor je vyčlení do samostatného modulu, a de facto si takto vytvoří vlastní soukromou knihovnu. S velkou pravděpodobností se jedná jen o krátkou část kódu, a u zbytku programu můžeme stále využít vysoké produktivity psaní programů v Pythonu.
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ě.[9] 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. 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.
Úč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
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ří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 ignorujeimportmath# 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_inputr=float(vstup)# převede řetězec na desetinné čísloS=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
Komentáře jsou v Pythonu jednořádkové a začínají znakem #.
# Toto je komentář
Hodnoty
V 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ů:
Singleton
NoneType – hodnota None
Ellipsis – hodnota ...
Čísla
int – celá čísla libovolné velikosti
bool – hodnoty True, False
float – nepřesná desetinná čísla
complex – komplexní čísla
Fraction – zlomky z modulu fractions
Decimal – přesná desetinná čísla z modulu decimal
Sekvence
Neměnné
str – textový řetězec
bytes – nezměnitelný binární řetězec
tuple – nezměnitelný seznam hodnot
Měnné
bytearray – změnitelný binární řetězec
list – změnitelný seznam hodnot
Množiny
Neměnné
frozenset – nezměnitelná množina
Měnné
set – změnitelná množina
Mapování
dict – slovník
Iterátory a Generátory
enumerate
zip
map
filter
range
Speciální Konstrukty
function
classmethod
staticmethod
property
super
type
Měnné objekty mohou změnit svou hodnotu, neměnné nemohou a proto mohou sloužit jako klíč do slovníku..
Pozor na nepřesná desetinná čísla float. Čísla typu float v Pythonu a většině programovacích jazyků jsou reprezentována podle standardu IEEE 754 pro plovoucí desetinnou čárku (floating-point arithmetic). Tento standard definuje formát pro uložení reálných čísel a provádění aritmetických operací s nimi, aby bylo zajištěno, že výsledky jsou konzistentní a předvídatelné napříč různými počítačovými systémy. Datový typ float
má dvojitou přesnost (64-bit), odpovídá tedy datovému typu double v C.
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ých 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.
Ta nepřesnost je velmi malinká, 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 5y=[1,2,3]# proměnné 'y' přiřadí seznam hodnot 1, 2, 3z=y# proměnné <code>z</code> se přiřadí ten samý seznam hodnot 1, 2, 3y[0]=x# první prvek seznamu 'y' je nastaven na hodnotu 5z=y[:]# '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átory
Python 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
+ – sčítání
- – odčítání
* – násobení
/ – dělení
% – modulo
** – umocnění
// – celočíselné dělení
Porovnávací operátory
== – rovná se
!= – nerovná se
> – větší než
< – menší než
>= – větší nebo rovno
<= – menší nebo rovno
Logické operátory
and – logické A
or – logické NEBO
not – logické NE
Bitové operátory
& – bitový AND
| – bitový OR
^ – bitový XOR
~ – bitový NOT
<< – bitový posun doleva
>> – bitový posun doprava
Přiřazovací operátory
= – přiřazení
+= – přičtení
-= – odečtení
*= – násobení
/= – dělení
%= – modulo přiřazení
**= – umocnění přiřazení
//= – celočíselné dělení přiřazení
Přiřazovací bitové operátory
&= – bitový AND a přiřazení
|= – bitový OR a přiřazení
^= – bitový XOR a přiřazení
>>= – bitový posun doprava a přiřazení
<<= – bitový posun doleva a přiřazení
Identitní operátory
is – je
is not – není
Členské operátory
in – je členem
not in – není členem
Další operátory
:= – walrus operátor (přiřazení v rámci výrazu)
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.05//2# výsledek je zaokrouhlené celé číslo 25.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.
# jednoduchý příklad využití v cyklu# standardní způsobi=0whilei<10:...# udělej něco desetkráti+=1# walrus zjednodušeníwhile(i:=0)<10:...# udělej něco desetkráti+=1# složitější příklad # standardní způsobden=ziskejDen()ifdenin('Sobota','Neděle'):print(f'{den} je víkend.')# vypíše např: Neděle je víkend.# walrus způsobif(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ž :=ifden:=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'orden=='Neděle':print(f'{den} je víkend.')
Jazykové konstrukce
Větvení programu
if, elif, else – Podmíněné větvení pro rozhodování na základě podmínek.
match, case – Větvení na základě vzorů, něco jako switch v jiných jazycích, ale mnohem komplexnější, v Pythonu až od verze 3.10.
Cykly programu
for, in – Cyklus pro iteraci přes položky v sekvenci nebo iterátoru.
while – Cyklus pro opakované vykonávání bloku kódu, dokud je podmínka pravdivá
break – Příkaz pro okamžité ukončení nejbližšího obklopujícího cyklu.
continue – Přeskočí zbytek těla cyklu a pokračuje další iterací.
Struktura programu
Moduly
import, from, as – Import modulů nebo objektů z modulu.
Volatelné konstrukce
class – Definice třídy.
def – Definice funkce nebo metody ve třídě.
lambda – Definice anonymní funkce.
return – Ukončení funkce/metody a vrácení hodnoty
yield – Přerušení funkce/metody a vrácení hodnoty (generátory)
Asynchronní programování
async def – Definice asynchronní funkce.
await – Čeká na dokončení asynchronní funkce.
Výjimky, ošetření chyb
assert – Používá se pro testovací aserce, které vyhodnotí podmínku jako pravdivou.
try, except, finally, else – Zachycení a ošetření výjimek.
raise – Vyvolání výjimky.
Kontextový manažer
with, as – Kontextový manažer pro automatické spravování prostředků.
Práce s proměnnými
del – Vymaže proměnnou
global – Deklarace globální proměnné.
nonlocal – Deklarace, že proměnná není lokální ani globální, ale nachází se v nadřazeném oboru.
Ostatní
pass – Prázdný příkaz, používá se jako zástupný symbol.
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ů
Inicializace a destrukce
__init__(self, ...): Inicializace objektu
__del__(self): Destrukce, volána při odstraňování objektu
Reprezentace objektů
__repr__(self): Oficiální řetězcová reprezentace objektu, pro vývojáře
__str__(self): Čitelná řetězcová reprezentace objektu, pro uživatele
Aritmetické operace
Binární aritmetické operace
__add__(self, other): sčítání
__sub__(self, other): odčítání
__mul__(self, other): násobení
__truediv__(self, other): dělení
__floordiv__(self, other): celočíselné dělení
__mod__(self, other): modulo
__pow__(self, other[, modulo]): mocnění
Reflexivní aritmetické operace
__radd__(self, other): reflexivní sčítání
__rsub__(self, other): reflexivní odčítání
__rmul__(self, other): reflexivní násobení
__rtruediv__(self, other): reflexivní dělení
__rfloordiv__(self, other): reflexivní celočíselné dělení
__ifloordiv__(self, other): celočíselné dělení s přiřazením
__imod__(self, other): modulo s přiřazením
__ipow__(self, other[, modulo]): mocnění s přiřazením
Unární aritmetické operace
__neg__(self): negace
__pos__(self): unární plus
__abs__(self): absolutní hodnota
Porovnávací operace
__eq__(self, other): rovnost, ==
__ne__(self, other): nerovnost, !=
__lt__(self, other): menší než, <
__le__(self, other): menší nebo rovno, <=
__gt__(self, other): větší než, >
__ge__(self, other): větší nebo rovno, >=
Kontejnerové operace
__len__(self): vrátí počet prvků v kontejneru
__getitem__(self, key): získání prvku pomocí indexu nebo klíče
__setitem__(self, key, value): nastavení prvku na daný index nebo klíč
__delitem__(self, key): odstranění prvku na daném indexu nebo klíči
__iter__(self): vrátí iterátor objektu
__contains__(self, item): testuje, zda kontejner obsahuje prvek
Kontextové manažery
__enter__(self): vstup do kontextu použitím with bloku
__exit__(self, exc_type, exc_val, exc_tb): ukončení kontextu a zpracování výjimek
Rozhraní objektu file
read(size=-1): Čte z souboru daný počet bytů, nebo pokud je size nezadáno nebo záporné, čte až do konce souboru.
readline(size=-1): Čte jednu řádku ze souboru s možným omezením délky.
readlines(hint=-1): Čte ze souboru a vrátí list řádků, možno omezit pomocí hint.
write(s): Zapisuje řetězec s do souboru.
writelines(lines): Zapisuje seznam řádků lines do souboru.
seek(offset, whence=SEEK_SET): Přesune pozici čtecího/zapisovacího ukazatele v souboru.
tell(): Vrátí aktuální pozici ukazatele v souboru.
flush(): Vyprázdní vnitřní buffer souboru, zápis všech nezapsaných dat na disk.
close(): Zavře soubor.
__enter__(self): Vstup do kontextového manažera, obvykle při použití with.
__exit__(self, exc_type, exc_val, exc_tb): Ukončení kontextového manažera, automatické zavření souboru.
Toto rozhraní krom objektu file (otevřeného souboru) implemdntuje ř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 StringIO a BytesIO, které umožňují s řetězcem pracovat jako se souborem nebo objekty pro práci s externími procesy z modulu subprocess.
Asynchronní operace
__await__(self): vrátí awaitable objekt pro asynchronní operace
__aiter__(self): vrátí asynchronní iterátor
__anext__(self): vrátí další prvek z asynchronního iterátoru
__aenter__(self): asynchronní vstup do kontextu
__aexit__(self, exc_type, exc_val, exc_tb): asynchronní ukončení kontextu
Implementace iterátorů
__iter__(self): Tato metoda je volána, když iterace začíná. Měla by vrátit objekt iterátoru, což je obvykle self.
__next__(self): Metoda, která je volána pro získání dalšího prvku iterátoru. Když jsou prvky vyčerpány, měla by vyvolat StopIteration.
Atributové a descriptor protokoly
Dynamický přístup k atributům
__getattr__(self, name): Voláno, pokud atribut nebyl nalezen tradičními způsoby.
__getattribute__(self, name): Voláno při každém přístupu k atributu.
__setattr__(self, name, value): Voláno při pokusu o nastavení hodnoty atributu.
__delattr__(self, name): Voláno při pokusu o smazání atributu.
Implementace descriptoru
__get__(self, instance, owner): Metoda pro čtení hodnoty descriptoru.
__set__(self, instance, value): Metoda pro nastavení hodnoty descriptoru.
__delete__(self, instance): Metoda pro smazání hodnoty descriptoru.
Specializované numerické metody
Konverze typů
__int__(self): Konverze objektu na celé číslo.
__float__(self): Konverze objektu na plovoucí desetinné číslo.
__complex__(self): Konverze objektu na komplexní číslo.
Další speciální metody
Hash a Boolean
__hash__(self): Vrátí hash hodnotu objektu, umožňuje použití objektu jako klíče v hashovatelných kontejnerech.
__bool__(self): Vrátí hodnotu True nebo False, když je objekt použit v Booleovském kontextu.
Správa prostředků a kopírování
__copy__(self): Implementace pro povrchovou kopii objektu.
__deepcopy__(self, memodict={}): Implementace pro hlubokou kopii objektu.
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:
delb[0]
Ve výsledku mají a a b stejnou „hodnotu“ [2]. Odkazování na stejný objekt lze zjistit konstrukcí:
aisb# => True
Funkce se uchovává jako objekt
Funkce se chová jako běžný objekt, dokud není zavolána.
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=1p2=""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.
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:
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.
>>>deff(c,n):...returnc*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>>>a3
Proměnná _ obsahuje poslední takto použitou hodnotu.
>>>f('x',a)'xxx'>>>len(_)3
Rozdíly mezi Pythonem 2 a 3
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. 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)[10][11]. 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
Print: z příkazu print se stala funkce.
Python 2: print "Hello"
Python 3: print("Hello")
Dělení celých čísel:: přestalo být celočíselné.
Python 2: 3/2 vrací 1
Python 3: 3/2 vrací 1.5
Python 3: 3//2 vrací 1
8 bitové a Unicode řetězce:
Python 2: Řetězce jsou ASCII, pokud nejsou explicitně označeny jako Unicode (u"some text").
Python 3: Všechny řetězce jsou Unicode by default.
Python 3: Pro binární kód vznikl typ bytes a bytearray: (b"abc", bytearray(b"abc")).
Iterátory:
Python 2: Funkce jako range(), map(), filter(), zip() nebo file.readlines() vrací seznamy.
Python 3: Tyto funkce vrací iterátory.
Python 3: Funkce xrange() a file.xreadlines(), které v Pythonu 2 vracely iterátory, byly zrušeny.
Syntaxe výjimek:
Python 2: except Exception, e:
Python 3: except Exception as e:
Funkce raw_input() a input():
Python 2: raw_input() čte vstup jako řetězec; input() vyhodnotí vstup jako Python výraz.
Python 3: input() funguje jako raw_input() z Pythonu 2; původní input() byl odstraněn.
Změny v API pro standardní knihovnu:
Python 2: Moduly jako urllib, urllib2, a urlparse.
Python 3: Tyto moduly byly sloučeny do urllib.
long typ už neexistuje:
Python 2: Oddělené typy pro int a long.
Python 3: Jednotný typ int, který odpovídá long z Pythonu 2.
Octal literals:
Python 2: Octal literal může být zapsán jako 0777.
↑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)