Piton | |
---|---|
Clasa de limba | limbaj de programare orientat pe obiecte |
Aparut in | 20 februarie 1991 [17] |
Autor | Guido van Rossum [1] |
Dezvoltator | Python Software Foundation și Guido van Rossum [1] |
Extensie de fișier | .py, [18] , [19] , [20] , [21] , [22] sau [23].pyc.pyd.pyo.pyw.pyz.pyi |
Eliberare |
|
A fost influențat | 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 , ML standard [8] |
Licență | Licență Python Software Foundation [1] |
Site-ul web | python.org _ |
Platformă | Microsoft Windows |
OS | multiplatformă [24] |
Fișiere media la Wikimedia Commons |
Python ( IPA : [ˈpʌɪθ(ə)n] ; în rusă există denumiri python [25] sau python [26] ) este un limbaj de programare de nivel înalt cu scop general, cu tastare dinamică puternică și management automat al memoriei [27] [28 ] ] , axat pe îmbunătățirea productivității dezvoltatorilor, a lizibilității și a calității codului și pe asigurarea portabilității programelor scrise pe acesta [29] . Limbajul este complet orientat pe obiect în sensul că totul este obiect [27] . O caracteristică neobișnuită a limbajului este indentarea în spații albe a blocurilor de cod [30] . Sintaxa limbajului de bază este minimalistă, din cauza căreia în practică este rareori necesar să se facă referire la documentație [29] . Limbajul în sine este cunoscut ca interpretat și este folosit, printre altele, pentru scrierea de scenarii [27] . Dezavantajele limbajului sunt adesea viteza mai mică și consumul mai mare de memorie al programelor scrise în el, comparativ cu codul similar scris în limbaje compilate, cum ar fi C sau C++ [27] [29] .
Python este un limbaj de programare multi-paradigma care suportă programarea imperativă , procedurală , structurată , orientată pe obiecte [27] , metaprogramare [31] și programare funcțională [27] . Problemele de programare generice sunt rezolvate prin tastare dinamică [32] [33] . Programarea orientată pe aspecte este suportată parțial prin decoratori [34] , un suport mai complet este asigurat de cadre suplimentare [35] . Tehnici precum programarea prin contract și logică pot fi implementate folosind biblioteci sau extensii [36] . Principalele caracteristici arhitecturale sunt tastarea dinamică , managementul automat al memoriei [27] , introspecția completă , mecanismul de gestionare a excepțiilor , suportul pentru calcule cu mai multe fire cu blocare globală a interpretului ( GIL ) [37] , structuri de date la nivel înalt . Este acceptată împărțirea programelor în module , care, la rândul lor, pot fi combinate în pachete [38] .
Implementarea de referință Python este interpretul CPython , care acceptă cele mai utilizate platforme [39] și este standardul de facto al limbajului [40] . Este distribuit sub licența gratuită Python Software Foundation , care vă permite să-l utilizați fără restricții în orice aplicație, inclusiv proprietară [41] . CPython compilează codul sursă în bytecode de nivel înalt care rulează într-o mașină virtuală stivă [42] . Celelalte trei implementări majore ale limbajului sunt Jython (pentru JVM ), IronPython (pentru CLR / .NET ) și PyPy [27] [43] . PyPy este scris într-un subset al limbajului Python (RPython) și a fost dezvoltat ca alternativă la CPython pentru a crește viteza de execuție a programului, inclusiv prin utilizarea compilației JIT [43] . Suportul pentru Python 2 sa încheiat în 2020 [44] . În acest moment, versiunea limbajului Python 3 este în curs de dezvoltare activ [45] . Dezvoltarea limbajului se realizează prin propuneri de extensie a limbajului PEP ( Python Enhancement Proposal ) , care descriu inovațiile, fac ajustări pe baza feedback-ului comunității și documentează deciziile finale [46] .
Biblioteca standard include un set mare de funcții portabile utile, de la capabilități de procesare a textului la instrumente pentru scrierea aplicațiilor de rețea. Caracteristici suplimentare, cum ar fi modelarea matematică, lucrul cu echipamente, scrierea de aplicații web sau dezvoltarea de jocuri, pot fi implementate printr-un număr mare de biblioteci terțe, precum și integrarea bibliotecilor scrise în C sau C++, în timp ce Python interpretul însuși poate fi integrat în proiecte, scrise în aceste limbi [27] . Există, de asemenea, un depozit specializat pentru software scris în Python, PyPI [47] . Acest depozit oferă un mijloc de a instala cu ușurință pachetele în sistemul de operare și a devenit standardul de facto pentru Python [48] . În 2019, acesta conținea peste 175.000 de pachete [47] .
Python a devenit unul dintre cele mai populare limbaje și este folosit în analiza datelor , învățarea automată , DevOps și dezvoltarea web , printre alte domenii, inclusiv dezvoltarea jocurilor . Datorită lizibilității, sintaxei simple și lipsei de compilare, limbajul este foarte potrivit pentru predarea programării, permițându-vă să vă concentrați asupra algoritmilor, conceptelor și paradigmelor de învățare. Depanarea și experimentarea este mult facilitată de faptul că limbajul este interpretabil [27] [49] . Limbajul este folosit de multe companii mari precum Google sau Facebook [27] . În septembrie 2022, Python ocupă locul 1 în clasamentul TIOBE al popularității limbajelor de programare cu un scor de 15,74% [50] . Python a fost declarat Limba TIOBE a anului în 2007, 2010, 2018, 2020 și 2021 [51] .
Ideea implementării limbii a apărut la sfârșitul anilor 1980 , iar dezvoltarea implementării acesteia a început în 1989 de către Guido van Rossum , angajat al institutului olandez CWI [46] . Sistemul de operare distribuit al lui Amoeba necesita un limbaj de scripting extensibil , iar Guido a început să dezvolte Python în timpul liber, împrumutând o parte din munca din limbajul ABC (Guido a fost implicat în dezvoltarea acestui limbaj axat pe predarea programării). În februarie 1991, Guido a postat codul sursă în grupul de știri alt.sources [52] . Încă de la început, Python a fost conceput ca un limbaj orientat pe obiecte .
Guido van Rossum a numit limbajul după popularul show de televiziune britanic de comedie Monty Python's Flying Circus [ 53 ] , deoarece autorul era un fan al spectacolului, la fel ca mulți alți dezvoltatori ai vremii, iar spectacolul în sine avea unele paralele cu lumea. a tehnologiei informatice [29] .
A avea o comunitate de utilizatori prietenoasă și receptivă este considerată, împreună cu intuiția de proiectare a lui Guido, una dintre cheile succesului Python. Dezvoltarea limbajului are loc conform unui proces clar reglementat de creare, discutare, selectare și implementare a documentelor PEP ( Python Enhancement Proposal ) - propuneri pentru dezvoltarea Python [54] .
Pe 3 decembrie 2008 [55] , după teste ample, a fost lansată prima versiune de Python 3000 (sau Python 3.0, cunoscută și ca Py3k ). Python 3000 remediază multe dintre deficiențele arhitecturii, menținând în același timp o compatibilitate cât mai mare (dar nu completă) cu versiunile mai vechi de Python posibil.
Data de sfârșit a suportului pentru Python 2.7 a fost stabilită inițial în 2015 și apoi a fost împinsă înapoi în 2020 din cauza îngrijorării că o mare parte din codul existent nu ar putea fi portat cu ușurință în Python 3 [56] [57] . Suportul Python 2 a fost direcționat doar către proiectele existente, proiectele noi erau necesare pentru a utiliza Python 3 [45] . Python 2.7 nu a fost acceptat oficial de la 1 ianuarie 2020, deși ultima actualizare a fost lansată în aprilie 2020. Nu vor mai fi lansate remedieri de securitate sau alte îmbunătățiri pentru Python 2.7 [44] [58] . Odată cu sfârșitul vieții Python 2.x, numai Python 3.6.x și mai târziu sunt acceptate [59] .
Limbajul folosește tastarea dinamică împreună cu numărarea referințelor și un colector de gunoi circular pentru gestionarea memoriei [60] . Există, de asemenea, rezoluții de nume dinamice ( legare dinamică ) care leagă numele metodelor și variabilelor în timpul execuției programului.
Python oferă suport pentru programarea funcțională în tradiția Lisp . Deci , în Python există funcții și filter; conceptele de caracteristici ale listelor , tablourilor asociative (dicționare), mulțimilor și generatoarelor de liste [61] au fost, de asemenea, împrumutate de la Lisp . Biblioteca standard conține două module (itertools și functools) care implementează instrumente împrumutate de la Haskell și Standard ML [62] . mapreduce
Dezvoltatorii limbajului Python aderă la o anumită filozofie de programare numită „Zenul lui Python” („ Zenul lui Python”, sau „Zenul lui Python”) [63] . Textul său este emis de interpretul Python la comandă import this(funcționează o dată pe sesiune). Tim Peters este considerat a fi autorul acestei filozofii .
Filosofia începe astfel [64] :
….
Text original (engleză)[ arataascunde]...
În loc să aibă toate funcționalitățile limbajului încorporate în nucleul Python, a fost proiectat pentru a fi ușor extensibil. Acest lucru a făcut ca limbajul să fie un mijloc popular de a adăuga interfețe programabile la aplicațiile existente. Viziunea lui Guido van Rossum despre un nucleu mic, cu o bibliotecă standard mare și un interpret ușor extensibil a rezultat din experiența negativă a dezvoltării limbajului ABC , care a adoptat o abordare opusă [65] .
Python vizează o sintaxă și o gramatică mai simplă, mai puțin greoaie, oferind dezvoltatorilor posibilitatea de a alege în metodologia lor de codare. Spre deosebire de motto-ul lui Perl „ există mai multe moduri de a face acest lucru ”, filosofia lui Python este „ar trebui să existe o singură modalitate evidentă de a face acest lucru” [66] . Alex Martelli , membru al Python Software Foundation și autor al unor cărți despre Python scrie că „A descrie ceva ca fiind „inteligent” nu este considerat un compliment în cultura Python” [67] .
Dezvoltatorii Python tind să evite optimizarea prematură și să respingă patch-urile la părțile necritice ale implementării de referință CPython care ar oferi o creștere marginală a vitezei în detrimentul clarității codului [68] . Cu toate acestea, există modalități de îmbunătățire a performanței. Dacă programul are blocaje asociate cu performanța operațiunilor care consumă mult resurse pe procesorul central, dar nu sunt asociate cu utilizarea operațiunilor I/O, atunci este posibilă îmbunătățirea performanței prin traducerea programului folosind Cython în limbajul C și ulterioare. compilare [69] . Părțile programului care necesită resurse de calcul pot fi, de asemenea, rescrise în limbajul C și conectate ca biblioteci separate cu legături la Python [43] .
Un obiectiv important al dezvoltatorilor Python este să îl facă distractiv de utilizat. Acest lucru s-a reflectat în numele limbii, dat în onoarea lui Monty Python [53] . Se reflectă, de asemenea, în abordarea uneori jucăușă a tutorialelor și a materialelor de referință, cum ar fi programele exemplu din documentație, care folosesc denumirile spam și ouă în loc de numele folosite în documentația multor alte limbi foo și bar [70 ] [71] .
Python a fost portat și rulează pe aproape toate platformele cunoscute, de la PDA-uri la mainframe . Există porturi pentru Microsoft Windows , aproape toate variantele de UNIX (inclusiv FreeBSD și Linux ), Android [72] , Plan 9 , Mac OS și macOS , iPhone OS (iOS) 2.0 și o versiune ulterioară, iPadOS , Palm OS , OS/2 , Amiga , HaikuOS , AS/400 , OS/390 , Windows Mobile și Symbian .
Pe măsură ce platforma devine învechită, suportul său în ramura principală a limbii încetează. De exemplu, suportul pentru Windows 95 , Windows 98 și Windows ME [73] a fost renunțat la versiunea 2.6 . Windows XP nu mai este acceptat în versiunea 3.5 [74] Windows Vista și Windows 7 nu mai sunt acceptate în versiunea 3.9 [75] .
În același timp, spre deosebire de multe sisteme portabile, pentru toate platformele majore, Python are suport pentru tehnologii specifice acestei platforme (de exemplu, Microsoft COM / DCOM ). Mai mult, există o versiune specială de Python pentru Java Virtual Machine - Jython , care permite interpretului să ruleze pe orice sistem care acceptă Java , în timp ce clasele Java pot fi utilizate direct din Python și chiar pot fi scrise în Python. Mai multe proiecte asigură integrarea cu platforma Microsoft.NET , principalele fiind IronPython și Python.Net .
Python acceptă tastarea dinamică , adică tipul unei variabile este determinat doar în timpul execuției. Deci, în loc să „atribuiți o valoare unei variabile” este mai bine să vorbim despre „asocierea unei valori cu un nume”. Tipurile primitive în Python includ boolean , întreg de precizie arbitrară , virgulă mobilă și complex . Tipurile de containere încorporate în Python sunt string , list , tuple , dictionary și set [49] . Toate valorile sunt obiecte, inclusiv funcții, metode, module, clase.
Puteți adăuga un tip nou fie scriind o clasă (clasă), fie definind un tip nou într-un modul de extensie (de exemplu, scris în C). Sistemul de clasă acceptă moștenirea (singură și multiplă ) și metaprogramarea . Este posibil să moșteniți de la majoritatea tipurilor încorporate și extensii.
Tip de | Schimbabilitatea | Descriere | Exemple |
---|---|---|---|
bool | imuabil | tip boolean | True False |
bytearray | schimbătoare | Matrice de octeți | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105]) |
bytes | imuabil | Matrice de octeți | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105]) |
complex | imuabil | Număr complex | 3+2.7j |
dict | schimbătoare | Dicționar ( matrice asociativă ) este o colecție de perechi cheie-valoare; valoarea poate fi de orice tip, cheia trebuie să fie de tip hashable | {'key1': 1.0, 3: False} {} |
ellipsis[K 1] | imuabil | Elips (elipse). Folosit în principal în NumPy pentru a oferi o scurtătură pentru tăierea unei matrice multidimensionale. Este prezent în Python în sine pentru a suporta tipuri și extensii personalizate, cum ar fi NumPy [76] | ... Ellipsis Pentru NumPy : care este echivalent cu [76] x[i, ..., j] x[i, :, :, j] |
float | imuabil | Număr în virgulă mobilă . Gradul de precizie depinde de platformă, dar în practică este de obicei implementat ca un număr pe 64 de biți și 53 de biți [77] |
1.414 |
frozenset | imuabil | Setul dezordonat , nu conține duplicate; poate conține diferite tipuri de date hashabile în interior | frozenset([4.0, 'string', True]) |
int | imuabil | Număr întreg nelimitat [78] | 42 |
list | schimbătoare | Listă , poate conține diferite tipuri de date | [4.0, 'string', True] [] |
NoneType[K 1] | imuabil | Un obiect care reprezintă absența unei valori, adesea denumit Null în alte limbi. | None |
NotImplementedType[K 1] | imuabil | Obiectul care este returnat la supraîncărcarea operatorilor când tipurile de operanzi nu sunt acceptate. | NotImplemented |
range | imuabil | O secvență de numere întregi de la o valoare la alta, folosită de obicei pentru a repeta o operație de mai multe ori cu for [79] | range(1, 10) range(10, -5, -2) |
set | schimbătoare | Setul dezordonat , nu conține duplicate; poate conține diferite tipuri de date hashabile în interior | {4.0, 'string', True} set() |
str | imuabil | tip șir | 'Wikipedia' "Wikipedia" """Se întinde pe mai multe linii""" |
tuple | imuabil | Tuplu . Poate conține diferite tipuri de date în sine. Poate fi folosit ca o listă imuabilă și ca înregistrări cu câmpuri fără nume [80] | Ca o listă imuabilă: Ca înregistrări: [80] (4.0, 'string', True) ('single element',) () lax_coordinates = (33.9425, -118.408056) city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) |
Limbajul are o sintaxă clară și consecventă, modularitate și scalabilitate atentă , făcând codul sursă al programelor scrise în Python ușor de citit. Când trece argumente către funcții, Python folosește call -by-sharing [ 81 ] .
Setul de operatori este destul de tradițional.
Una dintre caracteristicile sintactice interesante ale limbajului este indentarea blocurilor de cod (spații sau tab-uri), astfel încât Python nu are paranteze de început/sfârșit , ca în Pascal , sau acolade, ca în C. Un astfel de „truc” vă permite să reduceți numărul de linii și caractere din program și vă învață să „bun” stilul de programare. Pe de altă parte, comportamentul și chiar corectitudinea programului pot depinde de spațiile inițiale din text. Pentru cei care sunt obișnuiți cu programarea în limbaje cu selecție explicită a începutului și sfârșitului blocurilor, acest comportament poate părea la început neintuitiv și incomod.
Guido însuși a scris [82] :
Poate cea mai controversată caracteristică a lui Python este utilizarea indentării pentru a grupa instrucțiuni, care este preluată direct din ABC . Aceasta este una dintre trăsăturile limbajului care îmi este drag inimii. Acest lucru face codul Python mai lizibil în două moduri. În primul rând, utilizarea indentării reduce dezordinea vizuală și face programele mai scurte, reducând astfel cantitatea de atenție necesară pentru înțelegerea unității de bază a codului. În al doilea rând, îi oferă programatorului mai puțină libertate în formatare, permițând astfel un stil mai consistent, care facilitează citirea codului altor persoane. (Comparați, de exemplu, trei sau patru convenții diferite de acolade C , fiecare cu susținători puternici.)
Text original (engleză)[ arataascunde] Poate cea mai controversată caracteristică a lui Python este utilizarea indentării pentru gruparea declarațiilor, care derivă direct din ABC. Este una dintre trăsăturile limbii care îmi este cel mai drag inimii. Face codul Python mai lizibil în două moduri. În primul rând, utilizarea indentării reduce dezordinea vizuală și face programele mai scurte, reducând astfel durata de atenție necesară pentru a prelua o unitate de bază de cod. În al doilea rând, permite programatorului mai puțină libertate în formatare, permițând astfel un stil mai uniform, ceea ce facilitează citirea codului altcuiva. (Comparați, de exemplu, cele trei sau patru convenții diferite pentru plasarea bretelelor în C, fiecare cu susținători puternici.)Compoziția, sintaxa, asociativitatea și precedența operațiilor sunt destul de familiare cu limbajele de programare și sunt concepute pentru a minimiza utilizarea parantezelor. În comparație cu matematică, precedența operatorului o oglindește pe cea din matematică, cu operatorul de atribuire a valorii =corespunzător operatorului tipografic ←. În timp ce prioritatea operatorului evită utilizarea parantezelor în multe cazuri, analiza expresiilor mari poate fi consumatoare de timp, făcând parantezele explicite mai benefice în astfel de cazuri [45] .
Separat, merită menționată operația de formatare pentru șiruri (funcționează prin analogie cu funcția printf()din C), care folosește același simbol ca și luarea restului diviziunii:
>>> str_var = "world" >>> print ( "Bună ziua, %s " % str_var ) Bună ziua , lumeÎn versiunea 3.6, au fost adăugate șiruri literale formatate sau șiruri f pentru a face codul mai ușor de citit și mai concis:
>>> str_var = "world" >>> print ( f "Bună ziua, { str_var } " ) # ieșire folosind șirul f Bună ziua , lumePython are comparații înlănțuite la îndemână . Astfel de condiții în programe nu sunt neobișnuite:
1 <= a < 10 și 1 <= b < 20În plus, operațiile logice ( orși and) sunt leneșe : dacă primul operand este suficient pentru a evalua valoarea operației, acest operand este rezultatul, în caz contrar se evaluează al doilea operand al operației logice. Aceasta se bazează pe proprietățile algebrei logicii : de exemplu, dacă un argument al operației „SAU” ( or) este adevărat, atunci rezultatul acestei operații este întotdeauna adevărat. Dacă al doilea operand este o expresie complexă, aceasta reduce costul calculului său. Acest fapt a fost utilizat pe scară largă până la versiunea 2.5 în loc de construcția condiționată:
a < b și „mai mic decât” sau „mai mare sau egal cu”Tipurile de date încorporate au, în general, o sintaxă specială pentru literalele lor (constante scrise în codul sursă):
"șir și șir Unicode în același timp" "șir și șir Unicode în același timp" """și șir și șir Unicode în același timp""" Adevărat sau fals # literale booleene 3.14 # număr virgulă mobilă 0b1010 + 0o12 + 0xA # numere în binar , octal și hexazecimal 1 + 2 j # număr complex [ 1 , 2 , "a" ] # listă ( 1 , 2 , "a" ) # tuplu { 'a' : 1 , 'b' : ' B' } # dicționar { 'a' , 6 , 8.8 } # set lambda x : x ** 2 # funcție anonimă ( i pentru i în interval ( 10 )) # generatorPentru liste (și alte secvențe), Python oferă un set de operațiuni de tăiere. O caracteristică este indexarea, ceea ce poate părea ciudat pentru un începător, dar își dezvăluie consistența pe măsură ce o utilizați. Indicii elementelor din listă încep de la zero. Înregistrarea unei felii s[N:M]înseamnă că toate elementele de la N inclusiv la M, dar nu sunt incluse, cad în felie. În acest caz, indexul poate fi omis. De exemplu, înregistrare s[:M]înseamnă că toate elementele de la început cad în felie; notația s[N:]înseamnă că toate elementele sunt incluse până la sfârșitul feliei; înregistrare s[:]înseamnă că toate elementele de la început până la sfârșit sunt incluse.
Numele (identificatorul) poate începe cu o literă a oricărui alfabet în Unicode , orice literă sau liniuță de subliniere, după care se pot folosi și numere în nume. Nu puteți folosi cuvinte cheie ca nume (lista lor poate fi găsită prin import keyword; print(keyword.kwlist)) și nu este de dorit să redefiniți numele încorporate. Numele care încep cu liniuță au o semnificație specială [83] .
În fiecare punct al programului, interpretul are acces la trei spații de nume (adică mapări nume-obiect): local, global și încorporat.
Domeniile numelor pot fi imbricate unele în altele (numele din blocul de cod din jur sunt vizibile în interiorul funcției definite). În practică, există mai multe bune maniere asociate cu domeniile și legăturile de nume, despre care puteți afla mai multe în documentație.
Python oferă un mecanism pentru documentarea codului pydoc. La începutul fiecărui modul, clasă, funcție se inserează un șir de documentație - docstring . Șirurile de documentație rămân în cod în timpul execuției, iar accesul la documentație [84] (variabilă __doc__) este încorporat în limbaj, așa cum este folosit de IDE-urile moderne ( Mediul de dezvoltare integrat ) (de exemplu, Eclipse ).
Puteți obține ajutor interactiv, puteți genera documentație hipertext pentru un întreg modul sau chiar puteți utiliza pentru a testa automat un
Python este un limbaj de programare cu mai multe paradigme . Programarea orientată pe obiecte , structurală [85] , generică , funcțională [27] și metaprogramarea [31] sunt pe deplin acceptate . Suportul de bază pentru programarea orientată pe aspecte este oferit prin metaprogramare [34] . Multe alte tehnici, inclusiv contractul [86] [87] și programarea logică [88] , pot fi implementate folosind extensii.
Designul limbajului Python este construit în jurul unui model de programare orientat pe obiecte. Implementarea OOP în Python este bine gândită, dar în același timp destul de specifică în comparație cu alte limbaje orientate pe obiecte . Totul într-o limbă este un obiect, fie o instanță a unei clase, fie o instanță a unei metaclase. Excepția este metaclasa încorporată de bază type. Deci, clasele sunt de fapt instanțe ale metaclaselor, iar metaclasele derivate sunt instanțe ale unei metaclase type. Metaclasele fac parte din conceptul de metaprogramare și oferă capacitatea de a controla moștenirea claselor, ceea ce vă permite să creați clase abstracte, să înregistrați clase sau să adăugați orice interfață de programare la acestea într-o bibliotecă sau cadru [31] .
Clasele reprezintă în esență un plan sau o descriere a modului în care se creează un obiect și stochează o descriere a atributelor și metodelor obiectului de lucru cu acesta. Paradigma OOP se bazează pe încapsulare , moștenire și polimorfism [89] . Încapsularea în Python este reprezentată de capacitatea de a stoca atribute (câmpuri) publice și ascunse într-un obiect cu furnizarea de metode de lucru cu acestea [89] , în timp ce de fapt toate atributele sunt publice, dar există o convenție de denumire pentru marcarea ascunse. atribute [90] . Moștenirea vă permite să creați obiecte derivate fără a fi nevoie să rescrieți codul, iar polimorfismul este capacitatea de a suprascrie orice metode ale unui obiect (în Python, toate metodele sunt virtuale [90] ), precum și metodele și operatorii de supraîncărcare . Supraîncărcarea metodelor în Python este implementată datorită posibilității de a apela aceleiași metode cu un set diferit de argumente [89] . O caracteristică a lui Python este capacitatea de a modifica clase după ce sunt declarate, adăugându-le noi atribute și metode [45] , puteți modifica și obiectele în sine, ca urmare a cărora clasele pot fi folosite ca structuri pentru stocarea datelor arbitrare [ 45] 90] .
Python acceptă moștenirea multiplă. Moștenirea multiplă în sine este complexă, iar implementările sale întâmpină probleme de rezolvare a coliziunilor de nume între clasele părinte și, eventual, de remoștenire din aceeași clasă într-o ierarhie. În Python, metodele sunt apelate conform ordinii de rezoluție a metodei (MRO), care se bazează pe algoritmul de liniarizare C3 [91] , în cazuri normale, când scrieți programe, nu trebuie să știți cum funcționează acest algoritm, în timp ce înțelegerea poate fi necesar la crearea ierarhiilor de clasă non-triviale [92] .
Caracteristici și caracteristici specifice lui Python:
Limbajele care acceptă tastarea dinamică și programarea orientată pe obiecte nu sunt de obicei luate în considerare în cadrul programării generice, deoarece problemele de programare generică sunt rezolvate din cauza absenței restricțiilor privind tipurile de date [32] [33] . În Python, programarea generică puternic tipizată este realizată prin utilizarea caracteristicilor limbajului împreună cu analizoare externe de cod [93] , cum ar fi Mypy [94] .
Deși Python nu a fost conceput inițial ca un limbaj de programare funcțional [95] , Python acceptă programarea în stilul de programare funcțională, în special [96] :
Cu toate acestea, spre deosebire de majoritatea limbajelor axate direct pe programarea funcțională, Python nu este un limbaj de programare pur și codul nu este imun la efectele secundare [96] [97] .
Există, de asemenea, pachete speciale în biblioteca standard Python operatorpentru functoolsprogramare funcțională [95] .
Python acceptă metaprogramarea [98] [31] .
Software-ul Python (aplicație sau bibliotecă) este împachetat ca module, care la rândul lor pot fi împachetate în . Modulele pot fi localizate atât în directoare , cât și în arhive ZIP . Modulele pot fi de două tipuri la origine: module scrise în Python „pur” și module de extensie (module de extensie) scrise în alte limbaje de programare. De exemplu, biblioteca standard are un modul pickle „pur” și echivalentul său în C: cPickle. Modulul este realizat ca un fișier separat, iar pachetul - ca un director separat. Modulul este conectat la program de către operator import. Odată importat, un modul este reprezentat de un obiect separat care oferă acces la spațiul de nume al modulului. În timpul execuției programului, modulul poate fi reîncărcat cu funcția reload().
Python acceptă introspecția de rulare completă [99] . Aceasta înseamnă că pentru orice obiect, puteți obține toate informațiile despre structura sa internă.
Utilizarea introspecției este o parte importantă a ceea ce se numește stilul pythonic și este utilizat pe scară largă în bibliotecile și cadrele Python, cum ar fi PyRO , PLY, Cherry, Django și altele, economisind foarte mult timpul programatorului care le folosește.
Datele necesare introspecției sunt stocate în atribute speciale. Deci, de exemplu, puteți obține toate atributele definite de utilizator ale majorității obiectelor dintr-un atribut special - un dicționar (sau un alt obiect care oferă o interfață dict)__dict__
>>> clasa x ( obiect ): trece .... >>> f = x () >>> f . attr = 12 >>> print ( f . __dict__ ) { 'attr' : 12 } >>> print ( x . __dict__ ) # deoarece clasele sunt, de asemenea, instanțe ale tipului de obiect #, așa că acceptă acest tip de introspecție { '__dict__' : < atributul '__dict__' al obiectelor 'x' > , '__module__' .......Există și alte atribute ale căror nume și scopuri depind de obiect:
>>> def f (): trece .... >>> f . func_code . co_code # get function bytecode 'd \x00\x00 S' >>> f . __class__ # atribut special - referință la clasa obiectului dat < tip „funcție” >Marea majoritate a atributelor care susțin introspecția sunt bazate pe clasă, iar acestea, la rândul lor, pot fi preluate din obj.__class__.__dict__. O parte din informațiile moștenite de la clasa de bază sunt partajate de toate obiectele, ceea ce economisește memorie.
Pentru confortul obținerii de informații introspective, Python are un modul inspect[100] .
>>> def f ( x , y = 10 , ** mp ): trece ... >>> inspectează . getargspec ( f ) ([ 'x' , 'y' ], Niciunul , 'mp' , ( 10 ,))Cu ajutorul modulului , newprocesul invers este posibil - construirea unui obiect din părțile sale componente în etapa de execuție
>>> def f ( i ): return j + i .... >>> j = 2 >>> f ( 1 ) 3 >>> import new >>> g = new . function ( f . func_code , { 'j' : 23 }) >>> g ( 1 ) 24Gestionarea excepțiilor este suportată în Python prin instrucțiunile try, except, else, finally, raisecare formează blocul de gestionare a excepțiilor. În general, blocul arată astfel:
încercați : # Aici este codul care poate genera o excepție Excepție ( „ mesaj” ) # Excepție, acesta este unul dintre tipurile standard de excepție (doar o clasă), # poate fi folosit orice altul, inclusiv al dvs., cu excepția ( Exception type1 , Exception type2 , … ) as Variable : # Codul din bloc este executat dacă tipul de excepție se potrivește cu unul dintre # tipuri (ExceptionType1, ExceptionType2, ...) sau este un descendent al unui # dintre aceste tipuri. # Excepția rezultată este disponibilă într-o Variabilă opțională. except ( Exception type3 , Exception type4 , … ) ca Variabila : # Numarul de blocuri except este nelimitat crestere # Arunca o exceptie "pe deasupra" celei primite ; fără parametri - rethrow primit, cu excepția : # Se va executa la orice excepție care nu este gestionată de blocurile tastate, cu excepția altora : # Codul blocului este executat dacă nu au fost prinse excepții. în cele din urmă : # Se va executa oricum, eventual după o potrivire # exceptând sau altfel blocPartajarea else, excepta finallyfost posibilă doar de la Python 2.5. Informațiile despre excepția actuală sunt întotdeauna disponibile prin sys.exc_info(). Pe lângă valoarea excepției, Python salvează și starea stivei până la punctul în care este aruncată excepția - așa-numitul traceback.
Spre deosebire de limbajele de programare compilate, în Python, utilizarea unei excepții nu duce la o suprasolicitare semnificativă (și adesea accelerează chiar execuția programelor) și este foarte utilizată. Excepțiile sunt în concordanță cu filosofia lui Python (Punctul 10 din „ Zenul lui Python ” - „Erorile nu ar trebui să fie niciodată reduse la tăcere”) și reprezintă unul dintre mijloacele de a sprijini „ tastarea de rață ”.
Uneori este mai convenabil să folosiți un bloc în loc de gestionarea explicită a excepțiilor with(disponibil începând cu Python 2.5).
Iteratoarele sunt utilizate pe scară largă în programele Python. Bucla forpoate funcționa atât cu o secvență, cât și cu un iterator. Cele mai multe colecții oferă iteratoare, iteratorii pot fi, de asemenea, definiți de utilizator pe propriile obiecte. Modulul itertoolsbibliotecă standard conține facilități pentru lucrul cu iteratoare.
Una dintre caracteristicile interesante ale limbajului sunt generatoarele - funcții care salvează starea internă: valorile variabilelor locale și instrucțiunea curentă (vezi și: corutine ). Generatoarele pot fi folosite ca iteratoare pentru structurile de date și pentru evaluarea leneșă .
Când este apelat un generator, funcția returnează imediat un obiect iterator care stochează punctul de execuție curent și starea variabilelor locale ale funcției. Când este solicitată următoarea valoare (printr-o metodă next()numită implicit în buclă for), generatorul continuă funcția de la punctul de întrerupere anterior la următoarea yieldsau instrucțiunea return.
Python 2.4 a introdus expresii generatoare , expresii care au ca rezultat un generator. Expresiile generatoare vă permit să economisiți memorie acolo unde, altfel, ar trebui să utilizați o listă cu rezultate intermediare:
>>> suma ( i pentru i în intervalul ( 1 , 100 ) dacă i % 2 != 0 ) 2500Acest exemplu adună toate numerele impare de la 1 la 99.
Începând cu versiunea 2.5, Python acceptă co-proceduri cu drepturi depline: acum puteți transmite valori unui generator folosind o metodă send()și puteți ridica excepții în contextul său folosind throw().
Python acceptă și generatoare imbricate. De exemplu, pentru a crea o matrice bidimensională, trebuie să plasați un generator de listă care este un șir în interiorul generatorului tuturor șirurilor:[[0 for j in range(m)] for i in range(n)]
Python 2.5 a introdus instrumente pentru gestionarea contextului de execuție al unui bloc de cod - instrucțiunea withși modulul contextlib. Vezi: exemplu .
Operatorul poate fi folosit în cazurile în care trebuie efectuate alte acțiuni înainte și după unele acțiuni, indiferent de excepțiile sau declarațiile aruncate în bloc return: fișierele trebuie să fie închise, resursele trebuie eliberate, redirecționarea standard de intrare a ieșirii s-a încheiat etc. Operatorul îmbunătățește lizibilitatea codului, ceea ce înseamnă că ajută la prevenirea erorilor.
Decoratorii de funcții sunt obiecte apelabile care iau o altă funcție ca argument. Decoratorii de funcții pot efectua operații asupra unei funcții și pot returna fie funcția în sine, fie o altă funcție care o înlocuiește, fie un obiect apelabil. Adică, dacă un decorator numit decorate a fost scris anterior în cod, atunci următorul cod este [101] :
@decorate def target (): print ( 'running target()' )este echivalent cu aceasta [101] :
def target (): print ( 'running target()' ) target = decorate ( target )Un exemplu de utilizare a decoratorului de funcții [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>Există decoratori de clasă [102] .
Formatul expresiei regulate este moștenit de la Perl cu unele diferențe. Pentru a le utiliza, trebuie să importați modulul re[103] , care face parte din biblioteca standard.
Biblioteca standard bogată este una dintre atracțiile lui Python. Există instrumente pentru lucrul cu multe protocoale de rețea și formate de Internet , de exemplu, module pentru scrierea serverelor și clienților HTTP , pentru analizarea și crearea mesajelor de e-mail, pentru lucrul cu XML etc. Un set de module pentru lucrul cu sistemul de operare vă permite pentru a scrie aplicații multiplatforme. Există module pentru lucrul cu expresii regulate , codificări de text , formate multimedia , protocoale criptografice , arhive, serializare a datelor , suport pentru testarea unitară etc.
Pe lângă biblioteca standard, există multe biblioteci care oferă o interfață pentru toate apelurile de sistem pe diferite platforme; în special, pe platforma Win32, sunt acceptate toate apelurile API Win32 , precum și apelurile COM în măsura nu mai puțin decât cea a Visual Basic sau Delphi . Numărul de biblioteci de aplicații pentru Python în diverse domenii este literalmente imens ( web , baze de date , procesare de imagini, procesare de text, metode numerice , aplicații ale sistemului de operare etc.).
Pentru Python, a fost adoptată specificația interfeței de programare a bazei de date DB-API 2 și au fost dezvoltate pachete corespunzătoare acestei specificații pentru accesarea diferitelor SGBD : Oracle , MySQL , PostgreSQL , Sybase , Firebird ( Interbase ), Informix , Microsoft SQL Server și SQLite . Pe platforma Windows , accesul la baza de date este posibil prin ADO ( ADOdb ). Pachetul comercial mxODBC pentru accesul DBMS prin ODBC pentru platformele Windows și UNIX a fost dezvoltat de eGenix [105] . Au fost scrise multe ORM -uri pentru Python ( SQLObject , SQLAlchemy , Dejavu, Django ), au fost implementate cadre software pentru dezvoltarea aplicațiilor web ( Django , Pylons , Pyramid ).
Biblioteca NumPy pentru lucrul cu matrice multidimensionale poate atinge uneori performanțe științifice comparabile cu pachetele specializate. SciPy folosește NumPy și oferă acces la o gamă largă de algoritmi matematici (algebră matriceală - BLAS nivelurile 1-3, LAPACK , FFT ...). Numarray [106] este special conceput pentru operațiuni cu volume mari de date științifice.
WSGI [107] este o interfață gateway cu un server web (Python Web Server Gateway Interface).
Python oferă un API C simplu și convenabil pentru scrierea propriilor module în C și C++ . Un instrument precum SWIG vă permite să obțineți aproape automat legături pentru utilizarea bibliotecilor C/C++ în codul Python. Capacitățile acestui instrument și ale altor instrumente variază de la generarea automată (C/C++/Fortran)-interfețe Python din fișiere speciale (SWIG, pyste [108] , SIP [109] , pyfort [110] ), până la furnizarea de API-uri mai convenabile (boost). :: python [111] [112] , CXX [113] , Pyhrol [114] , etc.). Instrumentul de bibliotecă standard ctypes permite programelor Python să acceseze direct biblioteci dinamice / DLL-uri scrise în C. Există module care vă permit să încorporați codul C/C++ direct în fișierele sursă Python prin crearea de extensii din mers (pyinline [115] , weave [116] ).
O altă abordare este de a încorpora interpretul Python în aplicații. Python este ușor de integrat în programele Java, C/C++, OCaml . Interacțiunea aplicațiilor Python cu alte sisteme este posibilă și folosind CORBA , XML-RPC , SOAP , COM.
Cu ajutorul proiectului Cython , este posibilă traducerea programelor scrise în limbajele Python și Pyrex în cod C cu compilare ulterioară în codul mașinii. Cython este folosit pentru a simplifica scrierea bibliotecilor Python, atunci când îl utilizați, se observă că codul este mai rapid și suprasarcina este redusă.
Proiectul experimental al lui Shedskin implică crearea unui compilator care să transforme programele Python implicit tastate în cod C++ optimizat. Din versiunea 0.22 Shedskin vă permite să compilați funcții individuale în module de extensie.
Python și marea majoritate a bibliotecilor sale sunt gratuite și vin în cod sursă. Mai mult, spre deosebire de multe sisteme deschise, licența nu restricționează în niciun fel utilizarea Python în dezvoltarea comercială și nu impune alte obligații decât indicarea drepturilor de autor.
Unul dintre canalele pentru distribuirea și actualizarea pachetelor pentru Python este PyPI ( Python Package Index ) .
Python vine cu o bibliotecă tkinter bazată pe Tcl / Tk pentru construirea de programe GUI multiplatformă .
Există extensii care vă permit să utilizați toate bibliotecile GUI majore - wxPython [117] , bazate pe biblioteca wxWidgets , PyGObject pentru GTK [118] , PyQt și PySide pentru Qt și altele. Unele dintre ele oferă, de asemenea, baze de date extinse, grafică și capabilități de rețea, profitând din plin de biblioteca pe care se bazează.
Pentru a crea jocuri și aplicații care necesită o interfață non-standard, puteți folosi biblioteca Pygame . De asemenea, oferă instrumente multimedia extinse : cu ajutorul său puteți controla sunetul și imaginile, puteți reda videoclipuri. Accelerația hardware grafică OpenGL oferită de pygame are o interfață de nivel mai înalt decât PyOpenGL [119] , care copiază semantica bibliotecii OpenGL C. Există, de asemenea, PyOgre [120] care oferă o legătură către Ogre , o bibliotecă de grafică 3D de nivel înalt orientată pe obiecte. În plus, există o bibliotecă pythonOCC [121] care oferă o legătură către mediul de modelare și simulare 3D OpenCascade [122] .
Pentru a lucra cu grafica raster , este utilizată Biblioteca de imagini Python .
PyCairo este folosit pentru a lucra cu grafică vectorială .
Există module care vă permit să controlați tipurile de parametri ai funcției în timpul rulării, de exemplu, typecheck [123] sau decoratorii de verificare a semnăturii metodei [124] . O declarație opțională de tip pentru parametrii funcției a fost adăugată în Python 3, interpretul nu verifică tipurile, ci doar adaugă informațiile corespunzătoare la metadatele funcției pentru utilizarea ulterioară a acestor informații de către modulele de extensie [125] .
Supraîncărcarea funcției este implementată de diverse biblioteci terțe, inclusiv PEAK [126] [127] . Planurile care nu au fost acceptate pentru suport pentru supraîncărcare în Python3000 [128] au fost parțial implementate în overloading-lib [129] .
Articolul Wikiversity „ Exemple de programe Python ” conține exemple de programe mici care demonstrează unele dintre caracteristicile limbajului Python și ale bibliotecii sale standard.
Bună lume! ' poate fi scris pe o singură linie:
imprimare ( "Bună ziua, lume!" )Calculul factorialului numărului 10 (10!):
def factorial ( n ): dacă n < 0 : ridică ArithmeticError ( 'Factorialul unui număr negativ.' ) f = 1 pentru i în interval ( 2 , n + 1 ): f *= i return f imprimare ( factorial ( 10 )) # 3628800Implementare cu recursivitate :
def factorial ( n ): if n < 0 : ridică ArithmeticError ( 'Factorialul unui număr negativ.' ) if ( n == 0 ) sau ( n == 1 ): return 1 else : returnează factorial ( n - 1 ) * n imprimare ( factorial ( 10 ))Biblioteca standard Python oferă un profiler (modul profile) care poate fi utilizat pentru a colecta statistici privind timpul de rulare a funcțiilor individuale. Pentru a decide ce versiune a codului rulează mai repede, puteți utiliza timeit. Măsurătorile din următorul program ne permit să aflăm care dintre opțiunile de concatenare a șirurilor este mai eficientă:
de la timeit import Timer tmp = „Python 3.2.2 (implicit, 12 iunie 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] pe win32.” def case1 (): # A. concatenări incrementale într-o buclă s = "" pentru i în interval ( 10000 ): s += tmp def case2 (): # B. printr-o listă intermediară și metoda de îmbinare s = [] pentru i în interval ( 10000 ): s . anexează ( tmp ) s = "" . alatura-te ( e ) def case3 (): # B. expresia listă și metoda join returnează "" . join ([ tmp for i in range ( 10000 )]) def case4 (): # D. expresia generator și metoda join returnează "" . join ( tmp for i in range ( 10000 )) pentru v în interval ( 1 , 5 ): print ( Timer ( "func()" , "din __main__ import case %s ca func" % v ) . timeit ( 200 ))Ca orice limbaj de programare, Python are propriile tehnici de optimizare a codului . Puteți optimiza codul pe baza diverselor criterii (deseori concurând între ele) (creșterea performanței, scăderea cantității de memorie RAM necesară, compactitatea codului sursă etc.). Cel mai adesea, programele sunt optimizate pentru timpul de execuție.
Există mai multe reguli care sunt evidente pentru programatorii experimentați.
Python are următoarele caracteristici și reguli de optimizare asociate.
Un instrument numit Pychecker [130] vă va ajuta să analizați codul sursă Python și să faceți recomandări despre problemele găsite (de exemplu, nume neutilizate, schimbarea semnăturii unei metode atunci când este supraîncărcată etc.). În cursul unei astfel de analize statice a codului sursă, pot fi detectate și erori. Pylint [131] își propune să rezolve probleme similare, dar tinde să verifice stilul codului, să găsească codul cu miros [132] .
Alegerea limbii depinde de obicei de sarcinile care trebuie rezolvate, de caracteristicile limbilor și de disponibilitatea bibliotecilor necesare pentru a rezolva problema. Aceeași sarcină scrisă în diferite limbi poate varia foarte mult în ceea ce privește eficiența execuției, inclusiv diferențele atunci când este executată pe sisteme de operare diferite sau când se utilizează compilatoare diferite. În general, limbile pot fi împărțite în interpretate (scripting), compilate într-o reprezentare intermediară și compilate, ceea ce afectează performanța și consumul de memorie. Python este de obicei denumit interpretat. De asemenea, limbile individuale pot avea propriile puncte forte, în cazul lui Python, iese în evidență ușurința în scrierea programelor [133] .
Python este comparat cu C++/Java în ceea ce privește concizia, simplitatea și flexibilitatea lui Python [134] . Se pot compara programele „ Bună ziua, lume ” scrise în fiecare dintre limbi [134] .
C++ [134] | Java [134] | Python [134] |
---|---|---|
#include <iostream> int main () { std :: cout << "Bună ziua, lume!" << std :: endl ; returnează 0 ; } | public class HelloClass { public static void main ( String [] args ) { System . afară . println ( "Bună ziua, lume!" ); } } | print ( "Bună ziua, lume!" ) |
În ceea ce privește OOP, în Python, spre deosebire de C++ și Java, nu există modificatori de acces la câmpurile și metodele de clasă, atributele și câmpurile obiectelor pot fi create din mers în timpul execuției programului, iar toate metodele sunt virtuale. În comparație cu Java, Python permite și supraîncărcarea operatorului, ceea ce face posibilă utilizarea expresiilor care sunt aproape de naturale [134] . Luate împreună, abordarea Python asupra OOP simplifică programarea, face codul mai ușor de înțeles și, în același timp, adaugă flexibilitate limbajului [134] . Pe de altă parte, codul Python (precum și alte limbaje interpretate) este mult mai lent decât codul C++ echivalent [135] și, în general, este de așteptat să fie mai lent decât Java [136] . Codul C++ este mai productiv decât Python, în timp ce ocupă mai multe linii. Conform cercetărilor privind algoritmii utilizați în bioinformatică , Python s-a dovedit a fi mai flexibil decât C++, iar Java s-a dovedit a fi un compromis între performanța lui C++ și flexibilitatea lui Python [133] .
În Java și Python, toate obiectele sunt create pe heap , în timp ce C++ permite crearea obiectelor atât pe heap, cât și pe stivă , în funcție de sintaxa utilizată [137] . Performanța este afectată și de modul în care sunt accesate datele din memorie. În C++ și Java, datele sunt accesate la offset-uri constante în memorie, în timp ce în Python este prin tabele hash . Utilizarea pointerilor în C++ poate fi destul de dificil de înțeles de către începători și poate dura ceva timp pentru a stăpâni utilizarea corectă a pointerilor [133] .
Go și Python sunt limbi drastic diferite, cu toate acestea, ele sunt adesea comparate între ele datorită nișei lor comune - backend-ul aplicațiilor web. După cum spune Jason Kincaid, Go combină „performanța și securitatea limbajelor compilate, cum ar fi C++, cu viteza de dezvoltare în limbaje dinamice precum Python” [138] . Într-o oarecare măsură, acest lucru este adevărat: Go a fost conceput inițial ca un limbaj compilat puternic tipizat static, care acceptă caracteristicile maxime ale limbajelor dinamice, în care este încă posibil să se asigure o compilare eficientă și să mențină performanța programelor compilate. Comun ambelor limbi este utilizarea managementului automat al memoriei, prezența colecțiilor dinamice încorporate (matrice și dicționare), suport pentru felii, un mecanism de modul dezvoltat și o sintaxă simplă și minimalistă. Există mult mai multe diferențe și nu este întotdeauna posibil să indicați clar în favoarea căror limbi vorbesc.
posibilități dinamice. Dacă Python este un limbaj complet dinamic și aproape orice elemente ale programului se pot schimba în timpul execuției, inclusiv construirea de noi tipuri din mers și modificarea celor existente, atunci Go este un limbaj static cu capacități de reflectare destul de limitate care funcționează numai în ceea ce privește tipurile de date. create în timpul dezvoltării. Într-o oarecare măsură, un înlocuitor pentru capabilitățile dinamice în Go este generarea de cod, oferită de simplitatea sintaxei și disponibilitatea instrumentelor și bibliotecilor de sistem necesare. De asemenea, este planificată adăugarea de suport pentru generice în Go 2.0. Programare orientată pe obiecte. Python este construit pe ideologia „totul-obiect” și are multe mecanisme OOP, inclusiv cele rare și atipice. Go este un limbaj de programare procedural modular obișnuit, în care caracteristicile OOP sunt limitate la suportarea interfețelor și capacitatea de a încorpora structuri și interfețe. De fapt, Go nu are nici măcar moștenire cu drepturi depline. Prin urmare, dacă Python încurajează programarea în stilul OOP, cu construirea de dependențe de tip arbore între clase și utilizarea activă a moștenirii, atunci Go se concentrează pe abordarea componentelor: comportamentul componentelor este stabilit de interfețe, care poate nici măcar nu să fie legate între ele, iar implementarea interfețelor este plasată în struct types . „Tastarea de rață” implementată în Go duce la faptul că nu există nici măcar legături sintactice formale între interfețe și structurile care le implementează. Programare în paralel. În sprijinul programării paralele, Python este semnificativ inferior Go. În primul rând, GIL-ul în Python este un obstacol în calea utilizării eficiente a sistemelor cu un număr mare (zeci sau mai multe) de nuclee de procesor fizic. O altă problemă este lipsa mijloacelor integrate eficiente de interacțiune între firele paralele. Go include o primitivă de limbaj goroutine care vă permite să creați fire de execuție „ușoare” și conducte suportate de sintaxă care permit firelor de execuție să comunice. Ca urmare, atunci când se creează, de exemplu, sisteme de așteptare în Go, nu este o problemă să folosești sute sau chiar mii de fire existente simultan, în plus, cu încărcarea normală a oricărui număr de nuclee de procesor disponibile, în timp ce niciunul dintre cele existente. Implementările Python vor asigura funcționarea eficientă a unui astfel de număr de fire. Gestionarea erorilor, excepții. Python acceptă gestionarea excepțiilor, în timp ce Go implementează mecanisme pentru returnarea explicită a codurilor de eroare din funcții și gestionarea acestora la site-ul de apel. Această diferență poate fi evaluată în moduri diferite. Pe de o parte, excepțiile sunt un mecanism convenabil și familiar pentru gestionarea erorilor de program, permițându-vă să concentrați această procesare în fragmentele de cod selectate și să nu o „mânjiți” în textul programului. Pe de altă parte, autorii lui Go consideră că prea des programatorii ignoră gestionarea erorilor, bazându-se pe excepția aruncată pentru a fi tratată în altă parte; în aplicațiile distribuite, excepțiile nu sunt adesea trecute între componentele sistemului și duc la eșecuri neașteptate, iar în aplicațiile cu mai multe fire, o excepție netratată într-un fir poate duce la blocare sau, dimpotrivă, la blocarea programului. Posibilități vizuale, sintaxă. Python oferă mai multe caracteristici de limbaj și primitive care sunt convenabile pentru o dezvoltare rapidă decât Go. Acest lucru se datorează în mare parte faptului că dezvoltatorii Go au refuzat în mod deliberat să includă unele caracteristici „la modă” în limbaj, dintre care unele erau considerate provocând erori, altele maschând o implementare intenționat ineficientă. De exemplu, prezența în limbaj a unei operații simple de inserare a unui element în mijlocul unui tablou provoacă utilizarea frecventă a acestuia, iar fiecare astfel de operație necesită, cel puțin, mutarea „cozii” matricei în memorie și, uneori, poate necesita alocarea memoriei și mutarea întregii matrice. Performanţă. În ceea ce privește performanța în majoritatea testelor care implementează seturi tipice de operațiuni backend (procesarea interogărilor, generarea paginilor web), Go depășește Python de câteva ori până la câteva ordine de mărime. Acest lucru nu este surprinzător, având în vedere natura statică a limbajului și faptul că programele Go sunt compilate direct în codul platformei țintă. În sistemele în care cea mai mare parte a timpului petrecut este executarea de interogări de baze de date sau transferul de informații prin rețea, acest lucru nu este esențial, dar în sistemele foarte încărcate care procesează un număr mare de solicitări, avantajul Go este incontestabil. De asemenea, diferențele de performanță ale programelor Go și Python sunt afectate de diferențele de implementare a paralelismului menționate mai sus.Ambele limbi sunt interpretate, compilate într-o reprezentare intermediară, care este apoi trimisă pentru execuție. În cazul lui Python, este generat un bytecode intermediar, în timp ce compilatorul Perl generează un arbore de sintaxă. Gestionarea memoriei în ambele limbi este automată, iar limbile însele sunt folosite ca limbaje de scripting și sunt potrivite pentru scrierea aplicațiilor web. Abordarea de codare Python implică o mai bună înțelegere a listei de programe în detrimentul performanței, în timp ce Perl are mai multă libertate în sintaxă, ceea ce poate face programele Perl să nu fie citite pentru programatorii non-Perl [133] .
Lua este un limbaj simplu conceput inițial pentru a fi încorporat în software și utilizat pentru a automatiza operațiuni complexe (cum ar fi comportamentul roboților în jocurile pe calculator). Python poate fi folosit și în aceste domenii, concurând și cu Lua în scrierea de scripturi pentru automatizarea managementului computerului și a sistemului de operare și în autoprogramarea non-profesională. În ultimii ani, ambele limbi au fost încorporate în dispozitivele mobile, cum ar fi calculatoarele programabile.
Ambele limbi sunt dinamice, interpretate, suportă gestionarea automată a memoriei și au mijloace standard de interacțiune cu software-ul scris în alte limbi (în principal C și C++). Timpul de rulare Lua este mai compact și necesită mai puține resurse pentru a rula decât Python, ceea ce îi oferă lui Lua un avantaj la încorporare. La fel ca Python, Lua acceptă compilarea codului sursă în bytecode executabil de mașină virtuală. Există o implementare a compilatorului JIT pentru Lua.
Lua este mai simplu decât Python și are o sintaxă mai clasică asemănătoare Pascalului. Există doar opt tipuri de date încorporate în limbaj și toate tipurile structurate (structuri, enumerații, matrice, seturi) sunt modelate pe baza unui singur tip de tabel încorporat, care este de fapt un dicționar eterogen. OOP este implementat pe tabele și se bazează pe un model prototip, ca în JavaScript. Python oferă mai multe opțiuni, iar tipurile sale de date structurate au fiecare implementare proprie, ceea ce îmbunătățește performanța. Capacitățile OOP din Python sunt mult mai largi, ceea ce oferă un avantaj atunci când scrieți programe complexe, dar are un efect redus asupra calității și performanței scripturilor simple pe care se concentrează Lua.
Python, MATLAB și R sunt utilizate în procesarea datelor și în predarea elevilor a elementelor de bază ale matematicii și statisticii. R este un limbaj pentru efectuarea de calcule statistice, în timp ce MATLAB poate fi considerat un limbaj de programare împreună cu Python [139] .
Python, ca limbaj de programare foarte popular, a influențat următoarele limbaje:
Pythonul clasic are un dezavantaj comun cu multe alte limbaje interpretate - viteza relativ lentă de execuție a programelor [147] . Într-o oarecare măsură, situația este îmbunătățită prin salvarea bytecode -ului (extensiile .pycși, înainte de versiunea 3.5, .pyo), care permite interpretului să nu petreacă timp analizând textul modulelor la fiecare pornire.
Există implementări ale limbajului Python care introduc mașini virtuale (VM) de înaltă performanță ca backend al compilatorului. Exemple de astfel de implementări sunt PyPy , care se bazează pe RPython; o iniţiativă anterioară este proiectul Parrot . Este de așteptat ca utilizarea mașinilor virtuale de tip LLVM să conducă la aceleași rezultate ca și utilizarea unor abordări similare pentru implementările limbajului Java, unde performanța computațională slabă este în mare măsură depășită [148] . Cu toate acestea, nu trebuie să uităm că natura dinamică a lui Python face inevitabil ca în timpul execuției programului să fie suportate cheltuieli suplimentare, ceea ce limitează performanța sistemelor Python, indiferent de tehnologiile utilizate. Drept urmare, limbaje de nivel scăzut sunt folosite pentru a scrie secțiuni critice de cod, integrarea cu care este asigurată de multe programe și biblioteci (vezi mai sus).
În cea mai populară implementare a limbajului Python, interpretul este destul de mare și consumă mai multe resurse decât în implementările populare similare ale Tcl , Forth , LISP sau Lua , ceea ce limitează utilizarea sa în sistemele încorporate. Cu toate acestea, Python a fost portat pe unele platforme de performanță relativ scăzută. .
Interpretul Python din CPython (precum și Stackless și PyPy [149] ) utilizează date nesigure pentru fire, pentru a evita distrugerea cărora, atunci când sunt modificate în comun din diferite fire, se aplică o blocare globală a interpretului - GIL (Global Interpreter Lock) [150 ] : în timpul execuției codului, un fir de execuție Interpretul blochează GIL-ul, execută pentru o perioadă fixă de timp (implicit 5 milisecunde [K 2] ) un număr de instrucțiuni, apoi eliberează blocarea și se întrerupe pentru a permite rularea altor fire. GIL este, de asemenea, eliberat în timpul I/O, schimbând și verificând starea primitivelor de sincronizare, la executarea codului de extensie care nu accesează datele interpretului, cum ar fi NumPy / SciPy . Astfel, un singur fir de cod Python poate rula într-un singur proces de interpret Python la un moment dat, indiferent de numărul de nuclee de procesor disponibile.
Penalizarea de performanță din GIL depinde de natura programelor și de arhitectura sistemului. Majoritatea programelor sunt cu un singur thread sau rulează doar câteva fire, dintre care unele sunt inactive la un moment dat. Calculatoarele personale au de obicei un număr mic de nuclee de procesor, care sunt încărcate de procese care rulează în paralel în sistem, astfel încât pierderea reală de performanță pe computerele personale din cauza GIL este mică. Dar în aplicațiile server, poate fi convenabil să folosiți zeci și sute (sau chiar mai multe) de fire paralele (de exemplu, în sistemele de așteptare, în care fiecare fir procesează date pentru o cerere separată de utilizator) și servere la sfârșitul anilor 2010. au adesea zeci și chiar sute de nuclee de procesor, adică pot asigura din punct de vedere tehnic aceste fire de execuție fizică simultană; în astfel de condiții, GIL poate duce la o scădere cu adevărat semnificativă a performanței generale, deoarece privează programul de capacitatea de a utiliza pe deplin resursele sistemelor multi-core.
Guido van Rossum a spus că GIL „nu este atât de rău” și va fi în CPython până când „altcineva” vine cu o implementare non-GIL Python care face scripturi cu un singur thread la fel de rapide [153] [154] .
Sarcinile de dezvoltare includ munca privind optimizarea GIL [155] . Nu există planuri de depreciere a GIL în viitorul apropiat, deoarece mecanismele alternative pentru aplicațiile cu un singur thread, care sunt majoritatea, sunt mai lente sau consumă mai multe resurse:
O soluție radicală la problemă ar putea fi trecerea la Jython și IronPython care rulează pe mașini virtuale Java și .NET/Mono: aceste implementări nu folosesc deloc GIL.
În timp ce unul dintre principiile de proiectare declarate de Python este principiul celei mai mici surprize , criticii indică o serie de alegeri arhitecturale care pot fi confuze sau derutante pentru programatorii folosiți în alte limbaje principale [162] . Printre ei:
În comparație cu Ruby și cu alte limbi, Python nu are capacitatea de a modifica clasele încorporate ca int, str, float, listaltele, ceea ce îi permite totuși lui Python să consume mai puțină RAM și să ruleze mai rapid. Un alt motiv pentru introducerea unei astfel de restricții este necesitatea coordonării cu modulele de extensie. Multe module (pentru a optimiza performanța) convertesc tipurile elementare Python în tipurile C corespunzătoare, în loc să le manipuleze prin API-ul C. De asemenea, elimină multe capcane potențiale din anularea dinamică necontrolată a tipurilor încorporate.
CPython este principala implementare a limbajului. Este scris în C și este portabil pe platforme. Baza managementului memoriei este utilizarea unei combinații de contoare de referință și a unui colector de gunoi responsabil cu găsirea captărilor ciclice de referință [42] . Deși limbajul este considerat interpretat, este de fapt compilat într-un bytecode intermediar de nivel înalt [166] [167] , care este apoi executat printr-o mașină virtuală stivă [42] . De exemplu, un apel de funcție print()poate fi reprezentat ca [167] :
1 0 LOAD_NAME 0 ( print ) 2 LOAD_CONST 0 ( ' Bună lume ! ' ) 4 CALL_FUNCTION 1 6 RETURN_VALUENumele din limbă sunt întârziate, ceea ce înseamnă că puteți scrie apeluri la variabile, metode și atribute care nu există încă, dar care trebuie declarate în momentul execuției codului care le folosește. Fiecare obiect din Python are un dicționar de tabel hash, prin care numele atributelor sunt comparate cu valorile lor. Variabilele globale sunt, de asemenea, mapate printr-un dicționar. Un singur apel la o metodă sau un atribut poate fi urmat de o căutare alternativă în mai multe dicționare [42] .
PyPy este o implementare Python scrisă în RPython (un subset de Python cu capabilități mult mai puțin dinamice). Vă permite să testați cu ușurință funcții noi. PyPy, pe lângă CPython standard, include caracteristicile Stackless, Psyco , modificarea AST din mers și multe altele. Proiectul integrează capacitățile de analiză a codului Python și traducere în alte limbi și bytecoduri ale mașinilor virtuale ( C , LLVM , Javascript , .NET începând cu versiunea 0.9.9). Începând de la 0.9.0, este posibilă traducerea completă automată a RPython în C, rezultând o viteză acceptabilă pentru utilizare (de 2-3 ori mai mică decât CPython cu JIT dezactivat pentru versiunea 0.9.9). În mod implicit, PyPy vine cu un compilator JIT încorporat, cu care poate rula mult mai rapid decât CPython.
Jython este o implementare Python care compilează codul Python în bytecode Java care poate fi executat de JVM . Poate fi folosit și pentru a importa o clasă al cărei cod sursă a fost scris în Java ca modul pentru Python [168] .
Există și alte implementări.
Au fost create mai multe subseturi specializate ale limbajului pe baza Python, destinate în principal pentru compilarea statică în codul mașină. Unele dintre ele sunt enumerate mai jos.
La fel ca Lisp și Prolog , Python poate fi folosit interactiv, în care instrucțiunile tastate de la tastatură sunt imediat executate și rezultatul este afișat pe ecran ( REPL ). Acest mod este convenabil atât atunci când învățați o limbă, cât și în timpul procesului de dezvoltare profesională - pentru testarea rapidă a fragmentelor de cod individuale - deoarece oferă feedback imediat. De asemenea, vă permite să utilizați interpretul ca un calculator cu un set mare de funcții.
Aproape toate IDE-urile Python acceptă REPL pentru testare rapidă.
Există mai multe IDE-uri specializate pentru dezvoltarea Python.
În plus, există plug-in-uri pentru a sprijini programarea Python pentru IDE-urile universale Eclipse , KDevelop și Microsoft Visual Studio , precum și suport pentru evidențierea sintaxei, completarea codului și instrumente de depanare și lansare pentru o serie de editoare de text obișnuite.
Python este un limbaj stabil și răspândit. Este folosit în multe proiecte și în diferite capacități: ca limbaj principal de programare sau pentru crearea de extensii și integrarea aplicațiilor. Un număr mare de proiecte au fost implementate în Python și este, de asemenea, utilizat în mod activ pentru a crea prototipuri pentru programele viitoare.
Python este un limbaj ușor de învățat și este adesea predat ca primă limbă [27] , inclusiv atunci când îi învață pe copii cum să programeze [185] . Ca primă limbă, este foarte potrivită deoarece programele din el sunt apropiate de limbajul natural în care oamenii sunt obișnuiți să gândească și este necesar un număr minim de cuvinte cheie pentru a scrie un program corect. În alte limbaje, cum ar fi C++ , există un număr mare de sintaxe și elemente de limbaj diferite cărora trebuie să le acordați atenție în loc să studiați algoritmi [134] .
Ca aplicație open source, interpretul Python este folosit în întreaga lume și este livrat cu sisteme de operare bazate pe Linux și computere Apple . Python este popular printre dezvoltatorii individuali, dar este folosit și de companiile mari în produse destul de serioase, orientate spre profit [186] . Reddit [46] este scris în Python . Dropbox are , de asemenea, o utilizare puternică a Python și, din cauza complexității tastării dinamice și a cantității mari de cod, compania a trecut la tastarea statică cu proiectul open source Mypy [187] .Python este, de asemenea, foarte utilizat pe Facebook [188] ] și Instagram [189] . Multe companii folosesc Python pentru testarea hardware-ului, aceste companii includ Intel , Cisco , Hewlett-Packard și IBM . Industrial Light & Magic și Pixar îl folosesc în filmele lor animate [186] .
Limbajul este foarte folosit de Google în motorul său de căutare, iar Youtube este scris în mare măsură folosind Python [186] [190] . În plus, Google a sponsorizat dezvoltarea Python din 2010 [191] [192] , și suportul PyPI , principalul sistem de distribuție a pachetelor pentru Python [191] [193] .
Punctele forte ale Python sunt modularitatea și capacitatea de a se integra cu alte limbaje de programare, inclusiv ca parte a aplicațiilor și sistemelor complexe complexe [194] . Combinația dintre simplitate și concizie cu un număr mare de caracteristici face din Python un limbaj de scripting convenabil. . Multe proiecte oferă un API Python pentru scripting, cum ar fi mediile de modelare 3D Autodesk Maya [186] , Blender [195] și Houdini [196] și sistemul gratuit de informații geografice QGIS [197] . Unele proiecte implementează partea de bază în limbaje de programare mai productive și oferă un API cu drepturi depline în Python pentru a simplifica munca. . Astfel, motorul editorului video gratuit OpenShot este implementat sub forma bibliotecii libopenshot , scrisă în C++ folosind biblioteci C, iar toate posibilitățile sunt acoperite integral de API-ul Python [198][ semnificația faptului? ] . Agenția de Securitate Națională a SUA folosește Python pentru analiza datelor, iar NASA îl folosește în scopuri științifice [186] . Dintre instrumentele folosite la NASA, se remarcă simulatorul de rețea grafică gratuit GNS3 , care și-a dovedit a fi și într-un mediu corporativ și este folosit în companiile de tehnologie, de exemplu, la Intel [199] . Cura [200] [201] este, de asemenea, scris în Python, un program gratuit și popular pentru tăierea modelelor 3D pentru imprimare pe imprimante 3D .
Python, cu pachetele NumPy , SciPy și MatPlotLib , este utilizat în mod activ ca mediu de calcul științific de uz general ca înlocuitor pentru pachetele comerciale specializate comune, cum ar fi Matlab , oferind funcționalități similare și un prag de intrare mai scăzut [202] . În cea mai mare parte, programul grafic Veusz este scris și în Python.[203] , care vă permite să creați grafică de înaltă calitate gata pentru publicare în publicații științifice [204][ semnificația faptului? ] . Biblioteca Astropy este un instrument popular pentru calcule astronomice [205][ semnificația faptului? ] .
De asemenea, Python este potrivit pentru efectuarea de sarcini non-standard sau complexe în sistemele de construire a proiectelor , ceea ce se datorează lipsei necesității de a pre-compila fișierele sursă. Proiectul Google Test îl folosește pentru a genera cod sursă simulat pentru clasele C++ [206][ semnificația faptului? ] .
Interpretul Python poate fi folosit ca un puternic shell și limbaj de scripting pentru scrierea fișierelor batch OS. Ușurința de acces de la scripturile Python la programe externe și disponibilitatea bibliotecilor care oferă acces la managementul sistemului fac din Python un instrument convenabil pentru administrarea sistemului [207] . Este utilizat pe scară largă în acest scop pe platforma Linux: Python vine de obicei cu sistemul, în multe distribuții instalatorii și interfața vizuală a utilităților de sistem sunt scrise în Python. De asemenea, este utilizat în administrarea altor sisteme Unix, în special Solaris și macOS [207] . Natura inter- platformă a limbajului în sine și a bibliotecilor îl face atractiv pentru automatizarea unificată a sarcinilor de administrare a sistemului în medii eterogene în care computerele cu diferite tipuri de sisteme de operare sunt utilizate împreună.
Fiind un limbaj de uz general, Python este aplicabil în aproape toate domeniile de activitate. De fapt, Python este folosit de aproape fiecare companie de renume într-un fel sau altul, atât pentru sarcinile de zi cu zi, cât și în testare, administrare sau dezvoltare de software [186] .
Piton | |
---|---|
Comunitate | |
Implementări | |
Alte |
|
Limbaje de programare | |
---|---|
|
Site-uri tematice | ||||
---|---|---|---|---|
Dicționare și enciclopedii | ||||
|