Python
Logo Pythonu | |
Paradigma | multiparadigmatický |
---|---|
Vznik | 1991 |
Autor | Guido van Rossum |
Vývojář | Python Software Foundation |
První vydání | 20. února 1991 |
Poslední verze | 3.12.3 (9. dubna 2024) |
Poslední nestabilní verze | 3.13.0b1 (8. května 2024) |
Typová kontrola | silná, dynamická, duck-typing |
Hlavní implementace | CPython, Jython, IronPython, PyPy, Brython |
Dialekty | Stackless Python, RPython, Cython, MicroPython, CircuitPython |
Ovlivněn jazyky | ABC, Perl, Lisp, Smalltalk, Tcl |
Ovlivnil jazyky | Ruby, Boo, Groovy |
OS | multiplatformní |
Licence | Python Software Foundation License |
Web | www.python.org |
Python (anglická výslovnost [ˈpaiθən]) je vysokoúrovňový, 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. V roce 2023 se jednalo o třetí nejpoužívanější programovací jazyk.[2]
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.
Nachází využití zejména pro web development (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,[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.
Myšlenky návrhu jazyka jsou shrnuty ve filozofii Pythonu.
Produktivita
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 datasyncio
— asynchronní plánovač I/Obinascii
– binární/ASCII převodybuiltins
– vestavěné funkce a výjimkycmath
– matematické funkce pro komplexní číslacollections
– datové typy kontejnerů a kolekcíerrno
– systémové chybové kódygc
– garbage collectorgzip
– komprese a dekomprese gziphashlib
– hashovací algoritmyheapq
– implementace heap frontyio
– vstupní/výstupní operacejson
– Kódování a dekódování JSONmath
– matematické funkceos
– základní služby „operačního systému“.platform
– přístup k identifikačním údajům základní platformyrandom
– generátor náhodných číselre
– regulární výrazyselect
– IO multiplexing, sledování více kom. kanálů současněsocket
– síťové programováníssl
– modul SSL/TLS pro šifrovánístruct
– binární datové strukturysys
– systémové funkcetime
– časové funkcezlib
– komprese a dekomprese zlib_thread
– podpora multithreadingu
Knihovny specifické pro MicroPython
Funkčnost specifická pro implementaci MicroPythonu je dostupná v následujících knihovnách.
bluetooth
– low level Bluetooth funkcebtree
– jednoduchá databáze BTreecryptolib
– kryptografiedeflate
– komprese a dekompreseframebuf
– manipulace s video vyrovnávací pamětímachine
– funkce související s hardwaremmicropython
– přístup a ovládání interních částí MicroPythonuneopixel
– ovládání LED WS2812 / NeoPixelnetwork
– 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.
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.
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 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
Program v jazyce Python | Odpovídající program v jazyce C |
---|---|
def factorial(x):
if x <= 0:
return 1
else:
return x * factorial(x - 1)
def factorial_kratsi(x):
return 1 if x <= 0 else x * factorial_kratsi(x - 1)
| int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
int factorial_kratsi(int x) {
return x <= 0 ? 1 : x * factorial_kratsi(x - 1);
}
|
Vlastnosti jazyka
Komentáře
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é velikostibool
– hodnoty True, False
float
– nepřesná desetinná číslacomplex
– komplexní číslaFraction
– zlomky z modulu fractionsDecimal
– přesná desetinná čísla z modulu decimal
- Sekvence
- Neměnné
str
– textový řetězecbytes
– nezměnitelný binární řetězectuple
– nezměnitelný seznam hodnot
- Měnné
bytearray
– změnitelný binární řetězeclist
– změnitelný seznam hodnot
- Neměnné
- Množiny
- Neměnné
frozenset
– nezměnitelná množina
- Měnné
set
– změnitelná množina
- Neměnné
- 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.
>>> 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 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 5
y = [1, 2, 3] # proměnné 'y' přiřadí seznam hodnot 1, 2, 3
z = y # proměnné <code>z</code> 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[:] # '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é Aor
– logické NEBOnot
– 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
– jeis not
– není
Členské operátory
in
– je členemnot 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.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.
# jednoduchý příklad využití v cyklu
# standardní způsob
i = 0
while i < 10:
... # udělej něco desetkrát
i += 1
# walrus zjednodušení
while (i := 0) < 10:
... # udělej něco desetkrát
i += 1
# složitější příklad
# 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.')
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 jakoswitch
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í hodnotyyield
– 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ěnnouglobal
– 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í__rmod__(self, other)
: reflexivní modulo__rpow__(self, other[, modulo])
: reflexivní mocnění
Rozšířené přiřazení aritmetických operací
__iadd__(self, other)
: sčítání s přiřazením__isub__(self, other)
: odčítání s přiřazením__imul__(self, other)
: násobení s přiřazením__itruediv__(self, other)
: dělení s přiřazením__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ímwith
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 jesize
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ězecs
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 obvykleself
.__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 vyvolatStopIteration
.
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:
del b[0]
Ve výsledku mají a a b stejnou „hodnotu“ [2]
. Odkazování na stejný objekt lze zjistit konstrukcí:
a is b
# => True
Funkce se uchovává jako objekt
Funkce se chová jako běžný objekt, dokud není zavolána.
def funkce():
print('Python')
f = funkce
p = [1, 2, 'test', f]
p[3]()
Lze s ní manipulovat, ukládat do proměnných, polí, objektů. Přesněji řečeno, manipuluje se s odkazem na objekt funkce. S objektem funkce je možné podle potřeby svázat i nové jméno, případně ji i kdykoliv předefinovat.
Do složených datových struktur se ukládají odkazy
Do složených datových struktur se ukládají odkazy na objekty, nikoliv objekty samotné. Typ objektu není vázán na odkaz, ale je svázán až s odkazovaným objektem. Z toho vyplývá, že například do jednoho seznamu je možné současně uložit odkazy na objekty libovolného typu:
a = [1, 2, 'pokus', u"UNICODE", ('a tak', u'dále...'), {'4':44, 5:55}]#od verze 3.0 není potřeba před řetězce psát U, protože všechny řetězce jsou Unicode.
Jinými slovy, z technického hlediska jsou odkazy všechny stejného typu (interního), který nemá žádný vztah k typu odkazovaného objektu. Technicky lze tedy seznam považovat za homogenní datový typ. Z uživatelského pohledu to vypadá, že do seznamu můžeme vkládat hodnoty různého typu. Ještě jednou – do seznamu se nevkládají hodnoty daných typů, ale jen beztypové odkazy na příslušné objekty.
Proměnné není nutné deklarovat
V jiných jazycích se při deklaraci proměnné uvádí souvislost jména proměnné s typem ukládané hodnoty. V jazyce Python je proměnná jen pojmenovaným odkazem na nějaký objekt. Typ objektu je ale vázán na odkazovaný objekt, nikoliv na jméno. Potřeba deklarace proměnné ve významu určení souvisejícího typu dat tedy odpadá.
Existence, či neexistence jména přímo nesouvisí s existencí či neexistencí hodnotového objektu. Význam deklarace proměnné ve smyslu popisu existence související hodnoty tedy rovněž odpadá. Proměnná, jako pojmenovaný odkaz, vzniká v okamžiku, kdy se jméno objeví na levé straně přiřazovacího příkazu. Jméno proměnné může být později svázáno dalším přiřazením s jiným objektem zcela jiného typu.
p = 1
p2 = ""
p3 = p # Kopie odkazu p
Členské proměnné tříd mohou vznikat až za běhu
Mezi běžné praktiky při vytváření objektu patří i založení používaných členských proměnných. Tento obrat se ale v jazyce Python chápe jako užitečná technika, nikoliv jako nutnost. Členské proměnné (čili proměnné uvnitř objektu) mohou vznikat až za běhu.
class pokus: pass #prázdná třída
obj = pokus()
obj.field1 = 33
obj.field2 = 'str'
Existují ale techniky, které umožňují prostředky jazyka zamezit možnost dodatečného přidávání členských proměnných.
Dynamická silná typová kontrola
Při operacích nad objekty se zpravidla provádí silná typová kontrola[zdroj?!], to znamená, že při operacích s typy nedochází k automatickému přetypování hodnot. Výjimkou jsou v Pythonu 2 datové typy int a long, kde nedochází k přetečení datového typu int, ale k automatickému přetypování hodnoty z int na long. Python 3 už podporuje pouze datový typ int, který má vlastnosti jako datový typ long v Pythonu 2.
Dále jsou v Pythonu 2 i Pythonu 3 podporovány aritmetické operace různých numerických datových typů. Například lze sečíst datové typy int a float, výsledkem bude datový typ float, 1 + 1.0 = 2.0. Na rozdíl od řady jiných interpretovaných dynamických jazyků nedochází k automatickému převodu číselných textových řetězců na čísla, proto 1 + '1' = výjimka.
Výjimku vyvolá každá nepodporovaná operace různých datových typů. Nepodporované je třeba dělení řetězců, proto 'abcd' / 2 = výjimka. Násobení podporované je, proto 'abcd' * 2 = 'abcdabcd'.
Datové typy se kontrolují dynamicky, to jest až během chodu programu, nikoliv při kompilaci kódu.
Python 3.x podporuje volitelné statické typové anotace, které umožňují externím nástrojům, jako je např. mypy, provádět statickou analýzu a kontrolu datových typů v python kódu. Samotný standardní interpret Pythonu s nimi v současné době nepracuje (ignoruje je), pouze umožňuje jejich syntaxi, takže se nevyužívají k optimalizaci rychlosti běhu rychlosti.
Ortogonalita operátorů
Při vývoji jazyka se kladl a klade důraz na to, aby operátory nebyly vázány na specifické datové typy (pokud je to možné). Přípustnost použití operátoru pro konkrétní operandy se navíc vyhodnocuje až za běhu. Prakticky to znamená, že například následující funkci, která v těle používá operátor plus, je možné předat jednak číselné a jednak řetězcové argumenty:
def dohromady(a, b):
return a + b
dohromady(2, 3) # vrátí 5
dohromady("ahoj", ' nazdar') # vrátí 'ahoj nazdar'
Nejde jen o zajímavou hříčku. Běžné pythonovské funkce tím získávají vlastnosti, kterými se zabývá generické programování.
Interaktivní režim překladače
Interpret jazyka Python můžeme spustit v interaktivním režimu. Tento režim se používá především pro rychlé pokusy. Řádkový vstup je v takovém případě uvozen znaky >>>
.
Je-li očekáván pokračovací řádek zápisu dosud nedokončené konstrukce, pak je vstupní řádek uvozen znaky ...
. Dokončení zápisu konstrukce vyjadřujeme v interaktivním režimu zadáním prázdného řádku.
>>> def f(c, n):
... return c * n
...
>>> f(a, 5)
15
V interaktivním režimu většinou nepoužíváme příkaz print
(ale nic nám v tom nebrání). Pokud chceme zobrazit obsah proměnné, stačí za úvodní znaky zapsat její jméno.
>>> a = 1 + 2
>>> a
3
Proměnná _
obsahuje poslední takto použitou hodnotu.
>>> f('x', a)
'xxx'
>>> len(_)
3
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")
- Python 2:
- 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
- Python 2:
- 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")
).
- Python 2: Řetězce jsou ASCII, pokud nejsou explicitně označeny jako Unicode (
- Iterátory:
- Python 2: Funkce jako
range()
,map()
,filter()
,zip()
nebofile.readlines()
vrací seznamy. - Python 3: Tyto funkce vrací iterátory.
- Python 3: Funkce
xrange()
afile.xreadlines()
, které v Pythonu 2 vracely iterátory, byly zrušeny.
- Python 2: Funkce jako
- Syntaxe výjimek:
- Python 2:
except Exception, e:
- Python 3:
except Exception as e:
- Python 2:
- Funkce
raw_input()
ainput()
:- Python 2:
raw_input()
čte vstup jako řetězec;input()
vyhodnotí vstup jako Python výraz. - Python 3:
input()
funguje jakoraw_input()
z Pythonu 2; původníinput()
byl odstraněn.
- Python 2:
- Změny v API pro standardní knihovnu:
- Python 2: Moduly jako
urllib
,urllib2
, aurlparse
. - Python 3: Tyto moduly byly sloučeny do
urllib
.
- Python 2: Moduly jako
long
typ už neexistuje:- Python 2: Oddělené typy pro
int
along
. - Python 3: Jednotný typ
int
, který odpovídálong
z Pythonu 2.
- Python 2: Oddělené typy pro
- Octal literals:
- Python 2: Octal literal může být zapsán jako
0777
. - Python 3: Musí být zapsán jako
0o777
.
- Python 2: Octal literal může být zapsán jako
- Zjištění klíče v Dict:
- Python 2:
slovník.has_key(klic)
- Python 3:
klic in slovník
- Python 2:
- Definice Set množin:
- Python 2: jen
set([1,2])
- Python 3: navíc {1,2}
- Python 2: jen
- Formát řetězců:
- Python 3.6: přidává f-stringy
Podrobnější seznam změn najdete (anglicky) v dokumentu What’s New In Python 3.0.
Odkazy
Reference
- ↑ VAN ROSSUM, Guido. Python - zdrojové kódy. Python Foundation. http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY. [online]. [cit. 2010-04-12]. Dostupné v archivu pořízeném dne 2016-02-17.
- ↑ Stack Overflow Developer Survey 2023. Stack Overflow [online]. [cit. 2024-07-25]. Dostupné online. (anglicky)
- ↑ General Python FAQ — Python 3.10.5 documentation. docs.python.org [online]. [cit. 2022-06-11]. Dostupné online.
- ↑ https://www.root.cz/zpravicky/popularite-programovacich-jazyku-vevodi-python/
- ↑ KRČMÁŘ, Petr. Chyby v programovacích jazycích ohrožují bezpečnost aplikací. root.cz [online]. 12. 12. 2017. Dostupné online. ISSN 1212-8309.
- ↑ TIŠNOVSKÝ, Pavel. Praktické použití nástroje Cython při překladu Pythonu do nativního kódu. Root.cz [online]. [cit. 2023-05-22]. Dostupné online.
- ↑ https://pyfound.blogspot.com/2019/05/scott-shawcroft-history-of-circuitpython.html
- ↑ 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)
- ↑ http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=all&lang=python&lang2=psyco[nedostupný zdroj]
- ↑ Python 3000 Status Update (Long!). www.artima.com [online]. [cit. 2023-05-22]. Dostupné online.
- ↑ PEP 3000 – Python 3000 | peps.python.org. peps.python.org [online]. [cit. 2023-05-22]. Dostupné online.
Externí odkazy
- Obrázky, zvuky či videa k tématu Python na Wikimedia Commons
- www.python.org – oficiální web projektu (anglicky, část česky)
- python.cz – Python CZ, rozcestník české komunity
- www.py.cz – PyCZ, komunitní český web
- Boost.Python – C++ knihovna pro spolupráci mezi C++ a Pythonem
Dokumentace, učebnice
- Oficiální tutorial (anglicky)
- Oficiální dokumentace (anglicky)
- Učebnice jazyka Python (aneb Létající cirkus) (český překlad)
- Létající cirkus, PDF – seriál na ROOT.CZ, 21 dílů
- Jak se naučit programovat – Alan Gauld (český překlad)
- Python – programování zábavou – český web o Pythonu, základy, ukázky, praxe
- Ponořme se do Pythonu 3 – Mark Pilgrim (český překlad z originálního Dive Into Python 3)
- vydáno též v edici CZ.NIC – knižně i elektronicky
Média použitá na této stránce
Autor: Petr.Mach.Wraith, Licence: CC BY-SA 4.0
Vývoj Python programu v editoru Vim v prostředí Termux na Androidu.
Autor: Максим Пе, Licence: CC BY-SA 4.0
Python 3. The standard type hierarchy. Source: https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy