Krajta | |
---|---|
Jazyková třída | objektově orientovaný programovací jazyk |
Objevil se v | 20. února 1991 [17] |
Autor | Guido van Rossum [1] |
Vývojář | Python Software Foundation a Guido van Rossum [1] |
Přípona souboru | .py, [18] , [19] , [20] , [21] , [22] nebo [23].pyc.pyd.pyo.pyw.pyz.pyi |
Uvolnění | |
Byl ovlivněn | ABC , [5] Ada , [6] Algol 68 , [7] APL , [8] C , [9] C++ , [10] Clu , [11] Dylan , [12] Haskell , [13] Icon , [14 ] Java , [15] Lisp , [16] Modula-3 , [10] Perl , Standard ML [8] |
Licence | Licence Python Software Foundation [1] |
webová stránka | python.org _ |
Plošina | Microsoft Windows |
OS | multiplatformní [24] |
Mediální soubory na Wikimedia Commons |
Python ( IPA : [ˈpʌɪθ(ə)n] ; v ruštině existují názvy python [25] nebo python [26] ) je univerzální programovací jazyk na vysoké úrovni s dynamickým silným psaním a automatickou správou paměti [27] [28 ] , zaměřený na zlepšení produktivity vývojářů, čitelnosti a kvality kódu a zajištění přenositelnosti programů na něm napsaných [29] . Jazyk je zcela objektově orientovaný v tom smyslu, že vše je objekt [27] . Neobvyklou vlastností jazyka je odsazení bloků kódu bílými znaky [30] . Syntaxe základního jazyka je minimalistická, díky čemuž je v praxi málokdy potřeba odkazovat na dokumentaci [29] . Samotný jazyk je znám jako interpretovaný a používá se mimo jiné pro psaní skript [27] . Nevýhodou jazyka je často nižší rychlost a vyšší paměťová náročnost programů v něm napsaných ve srovnání s podobným kódem napsaným v kompilovaných jazycích, jako je C nebo C++ [27] [29] .
Python je multiparadigmatický programovací jazyk , který podporuje imperativní , procedurální , strukturované , objektově orientované programování [27] , metaprogramování [31] a funkcionální programování [27] . Problémy obecného programování jsou řešeny pomocí dynamického typování [32] [33] . Aspektově orientované programování je částečně podporováno prostřednictvím dekorátorů [34] , kompletnější podporu poskytují další frameworky [35] . Techniky jako smluvní a logické programování lze implementovat pomocí knihoven nebo rozšíření [36] . Hlavními architektonickými prvky jsou dynamické psaní , automatická správa paměti [27] , úplná introspekce , mechanismus zpracování výjimek , podpora vícevláknových výpočtů s globálním zámkem interpretů ( GIL ) [37] , datové struktury na vysoké úrovni . Je podporováno rozdělení programů do modulů , které lze zase kombinovat do balíčků [38] .
Referenční implementací Pythonu je interpret CPython , který podporuje nejrozšířenější platformy [39] a je de facto jazykovým standardem [40] . Je distribuován pod bezplatnou licencí Python Software Foundation License , která vám umožňuje používat jej bez omezení v jakékoli aplikaci, včetně proprietární [41] . CPython zkompiluje zdrojový kód do vysokoúrovňového bajtkódu , který běží v zásobníku virtuálního stroje [42] . Další tři hlavní implementace jazyka jsou Jython (pro JVM ), IronPython (pro CLR / .NET ) a PyPy [27] [43] . PyPy je napsán v podmnožině jazyka Python (RPython) a byl vyvinut jako alternativa k CPythonu za účelem zvýšení rychlosti provádění programu, včetně použití kompilace JIT [43] . Podpora pro Python 2 skončila v roce 2020 [44] . V současné době se aktivně vyvíjí verze jazyka Python 3 [45] . Vývoj jazyka se provádí prostřednictvím návrhů rozšíření jazyka PEP ( Python Enhancement Návrh ) , které popisují inovace, provádějí úpravy na základě zpětné vazby komunity a dokumentují konečná rozhodnutí [46] .
Standardní knihovna obsahuje velkou sadu užitečných přenosných funkcí, od schopností zpracování textu až po nástroje pro psaní síťových aplikací. Další funkce, jako je matematické modelování, práce s vybavením, psaní webových aplikací nebo vývoj her, lze implementovat prostřednictvím velkého množství knihoven třetích stran, stejně jako integrace knihoven napsaných v C nebo C++, zatímco Python samotný interpret může být integrován do projektů napsaných v těchto jazycích [27] . Existuje také specializované úložiště pro software napsaný v Pythonu, PyPI [47] . Toto úložiště poskytuje prostředek pro snadnou instalaci balíčků do operačního systému a stalo se de facto standardem pro Python [48] . K roku 2019 obsahoval přes 175 000 balíčků [47] .
Python se stal jedním z nejpopulárnějších jazyků a používá se v analýze dat , strojovém učení , DevOps a vývoji webu , mimo jiné včetně vývoje her . Díky své čitelnosti, jednoduché syntaxi a nedostatku kompilace je jazyk vhodný pro výuku programování, což vám umožní soustředit se na učení algoritmů, konceptů a paradigmat. Ladění a experimentování značně usnadňuje skutečnost, že jazyk je interpretovatelný [27] [49] . Jazyk používá mnoho velkých společností jako Google nebo Facebook [27] . Od září 2022 je Python na prvním místě v žebříčku TIOBE v oblíbenosti programovacích jazyků se skóre 15,74 % [50] . Python byl vyhlášen jazykem roku TIOBE v letech 2007, 2010, 2018, 2020 a 2021 [51] .
Nápad na implementaci jazyka se objevil na konci 80. let a vývoj jeho implementace začal v roce 1989 Guido van Rossum , pracovník holandského institutu CWI [46] . Distribuovaný operační systém Amoeba vyžadoval rozšiřitelný skriptovací jazyk a Guido začal vyvíjet Python ve svém volném čase a vypůjčil si část práce z jazyka ABC (Guido se podílel na vývoji tohoto jazyka zaměřeného na výuku programování). V únoru 1991 Guido zaslal zdrojový kód do diskusní skupiny alt.sources [52] . Od samého počátku byl Python navržen jako objektově orientovaný jazyk .
Guido van Rossum pojmenoval jazyk po populární britské komediální televizní show ze 70. let Monty Python's Flying Circus [ 53 ] , protože autor byl fanouškem show, stejně jako mnoho dalších vývojářů té doby, a samotná show měla určitou paralelu se světem výpočetní techniky [29] .
Mít přátelskou a citlivou uživatelskou komunitu je spolu s Guidovou designovou intuicí považováno za jeden z klíčů k úspěchu Pythonu. Vývoj jazyka probíhá podle jasně regulovaného procesu tvorby, projednávání, výběru a implementace dokumentů PEP ( Python Enhancement Návrh ) - návrhů na vývoj Pythonu [54] .
3. prosince 2008 [55] byla po rozsáhlém testování vydána první verze Pythonu 3000 (nebo Pythonu 3.0, také známého jako Py3k ). Python 3000 opravuje mnoho nedostatků architektury při zachování co největší (ale ne úplné) kompatibility se staršími verzemi Pythonu.
Datum konce podpory pro Python 2.7 bylo původně nastaveno na rok 2015 a poté posunuto zpět na rok 2020 z obavy, že velkou část stávajícího kódu nebude možné snadno přenést do Pythonu 3 [56] [57] . Podpora Pythonu 2 byla zaměřena pouze na existující projekty, nové projekty musely používat Python 3 [45] . Python 2.7 není oficiálně podporován od 1. ledna 2020, ačkoli poslední aktualizace byla vydána v dubnu 2020. Pro Python 2.7 nebudou vydány žádné další opravy zabezpečení ani jiná vylepšení [44] [58] . S koncem životnosti Pythonu 2.x je podporován pouze Python 3.6.xa novější [59] .
Jazyk používá dynamické psaní spolu s počítáním referencí a kruhovým garbage collectorem pro správu paměti [60] . Existují také dynamická rozlišení názvů ( dynamická vazba ), která spojují názvy metod a proměnných během provádění programu.
Python nabízí podporu pro funkcionální programování v tradici Lisp . Takže v Pythonu jsou funkce filter, mapa reduce; koncepty charakteristik seznamů , asociativních polí (slovníků), množin a generátorů seznamů [61] byly také převzaty z Lisp . Standardní knihovna obsahuje dva moduly (itertools a functools), které implementují nástroje vypůjčené od Haskell a Standard ML [62] .
Vývojáři jazyka Python dodržují jistou filozofii programování nazvanou „The Zen of Python“ („ Zen of Python“ nebo „Zen of Python“) [63] . Jeho text vydává interpret Pythonu na příkaz import this(funguje jednou za relaci). Za autora této filozofie je považován Tim Peters .
Filozofie začíná takto [64] :
….
Původní text (anglicky)[ zobrazitskrýt]...
Místo toho, aby byly všechny funkce jazyka zabudovány do jádra Pythonu, byl navržen tak, aby byl snadno rozšiřitelný. Díky tomu se jazyk stal oblíbeným prostředkem pro přidávání programovatelných rozhraní ke stávajícím aplikacím. Vize Guida van Rossuma o malém jádře s velkou standardní knihovnou a snadno rozšiřitelným interpretem pramenila z negativní zkušenosti s vývojem jazyka ABC , který zvolil opačný přístup [65] .
Python se zaměřuje na jednodušší, méně těžkopádnou syntaxi a gramatiku, což dává vývojářům možnost volby v metodologii kódování. Na rozdíl od motta Perlu „ existuje několik způsobů, jak to udělat “, filozofie Pythonu je „měl by existovat jeden – a nejlépe pouze jeden – zřejmý způsob, jak to udělat“ [66] . Alex Martelli , člen Python Software Foundation a autor knih o Pythonu píše, že „popisování něčeho jako ‚chytrého‘ není v kultuře Python považováno za kompliment“ [67] .
Vývojáři Pythonu mají tendenci vyhýbat se předčasné optimalizaci a odmítat záplaty pro nekritické části referenční implementace CPythonu , které by nabízely okrajové zvýšení rychlosti na úkor srozumitelnosti kódu [68] . Existují však způsoby, jak zlepšit výkon. Pokud má program úzká místa spojená s výkonem operací náročných na zdroje na centrálním procesoru, ale nesouvisející s používáním I/O operací, pak je možné zlepšit výkon překladem programu pomocí Cythonu do jazyka C a následným kompilace [69] . Části programu, které vyžadují výpočetní prostředky, lze také přepsat do jazyka C a propojit jako samostatné knihovny s vazbami na Python [43] .
Důležitým cílem vývojářů Pythonu je, aby bylo používání zábavné. To se odrazilo v názvu jazyka, uvedeném na počest Monty Python [53] . Odráží se to také v někdy hravém přístupu k výukovým programům a referenčním materiálům, jako jsou ukázkové programy v dokumentaci, které používají názvy spam a eggs místo názvů používaných v dokumentaci mnoha jiných jazyků foo a bar [70 ] [71] .
Python byl portován a běží na téměř všech známých platformách, od PDA po sálové počítače . Existují porty pro Microsoft Windows , téměř všechny varianty UNIXu (včetně FreeBSD a Linuxu ), Android [72] , Plan 9 , Mac OS a macOS , iPhone OS (iOS) 2.0 a vyšší, iPadOS , Palm OS , OS/2 , Amiga , HaikuOS , AS/400 , OS/390 , Windows Mobile a Symbian .
Jak platforma zastarává, její podpora v hlavní větvi jazyka se zastaví. Například podpora pro Windows 95 , Windows 98 a Windows ME [73] byla od verze 2.6 zrušena . Windows XP již není podporován ve verzi 3.5 [74] Windows Vista a Windows 7 již nejsou podporovány ve verzi 3.9 [75] .
Na rozdíl od mnoha přenosných systémů má Python pro všechny hlavní platformy podporu pro technologie specifické pro tuto platformu (například Microsoft COM / DCOM ). Navíc existuje speciální verze Pythonu pro Java Virtual Machine - Jython , která umožňuje, aby tlumočník běžel na jakémkoli systému, který podporuje Javu , zatímco třídy Java lze přímo používat z Pythonu a dokonce je lze psát v Pythonu. Několik projektů také poskytuje integraci s platformou Microsoft.NET , hlavními z nich jsou IronPython a Python.Net .
Python podporuje dynamické psaní , to znamená, že typ proměnné je určen pouze za běhu. Takže místo „přiřazení hodnoty proměnné“ je lepší mluvit o „přiřazení hodnoty k nějakému názvu“. Primitivní typy v Pythonu zahrnují boolean , libovolně přesné celé číslo , plovoucí desetinná čárka a komplexní . Vestavěné typy kontejnerů v Pythonu jsou string , list , tuple , dictionary a set [49] . Všechny hodnoty jsou objekty, včetně funkcí, metod, modulů, tříd.
Nový typ můžete přidat buď napsáním třídy (class) nebo definováním nového typu v rozšiřujícím modulu (například napsaném v C). Systém tříd podporuje dědičnost (jednoduchou a vícenásobnou ) a metaprogramování . Je možné dědit z většiny typů vestavěných a rozšíření.
Typy používané v PythonuTyp | Proměnlivost | Popis | Příklady |
---|---|---|---|
bool | neměnný | booleovský typ | True False |
bytearray | měnitelný | Pole bajtů | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105]) |
bytes | neměnný | Pole bajtů | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105]) |
complex | neměnný | Komplexní číslo | 3+2.7j |
dict | měnitelný | Dictionary ( asociativní pole ) je kolekce párů klíč-hodnota; hodnota může být libovolného typu, klíč musí být hašovatelného typu | {'key1': 1.0, 3: False} {} |
ellipsis[K 1] | neměnný | Elipsa (elipsa). Používá se především v NumPy k poskytnutí zkratky pro dělení vícerozměrného pole. Je přítomen v samotném Pythonu, aby podporoval vlastní typy a rozšíření, jako je NumPy [76] | ... Ellipsis Pro NumPy : což je ekvivalentní [76] x[i, ..., j] x[i, :, :, j] |
float | neměnný | Číslo s plovoucí desetinnou čárkou . Míra přesnosti závisí na platformě, ale v praxi se obvykle implementuje jako 64bitové 53bitové číslo [77] |
1.414 |
frozenset | neměnný | Neuspořádaná sada , neobsahuje duplikáty; mohou uvnitř obsahovat různé hašovatelné datové typy | frozenset([4.0, 'string', True]) |
int | neměnný | Neomezené celé číslo [78] | 42 |
list | měnitelný | Seznam , může obsahovat různé typy dat | [4.0, 'string', True] [] |
NoneType[K 1] | neměnný | Objekt představující absenci hodnoty, v jiných jazycích často označovaný jako Null | None |
NotImplementedType[K 1] | neměnný | Objekt, který je vrácen při přetížení operátorů, když typy operandů nejsou podporovány. | NotImplemented |
range | neměnný | Posloupnost celých čísel z jedné hodnoty do druhé, obvykle se používá k opakování operace vícekrát s pro [79] | range(1, 10) range(10, -5, -2) |
set | měnitelný | Neuspořádaná sada , neobsahuje duplikáty; mohou uvnitř obsahovat různé hašovatelné datové typy | {4.0, 'string', True} set() |
str | neměnný | typ řetězce | 'Wikipedia' "Wikipedia" """Přesahující více řádků""" |
tuple | neměnný | Tuple . Může v sobě obsahovat různé typy dat. Lze použít jako neměnný seznam a jako záznamy s nepojmenovanými poli [80] | Jako neměnný seznam: Jako záznamy: [80] (4.0, 'string', True) ('single element',) () lax_coordinates = (33.9425, -118.408056) city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) |
Jazyk má jasnou a konzistentní syntaxi, promyšlenou modularitu a škálovatelnost , díky čemuž je zdrojový kód programů napsaných v Pythonu snadno čitelný. Při předávání argumentů funkcím používá Python call -by-sharing [ 81 ] .
Sada operátorů je vcelku tradiční.
Jednou ze zajímavých syntaktických vlastností jazyka je odsazení bloků kódu (mezery nebo tabulátory), takže Python nemá počáteční/koncové závorky , jako v Pascalu , ani složené závorky, jako v C. Takový „trik“ vám umožní snížit počet řádků a znaků v programu a naučí vás „dobrý“ styl programování. Na druhou stranu chování a dokonce i správnost programu může záviset na počátečních mezerách v textu. Pro ty, kteří jsou zvyklí programovat v jazycích s explicitním výběrem začátku a konce bloků, se toto chování může zpočátku zdát neintuitivní a nepohodlné.
Guido sám napsal [82] :
Snad nejkontroverznějším rysem Pythonu je použití odsazení pro skupinové příkazy, které je převzato přímo z ABC . To je jeden z rysů jazyka, který je mi drahý. Díky tomu je kód Pythonu čitelnější dvěma způsoby. Za prvé, použití odsazení snižuje vizuální nepořádek a zkracuje programy, čímž snižuje množství pozornosti potřebné k pochopení základní jednotky kódu. Za druhé, dává programátorovi menší volnost ve formátování, čímž umožňuje konzistentnější styl, který usnadňuje čtení kódu jiných lidí. (Porovnejte například tři nebo čtyři různé konvence C složených závorek , z nichž každá má silné zastánce.)
Původní text (anglicky)[ zobrazitskrýt] Snad nejkontroverznější funkcí Pythonu je použití odsazení pro seskupování příkazů, které pochází přímo z ABC. Je to jeden z rysů jazyka, který je mému srdci nejdražší. Díky tomu je kód Python čitelnější dvěma způsoby. Za prvé, použití odsazení snižuje vizuální nepořádek a zkracuje programy, čímž se zkracuje doba pozornosti potřebná k přijetí základní jednotky kódu. Za druhé, umožňuje programátorovi menší volnost ve formátování, čímž umožňuje jednotnější styl, který usnadňuje čtení kódu někoho jiného. (Porovnejte například tři nebo čtyři různé konvence pro umístění rovnátek v C, z nichž každá má silné zastánce.)Složení, syntaxe, asociativita a priorita operací jsou programovacím jazykům docela známé a jsou navrženy tak, aby minimalizovaly použití závorek. Ve srovnání s matematikou se priorita operátorů odráží v matematice, přičemž operátor přiřazení hodnoty =odpovídá typografickému operátoru ←. Zatímco priorita operátorů se v mnoha případech vyhýbá použití závorek, analýza velkých výrazů může být časově náročná, takže explicitní závorky jsou v takových případech výhodnější [45] .
Samostatně stojí za zmínku operace formátování pro řetězce (funguje analogicky s funkcí printf()z C), která používá stejný symbol jako převzetí zbytku dělení:
>>> str_var = "svět" >>> tisk ( "Dobrý den, %s " % str_var ) Dobrý den , světeVe verzi 3.6 byly přidány formátované řetězcové literály nebo f-strings, aby byl kód čitelnější a stručnější:
>>> str_var = "world" >>> print ( f "Dobrý den, { str_var } " ) # výstup pomocí f-string Hello , worldPython má praktická zřetězená srovnání . Takové podmínky v programech nejsou neobvyklé:
1 <= a < 10 a 1 <= b < 20Navíc jsou logické operace ( ora and) líné : pokud první operand stačí k vyhodnocení hodnoty operace, je výsledkem tento operand, jinak se vyhodnotí druhý operand logické operace. To je založeno na vlastnostech algebry logiky : například pokud je jeden argument operace "OR" ( or) pravdivý, pak je výsledek této operace vždy pravdivý. Pokud je druhý operand komplexním výrazem, sníží se tím náklady na jeho výpočet. Tato skutečnost byla široce používána až do verze 2.5 místo podmíněného konstruktu:
a < b a "menší než" nebo "větší než nebo rovno"Vestavěné datové typy mají obecně speciální syntaxi pro své literály (konstanty zapsané ve zdrojovém kódu):
"řetězec a řetězec Unicode současně" 'řetězec a řetězec Unicode současně' """také řetězec a řetězec Unicode současně""" Pravda nebo nepravda # booleovské literály 3.14 # číslo s plovoucí desetinnou čárkou 0b1010 + 0o12 + 0xA # čísla v dvojkové soustavě , osmičkové soustavě a šestnáctkové soustavě 1 + 2 j # komplexní číslo [ 1 , 2 , "a" ] # seznam ( 1 , 2 , "a" ) # n-tice { 'a' : 1 , 'b' : ' B' } # dictionary { 'a' , 6 , 8.8 } # set lambda x : x ** 2 # anonymní funkce ( i pro i v rozsahu ( 10 )) # generátorPro seznamy (a další sekvence) nabízí Python sadu operací dělení. Funkce je indexování, které se může zdát začátečníkovi divné, ale při používání odhaluje její konzistenci. Indexy prvků seznamu začínají na nule. Záznam řezu s[N:M]znamená, že všechny prvky od N včetně po M, ale nezahrnuté, spadají do řezu. V tomto případě lze index vynechat. Například záznam s[:M]znamená, že všechny prvky od samého začátku spadají do řezu; zápis s[N:]znamená, že všechny prvky jsou zahrnuty až do konce řezu; záznam s[:]znamená, že jsou zahrnuty všechny prvky od začátku do konce.
Název (identifikátor) může začínat písmenem libovolné abecedy v Unicode , jakýmkoli velkým písmenem nebo podtržítkem, po kterém lze v názvu použít i čísla. Klíčová slova nelze použít jako název (jejich seznam lze nalézt pomocí import keyword; print(keyword.kwlist)) a je nežádoucí předefinovat vestavěné názvy. Zvláštní význam mají jména začínající podtržítkem [83] .
V každém bodě programu má interpret přístup ke třem jmenným prostorům (tj. mapování jmen na objekt): lokální, globální a vestavěný.
Rozsahy jmen lze vnořovat do sebe (jména z okolního bloku kódu jsou viditelná uvnitř definované funkce). V praxi existuje několik dobrých mravů spojených s rozsahy a vazbami jmen, o kterých se můžete dozvědět více v dokumentaci.
Python nabízí mechanismus pro dokumentaci pydoc kódu. Na začátek každého modulu, třídy, funkce je vložen dokumentační řetězec - docstring . Dokumentační řetězce zůstávají v kódu za běhu a do jazyka je zabudován přístup k dokumentaci [84] (proměnná ), který používají moderní IDE ( Integrated Development Environment ) (např. Eclipse ). __doc__
Můžete interaktivně získat nápovědu, generovat hypertextovou dokumentaci pro celý modul nebo dokonce použít k automatickému testování
Python je multiparadigmatický programovací jazyk . Objektově orientované , strukturální [85] , generické , funkční programování [27] a metaprogramování [31] je plně podporováno . Základní podpora pro aspektově orientované programování je poskytována prostřednictvím metaprogramování [34] . Mnoho dalších technik, včetně kontraktu [86] [87] a logického programování [88] , lze implementovat pomocí rozšíření.
Návrh jazyka Python je postaven na objektově orientovaném programovacím modelu. Implementace OOP v Pythonu je promyšlená, ale zároveň poměrně specifická ve srovnání s jinými objektově orientovanými jazyky . Vše v jazyce je objekt, buď instance třídy, nebo instance metatřídy. Výjimkou je základní vestavěná metatřída type. Třídy jsou tedy ve skutečnosti instancemi metatříd a odvozené metatřídy jsou instancemi metatřídy type. Metatřídy jsou součástí konceptu metaprogramování a poskytují možnost řídit dědičnost tříd, což umožňuje vytvářet abstraktní třídy, registrovat třídy nebo k nim v rámci knihovny nebo rámce přidávat libovolné programovací rozhraní [31] .
Třídy v podstatě představují plán nebo popis, jak vytvořit objekt, a ukládají popis atributů objektu a metod pro práci s ním. Paradigma OOP je založeno na zapouzdření , dědičnosti a polymorfismu [89] . Zapouzdření v Pythonu představuje možnost ukládat do objektu veřejné a skryté atributy (pole) s poskytnutím metod pro práci s nimi [89] , přičemž ve skutečnosti jsou všechny atributy veřejné, existuje však konvence pojmenování pro označení skrytých atributy [90] . Dědičnost umožňuje vytvářet odvozené objekty bez nutnosti přepisování kódu a polymorfismus je schopnost přepsat jakékoli metody objektu (v Pythonu jsou všechny metody virtuální [90] ), stejně jako přetěžování metod a operátorů . Přetížení metod v Pythonu je implementováno kvůli možnosti volání stejné metody s jinou sadou argumentů [89] . Vlastností Pythonu je možnost modifikovat třídy poté, co jsou deklarovány, přidávat k nim nové atributy a metody [45] , můžete také upravovat samotné objekty, v důsledku čehož lze třídy použít jako struktury pro ukládání libovolných dat [ 90] .
Python podporuje vícenásobnou dědičnost. Vícenásobná dědičnost je sama o sobě složitá a její implementace naráží na problémy při řešení kolizí názvů mezi nadřazenými třídami a případně při opětovném dědění ze stejné třídy v hierarchii. V Pythonu se metody volají podle pořadí rozlišení metod (MRO), které je založeno na linearizačním algoritmu C3 [91] , v normálních případech při psaní programů nemusíte vědět, jak tento algoritmus funguje, ale pochopení může být vyžadován při vytváření netriviálních hierarchií tříd [92] .
Vlastnosti a vlastnosti specifické pro Python:
Jazyky, které podporují dynamické typování a objektově orientované programování, se obvykle v rámci generického programování neberou v úvahu, protože problémy generického programování jsou řešeny díky absenci omezení na datové typy [32] [33] . V Pythonu se silně typovaného generického programování dosahuje použitím jazykových funkcí ve spojení s externími analyzátory kódu [93] , jako je Mypy [94] .
Přestože Python nebyl původně koncipován jako funkcionální programovací jazyk [95] , Python podporuje programování ve stylu funkcionálního programování, zejména [96] :
Na rozdíl od většiny jazyků přímo zaměřených na funkcionální programování však Python není čistý programovací jazyk a kód není imunní vůči vedlejším účinkům [96] [97] .
Ve standardní knihovně Pythonu existují také speciální balíčky operatorpro functoolsfunkcionální programování [95] .
Python podporuje metaprogramování [98] [31] .
Software Python (aplikace nebo knihovna) je zabalen jako moduly, které lze zase zabalit do . Moduly mohou být umístěny jak v adresářích , tak v archivech ZIP . Moduly mohou být ve svém původu dvou typů: moduly napsané v "čistém" Pythonu a rozšiřující moduly (rozšiřující moduly) napsané v jiných programovacích jazycích. Například standardní knihovna má „čistý“ modul pickle a jeho ekvivalent v jazyce C: cPickle. Modul je vytvořen jako samostatný soubor a balíček - jako samostatný adresář. Modul je k programu připojen operátorem import. Po importu je modul reprezentován samostatným objektem, který poskytuje přístup k jmennému prostoru modulu. Během provádění programu lze modul znovu načíst pomocí funkce reload().
Python podporuje úplnou introspekci za běhu [99] . To znamená, že pro jakýkoli objekt můžete získat všechny informace o jeho vnitřní struktuře.
Použití introspekce je důležitou součástí toho, co se nazývá pythonic style , a je široce používáno v knihovnách a frameworkech Pythonu , jako jsou PyRO , PLY, Cherry, Django a další, což výrazně šetří čas programátorů, kteří je používají.
Data nezbytná pro introspekci jsou uložena ve speciálních atributech. Takže například můžete získat všechny uživatelem definované atributy většiny objektů ze speciálního atributu - slovníku (nebo jiného objektu, který poskytuje rozhraní dict)__dict__
>>> třída x ( objekt ): předat .... >>> f = x () >>> f . attr = 12 >>> print ( f . __dict__ ) { 'attr' : 12 } >>> print ( x . __dict__ ) # protože třídy jsou také instancemi objektu typu #, takže podporují tento typ introspekce { '__dict__' : < atribut '__dict__' objektů 'x' > , ' __module__ ' .......Existují také další atributy, jejichž názvy a účely závisí na objektu:
>>> def f (): projít .... >>> f . func_code . co_code # get function bytecode 'd \x00\x00 S' >>> f . __class__ # speciální atribut - odkaz na třídu daného objektu < typ 'funkce' >Naprostá většina atributů, které podporují introspekci, je založena na třídách a ty lze zase získat z obj.__class__.__dict__. Některé informace zděděné ze základní třídy jsou sdíleny všemi objekty, což šetří paměť.
Pro usnadnění získávání introspektivních informací má Python modul inspect[100] .
>>> def f ( x , y = 10 , ** mp ): předat ... >>> zkontrolovat . getargspec ( f ) ([ 'x' , 'y' ], Žádný , 'mp' , ( 10 ,))S pomocí modulu newje možný i opačný proces - stavba objektu z jeho součástí ve fázi realizace
>>> def f ( i ): return j + i .... >>> j = 2 >>> f ( 1 ) 3 >>> import new >>> g = new . function ( f . func_code , { 'j' : 23 }) >>> g ( 1 ) 24Zpracování výjimek je v Pythonu podporováno prostřednictvím příkazů try, except, else, finally, raise, které tvoří blok zpracování výjimek. Obecně blok vypadá takto:
zkuste : # Zde je kód, který může způsobit zvýšení výjimky Výjimka ( "zpráva" ) # Výjimka, toto je jeden ze standardních typů výjimek (jen třída), # lze použít jakoukoli jinou, včetně vaší vlastní kromě ( Typ výjimky1 , Exception type2 , … ) as Variable : # Kód v bloku se provede, pokud typ výjimky odpovídá jednomu z # typů (ExceptionType1, ExceptionType2, ...) nebo je potomkem jednoho # z těchto typů. # Výsledná výjimka je k dispozici ve volitelné proměnné. kromě ( Typ výjimky 3 , Typ výjimky 4 , … ) jako Proměnná : # Počet bloků kromě je neomezený zvýšení # Vyhození výjimky "navrch" přijaté; nebyly přijaty žádné parametry - rethrow kromě : # Bude proveden na jakékoli výjimce, kterou nezpracovávají zadané bloky kromě jiného : # Kód bloku se provede, pokud nebyly zachyceny žádné výjimky. konečně : # Bude provedeno stejně, možná po odpovídajícím bloku # kromě nebo elseSdílení else, exceptje finallymožné teprve od Pythonu 2.5. Informace o aktuální výjimce jsou vždy dostupné prostřednictvím sys.exc_info(). Kromě hodnoty výjimky Python také ukládá stav zásobníku až do okamžiku vyvolání výjimky – tzv. traceback.
Na rozdíl od kompilovaných programovacích jazyků v Pythonu použití výjimky nevede k výrazné režii (a často dokonce zrychluje provádění programů) a je velmi široce používáno. Výjimky jsou v souladu s filozofií Pythonu (bod 10 " Zen of Python " - "Chyby by se nikdy neměly umlčet") a jsou jedním z prostředků na podporu " kachního psaní ".
Někdy je vhodnější použít blok místo explicitního zpracování výjimek with(dostupné od Pythonu 2.5).
Iterátory jsou široce používány v programech Python. Smyčka formůže pracovat se sekvencí i iterátorem. Většina kolekcí poskytuje iterátory, iterátory může také uživatel definovat na svých vlastních objektech. Standardní itertoolsmodul knihovny obsahuje zařízení pro práci s iterátory.
Jednou ze zajímavých funkcí jazyka jsou generátory - funkce, které ukládají vnitřní stav: hodnoty lokálních proměnných a aktuální instrukce (viz také: korutiny ). Generátory lze použít jako iterátory pro datové struktury a pro líné vyhodnocování .
Když je zavolán generátor, funkce okamžitě vrátí objekt iterátoru, který ukládá aktuální bod provádění a stav lokálních proměnných funkce. Když je požadována další hodnota (prostřednictvím metody next()implicitně volané ve smyčce for), generátor pokračuje ve funkci od předchozího bodu přerušení k dalšímu yieldnebo příkazu return.
Python 2.4 zavedl generátorové výrazy , výrazy, které vedou ke generátoru. Generátor výrazů vám umožňuje ušetřit paměť tam, kde byste jinak museli používat seznam s mezivýsledky:
>>> součet ( i pro i v rozsahu ( 1 , 100 ) pokud i % 2 != 0 ) 2500Tento příklad sečte všechna lichá čísla od 1 do 99.
Počínaje verzí 2.5 Python podporuje plnohodnotné ko-procedury: nyní můžete předávat hodnoty generátoru pomocí metody send()a vyvolávat výjimky v jejím kontextu pomocí throw().
Python také podporuje vnořené generátory. Chcete-li například vytvořit dvourozměrné pole, musíte do generátoru všech řetězců umístit generátor seznamu, což je řetězec:[[0 for j in range(m)] for i in range(n)]
Python 2.5 zavedl nástroje pro správu kontextu provádění bloku kódu – příkazu witha modulu contextlib. Viz: příklad .
Operátor lze použít v případech, kdy před a po některých akcích musí být provedeny některé další akce, bez ohledu na výjimky nebo příkazy vyvolané v bloku return: soubory musí být uzavřeny, prostředky musí být uvolněny, standardní přesměrování vstupu a výstupu skončilo atd. Operátor zlepšuje čitelnost kódu, což znamená, že pomáhá předcházet chybám.
Dekorátory funkcí jsou volatelné objekty, které berou jako argument jinou funkci. Dekorátory funkcí mohou provádět operace s funkcí a vracet buď funkci samotnou, nebo jinou funkci, která ji nahrazuje, nebo volatelný objekt. To znamená, že pokud byl v kódu dříve napsán dekorátor zvaný decor, pak je následující kód [101] :
@decorate def target (): print ( 'running target()' )je ekvivalentní tomuto [101] :
def target (): print ( 'běžící cíl()' ) target = decor ( target )Příklad použití dekorátoru funkcí [101] :
>>> def deco ( func ): ... def inner (): ... print ( 'running inner()' ) ... return inner ... >>> @deco ... def target (): .. .print ( 'running target()' ) >>> target () running inner() >>> target <function deco.<locals> .inner at 0.10063b598>Existují třídní dekoratéři [102] .
Formát regulárního výrazu je s určitými rozdíly zděděn z Perlu . Pro jejich použití je potřeba importovat modul re[103] , který je součástí standardní knihovny.
Bohatá standardní knihovna je jedním z lákadel Pythonu. Existují nástroje pro práci s mnoha síťovými protokoly a internetovými formáty , například moduly pro zápis HTTP serverů a klientů, pro analýzu a tvorbu poštovních zpráv, pro práci s XML atd. Sada modulů pro práci s operačním systémem umožňuje k psaní multiplatformních aplikací. K dispozici jsou moduly pro práci s regulárními výrazy , kódováním textu , multimediálními formáty, kryptografickými protokoly, archivy, serializací dat , podporou testování jednotek atd.
Kromě standardní knihovny existuje mnoho knihoven, které poskytují rozhraní pro všechna systémová volání na různých platformách; konkrétně na platformě Win32 jsou podporována všechna volání Win32 API , stejně jako volání COM v rozsahu, který není menší než u Visual Basic nebo Delphi . Počet aplikačních knihoven pro Python v různých oblastech je doslova obrovský ( web , databáze , zpracování obrázků, textový editor, numerické metody , aplikace operačních systémů atd.).
Pro Python byla přijata specifikace databázového programovacího rozhraní DB-API 2 a byly vyvinuty balíčky odpovídající této specifikaci pro přístup k různým DBMS : Oracle , MySQL , PostgreSQL , Sybase , Firebird ( Interbase ), Informix , Microsoft SQL Server a SQLite . Na platformě Windows je přístup k databázi možný přes ADO ( ADOdb ). Komerční balíček mxODBC pro přístup k DBMS přes ODBC pro platformy Windows a UNIX byl vyvinut společností eGenix [105] . Pro Python bylo napsáno mnoho ORM ( SQLObject , SQLAlchemy , Dejavu, Django ), implementovány byly softwarové frameworky pro vývoj webových aplikací ( Django , Pylons , Pyramid ).
Knihovna NumPy pro práci s vícerozměrnými poli může někdy dosáhnout vědeckého výkonu srovnatelného se specializovanými balíčky. SciPy používá NumPy a poskytuje přístup k široké škále matematických algoritmů (maticová algebra - BLAS úrovně 1-3, LAPACK , FFT ...). Numarray [106] je speciálně navržen pro operace s velkými objemy vědeckých dat.
WSGI [107] je rozhraní brány s webovým serverem (Python Web Server Gateway Interface).
Python poskytuje jednoduché a pohodlné C API pro psaní vlastních modulů v C a C++ . Nástroj jako SWIG vám umožňuje téměř automaticky získat vazby pro použití knihoven C/C++ v kódu Pythonu. Možnosti tohoto a dalších nástrojů sahají od automatického generování (C/C++/Fortran)-Python rozhraní ze speciálních souborů (SWIG, pyste [108] , SIP [109] , pyfort [110] ), až po poskytování pohodlnějších API (boost :: krajta [111] [112] , CXX [113] , Pyhrol [114] atd.). Nástroj standardní knihovny ctypes umožňuje programům Python přímý přístup k dynamickým knihovnám / DLL napsaným v C. Existují moduly, které umožňují vkládat kód C/C++ přímo do zdrojových souborů Pythonu vytvářením rozšíření za běhu (pyinline [115] , weave [116] ).
Dalším přístupem je vložení interpretu Pythonu do aplikací. Python lze snadno integrovat do programů Java, C/C++, OCaml . Interakce aplikací Pythonu s jinými systémy je také možná pomocí CORBA , XML-RPC , SOAP , COM.
S pomocí projektu Cython je možné překládat programy napsané v jazycích Python a Pyrex do kódu C s následnou kompilací do strojového kódu. Cython se používá ke zjednodušení psaní knihoven Pythonu, při jeho používání je patrné, že kód je rychlejší a režie se snižuje.
Shedskinův experimentální projekt zahrnuje vytvoření kompilátoru pro transformaci implicitně napsaných programů Pythonu do optimalizovaného kódu C++. Od verze 0.22 Shedskin umožňuje kompilovat jednotlivé funkce do rozšiřujících modulů.
Python a naprostá většina jeho knihoven jsou zdarma a přicházejí ve zdrojovém kódu. Navíc, na rozdíl od mnoha otevřených systémů, licence nijak neomezuje použití Pythonu v komerčním vývoji a neukládá žádné jiné povinnosti než označení autorských práv.
Jedním z kanálů pro distribuci a aktualizaci balíčků pro Python je PyPI ( Python Package Index ) .
Python přichází s knihovnou tkinter založenou na Tcl / Tk pro vytváření programů GUI pro různé platformy .
Existují rozšíření, která umožňují používat všechny hlavní knihovny GUI - wxPython [117] , založené na knihovně wxWidgets , PyGObject pro GTK [118] , PyQt a PySide pro Qt a další. Některé z nich také poskytují rozsáhlé databázové, grafické a síťové možnosti, přičemž plně využívají knihovnu, na které jsou založeny.
K vytváření her a aplikací, které vyžadují nestandardní rozhraní, můžete použít knihovnu Pygame . Poskytuje také rozsáhlé multimediální nástroje : s jeho pomocí můžete ovládat zvuk a obrázky, přehrávat videa. Grafická hardwarová akcelerace OpenGL poskytovaná pygame má rozhraní vyšší úrovně než PyOpenGL [119] , které kopíruje sémantiku OpenGL C knihovny. Existuje také PyOgre [120] , který poskytuje odkaz na Ogre , objektově orientovanou 3D grafickou knihovnu na vysoké úrovni. Kromě toho existuje knihovna pythonOCC [121] , která poskytuje odkaz na 3D modelovací a simulační prostředí OpenCascade [122] .
Pro práci s rastrovou grafikou se používá Python Imaging Library .
PyCairo se používá pro práci s vektorovou grafikou .
Existují moduly, které umožňují ovládat typy parametrů funkcí za běhu, například typecheck [123] nebo dekorátory kontroly signatury metody [124] . V Pythonu 3 byla přidána volitelná deklarace typu pro parametry funkcí, interpret nekontroluje typy, ale pouze přidává příslušné informace do metadat funkce pro následné použití těchto informací rozšiřujícími moduly [125] .
Přetížení funkcí je implementováno různými knihovnami třetích stran, včetně PEAK [126] [127] . Plány, které nebyly přijaty pro podporu přetížení v Pythonu3000 [128] , byly částečně implementovány v přetížení-lib [129] .
Článek Wikiverzity " Python Program Examples " obsahuje příklady malých programů, které demonstrují některé funkce jazyka Python a jeho standardní knihovny.
Ahoj světe! ' lze napsat na jeden řádek:
tisk ( "Ahoj svět!" )Výpočet faktoriálu čísla 10 (10!):
def factorial ( n ): if n < 0 : raise ArithmeticError ( 'Faktoriál záporného čísla.' ) f = 1 pro i v rozsahu ( 2 , n + 1 ): f *= i return f tisk ( faktoriál ( 10 )) # 3628800Implementace s rekurzí :
def faktoriál ( n ): if n < 0 : zvýšit ArithmeticError ( 'faktoriál záporného čísla.' ) if ( n == 0 ) nebo ( n == 1 ): vrátit 1 else : vrátit faktoriál ( n - 1 ) * n tisk ( faktoriál ( 10 ))Standardní knihovna Pythonu poskytuje profiler (modul profile), který lze použít ke sběru statistik o době běhu jednotlivých funkcí. Chcete-li se rozhodnout, která verze kódu běží rychleji, můžete použít timeit. Měření v následujícím programu nám umožňují zjistit, která z možností zřetězení řetězců je efektivnější:
z timeit import Timer tmp = "Python 3.2.2 (výchozí, 12. června 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] na win32." def case1 (): # A. inkrementální zřetězení ve smyčce s = "" pro i v rozsahu ( 10000 ): s += tmp def case2 (): # B. přes prostřední seznam a metodu spojení s = [] pro i v rozsahu ( 10000 ): s . append ( tmp ) s = "" . připojit se ( s ) def case3 (): # B. seznam výrazů a metoda spojení return "" . připojit ([ tmp pro i v rozsahu ( 10 000 )]) def case4 (): # D. generátor výrazu a metoda spojení return "" . připojit ( tmp pro i v rozsahu ( 10000 )) pro v v rozsahu ( 1 , 5 ): tisk ( Timer ( "func()" , "from __main__ import case %s as func" % v ) . timeit ( 200 ))Jako každý programovací jazyk má i Python své vlastní techniky optimalizace kódu . Kód můžete optimalizovat na základě různých (často si navzájem konkurujících) kritérií (zvýšení výkonu, snížení množství potřebné RAM, kompaktnost zdrojového kódu atd.). Nejčastěji jsou programy optimalizovány na dobu provádění.
Existuje několik pravidel, která jsou zřejmá zkušeným programátorům.
Python má následující funkce a související pravidla optimalizace.
Nástroj nazvaný Pychecker [130] vám pomůže analyzovat váš zdrojový kód Pythonu a doporučit nalezené problémy (například nepoužívaná jména, změna signatury metody, když je přetížená atd.). V průběhu takovéto statické analýzy zdrojového kódu lze také odhalit chyby. Pylint [131] si klade za cíl vyřešit podobné problémy, ale má tendenci kontrolovat styl kódu, najít kód s vůní [132] .
Volba jazyka obvykle závisí na úkolech, které je třeba vyřešit, vlastnostech jazyků a dostupnosti knihoven potřebných k vyřešení problému. Stejná úloha napsaná v různých jazycích se může značně lišit, pokud jde o efektivitu provádění, včetně rozdílů při provádění v různých operačních systémech nebo při použití různých kompilátorů. Obecně lze jazyky rozdělit na interpretované (skriptovací), kompilované do střední reprezentace a kompilované, což ovlivňuje výkon a spotřebu paměti. Python je obvykle označován jako interpretovaný. Také jednotlivé jazyky mohou mít své silné stránky, v případě Pythonu vyniká snadnost psaní programů [133] .
Python je srovnáván s C++/Java z hlediska stručnosti, jednoduchosti a flexibility Pythonu [134] . Lze porovnat programy „ Ahoj, světe “ napsané v každém z jazyků [134] .
Srovnání programů "Ahoj, světe!"C++ [134] | Java [134] | Python [134] |
---|---|---|
#include <iostream> int main () { std :: cout << "Ahoj světe!" << std :: endl ; návrat 0 ; } | public class HelloClass { public static void main ( String [] args ) { System . ven . println ( "Ahoj světe!" ); } } | tisk ( "Ahoj světe!" ) |
Pokud jde o OOP, v Pythonu na rozdíl od C++ a Javy neexistují žádné modifikátory přístupu k polím tříd a metodám, atributy a pole objektů lze vytvářet za běhu během provádění programu a všechny metody jsou virtuální. Oproti Javě Python také umožňuje přetěžování operátorů, což umožňuje používat výrazy, které se blíží přirozenému [134] . Celkově vzato přístup Pythonu k OOP zjednodušuje programování, činí kód srozumitelnějším a zároveň dodává jazyku flexibilitu [134] . Na druhou stranu kód Pythonu (stejně jako další interpretované jazyky) je mnohem pomalejší než ekvivalentní kód C++ [135] a obecně se očekává, že bude pomalejší než Java [136] . Kód C++ je produktivnější než Python, přičemž zabírá více řádků. Podle výzkumu algoritmů používaných v bioinformatice se Python ukázal být flexibilnější než C++ a Java se ukázala jako kompromis mezi výkonem C++ a flexibilitou Pythonu [133] .
V Javě a Pythonu jsou všechny objekty vytvářeny na haldě , zatímco C++ umožňuje vytvářet objekty jak na haldě, tak na zásobníku , v závislosti na použité syntaxi [137] . Výkon je také ovlivněn způsobem přístupu k datům v paměti. V C++ a Javě se k datům přistupuje s konstantními posuny v paměti, zatímco v Pythonu je to prostřednictvím hashovacích tabulek . Používání ukazatelů v C++ může být pro začátečníky poměrně obtížné pochopit a osvojení si správného používání ukazatelů může nějakou dobu trvat [133] .
Go a Python jsou drasticky odlišné jazyky, nicméně jsou často srovnávány kvůli jejich společnému výklenku - backendu webových aplikací. Jak říká Jason Kincaid, Go kombinuje „výkon a bezpečnost kompilovaných jazyků, jako je C++, s rychlostí vývoje v dynamických jazycích, jako je Python“ [138] . Do jisté míry to platí: Go byl původně navržen jako silně staticky typovaný kompilovaný jazyk, který podporuje maximální vlastnosti dynamických jazyků, ve kterých je stále možné zajistit efektivní kompilaci a udržet výkon kompilovaných programů. Společné pro oba jazyky je použití automatické správy paměti, přítomnost vestavěných dynamických kolekcí (pole a slovníky), podpora řezů, vyvinutý modulový mechanismus a jednoduchá a minimalistická syntaxe. Existuje mnohem více rozdílů a není vždy možné jasně uvést, kterým z jazyků mluví.
dynamické možnosti. Pokud je Python zcela dynamický jazyk a téměř jakékoli prvky programu se mohou za běhu měnit, včetně vytváření nových typů za běhu a úprav stávajících, pak je Go statický jazyk s poněkud omezenými schopnostmi reflexe, který funguje pouze s ohledem na datové typy. vytvořené během vývoje. Náhradou dynamických schopností v Go je do jisté míry generování kódu, zajištěné jednoduchostí syntaxe a dostupností potřebných nástrojů a systémových knihoven. Plánuje se také přidání podpory pro generika v Go 2.0. Objektově orientované programování. Python je postaven na ideologii „vše-objekt“ a má mnoho mechanismů OOP, včetně vzácných a atypických. Go je docela typický modulární procedurální programovací jazyk, kde jsou funkce OOP omezeny na podporu rozhraní a schopnost vkládat struktury a rozhraní. Go vlastně ani nemá plnohodnotné dědictví. Pokud tedy Python vybízí k programování ve stylu OOP, s konstrukcí stromových závislostí mezi třídami a aktivním využíváním dědičnosti, pak se Go zaměřuje na komponentní přístup: chování komponent je dáno rozhraními, která ani nemusí být vzájemně propojeny a implementace rozhraní je umístěna v typech struct . „Duck typing“ implementovaný v Go vede k tomu, že neexistují ani formální syntaktické vazby mezi rozhraními a strukturami, které je implementují. Paralelní programování. V podpoře paralelního programování je Python výrazně horší než Go. Za prvé, GIL v Pythonu je překážkou efektivního využití systémů s velkým počtem (desítky i více) fyzických procesorových jader. Dalším problémem je nedostatek účinných vestavěných prostředků interakce mezi paralelními vlákny. Go obsahuje primitivum gorutinního jazyka, které vám umožňuje vytvářet „odlehčená“ vlákna, a kanály s podporou syntaxe, které umožňují vláknům komunikovat. Výsledkem je, že při vytváření např. frontových systémů v Go není problém využít stovky či dokonce tisíce současně existujících vláken, navíc při běžné zátěži libovolného počtu dostupných procesorových jader, přičemž žádné z existujících Implementace Pythonu zajistí efektivní provoz takového počtu vláken. Ošetření chyb, výjimky. Python podporuje zpracování výjimek, zatímco Go implementuje mechanismy pro explicitní vracení chybových kódů z funkcí a jejich zpracování na místě volání. Tento rozdíl lze posuzovat různými způsoby. Na jedné straně jsou výjimky pohodlným a známým mechanismem pro zpracování programových chyb, který vám umožňuje soustředit toto zpracování do vybraných fragmentů kódu a „nerozmazávat“ jej po textu programu. Na druhou stranu mají autoři Go pocit, že programátoři příliš často ignorují zpracování chyb a spoléhají na to, že vyhozená výjimka bude zpracována jinde; v distribuovaných aplikacích často nedochází k předávání výjimek mezi systémovými komponentami a vedou k neočekávaným selháním a ve vícevláknových aplikacích může neošetřená výjimka ve vláknu vést k zablokování nebo naopak k pádu programu. Vizuální možnosti, syntaxe. Python poskytuje více jazykových funkcí a primitiv, které jsou vhodné pro rychlý vývoj, než Go. To je z velké části způsobeno tím, že vývojáři Go záměrně odmítli zahrnout do jazyka některé „módní“ funkce, z nichž některé byly považovány za provokující chyby, jiné zastíraly záměrně neefektivní implementaci. Například přítomnost jednoduché operace vložení prvku do středu pole v jazyce vyvolává jeho časté používání a každá taková operace vyžaduje minimálně přesunutí „ocasu“ pole v paměti a někdy může vyžadovat alokaci paměti a přesun celého pole. Výkon. Pokud jde o výkon ve většině testů, které implementují typické sady backendových operací (zpracování dotazů, generování webových stránek), Go překonává Python několikanásobně až o několik řádů. To není překvapivé vzhledem ke statické povaze jazyka a skutečnosti, že programy Go jsou kompilovány přímo do kódu cílové platformy. V systémech, kde většinu času tráví provádění databázových dotazů nebo přenos informací po síti, to není podstatné, ale ve vysoce zatížených systémech, které zpracovávají velké množství požadavků, je výhoda Go nepopiratelná. Rozdíly ve výkonu programů Go a Python jsou také ovlivněny výše uvedenými rozdíly v implementaci paralelismu.Oba jazyky jsou interpretovány, zkompilovány do přechodné reprezentace, která je poté odeslána k provedení. V případě Pythonu se generuje přechodný bytekód, zatímco kompilátor Perl generuje syntaktický strom. Správa paměti v obou jazycích je automatická a jazyky samotné se používají jako skriptovací jazyky a jsou vhodné pro psaní webových aplikací. Přístup kódování v Pythonu zahrnuje lepší porozumění výpisu programů na úkor výkonu, zatímco Perl má větší volnost v syntaxi, což může způsobit, že programy v Perlu nebudou čitelné pro programátory, kteří nepoužívají Perl [133] .
Lua je jednoduchý jazyk původně navržený pro zabudování do softwaru a používaný k automatizaci složitých operací (jako je chování robotů v počítačových hrách). Python lze použít i v těchto oblastech, s Luou konkuruje i v psaní skriptů pro automatizaci správy počítače a operačního systému a v neprofesionálním samoprogramování. V posledních letech byly oba jazyky začleněny do mobilních zařízení, jako jsou programovatelné kalkulačky.
Oba jazyky jsou dynamické, interpretované, podporují automatickou správu paměti a mají standardní prostředky pro interakci se softwarem napsaným v jiných jazycích (hlavně C a C++). Runtime Lua je kompaktnější a vyžaduje méně prostředků ke spuštění než Python, což dává Lua výhodu při vkládání. Stejně jako Python, Lua podporuje kompilaci zdrojového kódu do virtuálního stroje spustitelného bajtkódu. Pro Lua existuje implementace kompilátoru JIT.
Lua je jednodušší než Python a má klasičtější syntaxi podobnou Pascalu. V jazyce je pouze osm vestavěných datových typů a všechny strukturované typy (struktury, výčty, pole, množiny) jsou modelovány na základě jediného vestavěného typu tabulky, což je vlastně heterogenní slovník. OOP je implementován na tabulkách a je založen na prototypovém modelu, jako v JavaScriptu. Python poskytuje více možností a každý z jeho strukturovaných datových typů má svou vlastní implementaci, která zlepšuje výkon. Možnosti OOP v Pythonu jsou mnohem širší, což dává výhodu při psaní složitých programů, ale má malý vliv na kvalitu a výkon jednoduchých skriptů, na které se Lua zaměřuje.
Python, MATLAB a R se používají při zpracování dat a při výuce studentů základům matematiky a statistiky. R je jazyk pro provádění statistických výpočtů, zatímco MATLAB lze spolu s Pythonem považovat za programovací jazyk [139] .
Python, jako velmi populární programovací jazyk, ovlivnil následující jazyky:
Klasický Python má s mnoha jinými interpretovanými jazyky společnou nevýhodu – relativně pomalou rychlost provádění programů [147] . Situaci do jisté míry vylepšuje uložení bajtkódu (rozšíření .pyca před verzí 3.5, .pyo), což umožňuje interpretu netrávit čas rozebíráním textu modulů při každém spuštění.
Existují implementace jazyka Python, které zavádějí vysoce výkonné virtuální stroje (VM) jako backend kompilátoru. Příklady takových implementací jsou PyPy , který je založen na RPythonu; dřívější iniciativou je projekt Parrot . Očekává se, že použití VM typu LLVM povede ke stejným výsledkům jako použití podobných přístupů pro implementace jazyka Java, kde je z velké části překonán špatný výpočetní výkon [148] . Nesmíme však zapomínat, že kvůli dynamické povaze Pythonu je nevyhnutelné, že během provádění programu vznikají další režie, což omezuje výkon systémů Python bez ohledu na použité technologie. V důsledku toho se k psaní kritických částí kódu používají nízkoúrovňové jazyky, jejichž integraci zajišťuje mnoho programů a knihoven (viz výše).
V nejpopulárnější implementaci jazyka Python je interpret poměrně velký a náročnější na zdroje než v podobných populárních implementacích Tcl , Forth , LISP nebo Lua , což omezuje jeho použití ve vestavěných systémech. Python však byl portován na některé platformy s relativně nízkým výkonem. .
Interpret Pythonu v CPythonu (stejně jako Stackless a PyPy [149] ) používá data nebezpečná pro vlákna, aby se zabránilo jejich zničení, při společné úpravě z různých vláken se použije globální zámek interpretu - GIL (Global Interpreter Lock) [150 ] : vlákno během spouštění kódu Interpret uzamkne GIL, po stanovenou dobu (výchozí 5 milisekund [K 2] ) provede určitý počet instrukcí, poté uvolní zámek a pozastaví se, aby umožnil běh dalším vláknům. GIL se také uvolní během I/O, při změně a kontrole stavu synchronizačních primitiv, když se spouští rozšiřující kód, který nepřistupuje k datům interpretu, jako je NumPy / SciPy . V jednom procesu interpretru Pythonu tedy může současně běžet pouze jedno vlákno kódu Python, bez ohledu na počet dostupných procesorových jader.
Pokuta za výkon z GIL závisí na povaze programů a architektuře systému. Většina programů je jednovláknová nebo spouští pouze několik vláken, z nichž některá jsou v daný okamžik nečinná. Osobní počítače mají obvykle malý počet procesorových jader, která jsou zatěžována paralelně běžícími procesy v systému, takže reálná ztráta výkonu na osobních počítačích vlivem GIL je malá. Ale v serverových aplikacích může být vhodné používat desítky a stovky (nebo dokonce více) paralelních vláken (například v systémech front, kde každé vlákno zpracovává data pro samostatný uživatelský požadavek) a servery na konci 2010 často disponují desítkami a dokonce stovkami procesorových jader, to znamená, že dokážou technicky zajistit tato vlákna s fyzickým simultánním prováděním; za takových podmínek může GIL vést k opravdu výraznému poklesu celkového výkonu, protože zbavuje program schopnosti plně využívat zdroje vícejádrových systémů.
Guido van Rossum řekl, že GIL „není tak špatný“ a bude v CPythonu, dokud „někdo jiný“ nepřijde s implementací Pythonu mimo GIL, která dělá jednovláknové skripty stejně rychlé [153] [ 154] .
Vývojové úkoly zahrnují práci na optimalizaci GIL [155] . V blízké budoucnosti se neplánuje ukončit podporu GIL, protože alternativní mechanismy v aplikacích s jedním vláknem, kterých je většina, jsou pomalejší nebo spotřebovávají více zdrojů:
Radikálním řešením problému by mohl být přechod na Jython a IronPython běžící na virtuálních strojích Java a .NET/Mono: tyto implementace GIL vůbec nepoužívají.
Zatímco jedním z deklarovaných principů návrhu Pythonu je princip nejmenšího překvapení , kritici poukazují na řadu architektonických voleb, které mohou být matoucí nebo matoucí pro programátory zvyklé na jiné běžné jazyky [162] . Mezi nimi:
Ve srovnání s Ruby a některými dalšími jazyky Python postrádá možnost upravovat vestavěné třídy jako int, str, float, listjiné, což však Pythonu umožňuje spotřebovávat méně RAM a běžet rychleji. Dalším důvodem pro zavedení takového omezení je potřeba koordinace s rozšiřujícími moduly. Mnoho modulů (za účelem optimalizace výkonu) převádí elementární typy Pythonu na odpovídající typy C místo toho, aby s nimi manipulovalo prostřednictvím C API. Eliminuje také mnoho potenciálních úskalí plynoucích z nekontrolovaného dynamického přepisování vestavěných typů.
CPython je hlavní implementací jazyka. Je napsán v C a je přenosný napříč platformami. Základem správy paměti je použití kombinace čítačů referencí a garbage collectoru odpovědného za vyhledávání cyklických záchytů referencí [42] . Ačkoli je jazyk považován za interpretovaný, je ve skutečnosti zkompilován do středního vysokoúrovňového bajtkódu [166] [167] , který je pak spuštěn prostřednictvím virtuálního stroje zásobníku [42] . Například volání funkce print()může být reprezentováno jako [167] :
1 0 LOAD_NAME 0 ( tisk ) 2 LOAD_CONST 0 ( ' Ahoj světe ! ' ) 4 CALL_FUNCTION 1 6 RETURN_VALUENázvy v jazyce mají pozdní vazbu, což znamená, že můžete psát volání proměnných, metod a atributů, které ještě neexistují, ale musí být deklarovány v době spuštění kódu, který je používá. Každý objekt v Pythonu má slovník hashovacích tabulek, pomocí kterého se porovnávají názvy atributů s jejich hodnotami. Globální proměnné jsou také mapovány pomocí slovníku. Po jediném volání metody nebo atributu může následovat alternativní vyhledávání ve více slovnících [42] .
PyPy je implementace Pythonu napsaná v RPythonu (podmnožina Pythonu s mnohem méně dynamickými schopnostmi). Umožňuje snadno testovat nové funkce. PyPy, kromě standardního CPythonu, obsahuje funkce Stackless, Psyco , modifikace AST za běhu a mnoho dalšího. Projekt integruje možnosti analýzy kódu Pythonu a překladu do jiných jazyků a bajtkódů virtuálních strojů ( C , LLVM , Javascript , .NET od verze 0.9.9). Počínaje verzí 0.9.0 je možné plně automaticky překládat RPython do jazyka C, což vede k rychlosti, která je přijatelná pro použití (2-3krát nižší než CPython s vypnutým JIT pro verzi 0.9.9). Standardně PyPy přichází s vestavěným JIT kompilátorem, se kterým je schopen běžet mnohem rychleji než CPython.
Jython je implementace Pythonu, která kompiluje kód Pythonu do bajtkódu Java , který může být spuštěn JVM . Lze jej také použít k importu třídy, jejíž zdrojový kód byl napsán v Javě jako modul pro Python [168] .
Existují i další implementace.
Na základě Pythonu bylo vytvořeno několik specializovaných podmnožin jazyka, které jsou určeny především pro statickou kompilaci do strojového kódu. Některé z nich jsou uvedeny níže.
Podobně jako Lisp a Prolog lze i Python používat interaktivně, kdy se příkazy zadané z klávesnice okamžitě provedou a výsledek se zobrazí na obrazovce ( REPL ). Tento režim je vhodný jak při učení jazyka, tak během procesu profesionálního vývoje – pro rychlé testování jednotlivých fragmentů kódu – protože poskytuje okamžitou zpětnou vazbu. Umožňuje také používat tlumočník jako kalkulačku s velkou sadou funkcí.
Téměř všechna Python IDE podporují REPL pro rychlé testování.
Existuje několik specializovaných IDE pro vývoj Pythonu.
Kromě toho existují zásuvné moduly pro podporu programování v Pythonu pro univerzální IDE Eclipse , KDevelop a Microsoft Visual Studio a také podpora pro zvýrazňování syntaxe, dokončování kódu a nástroje pro ladění a spouštění pro řadu běžných textových editorů.
Python je stabilní a rozšířený jazyk. Používá se v mnoha projektech a v různých kapacitách: jako hlavní programovací jazyk nebo pro vytváření rozšíření a integraci aplikací. V Pythonu bylo implementováno velké množství projektů a je také aktivně využíván k vytváření prototypů pro budoucí programy.
Python je jazyk, který se snadno učí a často se vyučuje jako první jazyk [27] , a to i při výuce dětí, jak programovat [185] . Jako první jazyk se dobře hodí, protože programy v něm jsou blízké přirozenému jazyku, ve kterém jsou lidé zvyklí myslet, a pro napsání správného programu je potřeba minimální počet klíčových slov. V jiných jazycích, jako je C++ , existuje velké množství různých syntaxí a jazykových prvků, kterým musíte věnovat pozornost místo studia algoritmů [134] .
Jako aplikace s otevřeným zdrojovým kódem se interpret Pythonu používá po celém světě a je dodáván s operačními systémy založenými na Linuxu a počítači Apple . Python je populární mezi jednotlivými vývojáři, ale je také používán velkými společnostmi v poměrně seriózních produktech zaměřených na zisk [186] . Reddit [46] je napsán v Pythonu . Dropbox má také silné využití Pythonu a kvůli složitosti dynamického psaní a obrovskému množství kódu společnost přešla na statické psaní s open source projektem Mypy [187] . Python je také hojně využíván na Facebooku [188 ] a Instagram [189] . Mnoho společností používá Python pro testování hardwaru, mezi tyto společnosti patří Intel , Cisco , Hewlett-Packard a IBM . Industrial Light & Magic a Pixar jej používají ve svých animovaných filmech [186] .
Tento jazyk je hojně používán Googlem ve svém vyhledávači a Youtube je z velké části napsán pomocí Pythonu [186] [190] . Kromě toho Google od roku 2010 sponzoruje vývoj Pythonu [191] [192] a podporu PyPI , hlavního systému distribuce balíčků pro Python [191] [193] .
Silnými stránkami Pythonu jsou jeho modularita a schopnost integrace s jinými programovacími jazyky, včetně součástí komplexních komplexních aplikací a systémů [194] . Kombinace jednoduchosti a stručnosti s velkým množstvím funkcí dělá z Pythonu pohodlný skriptovací jazyk . . Mnoho projektů poskytuje Python API pro skriptování, například prostředí 3D modelování Autodesk Maya [186] , Blender [195] a Houdini [196] a bezplatný geografický informační systém QGIS [197] . Některé projekty implementují základní část v produktivnějších programovacích jazycích a poskytují plnohodnotné API v Pythonu pro zjednodušení práce. . Engine bezplatného video editoru OpenShot je tedy implementován ve formě knihovny libopenshot , napsané v C ++ s použitím knihoven C a všechny možnosti plně pokrývá Python API [198][ význam skutečnosti? ] . Americká národní bezpečnostní agentura používá Python pro analýzu dat a NASA jej používá pro vědecké účely [186] . Z nástrojů používaných v NASA si lze všimnout bezplatného grafického síťového simulátoru GNS3 , který se osvědčil i ve firemním prostředí a je využíván v technologických firmách např. u Intelu [199] . Cura [200] [201] je také napsán v Pythonu, bezplatném a oblíbeném programu pro řezání 3D modelů pro tisk na 3D tiskárnách .
Python s balíčky NumPy , SciPy a MatPlotLib se aktivně používá jako univerzální vědecké výpočetní prostředí jako náhrada za běžné specializované komerční balíčky, jako je Matlab , poskytující podobnou funkcionalitu a nižší vstupní práh [202] . V Pythonu je z velké části napsán i grafický program Veusz .[203] , který umožňuje vytvářet kvalitní grafiku připravenou k publikování ve vědeckých publikacích [204][ význam skutečnosti? ] . Knihovna Astropy je oblíbeným nástrojem pro astronomické výpočty [205][ význam skutečnosti? ] .
Python je také vhodný pro provádění nestandardních nebo složitých úloh v systémech pro vytváření projektů , což je způsobeno tím, že není třeba předkompilovat zdrojové soubory. Projekt Google Test jej používá ke generování falešného zdrojového kódu pro třídy C++ [206][ význam skutečnosti? ] .
Interpret Pythonu lze použít jako výkonný shell a skriptovací jazyk pro psaní dávkových souborů OS. Snadný přístup ze skriptů Pythonu k externím programům a dostupnost knihoven, které umožňují přístup ke správě systému, činí z Pythonu pohodlný nástroj pro správu systému [207] . Pro tento účel je široce používán na platformě Linux: Python je obvykle dodáván se systémem, v mnoha distribucích jsou instalátory a vizuální rozhraní systémových utilit napsány v Pythonu. Používá se také při správě jiných unixových systémů, zejména Solaris a macOS [207] . Díky multiplatformnímu charakteru samotného jazyka a knihoven je atraktivní pro jednotnou automatizaci úloh správy systému v heterogenních prostředích, kde se společně používají počítače s různými typy operačních systémů.
Python je univerzální jazyk a lze jej použít téměř ve všech oblastech činnosti. Ve skutečnosti Python tak či onak používá téměř každá renomovaná společnost, a to jak pro každodenní úkoly, tak při testování, správě nebo vývoji softwaru [186] .
Krajta | |
---|---|
Společenství | |
Implementace | |
jiný |
|
Programovací jazyky | |
---|---|
|
![]() | ||||
---|---|---|---|---|
Slovníky a encyklopedie | ||||
|