Pytonorm | |
---|---|
Språkklass | objektorienterat programmeringsspråk |
Framträdde i | 20 februari 1991 [17] |
Författare | Guido van Rossum [1] |
Utvecklaren | Python Software Foundation och Guido van Rossum [1] |
Filtillägg _ | .py, [18] , [19] , [20] , [21] , [22] eller [23].pyc.pyd.pyo.pyw.pyz.pyi |
Släpp |
|
Blivit påverkad | ABC , [5] Ada , [6] Algol 68 , [7] APL , [8] C , [9] C++ , [10] Clu , [11] Dylan , [12] Haskell , [13] Icon , [14 ] Java , [15] Lisp , [16] Modula-3 , [10] Perl , Standard ML [8] |
Licens | Python Software Foundation License [1] |
Hemsida | python.org _ |
Plattform | Microsoft Windows |
OS | plattformsoberoende [24] |
Mediafiler på Wikimedia Commons |
Python ( IPA : [ˈpʌɪθ(ə)n] ; på ryska finns namnen python [25] eller python [26] ) är ett allmänt programmeringsspråk på hög nivå med dynamisk stark skrivning och automatisk minneshantering [27] [28 ] , fokuserat på att förbättra utvecklarnas produktivitet, kodläsbarhet och kvalitet, och säkerställa portabiliteten för program skrivna på den [29] . Språket är helt objektorienterat i den meningen att allt är ett objekt [27] . En ovanlig egenskap hos språket är blankstegsindragning av kodblock [30] . Syntaxen för kärnspråket är minimalistisk, vilket i praktiken sällan behöver hänvisa till dokumentationen [29] . Språket i sig är känt som tolkat och används bland annat för att skriva manus [27] . Nackdelarna med språket är ofta lägre hastighet och högre minnesförbrukning för program skrivna i det jämfört med liknande kod skriven på kompilerade språk som C eller C++ [27] [29] .
Python är ett programmeringsspråk med flera paradigm som stöder imperativ , procedurell , strukturerad , objektorienterad programmering [27] , metaprogrammering [31] och funktionell programmering [27] . Generiska programmeringsproblem löses genom dynamisk typning [32] [33] . Aspektorienterad programmering stöds delvis av dekoratörer [34] , mer komplett stöd tillhandahålls av ytterligare ramverk [35] . Tekniker som kontrakts- och logikprogrammering kan implementeras med hjälp av bibliotek eller tillägg [36] . De främsta arkitektoniska funktionerna är dynamisk typning , automatisk minneshantering [27] , full introspektion , undantagshanteringsmekanism , stöd för flertrådiga beräkningar med globalt tolklås ( GIL ) [ 37] , datastrukturer på hög nivå . Dela upp program i moduler stöds , som i sin tur kan kombineras till paket [38] .
Python- referensimplementeringen är CPython- tolken , som stöder de mest använda plattformarna [39] och är de facto språkstandarden [40] . Den distribueras under den kostnadsfria Python Software Foundation License , som låter dig använda den utan begränsningar i alla applikationer, inklusive proprietära [41] . CPython kompilerar källkod till högnivåbytekod som körs i en virtuell stackmaskin [42] . De andra tre stora implementeringarna av språket är Jython (för JVM ), IronPython (för CLR / .NET ) och PyPy [27] [43] . PyPy är skrivet i en delmängd av Python-språket (RPython) och utvecklades som ett alternativ till CPython för att öka hastigheten på programexekveringen, inklusive genom användning av JIT-kompilering [43] . Stödet för Python 2 upphörde 2020 [44] . För tillfället utvecklas versionen av språket Python 3 aktivt [45] . Språkutveckling genomförs genom PEP ( Python Enhancement Proposal ) språkutvidgningsförslag , som beskriver innovationer, gör justeringar baserat på feedback från samhället och dokumenterar slutliga beslut [46] .
Standardbiblioteket innehåller en stor uppsättning användbara bärbara funktioner, allt från textbehandlingsfunktioner till verktyg för att skriva nätverksapplikationer. Ytterligare funktioner, såsom matematisk modellering, att arbeta med utrustning, skriva webbapplikationer eller utveckla spel, kan implementeras genom ett stort antal tredjepartsbibliotek, såväl som integration av bibliotek skrivna i C eller C++, medan Python tolken själv kan integreras i projekt, skrivna på dessa språk [27] . Det finns också ett specialiserat arkiv för programvara skriven i Python, PyPI [47] . Detta förråd ger ett sätt att enkelt installera paket i operativsystemet och har blivit de facto-standarden för Python [48] . Från och med 2019 innehöll den över 175 000 paket [47] .
Python har blivit ett av de mest populära språken och används inom dataanalys , maskininlärning , DevOps och webbutveckling , bland andra områden inklusive spelutveckling . På grund av dess läsbarhet, enkla syntax och bristande kompilering är språket väl lämpat för undervisning i programmering, vilket gör att du kan koncentrera dig på att lära dig algoritmer, begrepp och paradigmer. Felsökning och experimentering underlättas avsevärt av att språket är tolkbart [27] [49] . Språket används av många stora företag som Google eller Facebook [27] . Från och med september 2022 rankas Python som nummer 1 i TIOBE-rankningen av programmeringsspråkens popularitet med en poäng på 15,74 % [50] . Python har utsetts till Årets TIOBE-språk 2007, 2010, 2018, 2020 och 2021 [51] .
Idén för implementeringen av språket dök upp i slutet av 1980 -talet , och utvecklingen av dess implementering började 1989 av Guido van Rossum , en anställd vid det holländska CWI- institutet [46] . Amoebas distribuerade operativsystem krävde ett utbyggbart skriptspråk , och Guido började utveckla Python på sin fritid och lånade en del av arbetet från ABC- språket (Guido var involverad i utvecklingen av detta språk fokuserat på att lära ut programmering). I februari 1991 postade Guido källkoden till nyhetsgruppen alt.sources [52] . Redan från början var Python designat som ett objektorienterat språk .
Guido van Rossum döpte språket efter det populära brittiska komedi-tv-programmet Monty Pythons Flying Circus från 1970 -talet [ 53 ] eftersom författaren var ett fan av programmet, liksom många andra utvecklare på den tiden, och själva programmet hade en parallell till världen. av datorteknik [29] .
Att ha en vänlig, lyhörd användargemenskap anses, tillsammans med Guidos designintuition, vara en av nycklarna till Pythons framgång. Utvecklingen av språket sker enligt en tydligt reglerad process för att skapa, diskutera, välja ut och implementera PEP ( Python Enhancement Proposal ) dokument - förslag för utveckling av Python [54] .
Den 3 december 2008 [55] , efter omfattande tester, släpptes den första versionen av Python 3000 (eller Python 3.0, även känd som Py3k ). Python 3000 fixar många av arkitekturens brister samtidigt som den bibehåller så mycket (men inte fullständig) kompatibilitet med äldre versioner av Python som möjligt.
Slutdatumet för support för Python 2.7 var ursprungligen satt till 2015 och flyttades sedan tillbaka till 2020 av oro för att mycket av den befintliga koden inte lätt kunde portas till Python 3 [56] [57] . Python 2-stödet riktades endast mot befintliga projekt, nya projekt krävdes för att använda Python 3 [45] . Python 2.7 har inte fått officiellt stöd sedan 1 januari 2020, även om den senaste uppdateringen släpptes i april 2020. Inga fler säkerhetsfixar eller andra förbättringar kommer att släppas för Python 2.7 [44] [58] . Med slutet av livet för Python 2.x, stöds endast Python 3.6.x och senare [59] .
Språket använder dynamisk typning tillsammans med referensräkning och en cirkulär sopsamlare för minneshantering [60] . Det finns också dynamiska namnupplösningar ( dynamisk bindning ) som länkar samman metod och variabelnamn under programkörning.
Python erbjuder stöd för funktionell programmering enligt Lisp- traditionen . Så i Python finns det funktioner filter, mapoch reduce; begreppen egenskaper hos listor , associativa arrayer (ordböcker), uppsättningar och listgeneratorer [61] lånades också från Lisp . Standardbiblioteket innehåller två moduler (itertools och functools) som implementerar verktyg lånade från Haskell och Standard ML [62] .
Utvecklarna av Python-språket ansluter sig till en viss programmeringsfilosofi som kallas "The Zen of Python" (" Zen of Python", eller "Zen of Python") [63] . Dess text utfärdas av Python- tolkenimport this på kommando (den fungerar en gång per session). Tim Peters anses vara författaren till denna filosofi .
Filosofi börjar så här [64] :
….
Originaltext (engelska)[ visaDölj]...
Istället för att ha all funktionalitet i språket inbyggd i Python-kärnan, designades det för att vara lätt att utöka. Detta gjorde språket till ett populärt sätt att lägga till programmerbara gränssnitt till befintliga applikationer. Guido van Rossums vision om en liten kärna med ett stort standardbibliotek och en lätt utbyggbar tolk härrörde från den negativa erfarenheten av att utveckla ABC- språket , som tog motsatt tillvägagångssätt [65] .
Python syftar till en enklare, mindre krånglig syntax och grammatik, vilket ger utvecklare valmöjligheter i sin kodningsmetodik. I motsats till Perls motto " det finns flera sätt att göra det " är Pythons filosofi "det borde finnas ett – och helst bara ett – självklart sätt att göra det på" [66] . Alex Martelli , medlem i Python Software Foundation , och författare till böcker om Python skriver att "Att beskriva något som 'smart' anses inte vara en komplimang i Pythonkulturen" [67] .
Python-utvecklare tenderar att undvika för tidig optimering och avvisa patchar till icke-kritiska delar av CPython- referensimplementeringen som skulle erbjuda en marginell ökning av hastigheten på bekostnad av kodtydlighet [68] . Det finns dock sätt att förbättra prestandan. Om programmet har flaskhalsar förknippade med prestanda för resurskrävande operationer på centralprocessorn, men inte förknippade med användning av I/O-operationer, är det möjligt att förbättra prestandan genom att översätta programmet med Cython till C-språket och efterföljande sammanställning [69] . Delar av programmet som kräver beräkningsresurser kan också skrivas om till C-språket och kopplas som separata bibliotek med bindningar till Python [43] .
Ett viktigt mål för Python-utvecklare är att göra det roligt att använda. Detta återspeglades i namnet på språket, som gavs för att hedra Monty Python [53] . Det återspeglas också i det ibland lekfulla förhållningssättet till handledning och referensmaterial, som exempelprogrammen i dokumentationen, som använder namnen spam och ägg istället för namnen som används i dokumentationen för många andra språk foo och bar [70 ] [71] .
Python har porterats och körs på nästan alla kända plattformar, från handdatorer till stordatorer . Det finns portar för Microsoft Windows , nästan alla varianter av UNIX (inklusive FreeBSD och Linux ), Android [72] , Plan 9 , Mac OS och macOS , iPhone OS (iOS) 2.0 och högre, iPadOS , Palm OS , OS/2 , Amiga , HaikuOS , AS/400 , OS/390 , Windows Mobile och Symbian .
När plattformen blir föråldrad upphör dess stöd i huvudgrenen av språket. Till exempel har stöd för Windows 95 , Windows 98 och Windows ME [73] tagits bort sedan version 2.6 . Windows XP stöds inte längre i version 3.5 [74] Windows Vista och Windows 7 stöds inte längre i version 3.9 [75] .
Samtidigt, till skillnad från många bärbara system, för alla större plattformar, har Python stöd för teknologier som är specifika för denna plattform (till exempel Microsoft COM / DCOM ). Dessutom finns det en speciell version av Python för Java Virtual Machine - Jython , som gör att tolken kan köras på alla system som stöder Java , medan Java -klasser kan användas direkt från Python och till och med skrivas i Python. Flera projekt tillhandahåller också integration med Microsoft.NET -plattformen , de viktigaste är IronPython och Python.Net .
Python stöder dynamisk typning , det vill säga typen av en variabel bestäms endast vid körning. Så istället för att "tilldela ett värde till en variabel" är det bättre att prata om att "associera ett värde med något namn". Primitiva typer i Python inkluderar booleskt , heltal med godtycklig precision , flyttal och komplex . Pythons inbyggda behållartyper är string , list , tuple , dictionary och set [49] . Alla värden är objekt, inklusive funktioner, metoder, moduler, klasser.
Du kan lägga till en ny typ antingen genom att skriva en klass (klass) eller genom att definiera en ny typ i en tilläggsmodul (till exempel skriven i C). Klasssystemet stöder arv (enkel och multipel ) och metaprogrammering . Det går att ärva från de flesta inbyggda och tilläggstyper.
Typer som används i PythonSorts | Ombytlighet | Beskrivning | Exempel |
---|---|---|---|
bool | oföränderlig | boolesk typ | True False |
bytearray | föränderlig | Byte array | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105]) |
bytes | oföränderlig | Byte array | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105]) |
complex | oföränderlig | Komplext tal | 3+2.7j |
dict | föränderlig | Dictionary ( associativ array ) är en samling nyckel-värdepar; värdet kan vara av vilken typ som helst, nyckeln måste vara av en hashbar typ | {'key1': 1.0, 3: False} {} |
ellipsis[K 1] | oföränderlig | Ellipsis (ellipsis). Används främst i NumPy för att ge en genväg för att skära en flerdimensionell array. Det finns i själva Python för att stödja anpassade typer och tillägg som NumPy [76] | ... Ellipsis För NumPy : vilket motsvarar [76] x[i, ..., j] x[i, :, :, j] |
float | oföränderlig | Flyttalsnummer . Graden av precision beror på plattformen, men i praktiken implementeras den vanligtvis som ett 64-bitars 53-bitars nummer [77] |
1.414 |
frozenset | oföränderlig | Disordered set , innehåller inga dubbletter; kan innehålla olika hashbara datatyper inuti | frozenset([4.0, 'string', True]) |
int | oföränderlig | Obegränsat heltal [78] | 42 |
list | föränderlig | List , kan innehålla olika typer av data | [4.0, 'string', True] [] |
NoneType[K 1] | oföränderlig | Ett objekt som representerar frånvaron av ett värde, ofta kallat Null på andra språk. | None |
NotImplementedType[K 1] | oföränderlig | Objektet som returneras vid överbelastning av operatörer när operandtyperna inte stöds. | NotImplemented |
range | oföränderlig | En sekvens av heltal från ett värde till ett annat, vanligtvis används för att upprepa en operation flera gånger med för [79] | range(1, 10) range(10, -5, -2) |
set | föränderlig | Disordered set , innehåller inga dubbletter; kan innehålla olika hashbara datatyper inuti | {4.0, 'string', True} set() |
str | oföränderlig | strängtyp | 'Wikipedia' "Wikipedia" """Spänner över flera rader""" |
tuple | oföränderlig | Tuple . Den kan innehålla olika typer av data i sig själv. Kan användas som en oföränderlig lista och som poster med namnlösa fält [80] | Som en oföränderlig lista: Som poster: [80] (4.0, 'string', True) ('single element',) () lax_coordinates = (33.9425, -118.408056) city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) |
Språket har en tydlig och konsekvent syntax, genomtänkt modularitet och skalbarhet , vilket gör källkoden för program skrivna i Python lätt att läsa. När argument skickas till funktioner använder Python call -by-sharing [ 81 ] .
Uppsättningen av operatörer är ganska traditionell.
En av de intressanta syntaktiska egenskaperna hos språket är indragningen av kodblock (mellanslag eller tabbar), så Python har inte start-/ slutparenteser , som i Pascal , eller lockiga klammerparenteser, som i C. Ett sådant "trick" låter dig minska antalet rader och tecken i programmet och lär dig en "bra" programmeringsstil. Å andra sidan kan beteendet och till och med programmets korrekthet bero på de initiala mellanrummen i texten. För dem som är vana vid att programmera på språk med explicit val av början och slutet av block, kan detta beteende till en början verka ointuitivt och obekvämt.
Guido skrev själv [82] :
Den kanske mest kontroversiella egenskapen hos Python är användningen av indrag för att gruppera uttalanden, som är hämtat direkt från ABC . Detta är ett av språkets egenskaper som ligger mig varmt om hjärtat. Detta gör Python-koden mer läsbar på två sätt. För det första minskar användningen av indrag den visuella röran och gör programmen kortare, vilket minskar mängden uppmärksamhet som krävs för att förstå den grundläggande kodenheten. För det andra ger det programmeraren mindre frihet i formateringen, vilket möjliggör en mer konsekvent stil som gör det lättare att läsa andras kod. (Jämför t.ex. tre eller fyra olika konventioner för C -klammer , var och en med starka förespråkare.)
Originaltext (engelska)[ visaDölj] Pythons kanske mest kontroversiella egenskap är dess användning av indrag för uttalandegruppering, som härrör direkt från ABC. Det är ett av språkets egenskaper som ligger mig varmast om hjärtat. Det gör Python-koden mer läsbar på två sätt. För det första minskar användningen av indrag den visuella röran och gör programmen kortare, vilket minskar uppmärksamhetsintervallet som krävs för att ta in en grundläggande kodenhet. För det andra ger det programmeraren mindre frihet i formateringen, vilket möjliggör en mer enhetlig stil, vilket gör det lättare att läsa någon annans kod. (Jämför till exempel de tre eller fyra olika konventionerna för placering av hängslen i C, var och en med starka förespråkare.)Komposition, syntax, associativitet och prioritet för operationer är ganska bekanta för programmeringsspråk och är utformade för att minimera användningen av parenteser. Jämfört med matematik speglar operatorpreferensen det i matematik, med värdetilldelningsoperatorn som =motsvarar den typografiska operatorn ←. Medan operatorpreferens undviker användningen av parenteser i många fall kan det vara tidskrävande att analysera stora uttryck, vilket gör explicita parenteser mer fördelaktiga i sådana fall [45] .
Separat är det värt att nämna formateringsoperationen för strängar (den fungerar i analogi med funktionen printf()från C), som använder samma symbol som att ta resten av divisionen:
>>> str_var = "värld" >>> print ( "Hej, %s " % str_var ) Hej , världI version 3.6 lades formaterade strängliterals eller f-strängar till för att göra koden mer läsbar och koncis:
>>> str_var = "värld" >>> skriv ut ( f "Hej, { str_var } " ) # utdata med f-sträng Hej , världPython har praktiska kedjade jämförelser . Sådana tillstånd i program är inte ovanliga:
1 <= a < 10 och 1 <= b < 20Dessutom är logiska operationer ( oroch and) lata : om den första operanden räcker för att utvärdera värdet av operationen är denna operand resultatet, annars utvärderas den andra operanden av den logiska operationen. Detta är baserat på egenskaperna hos logikens algebra : till exempel, om ett argument för operationen "ELLER" ( or) är sant, är resultatet av denna operation alltid sant. Om den andra operanden är ett komplext uttryck, minskar detta kostnaden för dess beräkning. Detta faktum användes i stor utsträckning fram till version 2.5 istället för den villkorliga konstruktionen:
a < b och "mindre än" eller "större än eller lika med"Inbyggda datatyper har i allmänhet en speciell syntax för sina bokstaver (konst skrivna i källkoden):
"sträng och Unicode-sträng samtidigt" 'sträng och Unicode-sträng samtidigt' """även sträng och Unicode-sträng samtidigt""" Sant eller falskt # booleska bokstaver 3.14 # flyttalnummer 0b1010 + 0o12 + 0xA # tal i binärt , oktalt och hexadecimalt 1 + 2 j # komplext tal [ 1 , 2 , "a" ] # lista ( 1 , 2 , "a" ) # tuppel { 'a' : 1 , 'b' : ' B' } # ordbok { 'a' , 6 , 8.8 } # set lambda x : x ** 2 # anonym funktion ( i för i inom intervallet ( 10 )) # generatorFör listor (och andra sekvenser) erbjuder Python en uppsättning skivningsoperationer. En funktion är indexering, vilket kan verka konstigt för en nybörjare, men avslöjar dess konsistens när du använder den. Listelementindex börjar på noll. Att spela in en skiva s[N:M]innebär att alla element från N inklusive till M, men inte inkluderade, faller in i skivan. I detta fall kan indexet utelämnas. Till exempel s[:M]betyder record att alla element från början faller in i segmentet; notation s[N:]betyder att alla element är inkluderade till slutet av segmentet; rekord s[:]innebär att alla element från början till slutet ingår.
Namnet (identifieraren) kan börja med en bokstav i valfritt alfabet i Unicode , vilket som helst skiftläge eller understreck, varefter siffror också kan användas i namnet. Du kan inte använda nyckelord som ett namn (deras lista kan hittas av import keyword; print(keyword.kwlist)) och det är inte önskvärt att omdefiniera inbyggda namn. Namn som börjar med ett understreck har en speciell betydelse [83] .
Vid varje punkt i programmet har tolken tillgång till tre namnområden (det vill säga namn-till-objekt-mappningar): lokal, global och inbyggd.
Namnomfång kan kapslas in i varandra (namn från det omgivande kodblocket är synliga i den definierade funktionen). I praktiken finns det flera goda seder förknippade med omfattningar och namnbindningar som du kan lära dig mer om i dokumentationen.
Python erbjuder en mekanism för att dokumentera pydoc-kod. I början av varje modul, klass, funktion, infogas en dokumentationssträng - docstring . Dokumentationssträngar finns kvar i koden under körning, och dokumentationsåtkomst [84] (variabel __doc__) är inbyggd i språket, som används av moderna IDE:er ( Integrated Development Environment ) (t.ex. Eclipse ).
Du kan interaktivt få hjälp, generera hypertextdokumentation för en hel modul eller till och med använda för att automatiskt testa en
Python är ett programmeringsspråk med flera paradigm . Objektorienterad , strukturell [85] , generisk , funktionell programmering [27] och metaprogrammering [31] stöds fullt ut . Grundläggande stöd för aspektorienterad programmering tillhandahålls genom metaprogrammering [34] . Många andra tekniker, inklusive kontrakt [86] [87] och logisk programmering [88] , kan implementeras med hjälp av tillägg.
Utformningen av Python-språket är uppbyggd kring en objektorienterad programmeringsmodell. Implementeringen av OOP i Python är väl genomtänkt, men samtidigt ganska specifik jämfört med andra objektorienterade språk . Allt i ett språk är ett objekt, antingen en instans av en klass eller en instans av en metaklass. Undantaget är den inbyggda basmetaklassen type. Så klasser är faktiskt instanser av metaklasser, och härledda metaklasser är instanser av en metaklass type. Metaklasser är en del av begreppet metaprogrammering och ger möjligheten att styra klassarv, vilket gör att du kan skapa abstrakta klasser, registrera klasser eller lägga till valfritt programmeringsgränssnitt till dem inom ett bibliotek eller ramverk [31] .
Klasser representerar i huvudsak en plan eller beskrivning av hur man skapar ett objekt, och lagrar en beskrivning av objektets attribut och metoder för att arbeta med det. OOP-paradigmet är baserat på inkapsling , arv och polymorfism [89] . Inkapsling i Python representeras av förmågan att lagra offentliga och dolda attribut (fält) i ett objekt med tillhandahållande av metoder för att arbeta med dem [89] , medan i själva verket alla attribut är offentliga, men det finns en namnkonvention för att markera dolda attribut [90] . Arv låter dig skapa härledda objekt utan att behöva skriva om kod, och polymorfism är förmågan att åsidosätta alla metoder för ett objekt (i Python är alla metoder virtuella [90] ), såväl som överbelastade metoder och operatorer . Överbelastning av metoder i Python implementeras på grund av möjligheten att anropa samma metod med en annan uppsättning argument [89] . En funktion hos Python är möjligheten att modifiera klasser efter att de har deklarerats, lägga till nya attribut och metoder till dem [45] , du kan även modifiera själva objekten, vilket resulterar i att klasser kan användas som strukturer för att lagra godtycklig data [ 90] .
Python stöder flera arv. Multipelt arv i sig är komplext, och dess implementeringar stöter på problem med att lösa namnkollisioner mellan överordnade klasser och eventuellt återärva från samma klass i en hierarki. I Python anropas metoder enligt metodupplösningsordningen (MRO), som är baserad på C3-lineariseringsalgoritmen [91] , i normala fall behöver man inte veta hur denna algoritm fungerar när man skriver program, samtidigt som förståelse kan krävas när man skapar icke-triviala klasshierarkier [92] .
Funktioner och funktioner som är specifika för Python:
Språk som stöder dynamisk typning och objektorienterad programmering betraktas vanligtvis inte inom ramen för generisk programmering, eftersom generiska programmeringsproblem löses på grund av frånvaron av begränsningar för datatyper [32] [33] . I Python uppnås starkt typad generisk programmering genom att använda språkfunktioner i samband med externa kodanalysatorer [93] såsom Mypy [94] .
Även om Python inte ursprungligen var tänkt som ett funktionellt programmeringsspråk [95] , stöder Python programmering i stil med funktionell programmering, i synnerhet [96] :
Men till skillnad från de flesta språk som är direkt fokuserade på funktionell programmering, är Python inte ett rent programmeringsspråk och koden är inte immun mot biverkningar [96] [97] .
Det finns även speciella paket i Pythons standardbibliotek operatorför functoolsfunktionell programmering [95] .
Python stöder metaprogrammering [98] [31] .
Python-mjukvara (applikation eller bibliotek) är paketerad som moduler, som i sin tur kan paketeras i . Moduler kan finnas både i kataloger och i ZIP-arkiv . Moduler kan vara av två typer till sitt ursprung: moduler skrivna i "ren" Python, och tilläggsmoduler (tilläggsmoduler) skrivna på andra programmeringsspråk. Till exempel har standardbiblioteket en "ren" picklemodul och dess C-motsvarighet: cPickle. Modulen är gjord som en separat fil, och paketet - som en separat katalog. Modulen kopplas till programmet av operatören import. När den väl har importerats representeras en modul av ett separat objekt som ger åtkomst till modulens namnområde. Under programkörning kan modulen laddas om med funktionen reload().
Python stöder full runtime introspektion [99] . Detta innebär att du för alla objekt kan få all information om dess interna struktur.
Användningen av introspektion är en viktig del av det som kallas den pytoniska stilen , och används ofta i Python-bibliotek och ramverk som PyRO , PLY, Cherry, Django och andra, vilket i hög grad sparar tid för programmeraren att använda dem.
De data som behövs för introspektion lagras i speciella attribut. Så, till exempel, kan du få alla användardefinierade attribut för de flesta objekt från ett speciellt attribut - en ordbok (eller ett annat objekt som tillhandahåller ett gränssnitt dict)__dict__
>>> klass x ( objekt ): pass .... >>> f = x () >>> f . attr = 12 >>> print ( f . __dict__ ) { 'attr' : 12 } >>> print ( x . __dict__ ) # eftersom klasser är också instanser av objekttyp # så de stöder denna typ av introspektion { '__dict__' : < attribut '__dict__' av 'x'- objekt > , '__module__' .......Det finns även andra attribut vars namn och syften beror på objektet:
>>> def f (): pass .... >>> f . func_code . co_code # få funktion bytecode 'd \x00\x00 S' >>> f . __class__ # specialattribut - referens till klassen för det givna objektet < typ 'function' >De allra flesta attribut som stödjer introspektion är klassbaserade, och dessa kan i sin tur hämtas från obj.__class__.__dict__. En del av informationen som ärvs från basklassen delas av alla objekt, vilket sparar minne.
För att göra det lättare att få introspektiv information har Python en modul inspect[100] .
>>> def f ( x , y = 10 , ** mp ): passera ... >>> inspektera . getargspec ( f ) ([ 'x' , 'y' ], None , 'mp' , ( 10 ,))Med hjälp av modulen är den newomvända processen möjlig - att bygga ett objekt från dess beståndsdelar i exekveringsstadiet
>>> def f ( i ): returnera j + i .... >>> j = 2 >>> f ( 1 ) 3 >>> importera ny >>> g = ny . function ( f . func_code , { 'j' : 23 }) >>> g ( 1 ) 24Undantagshantering stöds i Python genom de satser try, except, else, finally, raisesom utgör undantagshanteringsblocket. I allmänhet ser blocket ut så här:
prova : # Här är kod som kan ge en undantagshöjning Undantag ( "meddelande" ) # Undantag, detta är en av standardundantagstyperna (bara en klass), # vilken annan kan användas, inklusive din egen utom ( Undantag typ1 , Exception type2 , … ) as Variable : # Koden i blocket exekveras om undantagstypen matchar en av # typerna (ExceptionType1, ExceptionType2, ...) eller är en avkomling av en # av dessa typer. # Det resulterande undantaget är tillgängligt i en valfri variabel. except ( Exception type3 , Exception type4 , … ) som variabel: # Antalet undantagsblock är obegränsat med höjning # Kasta ett undantag " överst " på det mottagna; inga parametrar - omkastning mottagen förutom : # Kommer att exekveras på alla undantag som inte hanteras av inskrivna block förutom annat : # Blockkoden exekveras om inga undantag fångades. finally : # Kommer att köras ändå, möjligen efter ett matchande # utom eller annat blockDelning else, excepthar finallybara varit möjligt sedan Python 2.5. Information om aktuellt undantag finns alltid tillgänglig via sys.exc_info(). Utöver värdet på undantaget sparar Python även stackens tillstånd fram till den punkt där undantaget kastas - den så kallade tracebacken.
Till skillnad från kompilerade programmeringsspråk, i Python, leder användningen av ett undantag inte till betydande overhead (och ofta till och med påskyndar exekveringen av program) och används mycket ofta. Undantag överensstämmer med Pythons filosofi (punkt 10 i " Zen of Python " - "Fel bör aldrig tystas ned") och är ett av sätten att stödja " duck typing ".
Ibland är det bekvämare att använda ett block istället för explicit undantagshantering with(tillgängligt sedan Python 2.5).
Iteratorer används ofta i Python-program. Slingan forkan fungera med både en sekvens och en iterator. De flesta samlingar tillhandahåller iteratorer, iteratorer kan också definieras av användaren på sina egna objekt. Standardbiblioteksmodulen itertoolsinnehåller faciliteter för att arbeta med iteratorer.
En av de intressanta funktionerna i språket är generatorer - funktioner som sparar det interna tillståndet: värdena för lokala variabler och den aktuella instruktionen (se även: coroutines ). Generatorer kan användas som iteratorer för datastrukturer och för lat utvärdering .
När en generator anropas returnerar funktionen omedelbart ett iteratorobjekt som lagrar den aktuella exekveringspunkten och tillståndet för funktionens lokala variabler. När nästa värde begärs (via en metod som next()implicit anropas i loopen for), fortsätter generatorn funktionen från föregående brytpunkt till nästa yieldeller sats return.
Python 2.4 introducerade generatoruttryck , uttryck som resulterar i en generator. Generatoruttryck låter dig spara minne där du annars skulle behöva använda en lista med mellanliggande resultat:
>>> summa ( i för i inom intervallet ( 1 , 100 ) om i % 2 != 0 ) 2500Det här exemplet lägger ihop alla udda tal från 1 till 99.
Från och med version 2.5 stöder Python fullfjädrade samprocedurer: du kan nu skicka värden till en generator med hjälp av en metod send()och ta fram undantag i dess sammanhang med hjälp av throw().
Python stöder även kapslade generatorer. Till exempel, för att skapa en tvådimensionell array måste du placera en listgenerator som är en sträng inuti generatorn av alla strängar:[[0 for j in range(m)] for i in range(n)]
Python 2.5 introducerade verktyg för att hantera exekveringskontexten för ett kodblock - satsen withoch modulen contextlib. Se: exempel .
Operatören kan användas i de fall där vissa andra åtgärder måste utföras före och efter vissa åtgärder, oavsett vilka undantag eller uttalanden som kastas i blocket return: filer måste stängas, resurser måste frigöras, standardinmatningsomdirigering har avslutats, etc. Operatören förbättrar läsbarhetskoden, vilket innebär att den hjälper till att förhindra fel.
Funktionsdekoratörer är anropsbara objekt som tar en annan funktion som argument. Funktionsdekoratörer kan utföra operationer på en funktion och returnera antingen själva funktionen eller en annan funktion som ersätter den, eller ett anropsbart objekt. Det vill säga, om en dekoratör som heter dekorera tidigare skrevs i koden, då är följande kod [101] :
@decorate def target (): print ( 'running target()' )motsvarar detta [101] :
def target (): print ( 'running target()' ) target = dekorera ( target )Ett exempel på användning av funktionen dekorator [101] :
>>> def deco ( func ): ... def inre (): ... print ( 'running inner()' ) ... return inre … >>> @deco ... def target (): .. .print ( 'running target()' ) >>> target () running inner() >>> target <function deco.<locals> .inner at 0.10063b598>Det finns klassdekoratörer [102] .
Det reguljära uttrycksformatet ärvs från Perl med vissa skillnader. För att använda dem måste du importera modulen re[103] , som är en del av standardbiblioteket.
Det rika standardbiblioteket är en av Pythons attraktioner. Det finns verktyg för att arbeta med många nätverksprotokoll och internetformat , till exempel moduler för att skriva HTTP-servrar och klienter, för att analysera och skapa e-postmeddelanden, för att arbeta med XML , etc. En uppsättning moduler för att arbeta med operativsystemet låter dig att skriva plattformsoberoende applikationer. Det finns moduler för att arbeta med reguljära uttryck , textkodningar , multimediaformat , kryptografiska protokoll, arkiv, dataserialisering , enhetsteststöd etc.
Utöver standardbiblioteket finns det många bibliotek som tillhandahåller ett gränssnitt till alla systemsamtal på olika plattformar; i synnerhet på Win32-plattformen stöds alla Win32 API- anrop , såväl som COM- anrop i den utsträckning som inte är mindre än Visual Basic eller Delphi . Antalet applikationsbibliotek för Python inom olika områden är bokstavligen enormt ( webb , databaser , bildbehandling, ordbehandling, numeriska metoder , operativsystemapplikationer , etc.).
För Python har databasprogrammeringsgränssnittsspecifikationen DB-API 2 antagits och paket som motsvarar denna specifikation har utvecklats för åtkomst av olika DBMS : Oracle , MySQL , PostgreSQL , Sybase , Firebird ( Interbase ), Informix , Microsoft SQL Server och SQLite . På Windows -plattformen är tillgång till databasen möjlig via ADO ( ADOdb ). Det kommersiella mxODBC-paketet för DBMS-åtkomst via ODBC för Windows- och UNIX -plattformar utvecklades av eGenix [105] . Många ORM:er har skrivits för Python ( SQLObject , SQLAlchemy , Dejavu, Django ), ramverk för att utveckla webbapplikationer har implementerats ( Django , Pylons , Pyramid ).
NumPy - biblioteket för att arbeta med flerdimensionella arrayer kan ibland uppnå vetenskaplig prestanda jämförbar med specialiserade paket. SciPy använder NumPy och ger tillgång till ett brett utbud av matematiska algoritmer (matrisalgebra - BLAS nivåer 1-3, LAPACK , FFT ...). Numarray [106] är speciellt utformad för operationer med stora mängder vetenskaplig data.
WSGI [107] är ett gateway-gränssnitt med en webbserver (Python Web Server Gateway Interface).
Python tillhandahåller ett enkelt och bekvämt C API för att skriva dina egna moduler i C och C++ . Ett verktyg som SWIG låter dig nästan automatiskt få bindningar för att använda C/C++-bibliotek i Python-kod. Möjligheterna hos detta och andra verktyg sträcker sig från att automatiskt generera (C/C++/Fortran)-Python-gränssnitt från specialfiler (SWIG, pyste [108] , SIP [109] , pyfort [110] ), till att tillhandahålla mer bekväma API:er (boost :: python [111] [112] , CXX [113] , Pyhrol [114] , etc.). Ctypes standardbiblioteksverktyg tillåter Python-program att direkt komma åt dynamiska bibliotek / DLL:er skrivna i C. Det finns moduler som låter dig bädda in C/C++-kod direkt i Python-källfilerna genom att skapa tillägg i farten (pyinline [115] , väv [116] ).
Ett annat tillvägagångssätt är att bädda in Python-tolken i applikationer. Python integreras enkelt i Java, C/C++, OCaml- program . Interaktion av Python-applikationer med andra system är också möjlig med CORBA , XML-RPC , SOAP , COM.
Med hjälp av Cython- projektet är det möjligt att översätta program skrivna på Python- och Pyrex -språken till C-kod med efterföljande kompilering till maskinkod. Cython används för att förenkla skrivningen av Python-bibliotek, när man använder det noteras det att koden är snabbare och omkostnaderna minskar.
Shedskins experimentella projekt innebär att skapa en kompilator för att omvandla implicit typade Python-program till optimerad C++-kod. Sedan version 0.22 låter Shedskin dig kompilera individuella funktioner till tilläggsmoduler.
Python och de allra flesta av dess bibliotek är gratis och kommer i källkod. Dessutom, till skillnad från många öppna system, begränsar licensen inte användningen av Python i kommersiell utveckling på något sätt och ålägger inte några andra skyldigheter än att ange upphovsrätt.
En av kanalerna för att distribuera och uppdatera paket för Python är PyPI ( Python Package Index ) .
Python kommer med ett Tcl / Tk - baserat tkinter- bibliotek för att bygga gränsöverskridande GUI -program .
Det finns tillägg som låter dig använda alla stora GUI-bibliotek - wxPython [117] , baserade på wxWidgets-biblioteket , PyGObject för GTK [118] , PyQt och PySide för Qt , och andra. Vissa av dem tillhandahåller också omfattande databas-, grafik- och nätverksmöjligheter, och drar full nytta av biblioteket de är baserade på.
För att skapa spel och applikationer som kräver ett icke-standardgränssnitt kan du använda Pygame- biblioteket . Den tillhandahåller också omfattande multimediaverktyg : med hjälp av den kan du styra ljud och bilder, spela upp videor. OpenGL -grafikhårdvaruaccelerationen som tillhandahålls av pygame har ett gränssnitt på högre nivå än PyOpenGL [119] , som kopierar semantiken i OpenGL C-biblioteket. Det finns också PyOgre [120] som ger en länk till Ogre , ett objektorienterat 3D-grafikbibliotek på hög nivå. Dessutom finns det ett pythonOCC-bibliotek [121] som ger en länk till OpenCascade 3D-modellerings- och simuleringsmiljön [122] .
För att arbeta med rastergrafik används Python Imaging Library .
PyCairo används för att arbeta med vektorgrafik .
Det finns moduler som låter dig styra typerna av funktionsparametrar vid körning, till exempel typkontroll [123] eller metodsignaturkontroll av dekoratorer [124] . En valfri typdeklaration för funktionsparametrar lades till i Python 3, tolken kontrollerar inte typer, utan lägger bara till lämplig information till funktionsmetadata för efterföljande användning av denna information av tilläggsmoduler [125] .
Funktionsöverbelastning implementeras av olika tredjepartsbibliotek, inklusive PEAK [126] [127] . Planer som inte accepterades för överbelastningsstöd i Python3000 [128] implementerades delvis i overloading-lib [129] .
Wikiversity- artikeln " Python-programexempel " innehåller exempel på små program som visar några av funktionerna i Python-språket och dess standardbibliotek.
Hej världen! ' kan skrivas på en rad:
print ( "Hej världen!" )Beräknar fakulteten för talet 10 (10!):
def factorial ( n ): om n < 0 : höj ArithmeticError ( 'Faktoriet för ett negativt tal.' ) f = 1 för i i intervallet ( 2 , n + 1 ): f *= i returnerar f print ( faktoriell ( 10 )) # 3628800Implementering med rekursion :
def factorial ( n ): om n < 0 : höj ArithmeticError ( 'Faktoriet för ett negativt tal.' ) om ( n == 0 ) eller ( n == 1 ): returnera 1 annat : returnera faktorial ( n - 1 ) * n print ( faktoriell ( 10 ))Python-standardbiblioteket tillhandahåller en profilerare (modul profile) som kan användas för att samla in statistik om körtiden för enskilda funktioner. För att bestämma vilken version av koden som körs snabbare kan du använda timeit. Mätningarna i följande program låter oss ta reda på vilket av strängsammansättningsalternativen som är mer effektivt:
från timeit import Timer tmp = "Python 3.2.2 (standard, 12 juni 2011, 15:08:59) [MSC v.1500 32 bitar (Intel)] på win32." def case1 (): # A. inkrementella sammanlänkningar i en slinga s = "" för i i intervallet ( 10000 ): s += tmp def case2 (): # B. genom en mellanliggande lista och sammanfogningsmetod s = [] för i i intervallet ( 10000 ): s . lägg till ( tmp ) s = "" . gå med _ _ def case3 (): # B. lista uttryck och join-metoden returnerar "" . join ([ tmp för i inom intervallet ( 10000 )]) def case4 (): # D. generator uttryck och join metod returnerar "" . join ( tmp för i inom intervallet ( 10000 )) för v i intervallet ( 1 , 5 ): print ( Timer ( "func()" , " från __main__ importera fallet %s som func" % v . timeit ( 200 ))Liksom alla programmeringsspråk har Python sina egna kodoptimeringstekniker . Du kan optimera koden baserat på olika (ofta konkurrerande med varandra) kriterier (ökning i prestanda, minskning av mängden erforderlig RAM, källkodens kompakthet, etc.). Oftast är program optimerade för körningstid.
Det finns flera regler som är självklara för erfarna programmerare.
Python har följande funktioner och tillhörande optimeringsregler.
Ett verktyg som heter Pychecker [130] hjälper dig att analysera din Python-källkod och ge rekommendationer om problem som hittas (till exempel oanvända namn, ändra signaturen för en metod när den är överbelastad, etc.). Under en sådan statisk analys av källkoden kan även fel upptäckas. Pylint [131] syftar till att lösa liknande problem, men tenderar att kontrollera kodstil, hitta kod med lukt [132] .
Valet av språk beror vanligtvis på de uppgifter som ska lösas, språkens egenskaper och tillgången på bibliotek som krävs för att lösa problemet. Samma uppgift skriven på olika språk kan variera mycket när det gäller exekveringseffektivitet, inklusive skillnader när den körs på olika operativsystem eller när du använder olika kompilatorer. I allmänhet kan språk delas in i tolkade (skript), kompileras till en mellanrepresentation och kompileras, vilket påverkar prestanda och minnesförbrukning. Python brukar kallas tolkad. Individuella språk kan också ha sina egna styrkor, i fallet med Python sticker det lätt att skriva program ut [133] .
Python jämförs med C++/Java när det gäller koncishet, enkelhet och flexibilitet hos Python [134] . Man kan jämföra " Hej världen "-program skrivna på vart och ett av språken [134] .
Jämförelse av program "Hej världen!"C++ [134] | Java [134] | Python [134] |
---|---|---|
#include <iostream> int main () { std :: cout << "Hej världen!" << std :: endl ; returnera 0 ; } | public class HelloClass { public static void main ( String [ ] args ) { System . ut . println ( "Hej världen!" ); } } | print ( "Hej världen!" ) |
När det gäller OOP, i Python, till skillnad från C ++ och Java, finns det inga åtkomstmodifierare till klassfält och metoder, attribut och fält för objekt kan skapas i farten under programkörning, och alla metoder är virtuella. Jämfört med Java tillåter Python även operatörsöverbelastning, vilket gör det möjligt att använda uttryck som är nära naturliga [134] . Sammantaget förenklar Pythons tillvägagångssätt för OOP programmering, gör koden mer begriplig och ger samtidigt flexibilitet till språket [134] . Å andra sidan är Python-kod (liksom andra tolkade språk) mycket långsammare än motsvarande C++-kod [135] och förväntas i allmänhet vara långsammare än Java [136] . C++-kod är mer produktiv än Python, samtidigt som den tar upp fler rader. Enligt forskning om algoritmer som används inom bioinformatik har Python visat sig vara mer flexibel än C++, och Java har visat sig vara en kompromiss mellan prestandan hos C++ och flexibiliteten hos Python [133] .
I Java och Python skapas alla objekt på heapen , medan C++ tillåter att objekt skapas både på heapen och på stacken , beroende på vilken syntax som används [137] . Prestandan påverkas också av hur data i minnet nås. I C++ och Java nås data med konstanta förskjutningar i minnet, medan det i Python sker genom hash-tabeller . Användningen av pekare i C++ kan vara ganska svår för nybörjare att förstå, och det kan ta lite tid att bemästra korrekt användning av pekare [133] .
Go och Python är drastiskt olika språk, men de jämförs ofta med varandra på grund av deras gemensamma nisch - backend av webbapplikationer. Som Jason Kincaid uttrycker det, kombinerar Go "prestandan och säkerheten för kompilerade språk som C++ med utvecklingshastigheten i dynamiska språk som Python" [138] . Till viss del stämmer detta: Go designades ursprungligen som ett starkt statiskt skrivet kompilerat språk som stöder de maximala funktionerna hos dynamiska språk, där det fortfarande är möjligt att säkerställa effektiv kompilering och upprätthålla prestanda för kompilerade program. Gemensamt för båda språken är användningen av automatisk minneshantering, närvaron av inbyggda dynamiska samlingar (arrayer och ordböcker), stöd för skivor, en utvecklad modulmekanism och en enkel och minimalistisk syntax. Det finns många fler skillnader, och det är inte alltid möjligt att tydligt ange vilket av språken de talar.
dynamiska möjligheter. Om Python är ett helt dynamiskt språk och nästan alla element i programmet kan ändras under körning, inklusive att konstruera nya typer i farten och modifiera befintliga, så är Go ett statiskt språk med ganska begränsade reflektionsmöjligheter som bara fungerar med avseende på datatyper skapas under utvecklingen. Till viss del är en ersättning för dynamiska funktioner i Go kodgenerering, som tillhandahålls av enkelheten i syntaxen och tillgången på nödvändiga verktyg och systembibliotek. Det är också planerat att lägga till stöd för generika i Go 2.0. Objektorienterad programmering. Python bygger på "allt-objekt"-ideologin och har många OOP-mekanismer, inklusive sällsynta och atypiska. Go är ett ganska typiskt modulärt procedurprogrammeringsspråk, där OOP-funktioner är begränsade till stödjande gränssnitt och möjligheten att bädda in strukturer och gränssnitt. Faktum är att Go inte ens har ett fullfjädrat arv. Därför, om Python uppmuntrar programmering i OOP-stil, med konstruktion av trädliknande beroenden mellan klasser och aktiv användning av arv, så fokuserar Go på komponentmetoden: komponenternas beteende bestäms av gränssnitt, som kanske inte ens vara relaterade till varandra, och implementeringen av gränssnitt placeras i struct-typer . "Duck typing" implementerad i Go leder till att det inte ens finns formella syntaktiska länkar mellan gränssnitt och strukturerna som implementerar dem. Parallell programmering. Till stöd för parallell programmering är Python betydligt sämre än Go. Först och främst är GIL i Python ett hinder för effektiv användning av system med ett stort antal (tiotals eller fler) fysiska processorkärnor. Ett annat problem är bristen på effektiva inbyggda medel för interaktion mellan parallella trådar. Go innehåller en primitiv goroutinspråk som låter dig skapa "lätta" trådar och syntaxstödda pipes som låter trådar kommunicera. Som ett resultat, när man skapar till exempel kösystem i Go, är det inte ett problem att använda hundratals eller till och med tusentals samtidigt befintliga trådar, dessutom med normal laddning av ett valfritt antal tillgängliga processorkärnor, medan ingen av de befintliga Python-implementationer kommer att säkerställa effektiv drift av ett sådant antal trådar. . Felhantering, undantag. Python stöder undantagshantering, medan Go implementerar mekanismer för att explicit returnera felkoder från funktioner och hantera dem på anropsplatsen. Denna skillnad kan bedömas på olika sätt. Å ena sidan är undantag en bekväm och välbekant mekanism för att hantera programfel, vilket gör att du kan koncentrera denna bearbetning i utvalda kodfragment och inte "smeta ut" den genom hela programtexten. Å andra sidan känner författarna till Go att programmerare alltför ofta ignorerar felhantering och förlitar sig på att undantaget kastas för att hanteras någon annanstans; i distribuerade applikationer skickas undantag ofta inte mellan systemkomponenter och leder till oväntade misslyckanden, och i flertrådade applikationer kan ett ohanterat undantag i en tråd leda till blockering eller omvänt till en programkrasch. Visuella möjligheter, syntax. Python ger fler språkfunktioner och primitiver som är bekväma för snabb utveckling än Go. Detta beror till stor del på det faktum att utvecklarna av Go medvetet vägrade att inkludera några "fashionabla" funktioner i språket, av vilka några ansågs provocera fel, andra maskerade en medvetet ineffektiv implementering. Till exempel, närvaron på språket av en enkel operation för att infoga ett element i mitten av en array provocerar dess frekventa användning, och varje sådan operation kräver, som ett minimum, flytta "svansen" på arrayen i minnet, och ibland det kan kräva att allokera minne och flytta hela arrayen. Prestanda. När det gäller prestanda i de flesta tester som implementerar typiska uppsättningar av backend-operationer (frågebehandling, webbsidesgenerering), överträffar Go Python med flera gånger till flera storleksordningar. Detta är inte förvånande med tanke på språkets statiska karaktär och det faktum att Go-program kompileras direkt i koden för målplattformen. I system där den mesta tiden går åt till att köra databasfrågor eller överföra information över nätverket är detta inte nödvändigt, men i högt belastade system som behandlar ett stort antal förfrågningar är fördelen med Go obestridlig. Skillnaderna i prestanda för Go- och Python-program påverkas också av skillnaderna i implementeringen av parallellism som noterats ovan.Båda språken tolkas, sammanställs till en mellanrepresentation, som sedan skickas för exekvering. I fallet med Python genereras en mellanbytekod, medan Perl-kompilatorn genererar ett syntaxträd. Minneshantering på båda språken är automatisk, och själva språken används som skriptspråk och är väl lämpade för att skriva webbapplikationer. Python-kodningsmetoden innebär en bättre förståelse av programlistning på bekostnad av prestanda, medan Perl har mer frihet i syntax, vilket kan göra Perl-program oläsliga för icke-Perl-programmerare [133] .
Lua är ett enkelt språk som ursprungligen utformats för att vara inbäddat i programvara och används för att automatisera komplexa operationer (som bots beteende i datorspel). Python kan även användas inom dessa områden, den konkurrerar även med Lua i att skriva skript för automatisering av dator- och operativsystemhantering och i icke-professionell självprogrammering. Under de senaste åren har båda språken införlivats i mobila enheter som programmerbara miniräknare.
Båda språken är dynamiska, tolkade, stöder automatisk minneshantering och har standardmetoder för att interagera med programvara skriven på andra språk (främst C och C++). Lua-körtiden är mer kompakt och kräver färre resurser att köra än Python, vilket ger Lua en fördel vid inbäddning. Precis som Python stöder Lua kompilering av källkod till virtuell maskinkörbar bytekod. Det finns en JIT-kompilatorimplementering för Lua.
Lua är enklare än Python och har en mer klassisk Pascal-liknande syntax. Det finns bara åtta inbyggda datatyper i språket, och alla strukturerade typer (strukturer, uppräkningar, arrayer, uppsättningar) är modellerade utifrån en enda inbyggd tabelltyp, som egentligen är en heterogen ordbok. OOP är implementerat på tabeller och bygger på en prototypmodell, som i JavaScript. Python ger fler alternativ, och dess strukturerade datatyper har var sin implementering, vilket förbättrar prestandan. OOP-möjligheterna i Python är mycket bredare, vilket ger en fördel när man skriver komplexa program, men har liten effekt på kvaliteten och prestandan hos enkla skript som Lua är fokuserad på.
Python, MATLAB och R används i databehandling och för att lära eleverna grunderna i matematik och statistik. R är ett språk för att utföra statistiska beräkningar, medan MATLAB kan betraktas som ett programmeringsspråk tillsammans med Python [139] .
Python, som ett mycket populärt programmeringsspråk, har påverkat följande språk:
Klassisk Python har en nackdel gemensam med många andra tolkade språk - den relativt långsamma exekveringshastigheten för program [147] . Till viss del förbättras situationen genom att spara bytekoden (tillägg .pycoch, före version 3.5, .pyo), vilket gör att tolken inte kan lägga tid på att analysera modulens text vid varje start.
Det finns implementeringar av Python-språket som introducerar högpresterande virtuella maskiner (VM) som en kompilatorbackend. Exempel på sådana implementeringar är PyPy , som är baserad på RPython; ett tidigare initiativ är Papegojaprojektet . Det förväntas att användningen av virtuella datorer av LLVM-typ kommer att leda till samma resultat som användningen av liknande tillvägagångssätt för Java-språkimplementeringar, där dålig beräkningsprestanda till stor del övervinns [148] . Vi får dock inte glömma att Pythons dynamiska karaktär gör det oundvikligt att ytterligare omkostnader uppstår under programexekveringen, vilket begränsar prestanda för Python-system, oavsett vilken teknik som används. Som ett resultat används lågnivåspråk för att skriva kritiska delar av koden, med vilken integration tillhandahålls av många program och bibliotek (se ovan).
I den mest populära implementeringen av Python-språket är tolken ganska stor och mer resurskrävande än i liknande populära implementeringar av Tcl , Forth , LISP eller Lua , vilket begränsar dess användning i inbäddade system. Python har dock porterats till några relativt lågpresterande plattformar. .
Python-tolken i CPython (liksom Stackless och PyPy [149] ) använder tråd-osäkra data, för att undvika förstörelse av vilka, när de modifieras gemensamt från olika trådar, ett globalt tolklås tillämpas - GIL (Global Interpreter Lock) [150 ] : under kodexekvering, en tråd Tolken låser GIL, exekverar under en fast tidsperiod (standard 5 millisekunder [K 2] ) ett antal instruktioner, släpper sedan låset och pausar för att tillåta andra trådar att köra. GIL frigörs också under I/O, ändrar och kontrollerar tillståndet för synkroniseringsprimitiver, vid exekvering av tilläggskod som inte kommer åt tolkdata, såsom NumPy / SciPy . Således kan endast en tråd med Python-kod köras i en enda Python-tolkprocess åt gången, oavsett antalet tillgängliga processorkärnor.
Prestationsstraffet från GIL beror på programmens natur och systemets arkitektur. De flesta program är enkeltrådade eller kör bara ett fåtal trådar, av vilka några är inaktiva vid varje givet tillfälle. Persondatorer har vanligtvis ett litet antal processorkärnor, som laddas av processer som körs parallellt i systemet, så den verkliga prestandaförlusten på persondatorer på grund av GIL är liten. Men i serverapplikationer kan det vara bekvämt att använda dussintals och hundratals (eller till och med fler) parallella trådar (till exempel i kösystem, där varje tråd behandlar data för en separat användarförfrågan), och servrar i slutet av 2010-talet har ofta dussintals och till och med hundratals processorkärnor, det vill säga de kan tekniskt förse dessa trådar med fysiskt samtidig exekvering; under sådana förhållanden kan GIL leda till en riktigt betydande minskning av den totala prestandan, eftersom det berövar programmet förmågan att fullt ut använda resurserna i flerkärniga system.
Guido van Rossum sa att GIL "inte är så illa" och kommer att finnas i CPython tills "någon annan" kommer med en icke-GIL Python-implementation som gör enkeltrådade skript lika snabba [153] [154] .
Utvecklingsuppgifterna inkluderar arbete med att optimera GIL [155] . Det finns inga planer på att fasa ut GIL inom en snar framtid, eftersom alternativa mekanismer på enkeltrådade applikationer, som är majoriteten, är långsammare eller förbrukar mer resurser:
En radikal lösning på problemet kan vara att byta till Jython och IronPython som körs på virtuella Java-maskiner och .NET/Mono: dessa implementeringar använder inte GIL alls.
Medan en av Pythons uttalade designprinciper är principen om minsta överraskning , pekar kritiker på ett antal arkitektoniska val som kan vara förvirrande eller förvirrande för programmerare som är vana vid andra vanliga språk [162] . Bland dem:
Jämfört med Ruby och vissa andra språk saknar Python förmågan att modifiera inbyggda klasser som int, str, float, listandra, vilket dock gör att Python kan förbruka mindre RAM och köra snabbare. Ett annat skäl för att införa en sådan begränsning är behovet av att samordna med utbyggnadsmoduler. Många moduler (för att optimera prestanda) konverterar Python elementära typer till motsvarande C-typer istället för att manipulera dem genom C API. Det eliminerar också många potentiella fallgropar från okontrollerad dynamisk överstyrning av inbyggda typer.
CPython är den huvudsakliga implementeringen av språket. Den är skriven i C och är portabel över plattformar. Grunden för minneshantering är användningen av en kombination av referensräknare och en sophämtare som ansvarar för att hitta cykliska referensfångster [42] . Även om språket anses tolkat, kompileras det faktiskt till en mellanliggande högnivåbytekod [166] [167] , som sedan exekveras genom en virtuell stackmaskin [42] . Till exempel kan ett funktionsanrop print()representeras som [167] :
1 0 LOAD_NAME 0 ( skriv ut ) 2 LOAD_CONST 0 ( ' Hej världen ! ' ) 4 CALL_FUNCTION 1 6 RETURN_VALUENamn i språket är senbundna, vilket innebär att du kan skriva anrop till variabler, metoder och attribut som ännu inte existerar, men som måste deklareras vid exekvering av koden som använder dem. Varje objekt i Python har en hashtabellsordbok, genom vilken attributnamn jämförs med deras värden. Globala variabler kartläggs också via en ordbok. Ett enda anrop till en metod eller ett attribut kan följas av en alternativ uppslagning i flera ordböcker [42] .
PyPy är en Python-implementation skriven i RPython (en delmängd av Python med mycket mindre dynamiska möjligheter). Låter dig enkelt testa nya funktioner. PyPy, förutom standard CPython, innehåller funktionerna Stackless, Psyco , AST modifiering i farten och mycket mer. Projektet integrerar möjligheterna att analysera Python-kod och översättning till andra språk och bytekoder för virtuella maskiner ( C , LLVM , Javascript , .NET sedan version 0.9.9). Med start från 0.9.0 är det möjligt att helt automatiskt översätta RPython till C, vilket resulterar i en hastighet som är acceptabel för användning (2-3 gånger lägre än CPython med JIT inaktiverat för version 0.9.9). Som standard kommer PyPy med en inbyggd JIT-kompilator, med vilken den kan köras mycket snabbare än CPython.
Jython är en Python-implementation som kompilerar Python -kod till Java-bytekod som kan köras av JVM . Den kan också användas för att importera en klass vars källkod skrevs i Java som en modul för Python [168] .
Det finns även andra implementeringar.
Flera specialiserade underuppsättningar av språket har skapats baserat på Python, främst avsedda för statisk kompilering till maskinkod. Några av dem är listade nedan.
Liksom Lisp och Prolog kan Python användas interaktivt, där satser som skrivs in från tangentbordet omedelbart exekveras och resultatet visas på skärmen ( REPL ). Det här läget är praktiskt både när man lär sig ett språk och under den professionella utvecklingsprocessen - för att snabbt testa individuella kodfragment - eftersom det ger omedelbar feedback. Det låter dig också använda tolken som en miniräknare med en stor uppsättning funktioner.
Nästan alla Python IDE:er stöder REPL för snabb testning.
Det finns flera specialiserade IDE för Python-utveckling.
Dessutom finns det plug-ins för att stödja Python-programmering för de universella IDE:erna Eclipse , KDevelop och Microsoft Visual Studio , samt stöd för syntaxmarkering, kodkomplettering och felsöknings- och startverktyg för ett antal vanliga textredigerare.
Python är ett stabilt och utbrett språk. Det används i många projekt och i olika kapaciteter: som ett huvudprogrammeringsspråk eller för att skapa tillägg och integrera applikationer. Ett stort antal projekt har implementerats i Python, och det används också aktivt för att skapa prototyper för framtida program.
Python är ett lätt språk att lära sig, och lärs ofta ut som ett första språk [27] , inklusive när man lär barn hur man programmerar [185] . Som förstaspråk är det väl lämpat eftersom program i det ligger nära det naturliga språk som folk är vana vid att tänka på, och ett minsta antal nyckelord krävs för att skriva ett korrekt program. I andra språk, som C++ , finns det ett stort antal olika syntaxer och språkelement som man måste vara uppmärksam på istället för att studera algoritmer [134] .
Som en öppen källkodsapplikation används Python-tolken över hela världen och levereras med Linux-baserade operativsystem och Apple-datorer . Python är populärt bland enskilda utvecklare, men används även av stora företag i ganska seriösa, vinstorienterade produkter [186] . Reddit [46] är skriven i Python . Dropbox har också en stark användning av Python, och på grund av komplexiteten med dynamisk typning och den stora mängden kod har företaget gått över till statisk typning med open source-projektet Mypy [187] Python används också flitigt på Facebook [188 ] och Instagram [189] . Många företag använder Python för hårdvarutestning, dessa företag inkluderar Intel , Cisco , Hewlett-Packard och IBM . Industrial Light & Magic och Pixar använder det i sina animerade filmer [186] .
Språket används flitigt av Google i sin sökmotor, och Youtube är till stor del skrivet med Python [186] [190] . Dessutom har Google sponsrat utvecklingen av Python sedan 2010 [191] [192] och stödet av PyPI , huvudpaketets distributionssystem för Python [191] [193] .
Styrkan med Python är dess modularitet och förmågan att integrera med andra programmeringsspråk, inklusive som en del av komplexa komplexa applikationer och system [194] . Kombinationen av enkelhet och koncisthet med ett stort antal funktioner gör Python till ett bekvämt skriptspråk . . Många projekt tillhandahåller ett Python API för skript, såsom Autodesk Maya [186] , Blender [195] och Houdini [196] 3D-modelleringsmiljöer och det fria geografiska informationssystemet QGIS [197] . Vissa projekt implementerar kärndelen i mer produktiva programmeringsspråk och tillhandahåller ett fullfjädrat API i Python för att förenkla arbetet. . Således är motorn för den fria videoredigeraren OpenShot implementerad i form av biblioteket libopenshot , skrivet i C ++ med C-bibliotek, och alla möjligheter täcks helt av Python API [198][ betydelsen av faktum? ] . US National Security Agency använder Python för dataanalys, och NASA använder det för vetenskapliga ändamål [186] . Av de verktyg som används på NASA kan man notera den kostnadsfria grafiska nätverkssimulatorn GNS3 , som även har visat sig i en företagsmiljö och används i teknikföretag, till exempel hos Intel [199] . Cura [200] [201] är också skriven i Python, ett gratis och populärt program för att klippa 3D-modeller för utskrift på 3D-skrivare .
Python, med paketen NumPy , SciPy och MatPlotLib , används aktivt som en allmän vetenskaplig datormiljö som en ersättning för vanliga specialiserade kommersiella paket som Matlab , vilket ger liknande funktionalitet och en lägre ingångströskel [202] . För det mesta är det grafiska programmet Veusz också skrivet i Python.[203] , som låter dig skapa högkvalitativ grafik redo för publicering i vetenskapliga publikationer [204][ betydelsen av faktum? ] . Astropy -biblioteket är ett populärt verktyg för astronomiska beräkningar [205][ betydelsen av faktum? ] .
Python är också lämplig för att utföra icke-standardiserade eller komplexa uppgifter i projektbyggsystem , vilket beror på bristen på behovet av att förkompilera källfiler. Google Test- projektet använder det för att generera skenkod för C++- klasser [206][ betydelsen av faktum? ] .
Python-tolken kan användas som ett kraftfullt skal- och skriptspråk för att skriva OS-batchfiler. Den enkla åtkomsten från Python-skript till externa program och tillgången på bibliotek som ger tillgång till systemhantering gör Python till ett bekvämt verktyg för systemadministration [207] . Det används ofta för detta ändamål på Linux-plattformen: Python följer vanligtvis med systemet, i många distributioner är installationsprogrammen och det visuella gränssnittet för systemverktyg skrivna i Python. Det används också i administrationen av andra Unix-system, i synnerhet Solaris och macOS [207] . Den plattformsoberoende karaktären hos själva språket och biblioteken gör det attraktivt för enhetlig automatisering av systemadministrationsuppgifter i heterogena miljöer där datorer med olika typer av operativsystem används tillsammans.
Eftersom Python är ett allmänt språk är det tillämpligt på nästan alla verksamhetsområden. Faktum är att Python används av nästan alla välrenommerade företag på ett eller annat sätt, både för dagliga uppgifter och i testning, administration eller mjukvaruutveckling [186] .
Pytonorm | |
---|---|
gemenskap | |
Genomföranden | |
Övrig |
|
Programmeringsspråk | |
---|---|
|
![]() | ||||
---|---|---|---|---|
Ordböcker och uppslagsverk | ||||
|