Piton

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] .

Istorie

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] .

Concept și filozofie

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 Perlexistă 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] .

Portabilitate

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 .

Tipuri și structuri de date

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.

Tipuri utilizate în Python
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)

Sintaxă și semantică

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 ] .

Operatori

Setul de operatori este destul de tradițional.

Sistem de indentare

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.)

Expresii

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 , lume

Python 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 )) # generator

Pentru 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.

Nume

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.

Docstrings

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

Paradigma de programare

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.

Programare orientată pe obiecte

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:

  • Metode speciale care controlează ciclul de viață al unui obiect: constructori, destructori.
  • Supraîncărcarea operatorului (toate cu excepția is, '.', '='celor logice simbolice).
  • Proprietăți (simulare câmp folosind funcții).
  • Controlul accesului la câmp (emulare de câmpuri și metode, acces parțial etc.).
  • Metode de gestionare a celor mai frecvente operațiuni (valoare de adevăr, len(), copiere profundă, serializare , iterație obiect, ...).
  • Introspecție completă .
  • Clasă și metode statice, câmpuri de clasă.
  • Clase imbricate în funcții și clase.
  • Abilitatea de a modifica obiecte în timpul execuției programului.

Programare generică

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] .

Programare funcțională

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] :

  • funcția este un obiect de primă clasă,
  • funcții de ordin superior,
  • recursivitate,
  • concentrați-vă pe lucrul cu liste ,
  • analog al închiderilor ,
  • aplicarea parțială a unei funcții folosind metoda partial(),
  • posibilitatea implementării altor mijloace în limba însăși (de exemplu, currying ).

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] .

Metaprogramare

Python acceptă metaprogramarea [98] [31] .

Caracteristici

Module și pachete

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().

Introspecție

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 ) 24

Gestionarea excepțiilor

Gestionarea 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 bloc

Partajarea 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).

Iteratori

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.

Generatoare

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 ) 2500

Acest 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)]

Managementul contextului de execuție

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.

Decoratori

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] .

Expresii regulate

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.

Biblioteci

Bibliotecă 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.

Module de extensie și interfețe de programare

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 ) . 

Biblioteci grafice

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ă .

Verificarea tipului și supraîncărcarea funcției

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] .

Exemple de programe

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 )) # 3628800

Implementare 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 ))

Profilarea și optimizarea codului

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.

  • Nu este nevoie să optimizați programul dacă viteza de execuție a acestuia este suficientă.
  • Algoritmul utilizat are o anumită complexitate în timp , așa că înainte de a optimiza codul programului, ar trebui să revizuiți mai întâi algoritmul.
  • Merită să folosiți funcții și module gata făcute și depanate, chiar dacă acest lucru necesită puțină prelucrare a datelor. De exemplu, Python are o funcție încorporată sorted().
  • Profilarea vă va ajuta să găsiți blocaje. Optimizarea ar trebui să înceapă cu ele.

Python are următoarele caracteristici și reguli de optimizare asociate.

  • Apelarea funcțiilor este o operațiune destul de costisitoare, așa că ar trebui să încercați să evitați apelarea funcțiilor în bucle imbricate sau, de exemplu, să mutați bucla în funcții. O funcție care procesează o secvență este mai eficientă decât procesarea aceleiași secvențe într-o buclă cu un apel de funcție.
  • Încercați să scoateți totul din bucla profund imbricată care poate fi calculată în buclele exterioare. Accesul la variabile locale este mai rapid decât accesul global sau pe teren.
  • Optimizatorul psyco poate ajuta la accelerarea execuției unui modul de program, cu condiția ca modulul să nu folosească proprietățile dinamice ale limbajului Python.
  • Dacă modulul realizează o prelucrare masivă a datelor și optimizarea algoritmului și codul nu ajută, puteți rescrie secțiunile critice , de exemplu, în C sau Pyrex.

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] .

Comparație cu alte limbi

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] .

C++ și Java

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] .

Comparație de programe „Bună, lume!”
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] .

Du -te

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.

Perl

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] .

PHP

Lua

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.

MATLAB și R

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] .

Limbi influențate de Python

Python, ca limbaj de programare foarte popular, a influențat următoarele limbaje:

  • CoffeeScript are o sintaxă inspirată de Python [140] .
  • ECMAScript / JavaScript au împrumutat iteratoare și generatoare de la Python [141] .
  • Go , cu cele mai puternice diferențe ideologice, împrumutate din limbaje dinamice precum Python, dicționare încorporate, matrice dinamice, felii.
  • Groovy a fost creat cu motivația de a aduce filosofia lui Python în Java [142] .
  • Julia a fost menită să fie „la fel de bună pentru programarea generală ca Python” [143] .
  • Nim folosește un sistem de indentare și o sintaxă similară [144] .
  • Ruby  - Yukihiro Matsumoto , creatorul limbajului, a spus: „Mi-am dorit un limbaj de scripting care să fie mai puternic decât Perl și mai orientat pe obiecte decât Python. De aceea am decis să-mi creez propriul limbaj” [145] .
  • Swift a preluat idei despre structura limbajului din Python în timpul dezvoltării, precum și din Objective-C , Rust , Haskell , Ruby , C# , CLU [146] .

Critica

Performanță lentă

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ă. .

Global Interpreter Lock (GIL)

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:

  • Varianta interpretului cu acces sincronizat la obiecte individuale în locul blocării globale [156] s-a dovedit a fi prea lentă din cauza achizițiilor/eliberărilor frecvente de blocări.
  • python-safethread - CPython fără GIL [157] , conform autorilor, oferă viteze de ordinul 60-65% din viteza CPython pe aplicațiile cu un singur thread.
  • Implementarea firelor de execuție prin procesele OS, de exemplu, modulul de procesare [158] (redenumit în multiprocesare începând cu versiunea 2.6). Pe sistemele de tip UNIX, suprasarcina de generare a procesului este mică, dar pe Windows, utilizarea proceselor în loc de fire duce la o creștere semnificativă a consumului de RAM.
  • Evitați partajarea datelor modificabile și apelurile către cod extern. În acest caz, datele sunt duplicate în fire și sincronizarea lor (dacă există) revine programatorului [159] . Această abordare crește și consumul de memorie RAM, deși nu la fel de mult ca atunci când se utilizează procese în Windows.
  • Biblioteci care oferă suport nativ pentru fire, cum ar fi parallelpython [160] , pympi [161] și altele.

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.

Sintaxă și semantică

Î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:

  • Diferența în principiul operatorului de atribuire în comparație cu limbile tipizate static. În Python, atribuirea unei valori copiază referința la obiect, nu valoarea. Când lucrați cu tipuri simple imuabile, se pare că valoarea unei variabile se schimbă atunci când i se atribuie o valoare, dar de fapt i se atribuie o referință la o altă valoare, de exemplu, creșterea valorii unei variabile intde tip cu 1 schimbă referința , în loc să crească valoarea prin referință. Cu toate acestea, atunci când lucrați cu tipuri mutabile, conținutul acestora poate fi modificat prin referință, așa că atunci când atribuiți unei variabile o referință unei alte și apoi modificați valoarea uneia dintre cele două variabile, aceasta se va modifica în ambele variabile, ceea ce este clar vizibil atunci când lucrul cu liste [162] [163] . În același timp, deși tuplurile sunt imuabile, ele pot stoca referințe la obiecte mutabile, deci de fapt tuplurile pot fi și modificate [164] ;
  • Diferența de comportament pe unele tipuri de operatori „comandă rapidă”, cum ar fi +=notația lor extinsă, deși în majoritatea limbilor „scurtătura” este doar o notație scurtă a celei complete și sunt exact echivalente din punct de vedere semantic. Exemplu folosind x +=:>>> x = [ 1 , 2 ] >>> y = x >>> x += [ 3 , 4 ] >>> x [ 1 , 2 , 3 , 4 ] >>> y [ 1 , 2 , 3 , 4 ] Exemplu similar folosind x = x +:>>> x = [ 1 , 2 ] >>> y = x >>> x = x + [ 3 , 4 ] >>> x [ 1 , 2 , 3 , 4 ] >>> y [ 1 , 2 ]
  • Un tratament rigid al domeniului lexical, similar cu cel folosit în JavaScript: chiar dacă o variabilă își primește valoarea pe ultima linie a unei funcții, domeniul de aplicare este întreaga funcție.
  • Confuzie între câmpurile de clasă și câmpurile de obiect: valoarea curentă a unui câmp de clasă inițializează câmpul obiect cu același nume, dar nu atunci când obiectul este creat, ci atunci când valoarea este scrisă pentru prima dată în acest câmp.clasa Colorate : culoare = "rosu" obj1 = Colored () print ( obj1 . color ) # imprimă valoarea originală a câmpului Colored CLASS . color = "verde" # schimba câmpul CLASS print ( obj1 . color ) # imprimă valoarea câmpului CLASS obj1 . color = "albastru" # câmpul OBJECT este schimbat și valoarea lui este fixată la Colored . culoare = "galben" # schimba câmpul CLASS, care nu se va mai reflecta în imprimarea obiectului ( obj1 . color ) # este afișat câmpul OBJECT # Scriptul va afișa: roșu verde albastru
În exemplul de mai sus, câmpul de culoare al obiectului obj1 al clasei Colored este afișat de trei ori. În acest caz, până când se realizează o înregistrare în acest câmp, este afișată valoarea curentă a câmpului de clasă , iar pentru a treia oară, valoarea câmpului obiect. O astfel de păstrare a conexiunii dintre câmpul obiectului și clasă până la prima rescrire poate provoca un efect neașteptat: dacă valoarea câmpului de clasă se modifică în program, atunci toate obiectele ale căror câmpuri cu același nume nu au fost încă suprascrise. vor fi implicit modificate.
  • Intuitiv dificil de prezis comportamentul parametrilor cu un obiect-valoare implicit. Dacă specificați un constructor de obiect ca inițializator pentru parametrul implicit, aceasta va duce la crearea unui obiect static, referința la care va fi transmisă implicit la fiecare apel către [165] . Acest lucru poate duce la erori subtile.

Imposibilitatea de a modifica clasele încorporate

Î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.

Implementări

CPython

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_VALUE

Numele 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

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

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] .

Alte implementări

Există și alte implementări.

  • Numba  - compilator Jit bazat pe LLVM cu suport NumPy.
  • PyS60 [169]  este o implementare a limbajului pentru smartphone-urile Nokia bazată pe platforma Series 60 .
  • IronPython  - Python pentru .NET Framework și Mono . Compilează programe Python în MSIL , oferind astfel integrare completă cu sistemul .NET [170] .
  • Stackless  este, de asemenea, o implementare C a lui Python. Aceasta nu este o implementare cu drepturi depline, ci patch-uri pentru CPython. Oferă programare avansată cu mai multe fire și o adâncime semnificativ mai mare a recursiunii .
  • Python pentru .NET [171]  este o altă implementare a Python pentru .NET. Spre deosebire de IronPython, această implementare nu compilează codul Python în MSIL, ci oferă doar un interpret scris în C# . Vă permite să utilizați ansambluri .NET din codul Python.
  • Jython  este o implementare Python care folosește JVM ca mediu de execuție. Permite utilizarea transparentă a bibliotecilor Java .
  • python-safethread [157] este o versiune non- GIL  a CPython care permite firelor Python să ruleze simultan pe toate procesoarele disponibile. Au mai fost făcute și alte modificări.
  • Unladen Swallow  este un proiect inițiat de Google pentru a dezvolta un compilator JIT bazat pe LLVM , foarte eficient, compatibil cu CPython . Conform planurilor de dezvoltare pentru Python [172] , sa planificat portarea codului sursă al Unladen Swallow la CPython în versiunea 3.3. Dar PEP-3146 a fost anulat din cauza lipsei de interes pentru Unladen Swallow de la Google, principalul sponsor al dezvoltării [173] .
  • tinypy [174]  este o versiune minimalistă a Python. Unele caracteristici CPython nu sunt implementate.
  • MicroPython  este o implementare Python 3 pentru sisteme încorporate cu memorie redusă [175] .
  • Brython [176]  este o implementare a limbajului JavaScript la nivelul clientului care permite scripturile browserului să fie scrise în Python 3.
  • QPython [177]  este o implementare Python pentru Android. Proiectul este încă în stadiu de testare, dar unele dintre cele mai necesare biblioteci au fost deja portate în qpython. Vă permite să lucrați în modul interactiv. Există și Qpython3.
  • Grumpy [178]  este o implementare a Python on Go (în dezvoltare activă) care permite codului Python să ruleze fără o mașină virtuală: compilați codul Python în codul Go și apoi obțineți un fișier executabil.

Subseturi/extensii specializate ale lui Python

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.

  • RPython [179] este o implementare extrem de limitată a Python creată de  proiectul PyPy fără dinamism de rulare și alte caracteristici. Codul RPython poate fi compilat în multe alte limbi/platforme - C, JavaScript, Lisp, .NET [180] , LLVM . Interpretul PyPy este scris în RPython.
  • Pyrex [181]  este o implementare limitată a lui Python, dar oarecum mai mică decât RPython. Pyrex este extins cu capacități de tastare statică cu tipuri din limbajul C și vă permite să amestecați liber codul tastat și cel neînregistrat. Proiectat pentru scrierea modulelor de extensie, compilate în cod C.
  • Cython [182]  este o versiune extinsă a Pyrex.
  • Proiectul Shedskin  este conceput pentru a compila codul Python implicit tip static în cod C++ optimizat.

Instrumente de asistență pentru programare

Modul interactiv

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.

  • Implementarea de referință Python are un interpret interactiv încorporat care funcționează în modul terminal text și vă permite să efectuați toate operațiunile de bază. În modul interactiv, este disponibil un sistem de depanare pdb și ajutor (numit de help()), care funcționează pentru toate modulele, clasele și funcțiile care conțin șiruri de documente:
>>> din import matematică * # import funcții matematice >>> ajutor ( sortat ) # ajutor pentru funcții sortate Ajutor pentru funcția încorporată sortată în modulele interne : sortat ( iterabil , / , * , cheie = Nici unul , invers = Fals ) Returnează o nouă listă care conține toate elementele din iterabil în ordine crescătoare . . . .
  • IPython [183]  ​​​​este un shell interactiv cu licență BSD, multiplatformă, care oferă introspecție avansată și comenzi suplimentare. În special, vă permite să transmiteți rezultatele executării comenzilor din shell-ul sistemului la codul executabil Python. Acceptă evidențierea codului și completarea automată.
  • bpython [184]  este o extensie a shell-ului standard Python cu un număr de module suplimentare. Implementează evidențierea sintaxei, completarea automată a codului cu sugestii, alinierea automată, integrarea Pastebin , salvarea intrării în fișier, recuperarea șirului șters, sugerarea parametrilor pentru funcții.

Aproape toate IDE-urile Python acceptă REPL pentru testare rapidă.

IDE

Există mai multe IDE-uri specializate pentru dezvoltarea Python.

  • Eric  este un editor Python complet și un IDE scris în Python. Se bazează pe framework-ul multiplatform Qt și folosește QScintilla ca componentă de editare . Eric oferă management de proiect, depanare, profilare, refactorizare de cod, interacțiune cu sisteme populare de control al versiunilor, cum ar fi Subversion și Git . Extensibil prin mecanismul pluginului. Depozitul de plugin este disponibil direct din mediul de dezvoltare. Distribuit gratuit, licențiat sub GNU GPL v3 .
  • PyCharm  este un IDE Python complet de la JetBrains , disponibil pe platformele Windows, macOS și Linux, disponibil în versiuni gratuite (Community) și plătite (Professional).
  • Wing IDE - linia Python-IDE de la compania americană Wingware, include trei opțiuni: „Wing 101”, „Wing Personal”, „Wing Pro”, dintre care primele două sunt gratuite, ultima este plătită. Versiunea Pro are tot ce aveți nevoie pentru dezvoltarea profesională, inclusiv suport pentru proiecte, control al versiunilor, navigare avansată a codului și analiză de cod, refactorizare, suport pentru utilizarea Django . Versiunile gratuite oferă mai puține funcții și nu depășesc funcțiile disponibile în alte IDE-uri Python gratuite.
  • Spyder este un IDE Python cu licență MIT  open source , gratuit, disponibil pe platformele Windows, Mac OS X și Linux. Particularitatea este că IDE-ul este axat pe știința datelor , este convenabil să lucrezi cu biblioteci precum SciPy, NumPy, Matplotlib. Spyder vine la pachet cu managerul de pachete Anaconda . În general, are calitățile unui IDE standard, are un editor cu evidențiere de sintaxă, completare automată a codului și un browser de documentație.
  • Thonny  este un IDE gratuit multiplatform lansat sub licența MIT și susținut de Institutul de Informatică al Universității din Tartu din Estonia . Este poziționat ca „Python IDE pentru începători”, complet, inclusiv interpretul Python, este instalat „din cutie” de către un utilizator fără drepturi administrative, poate fi folosit imediat după instalare fără setări suplimentare. Proiectat pentru învățare, are vizualizarea îmbunătățită a ordinii de evaluare a expresiilor și a apelurilor de funcții, evidențierea dinamică a erorilor de sintaxă, un simplu manager de pachete. Pentru uz profesional, capacitățile nu sunt suficiente, de exemplu, nu există suport de proiect și integrare cu sistemele de control al versiunilor .

Î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.

Aplicație

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] .

Vezi și

Note

Comentarii

  1. 1 2 3 Nu este disponibil direct după numele tipului.
  2. Valoarea în secunde poate fi obținută folosind comanda sys.getswitchinterval() [151] și poate fi modificată în timpul execuției folosind sys.setswitchinterval() [152]

Surse

  1. 1 2 3 4 5 https://docs.python.org/3/license.html
  2. Python 3.11 a fost lansat cu îmbunătățiri mari de performanță, grupuri de activități pentru I/O  asincron - 2022 .
  3. Python 3.11 lansat  - 2022 .
  4. Python 3.11.0 este acum disponibil  (engleză) - 2022.
  5. De ce a fost creat Python în primul rând? . Întrebări frecvente generale Python . Python Software Foundation. Data accesului: 22 martie 2007. Arhivat din original la 24 octombrie 2012.
  6. Manual de referință Ada 83 (declarație de ridicare) . Preluat la 7 ianuarie 2020. Arhivat din original pe 22 octombrie 2019.
  7. Kuchling, Andrew M. Interviu cu Guido van Rossum (iulie 1998) . amk.ca (22 decembrie 2006). Preluat la 12 martie 2012. Arhivat din original la 1 mai 2007.
  8. 1 2 itertools - Funcții care creează iteratoare pentru o buclă eficientă - documentația Python 3.7.1 . docs.python.org . Consultat la 22 noiembrie 2016. Arhivat din original la 14 iunie 2020.
  9. van Rossum, Guido (1993). „O introducere în Python pentru programatorii UNIX/C.” Proceedings of the NLUUG Najaarsconferentie (Grupul olandez de utilizatori UNIX) . CiteSeerX  10.1.1.38.2023 . chiar dacă designul lui C este departe de a fi ideal, influența sa asupra Python este considerabilă.
  10. 12 clase . _ Tutorialul Python . Python Software Foundation. — „Este un amestec de mecanisme de clasă găsite în C++ și Modula-3”. Data accesului: 20 februarie 2012. Arhivat din original la 23 octombrie 2012.
  11. Lundh, Fredrik Apel după obiect . effbot.org . - „înlocuiți „CLU” cu „Python”, „înregistrați” cu „instanță” și „procedură” cu „funcție sau metodă”, și veți obține o descriere destul de precisă a modelului obiect Python.”. Preluat la 21 noiembrie 2017. Arhivat din original la 23 noiembrie 2019.
  12. Simionato, Michele The Python 2.3 Method Resolution Order . Python Software Foundation. - „Metoda C3 în sine nu are nimic de-a face cu Python, deoarece a fost inventată de oameni care lucrează la Dylan și este descrisă într-o lucrare destinată șochilor”. Preluat la 29 iulie 2014. Arhivat din original la 20 august 2020.
  13. Kuchling, A.M. HOWTO privind programarea funcțională . Documentația Python v2.7.2 . Python Software Foundation. Data accesului: 9 februarie 2012. Arhivat din original pe 24 octombrie 2012.
  14. Schemenauer, Neil; Peters, Tim; Hetland, Magnus Lie PEP 255 - Generatoare simple . Propuneri de îmbunătățire Python . Python Software Foundation (18 mai 2001). Preluat la 9 februarie 2012. Arhivat din original la 5 iunie 2020.
  15. Smith, Kevin D.; Jewett, Jim J.; Montanaro, Skip; Baxter, Anthony PEP 318 - Decoratori pentru funcții și metode . Propuneri de îmbunătățire Python . Python Software Foundation (2 septembrie 2004). Preluat la 24 februarie 2012. Arhivat din original la 3 iunie 2020.
  16. Mai multe instrumente de control al fluxului . Documentația Python 3 . Python Software Foundation. Preluat la 24 iulie 2015. Arhivat din original la 4 iunie 2016.
  17. Istoric și licență
  18. https://docs.python.org/3/library/py_compile.html
  19. https://docs.python.org/3/faq/windows.html#is-a-pyd-file-the-same-as-a-dll
  20. https://www.python.org/dev/peps/pep-0488/
  21. https://docs.python.org/3/using/windows.html
  22. https://docs.python.org/3/library/zipapp.html
  23. https://www.python.org/dev/peps/pep-0484/
  24. https://www.python.org/downloads/
  25. Maria „Mifrill” Nefyodova, Creatorii de limbaje de programare: Sunt atât de diferite, dar codificarea îi unește, Hacker Nr. 09/08 (117) . Consultat la 1 decembrie 2012. Arhivat din original pe 2 iulie 2013.
  26. Prohorenok N., Dronov V. Introducere // Python 3. Essentials, ed. a II-a. . - BHV-Petersburg, 2019. - P. 11. - 608 p. — ISBN 9785977539944 .
  27. ↑ 1 2 3 4 5 6 7 8 9 10 11 12 13 Yogesh Rana. Python: simplu, deși un limbaj de programare important // Jurnalul Internațional de Cercetare de Inginerie și Tehnologie  (  IRJET). - 2019. - 2 februarie ( vol. 06 , iss. 2 ). - P. 1856-1858 . — ISSN 2395-0056 . Arhivat din original pe 11 februarie 2021.
  28. SkipMontanaro. De ce este Python un limbaj dinamic și, de asemenea, un limbaj puternic tipat - Python Wiki  . wiki.python.org (24 februarie 2012). Preluat la 14 martie 2021. Arhivat din original la 14 martie 2021.
  29. ↑ 1 2 3 4 Mark Lutz. O  sesiune de întrebări și răspunsuri Python . Learning Python, ediția a 3-a [Carte] . O'Reilly Media Inc. (2007). Consultat la 11 februarie 2021. Arhivat din original pe 8 februarie 2021.
  30. Python Introducere |  (engleză) . Educație Python . Google Developers (20 august 2018). Preluat la 21 februarie 2021. Arhivat din original la 4 decembrie 2020.
  31. ↑ 1 2 3 4 Satwik Kansal. Metaprogramarea în Python  . IBM (5 aprilie 2018). Preluat la 14 aprilie 2021. Arhivat din original la 27 februarie 2021.
  32. ↑ 1 2 Alexandre Bergel, Lorenzo Bettini. Programare generică în Pharo  //  Software și tehnologii de date / José Cordeiro, Slimane Hammoudi, Marten van Sinderen. - Berlin, Heidelberg: Springer, 2013. - P. 66–79 . — ISBN 978-3-642-45404-2 . - doi : 10.1007/978-3-642-45404-2_5 . Arhivat din original pe 13 februarie 2021.
  33. ↑ 1 2 R. Peschke, K. Nishimura, G. Varner. ARGG-HDL: Un cadru HDL de nivel înalt bazat pe Python orientat pe obiecte  //  Tranzacții IEEE privind știința nucleară: pre-print. - 2020. - Octombrie. - arXiv : 011.02626v1 . Arhivat 7 noiembrie 2020.
  34. ↑ 1 2 Steven F. Lott. Programare orientată pe aspecte  . Stăpânirea Python-ului orientat pe obiecte - Ediția a doua . Editura Packt (2019). Preluat la 21 februarie 2021. Arhivat din original la 21 februarie 2021.
  35. Arne Bachmann, Henning Bergmeyer, Andreas Schreiber. Evaluarea cadrelor orientate pe aspecte în Python pentru extinderea unui proiect cu caracteristici de documentare a provenienței  //  The Python Papers. - 2011. - Vol. 6 , iss. 3 . — P. 1–18 . — ISSN 1834-3147 . Arhivat din original pe 22 aprilie 2018.
  36. Steven Cooper. Știința datelor de la zero: Ghidul nr. 1 pentru știința datelor pentru tot ce trebuie să știe un cercetător de date: Python, algebră liniară, statistică, codificare, aplicații, rețele neuronale și arbori de decizie . - Roland Bind, 2018. - 126 p. Arhivat pe 21 februarie 2021 la Wayback Machine
  37. Reuven M. Lerner. Multiprocesare în  Python . Linux Journal (16 aprilie 2018). Consultat la 14 februarie 2021. Arhivat din original pe 14 februarie 2021.
  38. David Beazley, Brian K. Jones. 10. Module and Packages - Python Cookbook, Ediția a 3-a [Carte ]  . Cartea de bucate Python, ediția a treia . O'Reilly Media Inc. (2013). Preluat la 21 februarie 2021. Arhivat din original la 21 februarie 2021.
  39. Despre Python . Preluat la 7 august 2007. Arhivat din original la 11 august 2007.
  40. PythonImplementations - Python  Wiki . wiki.python.org (21 iulie 2020). Preluat la 17 februarie 2021. Arhivat din original la 11 noiembrie 2020.
  41. ↑ Istoric și licență  . Python . Preluat la 21 mai 2021. Arhivat din original la 5 decembrie 2016.
  42. ↑ 1 2 3 4 Mostafa Chandra Krintz, C. Cascaval, D. Edelsohn, P. Nagpurkar, P. Wu. Înțelegerea potențialului optimizărilor bazate pe interpreți pentru Python  //  Raport tehnic UCSB. - 2010. - 11 august. Arhivat din original pe 23 februarie 2021.
  43. ↑ 1 2 3 J. Akeret, L. Gamper, A. Amara, A. Refregier. HOPE: Un compilator Python just-in-time pentru calcule astrofizice  //  Astronomie și calcul. - 2015. - 1 aprilie ( vol. 10 ). — P. 1–8 . — ISSN 2213-1337 . - doi : 10.1016/j.ascom.2014.12.001 . - arXiv : 1410.4345v2 . Arhivat din original pe 15 februarie 2021.
  44. 1 2 PEP 373 -- Programul de lansare Python 2.7  ( 23 martie 2014). Preluat la 7 martie 2021. Arhivat din original la 25 februarie 2021.
  45. ↑ 1 2 3 4 Berk Ekmekci, Charles E. McAnany, Cameron Mura. O introducere în programare pentru oamenii de știință: un primer bazat pe Python  //  PLOS Computational Biology. - 2016. - 6 iulie ( vol. 12 , iss. 6 ). — P. e1004867 . — ISSN 1553-7358 . - doi : 10.1371/journal.pcbi.1004867 . — PMID 27271528 . Arhivat din original pe 16 februarie 2021.
  46. ↑ 1 2 3 Kalyani Adawadkar. Programare Python - Aplicații și viitor  //  Jurnalul internațional de inginerie avansată și dezvoltare a cercetării. - 2017. - Aprilie ( iss. SIEICON-2017 ). - P. 1-4 . — ISSN 2348-447 . Arhivat din original pe 15 iulie 2020.
  47. ↑ 1 2 Ethan Bommarito, Michael James Bommarito. O analiză empirică a indexului pachetului Python (PyPI  )  // Rețeaua de cercetare în științe sociale. - Rochester, NY: Social Science Research Network, 2019. - 25 iulie. - doi : 10.2139/ssrn.3426281 . - arXiv : arXiv:1907.11073v2 . Arhivat din original pe 9 iunie 2021.
  48. Pratik Desai. Programare Python pentru Arduino . - Packt Publishing Ltd, 2015. - P. 8. - 400 p. — ISBN 978-1-78328-594-5 . Arhivat pe 21 februarie 2021 la Wayback Machine
  49. ↑ 1 2 Sebastian Bassi. Un primer despre Python pentru cercetătorii din știința vieții  //  PLOS Computational Biology. - 2007. - 30 noiembrie ( vol. 3 , iss. 11 ). —P.e199 . _ — ISSN 1553-7358 . - doi : 10.1371/journal.pcbi.0030199 . Arhivat din original pe 13 martie 2021.
  50. Index  TIOBE . tiobe.com . TIOBE - Compania de calitate software. Preluat la 12 octombrie 2021. Arhivat din original la 12 octombrie 2021.
  51. Python | TIOBE - Compania de calitate a software-ului . www.tiobe.com. Consultat la 13 februarie 2021. Arhivat din original pe 6 februarie 2021.
  52. Copie arhivată (link nu este disponibil) . Consultat la 1 iunie 2009. Arhivat din original pe 17 februarie 2016. 
  53. 12 Întrebări frecvente generale Python . Documentația Python v2.7.3 . docs.python.org. Preluat la 4 iunie 2020. Arhivat din original la 24 octombrie 2012.
  54. Index of Python Enhancement Proposals (PEPs) . Data accesului: 28 ianuarie 2007. Arhivat din original la 28 ianuarie 2007.
  55. Versiunea Python 3.0 . Consultat la 1 iunie 2009. Arhivat din original pe 2 iunie 2009.
  56. PEP 373 - Programul de lansare Python 2.7 . python.org . Preluat la 9 ianuarie 2017. Arhivat din original la 19 mai 2020.
  57. PEP 466 -- Îmbunătățiri de securitate a rețelei pentru Python 2.7.x . python.org . Preluat la 9 ianuarie 2017. Arhivat din original la 4 iunie 2020.
  58. Sunsetting Python  2 . Python.org . Preluat la 22 septembrie 2019. Arhivat din original la 12 ianuarie 2020.
  59. Ghidul dezvoltatorului Python - Ghidul dezvoltatorului Python . devguide.python.org _ Consultat la 17 decembrie 2019. Arhivat din original la 9 noiembrie 2020.
  60. ↑ Extinderea și încorporarea interpretului Python : Reference Counts  . docs.python.org. „Din moment ce Python folosește intens malloc()și free(), are nevoie de o strategie pentru a evita scurgerile de memorie, precum și utilizarea memoriei eliberate. Metoda aleasă se numește numărarea referințelor .”. Preluat la 5 iunie 2020. Arhivat din original la 18 octombrie 2012.
  61. Hettinger, Raymond PEP 289 - Generator Expressions . Propuneri de îmbunătățire Python . Python Software Foundation (30 ianuarie 2002). Consultat la 19 februarie 2012. Arhivat din original la 14 iunie 2020.
  62. 6.5 itertools - Funcții care creează iteratoare pentru o buclă eficientă . docs.python.org. Consultat la 22 noiembrie 2016. Arhivat din original la 14 iunie 2020.
  63. PEP 20 - Zenul lui Python . Consultat la 23 septembrie 2005. Arhivat din original la 17 iulie 2005.
  64. Bader Dan. Python pur. Subtilitățile programării pentru profesioniști . - „Editura” „Petru” „”, 2018. - S. 64-65. — 288 p. - ISBN 978-5-4461-0803-9 . Arhivat pe 10 aprilie 2021 la Wayback Machine
  65. Venners, Bill The Making of Python . Dezvoltator Artima . Artima (13 ianuarie 2003). Preluat la 22 martie 2007. Arhivat din original la 1 septembrie 2016.
  66. Peters, Tim PEP 20 - Zenul lui Python . Propuneri de îmbunătățire Python . Python Software Foundation (19 august 2004). Consultat la 24 noiembrie 2008. Arhivat din original la 26 decembrie 2018.
  67. Alex Martelli, Anna Ravenscroft, David Ascher. Cartea de bucate Python, ediția a 2-a . - O'Reilly Media , 2005. - P. 230. - ISBN 978-0-596-00797-3 . Arhivat pe 23 februarie 2020 la Wayback Machine
  68. Cultura Python (link în jos) . ebeab (21 ianuarie 2014). Arhivat din original la 30 ianuarie 2014. 
  69. Mark Summerfield. Python în practică: creați programe mai bune utilizând concurență, biblioteci și modele . — Addison-Wesley, 20.08.2013. - S. 201. - 326 p. — ISBN 978-0-13-337323-3 . Arhivat pe 9 iunie 2021 la Wayback Machine
  70. 15 moduri în care Python este o forță puternică pe web (link descendent) . Preluat la 28 decembrie 2020. Arhivat din original la 11 mai 2019. 
  71. 8.18. pprint - Data pretty printer - Documentația Python 3.8.3 . docs.python.org . Preluat la 28 decembrie 2020. Arhivat din original la 22 ianuarie 2021.
  72. Python pe Android  (eng.)  (link nu este disponibil) . www.damonkohler.com Data accesului: 19 decembrie 2009. Arhivat din original la 28 ianuarie 2011.
  73. Modificări specifice portului: Windows  (engleză)  (link nu este disponibil) . Documentația Python v2.6.1. Ce este nou în Python 2.6 . Python Software Foundation. Data accesului: 11 decembrie 2008. Arhivat din original la 28 ianuarie 2011.
  74. 3. Utilizarea Python pe Windows - Documentația Python 3.5.9  . Documentația Python . Python Software Foundation. Preluat la 8 iunie 2020. Arhivat din original la 15 octombrie 2020.
  75. Renunțați la suportul pentru Windows Vista și 7 în Python  3.9 . Preluat la 10 ianuarie 2021. Arhivat din original la 4 noiembrie 2020.
  76. 1 2 Ramalho, 2016 , p. 61.
  77. 15. Aritmetică în virgulă mobilă: probleme și limitări - documentația Python 3.8.3 . docs.python.org . - „Aproape toate mașinile de astăzi (noiembrie 2000) folosesc aritmetica în virgulă mobilă IEEE-754 și aproape toate platformele mapează flotanți Python la „precizie dublă” IEEE-754. Preluat la 6 iunie 2020. Arhivat din original la 6 iunie 2020.
  78. Moshe Zadka, Guido van Rossum. PEP 237 - Unificarea numerelor întregi lungi și întregi . Propuneri de îmbunătățire Python . Python Software Foundation (11 martie 2001). Preluat la 24 septembrie 2011. Arhivat din original la 28 mai 2020.
  79. Tipuri încorporate . Preluat la 3 octombrie 2019. Arhivat din original la 14 iunie 2020.
  80. 1 2 Ramalho, 2016 , pp. 52-54.
  81. Fredrik Lundh. Apel după obiect  (engleză)  (downlink) . effbot.org . Consultat la 31 mai 2014. Arhivat din original la 23 noiembrie 2019.
  82. Cuvânt înainte pentru „Programming Python” (ed. I  ) . Preluat la 7 martie 2021. Arhivat din original la 20 ianuarie 2021.
  83. 2.3.2. Clase rezervate de identificatori . Documentație Python (18 octombrie 2009). Arhivat din original pe 28 ianuarie 2011.
  84. ... integritatea proiectelor mari Python este construită pe două lucruri: teste și șirul de documente . Consultat la 31 octombrie 2008. Arhivat din original pe 21 octombrie 2008.
  85. Steve D. Jost. Detalii de programare structurată . IT 211, Universitatea DePaul (2019). Preluat la 17 februarie 2021. Arhivat din original la 29 aprilie 2020.
  86. PyDBC: precondiții de metodă, postcondiții de metodă și invarianți de clasă pentru Python . Preluat la 24 septembrie 2011. Arhivat din original la 23 noiembrie 2019.
  87. Contracte pentru Python . Preluat la 24 septembrie 2011. Arhivat din original la 15 iunie 2020.
  88. Pydatalog . Preluat la 22 iulie 2012. Arhivat din original la 13 iunie 2020.
  89. ↑ 1 2 3 Programare orientată pe obiecte în  Python . Dezvoltator IBM . ibm.com (20 octombrie 2020). Preluat la 11 martie 2021. Arhivat din original la 11 martie 2021.
  90. ↑ 1 2 3 9.  Clase . Documentația Python 3.9.2 . docs.python.org. Preluat la 14 martie 2021. Arhivat din original la 14 martie 2021.
  91. Fawzi Albalooshi, Amjad Mahmood. Un studiu comparativ asupra efectului mecanismului de moștenire multiplă în Java, C++ și Python asupra complexității și reutilizabilității codului // Jurnalul Internațional de Științe și Aplicații Informatice Avansate  (  IJACSA). - 2017. - Vol. 8 , iss. 6 . — ISSN 2156-5570 . - doi : 10.14569/IJACSA.2017.080614 . Arhivat din original pe 10 iulie 2020.
  92. Michele Simionato. Ordinul de rezoluție a metodei Python 2.3  . Python.org . Preluat la 14 martie 2021. Arhivat din original la 14 martie 2021.
  93. ↑ PEP 484 -- Tip Sugestii  . Python.org (24 septembrie 2014). Consultat la 13 februarie 2021. Arhivat din original pe 9 februarie 2021.
  94. Jukka Lehtosalo. Generic  (engleză) . Documentația Mypy 0.800 . Citiți documentele (2016). Preluat la 13 februarie 2021. Arhivat din original la 13 februarie 2021.
  95. 1 2 Ramalho, 2016 , pp. 188-191.
  96. ↑ 12 David Mertz . Programare funcțională în Python. - O'Reilly, 2015. - ISBN 978-1491928561 .
  97. Ramalho, 2016 , p. 273.
  98. Ramalho, 2016 , pp. 613-708.
  99. Patrick O'Brien. Un ghid pentru introspecție în Python / Intersoft Lab .
  100. Beazley, 2009 , pp. 222-225.
  101. 1 2 3 Ramalho, 2016 , pp. 214-246.
  102. Ramalho, 2016 , pp. 686-688.
  103. 6.2. re - Operații cu expresii regulate - documentația Python 3.5.1 . Preluat la 11 mai 2016. Arhivat din original la 18 iulie 2018.
  104. A.M. Kuchling . PEP 206 -- Biblioteca avansată Python , Python.org  (14.07.2000). Arhivat 5 mai 2021. Preluat la 4 aprilie 2021.
  105. eGenix.com - Software, abilități și servicii profesionale Python . Data accesului: 29 ianuarie 2007. Arhivat din original la 28 ianuarie 2007.
  106. Numarray Pagina de pornire . Preluat la 5 februarie 2007. Arhivat din original la 9 iunie 2021.
  107. PEP333 . Consultat la 29 ianuarie 2007. Arhivat din original la 9 iunie 2021.
  108. Pyste Documentation (downlink) . Consultat la 3 februarie 2007. Arhivat din original pe 3 februarie 2007. 
  109. Copie arhivată (link nu este disponibil) . Consultat la 3 februarie 2007. Arhivat din original pe 8 februarie 2007. 
  110. Copie arhivată . Consultat la 3 februarie 2007. Arhivat din original pe 8 februarie 2007.
  111. Boost.Python . Consultat la 3 februarie 2007. Arhivat din original pe 3 februarie 2007.
  112. http://www.drdobbs.com/building-hybrid-systems-with-boostpython/184401666 Arhivat 13 octombrie 2015 la Wayback Machine Building Hybrid Systems with Boost.Python
  113. PyCXX: scrieți extensii Python în C. Consultat la 3 februarie 2007. Arhivat din original pe 3 februarie 2007.
  114. Punte între C++ și Python . Preluat la 15 mai 2014. Arhivat din original la 18 decembrie 2014.
  115. PyInline: amestecați alte limbi direct în linie cu Python-ul dvs. Consultat la 3 februarie 2007. Arhivat din original pe 15 ianuarie 2007.
  116. Weave (downlink) . Consultat la 3 februarie 2007. Arhivat din original la 1 martie 2007. 
  117. wxPython . Consultat la 30 septembrie 2008. Arhivat din original pe 9 iunie 2021.
  118. Echipa GTK. Proiectul GTK - Un set de instrumente pentru widgeturi multiplatformă gratuit și open-source  . Echipa GTK (5 iunie 2015). Preluat la 25 ianuarie 2021. Arhivat din original la 27 noiembrie 2020.
  119. PyOpenGL - Legarea Python OpenGL . Consultat la 9 februarie 2007. Arhivat din original pe 15 iunie 2011.
  120. PyOgre: Ogre Wiki (link în jos) . Consultat la 9 februarie 2007. Arhivat din original pe 6 februarie 2007. 
  121. pythonOCC, cadru de dezvoltare 3D CAD/CAE/PLM pentru limbajul de programare Python . Preluat la 28 martie 2009. Arhivat din original la 8 august 2011.
  122. Tehnologia Open CASCADE, modelare 3D și simulare numerică . Consultat la 28 martie 2009. Arhivat din original pe 18 martie 2009.
  123. Modul de verificare a tipului pentru Python (link descendent) . Consultat la 10 februarie 2007. Arhivat din original pe 4 februarie 2007. 
  124. Metoda de verificare a semnăturii decoratorilor „Rețete Python” ActiveState Code . Consultat la 16 februarie 2008. Arhivat din original pe 13 februarie 2008.
  125. PEP-3107 . Consultat la 16 februarie 2007. Arhivat din original pe 8 mai 2007.
  126. FrontPage - Centrul pentru dezvoltatori PEAK . Preluat la 19 martie 2008. Arhivat din original la 12 mai 2008.
  127. Reguli PEAK . Data accesului: 19 martie 2008. Arhivat din original la 23 iulie 2008.
  128. PEP-3124 . Consultat la 25 mai 2007. Arhivat din original pe 3 iulie 2007.
  129. overloading-lib Arhivat pe 17 septembrie 2013 la Wayback Machine , O bibliotecă de supraîncărcare a metodelor și a funcției dinamice bazate pe tipuri pentru limbajul Python
  130. PyChecker: un instrument de verificare a codului sursă python . Consultat la 3 februarie 2007. Arhivat din original pe 2 februarie 2007.
  131. pylint (analizează codul sursă Python căutând erori și semne de calitate proastă.) (Logilab.org) . Consultat la 3 februarie 2007. Arhivat din original pe 12 februarie 2007.
  132. Documentația Pylint 1.0.0, Introducere . Consultat la 23 noiembrie 2013. Arhivat din original la 2 decembrie 2013.
  133. ↑ 1 2 3 4 Mathieu Fourment, Michael R. Gillings. O comparație a limbajelor de programare comune utilizate în bioinformatică  //  BMC Bioinformatics. - 2008. - 5 februarie ( vol. 9 , iss. 1 ). — P. 82 . — ISSN 1471-2105 . - doi : 10.1186/1471-2105-9-82 . Arhivat din original pe 19 martie 2021.
  134. ↑ 1 2 3 4 5 6 7 8 A Bogdancikov, M Zhaparov, R Suliyev. Python pentru a învăța programarea  (engleză)  // Journal of Physics: Conference Series. — 10-04-2013. - 10 aprilie ( vol. 423 ). — P. 012027 . — ISSN 1742-6596 1742-6588, 1742-6596 . - doi : 10.1088/1742-6596/423/1/012027 . Arhivat din original pe 9 iunie 2021.
  135. Pascal Fua, Krzysztof Lis. Comparând Python, Go și C++ în problema N-Queens  // Computer Vision Laboratory, EPFL. — 2020. Arhivat 12 martie 2020.
  136. Guido van Rossum. Compararea Python cu alte  limbi . Python.org (1997). Preluat la 16 martie 2021. Arhivat din original la 16 martie 2021.
  137. Muhammad Shoaib Farooq, Sher Afzal Khan, Farooq Ahmad, Saeed Islam, Adnan Abid. Un cadru de evaluare și o analiză comparativă a primelor limbaje de programare utilizate pe scară largă  //  PLoS ONE. - 2014. - 24 februarie ( vol. 9 , is. 2 ). — ISSN 1932-6203 . - doi : 10.1371/journal.pone.0088941 . — PMID 24586449 . Arhivat din original pe 15 martie 2021.
  138. Kincaid, Jason . Google's Go: un nou limbaj de programare care este Python Meets C++ , TechCrunch  (10 noiembrie 2009). Arhivat din original pe 18 ianuarie 2010. Preluat la 16 februarie 2021.
  139. Ceyhun Ozgur, Taylor Colliau, Grace Rogers, Zachariah Hughes, Elyse „Bennie” Myer-Tyson. matlab vs. Python vs. R  (engleză)  // Journal of Data Science. - 2017. - Vol. 15 . - P. 355-372 . — ISSN 1680-743X . Arhivat din original pe 11 aprilie 2021.
  140. Alex Maccaw. Mica carte despre CoffeeScript . - O'Reilly, 2012. - ISBN 9781449321055 .
  141. Propuneri: iteratoare și generatoare [ES4 Wiki] (downlink) . wiki.ecmascript.org. Consultat la 24 noiembrie 2008. Arhivat din original pe 20 octombrie 2007. 
  142. Strachan, James Groovy - nașterea unui nou limbaj dinamic pentru platforma Java (link indisponibil) (29 august 2003). Consultat la 11 iunie 2007. Arhivat din original pe 5 aprilie 2007. 
  143. De ce am creat-o pe Julia . Site-ul Julia (februarie 2012). - „Vrem ceva la fel de utilizabil pentru programare generală ca Python [...]”. Preluat la 5 iunie 2014. Arhivat din original la 2 mai 2020.
  144. Yegulalp, limbajul Serdar Nim se bazează pe cele mai bune din Python, Rust, Go și Lisp . InfoWorld (16 ianuarie 2017). - „Sintaxa lui Nim amintește puternic de cea a lui Python, deoarece folosește blocuri de cod indentate și unele din aceeași sintaxă (cum ar fi modul în care sunt construite blocurile if/elif/then/else).”. Preluat la 16 februarie 2021. Arhivat din original la 13 octombrie 2018.
  145. Un interviu cu creatorul lui Ruby . linuxdevcenter.com. Consultat la 3 decembrie 2012. Arhivat din original la 28 aprilie 2018.
  146. Lattner, Pagina de pornire a lui Chris Chris Lattner . Chris Lattner (3 iunie 2014). — „Am început să lucrez la limbajul de programare Swift în iulie 2010. Am implementat o mare parte din structura limbajului de bază, doar câțiva oameni știind despre existența lui. Alți câțiva oameni (uimitoare) au început să contribuie serios la sfârșitul anului 2011 și a devenit un obiectiv major pentru grupul de instrumente pentru dezvoltatori Apple în iulie 2013 [...] trăgând idei de la Objective-C, Rust, Haskell, Ruby, Python, C#, CLU și mult prea multe altele pentru a fi enumerate.” Preluat la 3 iunie 2014. Arhivat din original la 22 decembrie 2015.
  147. Python/C++ GNU g++ (link descendent) . Joc de referință pentru limbajul computerului . ???. Data accesului: 1 iulie 2009. Arhivat din original la 28 ianuarie 2011. 
  148. neîncărcat-înghită. O implementare mai rapidă a Python (link indisponibil) . code.google. - „Obiective:... Produceți o versiune de Python de cel puțin 5 ori mai rapidă decât CPython.” Consultat la 22 iunie 2009. Arhivat din original pe 28 ianuarie 2011. 
  149. Jaworski, Ziade, 2021 , p. 466.
  150. Palach, 2014 , pp. 16-17.
  151. sys#sys.getswitchinterval() . Documentația Python . Preluat la 25 octombrie 2021. Arhivat din original la 25 octombrie 2021.
  152. sys#sys.setswitchinterval() . Documentația Python . Preluat la 25 octombrie 2021. Arhivat din original la 25 octombrie 2021.
  153. Guido van Rossum . viitorul GIL . Liste de corespondență Python (8 mai 2007). Preluat la 3 martie 2021. Arhivat din original la 9 noiembrie 2020.
  154. Guido van Rossum. Nu este ușor să eliminați GIL . artima.com (10 septembrie 2007). Preluat la 3 martie 2021. Arhivat din original la 6 iunie 2019.
  155. Python-Dev] Reprelucrarea GIL . Preluat la 7 decembrie 2010. Arhivat din original la 10 iunie 2011.
  156. Întrebări frecvente Python 3000 . Preluat la 8 august 2007. Arhivat din original la 9 noiembrie 2020.
  157. 1 2 python-safethread - Găzduire proiect pe Google Code . Preluat la 21 august 2008. Arhivat din original la 1 august 2008.
  158. Indexul pachetului Python: procesare 0.52 . Preluat la 8 august 2007. Arhivat din original la 13 octombrie 2007.
  159. perlthrtut - perldoc.perl.org . Consultat la 10 aprilie 2008. Arhivat din original pe 22 mai 2008.
  160. Parallel Python - Acasă (link descendent) . Consultat la 8 august 2007. Arhivat din original pe 28 mai 2010. 
  161. pyMPI.sourceforge.net: Punerea py în MPI . Preluat la 8 august 2007. Arhivat din original la 18 octombrie 2007.
  162. 1 2 zephyrfalcon.org :: labs :: 10 capcane Python
  163. Reeta Sahoo, Gagan Sahoo. Informatica cu Python . - New Delhi: New Saraswati House India Pvt Ltd, 2016. - P. 3.35-3.36. — 458 p. — ISBN 978-93-5199-980-5 . Arhivat pe 22 ianuarie 2021 la Wayback Machine
  164. Luciano Ramalho. Tupluri Python : imuabile, dar potențial schimbătoare - O'Reilly Radar  . radar.oreilly.com . O'Reilly (15 octombrie 2014). Preluat la 16 ianuarie 2021. Arhivat din original la 16 ianuarie 2021.
  165. 8. Declarații compuse - documentația Python 3.7.2 . docs.python.org. Consultat la 5 februarie 2019. Arhivat din original la 27 noiembrie 2019.
  166. Obi Ike-Nwosu. Citiți în interiorul mașinii virtuale Python | Leanpub . În interiorul mașinii virtuale Python . leanpub.com. Preluat la 23 martie 2021. Arhivat din original la 29 ianuarie 2021.
  167. ↑ 1 2 Preluat prin dis.dis('print("Hello World!")').
  168. K. Reith, T. Schlusser, 2017 , p. 23.
  169. Python pentru S60 - OpenSource Arhivat 6 august 2009.
  170. IronPython . Data accesului: 24 iulie 2007. Arhivat din original la 18 august 2006.
  171. Python pentru .NET . Consultat la 10 februarie 2007. Arhivat din original pe 16 februarie 2007.
  172. PEP 3146 - Fuzionarea Rândunicii neîncărcate în CPython . Consultat la 8 iunie 2010. Arhivat din original pe 3 iunie 2010.
  173. QINSB nu este un blog de software: Unladen Swallow Retrospective . Data accesului: 19 mai 2012. Arhivat din original pe 22 martie 2012.
  174. tinypy . Preluat la 21 august 2008. Arhivat din original la 18 septembrie 2008.
  175. MicroPython . Consultat la 4 iunie 2014. Arhivat din original pe 6 iunie 2014.
  176. Site-ul web al proiectului Brython . Consultat la 6 noiembrie 2014. Arhivat din original la 20 octombrie 2014.
  177. Site-ul proiectului QPython . Consultat la 3 februarie 2015. Arhivat din original pe 4 februarie 2015.
  178. Site-ul proiectului Grumpy . Preluat la 17 februarie 2021. Arhivat din original la 9 noiembrie 2020.
  179. PyPy[coding-guide] (link descendent) . Data accesării: 24 iulie 2007. Arhivat din original pe 7 iulie 2007. 
  180. PyPy carbonpython (link în jos) . Data accesului: 24 iulie 2007. Arhivat din original la 12 septembrie 2007. 
  181. Pyrex . Consultat la 3 februarie 2007. Arhivat din original la 26 septembrie 2018.
  182. Cython: C-Extensions pentru Python . Preluat la 28 iulie 2007. Arhivat din original la 11 august 2007.
  183. Copie arhivată (link nu este disponibil) . Consultat la 1 iunie 2006. Arhivat din original pe 4 august 2018. 
  184. bpython interpret . Consultat la 17 februarie 2011. Arhivat din original pe 11 mai 2011.
  185. Vasiliev Denis Alekseevici. Caracteristici metodologice ale învățării limbajului Python de către școlari  // Simbol al științei. - 2017. - Nr. 1 .
  186. ↑ 1 2 3 4 5 6 Mark Lutz. Învățarea Python : programare puternică orientată pe obiecte  . — O'Reilly Media, Inc., 2009-10-06. - P. 7-8. — 1218 p. — ISBN 978-1-4493-7932-2 . Arhivat pe 10 aprilie 2021 la Wayback Machine
  187. Jukka Lehtosalo. Călătoria noastră către verificarea tipului a 4 milioane de linii  Python . dropbox.tech _ Dropbox (5 septembrie 2019). Preluat la 22 septembrie 2020. Arhivat din original la 22 septembrie 2020.
  188. Python în ingineria producției . Preluat la 21 ianuarie 2017. Arhivat din original la 2 februarie 2017.
  189. Ce dă putere Instagram: sute de instanțe, zeci de tehnologii . Preluat la 21 ianuarie 2017. Arhivat din original la 9 iunie 2021.
  190. Grumpy: Pornește Python! Arhivat pe 20 ianuarie 2017 la articolul Wayback Machine  - Google Open Source Blog
  191. ↑ 12 Christina Cardoza . Google se angajează din nou față de ecosistemul Python , SD Times  (02.12.2021). Arhivat din original pe 25 februarie 2021. Preluat la 4 aprilie 2021.
  192. Bun venit Google ca sponsor vizionar al PSF , Știri de la Python Software Foundation  (2021-02-11). Arhivat din original pe 9 aprilie 2021. Preluat la 4 aprilie 2021.
  193. Google Cloud finanțează ecosistemul Python , Open Systems Publishing  (03.02.2021). Arhivat din original pe 9 iunie 2021. Preluat la 4 aprilie 2021.
  194. Eilif Muller, James A. Bednar, Markus Diesmann, Marc-Oliver Gewaltig, Michael Hines. Python în neuroștiință  (engleză)  // Frontiers in Neuroinformatics. - 2015. - 14 aprilie ( vol. 9 ). — ISSN 1662-5196 . - doi : 10.3389/fninf.2015.00011 . Arhivat 30 noiembrie 2020.
  195. Scripting & Extending Blender:  Introducere . Manualul blenderului . Blender. Preluat la 21 septembrie 2020. Arhivat din original la 21 septembrie 2020.
  196. Scripturi  Python . www.sidefx.com . Preluat la 27 septembrie 2020. Arhivat din original la 29 septembrie 2020.
  197. ↑ Construirea unui plugin pentru QGIS  . Programul Sisteme Informaționale Geografice (GIS) . Centrul Național de Cercetări Atmosferice. Preluat la 23 septembrie 2020. Arhivat din original la 23 septembrie 2020.
  198. Jonathan Thomas. OpenShot Video Editor pentru Windows, Mac și Linux  (engleză) . Kickstarter (4 martie 2020). Preluat la 23 septembrie 2020. Arhivat din original la 23 septembrie 2020.
  199. Folosești GNS3 cu   Fedora ? . Revista Fedora (28 august 2019). Preluat la 22 septembrie 2020. Arhivat din original la 1 octombrie 2020.
  200. Ultimaker Cura GitHub . Preluat la 19 septembrie 2020. Arhivat din original pe 17 septembrie 2020.
  201. Natol Locker. Cel mai bun software de tăiere a imprimantei 3D din 2020  . All3DP (2 ianuarie 2020). - „Lista este sortată după popularitate (prin rangul Alexa)”. Preluat la 24 septembrie 2020. Arhivat din original la 13 august 2020.
  202. Peter Jurica, Cees Van Leeuwen. OMPC: un compilator open-source MATLAB®-to-Python  //  Frontiers in Neuroinformatics. - 2009. - T. 3 . — ISSN 1662-5196 . - doi : 10.3389/neuro.11.005.2009 . Arhivat 29 noiembrie 2020.
  203. Dezvoltarea Veusz  . Veusz . Pagini Github. Preluat la 2 octombrie 2020. Arhivat din original la 2 octombrie 2020.
  204. Fisher, M. Complot cu un scop  : [ arh. 2 octombrie 2020 ] // Scriere pentru conservare  : [ ing. ] . — Fauna & Flora International, Cambridge, 2019.
  205. The Astropy Collaboration, AM Price-Whelan, BM Sipőcz, HM Günther, PL Lim, SM Crawford, S. Conseil, DL Shupe, MW Craig, N. Dencheva. Proiectul Astropy: Construirea unui proiect de știință deschisă și statutul pachetului de bază v2.0  : [ ing. ]  : [ arh. 3 octombrie 2020 ] // Jurnalul Astronomic. - 2018. - T. 156, nr. 3 (24 august). - S. 123. - ISSN 1538-3881 . doi : 10.3847 /1538-3881/aabc4f .
  206. Generatorul de clasă Google Mock README . Test Google . github.com. Preluat la 3 februarie 2019. Arhivat din original la 9 iunie 2021.
  207. 1 2 Noah Gift, Jeremy M. Jones. Administrarea sistemului Python pentru Unix și Linux. - ISBN 978-0-596-51582-9 .

Literatură

Link -uri