Remove ads
programovací jazyk From Wikipedia, the free encyclopedia
Python (anglická výslovnost [ˈpaiθən]) je vysokoúrovňový, interpretovaný programovací jazyk, který v roce 1991[1] navrhl Guido van Rossum. Nabízí dynamickou kontrolu datových typů a podporuje různá programovací paradigmata, včetně objektově orientovaného, imperativního nebo funkcionálního. Jako instalátor balíčků slouží např. pip,[2] který je přítomný ve většině instalacích Pythonu.[3] Tyto balíčky lze získat např. z repozitáře PyPI (Python Package Index).[4] V roce 2023 se jednalo o třetí nejpoužívanější programovací jazyk.[5]
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 je vyvíjen jako open source projekt, který zdarma nabízí instalační balíky pro většinu běžných platforem (Unix, MS Windows, macOS, Android); ve většině distribucí systému GNU/Linux je Python součástí základní instalace.[zdroj?]
Nachází využití zejména pro vývoj webových aplikací (framework Django), datovou analýzu (frameworky Pandas nebo scikit-learn) a strojové učení (Pytorch, TensorFlow).
Python byl pojmenován podle komediální skupiny Monty Python,[6] kteří pomocí svých skečů ovlivnili internetovou subkulturu například slovem spam.
Python nabízí široké spektrum využití, například:
Python má rozsáhlou komunitu, která přispívá k velkému množství otevřených zdrojů, projektů a knihoven, 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ů.
Postupem času vznikly tři nekompatibilní major verze, Python (1), Python 2 a Python 3.
Python 3 se i nadále vyvíjí. Pravidelně, jednou ročně v říjnu, vychází nová verze. Poslední verze jsou:
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}"}. |
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.
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.
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í.
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.
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í.
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).
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.[8]
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.
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 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 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 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 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 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.[9] 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 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 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 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.
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 multithreadinguFunkč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émK tomu je k dispozici řada knihoven specifická pro různý hardware dodávaných výrobci tohoto hardware.
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.[10]
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í.
Python je dostupný pro různé hardwarové architektury pro různé operační systémy skrze různé distribuce.
Standardní distribuce je dostupná zdarma na oficiálním webu.
K dispozici jsou aktuální balíčky pro
A dále jsou v nabídce odkazy pro platformy: AIX, IBM i, OS/390, z/OS, RISC OS, Solaris, UEFI, VMX a HP-UX. Zpravidla se jedná o starší verze Pythonu a jsou to odkazy na jiné distribuce.
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.
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.
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.
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 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ý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++.[11]
Program v Pythonu může být pomalejší řádově desetinásobně, klidně i padesátkrát. To ho činí například nevhodným pro vývoj velkých a graficky náročných her nebo grafických kodeků a podobně.
Ale jinak to v praxi často nevadí a to z řady důvodů:
V historii Pythonu vznikla řada optimalizačních technik.
V minulosti se pro zvýšení výkonu používala snadno použitelná knihovna Psyco, která transparentně optimalizovala kód Pythonu na výkon (JIT). Některé operace byly pomocí Psyco urychleny až řádově.[12] 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.
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);
}
|
Komentáře jsou v Pythonu jednořádkové a začínají znakem #
.
# Toto je komentář
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ů:
Ellipsis
– hodnota ...int
– celá čísla libovolné velikosti
bool
– hodnoty True, Falsefloat
– nepřesná desetinná číslacomplex
– komplexní číslaFraction
– zlomky z modulu fractionsDecimal
– přesná desetinná čísla z modulu decimalstr
– textový řetězecbytes
– nezměnitelný binární řetězectuple
– nezměnitelný seznam hodnotbytearray
– změnitelný binární řetězeclist
– změnitelný seznam hodnotfrozenset
– nezměnitelná množinaset
– změnitelná množinadict
– slovníkenumerate
zip
map
filter
range
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á 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
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 rovnoLogické operátory
and
– logické Aor
– logické NEBOnot
– logické NEBitové operátory
&
– bitový AND|
– bitový OR^
– bitový XOR~
– bitový NOT<<
– bitový posun doleva>>
– bitový posun dopravaPř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í členemDalší 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.')
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
import
, from
, as
– Import modulů nebo objektů z modulu.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)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.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í.
Inicializace a destrukce
__init__(self, ...)
: Inicializace objektu__del__(self)
: Destrukce, volána při odstraňování objektuReprezentace objektů
__repr__(self)
: Oficiální řetězcová reprezentace objektu, pro vývojáře__str__(self)
: Čitelná řetězcová reprezentace objektu, pro uživateleBiná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ímUnární aritmetické operace
__neg__(self)
: negace__pos__(self)
: unární plus__abs__(self)
: absolutní hodnota__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, >=
__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__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ýjimekread(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
.
__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__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
.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.Konverze typů
__int__(self)
: Konverze objektu na celé číslo.__float__(self)
: Konverze objektu na plovoucí desetinné číslo.__complex__(self)
: Konverze objektu na komplexní číslo.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.
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 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 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.
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
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.
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.
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í.
Interpret jazyka Python můžeme spustit v interaktivním režimu. Tento režim se používá především pro rychlé pokusy. Řádkový vstup je v takovém případě uvozen znaky >>>
.
Je-li očekáván pokračovací řádek zápisu dosud nedokončené konstrukce, pak je vstupní řádek uvozen znaky ...
. Dokončení zápisu konstrukce vyjadřujeme v interaktivním režimu zadáním prázdného řádku.
>>> def f(c, n):
... return c * n
...
>>> f(a, 5)
15
V interaktivním režimu většinou nepoužíváme příkaz print
(ale nic nám v tom nebrání). Pokud chceme zobrazit obsah proměnné, stačí za úvodní znaky zapsat její jméno.
>>> a = 1 + 2
>>> a
3
Proměnná _
obsahuje poslední takto použitou hodnotu.
>>> f('x', a)
'xxx'
>>> len(_)
3
Python 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)[13][14]. 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.
print "Hello"
print("Hello")
3/2
vrací 1
3/2
vrací 1.5
3//2
vrací 1
u"some text"
).b"abc"
, bytearray(b"abc")
).range()
, map()
, filter()
, zip()
nebo file.readlines()
vrací seznamy.xrange()
a file.xreadlines()
, které v Pythonu 2 vracely iterátory, byly zrušeny.except Exception, e:
except Exception as e:
raw_input()
a input()
:
raw_input()
čte vstup jako řetězec; input()
vyhodnotí vstup jako Python výraz.input()
funguje jako raw_input()
z Pythonu 2; původní input()
byl odstraněn.urllib
, urllib2
, a urlparse
.urllib
.long
typ už neexistuje:
int
a long
.int
, který odpovídá long
z Pythonu 2.0777
.0o777
.slovník.has_key(klic)
klic in slovník
set([1,2])
Podrobnější seznam změn najdete (anglicky) v dokumentu What’s New In Python 3.0.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.