Python | |
---|---|
Sprog klasse | objektorienteret programmeringssprog |
Dukkede op i | 20. februar 1991 [17] |
Forfatter | Guido van Rossum [1] |
Udvikler | Python Software Foundation og Guido van Rossum [1] |
Filtypenavn _ | .py, [18] , [19] , [20] , [21] , [22] eller [23].pyc.pyd.pyo.pyw.pyz.pyi |
Frigøre |
|
Blev påvirket | 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-licens [1] |
Internet side | python.org _ |
Platform | Microsoft Windows |
OS | tværplatform [24] |
Mediefiler på Wikimedia Commons |
Python ( IPA : [ˈpʌɪθ(ə)n] ; på russisk er der navne python [25] eller python [26] ) er et alment programmeringssprog på højt niveau med dynamisk stærk indtastning og automatisk hukommelsesstyring [27] [28 ] , fokuseret på at forbedre udviklerproduktivitet, kodelæsbarhed og kvalitet og sikre overførsel af programmer skrevet på den [29] . Sproget er fuldstændig objektorienteret i den forstand, at alt er et objekt [27] . Et usædvanligt træk ved sproget er indrykning af hvide mellemrum af kodeblokke [30] . Syntaksen i kernesproget er minimalistisk, hvorfor der i praksis sjældent er behov for at henvise til dokumentationen [29] . Sproget i sig selv er kendt som fortolket og bruges blandt andet til at skrive manuskripter [27] . Ulemperne ved sproget er ofte lavere hastighed og højere hukommelsesforbrug af programmer skrevet i det sammenlignet med lignende kode skrevet på kompilerede sprog som C eller C++ [27] [29] .
Python er et multi-paradigme programmeringssprog, der understøtter imperativ , proceduremæssig , struktureret , objektorienteret programmering [27] , metaprogrammering [31] og funktionel programmering [27] . Generiske programmeringsproblemer løses gennem dynamisk indtastning [32] [33] . Aspekt-orienteret programmering understøttes delvist af dekoratører [34] , mere komplet support ydes af yderligere rammer [35] . Teknikker som kontrakt- og logikprogrammering kan implementeres ved hjælp af biblioteker eller udvidelser [36] . De vigtigste arkitektoniske funktioner er dynamisk typning , automatisk hukommelsesstyring [27] , fuld introspektion , undtagelseshåndteringsmekanisme , understøttelse af multi- threaded beregninger med global fortolkerlås ( GIL ) [37] , datastrukturer på højt niveau . Opdeling af programmer i moduler understøttes , som igen kan kombineres til pakker [38] .
Python- referenceimplementeringen er CPython- fortolkeren , som understøtter de mest udbredte platforme [39] og er de facto sprogstandarden [40] . Den distribueres under den gratis Python Software Foundation License , som giver dig mulighed for at bruge den uden begrænsninger i enhver applikation, inklusive proprietær [41] . CPython kompilerer kildekoden til bytekode på højt niveau , der kører i en virtuel stakmaskine [42] . De andre tre store implementeringer af sproget er Jython (til JVM ), IronPython (til CLR / .NET ) og PyPy [27] [43] . PyPy er skrevet i en delmængde af Python-sproget (RPython) og blev udviklet som et alternativ til CPython for at øge hastigheden af programudførelse, herunder ved brug af JIT-kompilering [43] . Support til Python 2 sluttede i 2020 [44] . I øjeblikket udvikles versionen af Python 3-sproget aktivt [45] . Sprogudvikling udføres gennem PEP ( Python Enhancement Proposal ) sprogudvidelsesforslag , som beskriver innovationer, foretager justeringer baseret på community-feedback og dokumenterer endelige beslutninger [46] .
Standardbiblioteket indeholder et stort sæt nyttige bærbare funktioner, lige fra tekstbehandlingsfunktioner til værktøjer til at skrive netværksapplikationer. Yderligere funktioner, såsom matematisk modellering, arbejde med udstyr, skrivning af webapplikationer eller udvikling af spil, kan implementeres gennem et stort antal tredjepartsbiblioteker, såvel som integration af biblioteker skrevet i C eller C++, mens Python tolk selv kan integreres i projekter, skrevet på disse sprog [27] . Der er også et specialiseret lager for software skrevet i Python, PyPI [47] . Dette lager giver et middel til nemt at installere pakker i operativsystemet og er blevet de facto-standarden for Python [48] . Fra 2019 indeholdt den over 175.000 pakker [47] .
Python er blevet et af de mest populære sprog og bruges i dataanalyse , maskinlæring , DevOps og webudvikling , blandt andre områder, herunder spiludvikling . På grund af dets læsbarhed, enkle syntaks og manglende kompilering er sproget velegnet til undervisning i programmering, så du kan koncentrere dig om at lære algoritmer, begreber og paradigmer. Fejlretning og eksperimentering lettes i høj grad af det faktum, at sproget kan fortolkes [27] [49] . Sproget bruges af mange store virksomheder som Google eller Facebook [27] . Fra september 2022 rangerer Python #1 i TIOBE-rangeringen af programmeringssprogs popularitet med en score på 15,74% [50] . Python er blevet kåret som Årets TIOBE-sprog i 2007, 2010, 2018, 2020 og 2021 [51] .
Ideen til implementeringen af sproget dukkede op i slutningen af 1980'erne , og udviklingen af dets implementering begyndte i 1989 af Guido van Rossum , en ansat ved det hollandske CWI- institut [46] . Amoebas distribuerede operativsystem krævede et udvideligt scriptsprog , og Guido begyndte at udvikle Python i ro og mag, idet han lånte noget af arbejdet fra ABC -sproget (Guido var involveret i udviklingen af dette sprog med fokus på programmering). I februar 1991 postede Guido kildekoden til alt.sources [ 52] nyhedsgruppen . Helt fra begyndelsen var Python designet som et objektorienteret sprog .
Guido van Rossum opkaldte sproget efter det populære britiske komedie-tv-show fra 1970'erne Monty Pythons Flying Circus [ 53 ] fordi forfatteren var fan af showet, ligesom mange andre udviklere på den tid, og selve showet havde en parallel til verden af computerteknologi [29] .
At have et venligt, lydhørt brugerfællesskab betragtes sammen med Guidos designintuition som en af nøglerne til Pythons succes. Udviklingen af sproget foregår efter en klart reguleret proces med at skabe, diskutere, udvælge og implementere PEP ( Python Enhancement Proposal ) dokumenter - forslag til udvikling af Python [54] .
Den 3. december 2008 [55] blev den første version af Python 3000 (eller Python 3.0, også kendt som Py3k ) efter omfattende test udgivet. Python 3000 retter mange af arkitekturens mangler, mens den bibeholder så meget (men ikke fuldstændig) kompatibilitet med ældre versioner af Python som muligt.
Slutdatoen for support for Python 2.7 blev oprindeligt sat til 2015 og derefter skubbet tilbage til 2020 af bekymring for, at meget af den eksisterende kode ikke nemt kunne overføres til Python 3 [56] [57] . Python 2-understøttelse var kun rettet mod eksisterende projekter, nye projekter var påkrævet for at bruge Python 3 [45] . Python 2.7 er ikke blevet officielt understøttet siden 1. januar 2020, selvom den sidste opdatering blev udgivet i april 2020. Der vil ikke blive frigivet flere sikkerhedsrettelser eller andre forbedringer til Python 2.7 [44] [58] . Efter endt levetid for Python 2.x er det kun Python 3.6.x og nyere, der understøttes [59] .
Sproget bruger dynamisk skrivning sammen med referencetælling og en cirkulær skraldeopsamler til hukommelseshåndtering [60] . Der er også dynamiske navneopløsninger ( dynamisk binding ), der forbinder metode og variabelnavne under programafvikling.
Python tilbyder understøttelse af funktionel programmering i traditionen med Lisp . Så i Python er der funktioner filter, mapog reduce; begreberne karakteristika for lister , associative arrays (ordbøger), sæt og listegeneratorer [61] blev også lånt fra Lisp . Standardbiblioteket indeholder to moduler (itertools og functools), der implementerer værktøjer lånt fra Haskell og Standard ML [62] .
Udviklerne af Python-sproget holder sig til en bestemt programmeringsfilosofi kaldet "The Zen of Python" (" Zen of Python" eller "Zen of Python") [63] . Dens tekst udsendes af Python- fortolkerenimport this på kommando (den virker én gang pr. session). Tim Peters anses for at være forfatteren til denne filosofi .
Filosofi begynder således [64] :
….
Originaltekst (engelsk)[ Visskjule]...
I stedet for at have al sprogets funktionalitet indbygget i Python-kernen, blev det designet til at være let at udvide. Dette gjorde sproget til et populært middel til at tilføje programmerbare grænseflader til eksisterende applikationer. Guido van Rossums vision om en lille kerne med et stort standardbibliotek og en let udvidelsesbar tolk stammede fra den negative erfaring med at udvikle ABC -sproget , som tog den modsatte tilgang [65] .
Python sigter efter en enklere, mindre besværlig syntaks og grammatik, hvilket giver udviklere valgmuligheder i deres kodningsmetodologi. I modsætning til Perls motto " der er flere måder at gøre det på," er Pythons filosofi "der bør være én – og helst kun én – åbenlys måde at gøre det på" [66] . Alex Martelli , medlem af Python Software Foundation , og forfatter til bøger om Python skriver, at "at beskrive noget som 'smart' betragtes ikke som en kompliment i Python-kulturen" [67] .
Python-udviklere har en tendens til at undgå for tidlig optimering og afvise patches til ikke-kritiske dele af CPython- referenceimplementeringen , der ville tilbyde en marginal stigning i hastigheden på bekostning af kodeklarhed [68] . Der er dog måder at forbedre ydeevnen på. Hvis programmet har flaskehalse forbundet med udførelsen af ressourcekrævende operationer på den centrale processor, men ikke forbundet med brugen af I/O operationer, så er det muligt at forbedre ydeevnen ved at oversætte programmet ved hjælp af Cython til C-sproget og efterfølgende kompilering [69] . Dele af programmet, der kræver beregningsressourcer, kan også omskrives til C-sproget og forbindes som separate biblioteker med bindinger til Python [43] .
Et vigtigt mål for Python-udviklere er at gøre det sjovt at bruge. Dette afspejledes i sprogets navn, givet til ære for Monty Python [53] . Det afspejles også i den til tider legende tilgang til tutorials og referencemateriale, såsom eksempelprogrammerne i dokumentationen, der bruger navnene spam og æg i stedet for navnene, der bruges i dokumentationen på mange andre sprog foo og bar [70 ] [71] .
Python er blevet porteret og kører på næsten alle kendte platforme, fra PDA'er til mainframes . Der er porte til Microsoft Windows , næsten alle varianter af UNIX (inklusive FreeBSD og Linux ), Android [72] , Plan 9 , Mac OS og macOS , iPhone OS (iOS) 2.0 og nyere, iPadOS , Palm OS , OS/2 , Amiga , HaikuOS , AS/400 , OS/390 , Windows Mobile og Symbian .
Efterhånden som platformen bliver forældet, stopper dens støtte i sprogets hovedgren. For eksempel er understøttelse af Windows 95 , Windows 98 og Windows ME [73] blevet droppet siden version 2.6 . Windows XP understøttes ikke længere i version 3.5 [74] Windows Vista og Windows 7 understøttes ikke længere i version 3.9 [75] .
På samme tid, i modsætning til mange bærbare systemer, for alle større platforme, har Python understøttelse af teknologier, der er specifikke for denne platform (for eksempel Microsoft COM / DCOM ). Desuden er der en speciel version af Python til Java Virtual Machine - Jython , som gør det muligt for tolken at køre på ethvert system, der understøtter Java , mens Java -klasser kan bruges direkte fra Python og endda skrives i Python. Adskillige projekter giver også integration med Microsoft.NET platformen , de vigtigste er IronPython og Python.Net .
Python understøtter dynamisk indtastning , det vil sige, at typen af en variabel kun bestemmes under kørsel. Så i stedet for at "tildele en værdi til en variabel" er det bedre at tale om "at forbinde en værdi med et eller andet navn". Primitive typer i Python inkluderer boolesk , heltal med vilkårlig præcision , flydende komma og kompleks . Pythons indbyggede containertyper er streng , liste , tuple , ordbog og sæt [49] . Alle værdier er objekter, inklusive funktioner, metoder, moduler, klasser.
Du kan tilføje en ny type enten ved at skrive en klasse (klasse) eller ved at definere en ny type i et udvidelsesmodul (f.eks. skrevet i C). Klassesystemet understøtter nedarvning (enkelt og flere ) og metaprogrammering . Det er muligt at arve fra de fleste indbygnings- og tilbygningstyper.
Type | Foranderlighed | Beskrivelse | Eksempler |
---|---|---|---|
bool | uforanderlig | boolesk type | True False |
bytearray | foranderlig | Byte array | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105]) |
bytes | uforanderlig | Byte array | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105]) |
complex | uforanderlig | Kompleks tal | 3+2.7j |
dict | foranderlig | Ordbog ( associativ array ) er en samling af nøgle-værdi-par; værdien kan være af enhver type, nøglen skal være af en hashbar type | {'key1': 1.0, 3: False} {} |
ellipsis[K 1] | uforanderlig | Ellipsis (ellipsis). Anvendes primært i NumPy til at give en genvej til udskæring af et flerdimensionelt array. Det er til stede i selve Python for at understøtte brugerdefinerede typer og udvidelser såsom NumPy [76] | ... Ellipsis For NumPy : hvilket svarer til [76] x[i, ..., j] x[i, :, :, j] |
float | uforanderlig | Flydende komma nummer . Graden af præcision afhænger af platformen, men i praksis implementeres den normalt som et 64-bit 53-bit nummer [77] |
1.414 |
frozenset | uforanderlig | Uordnet sæt , indeholder ikke dubletter; kan indeholde forskellige hashbare datatyper indeni | frozenset([4.0, 'string', True]) |
int | uforanderlig | Ubegrænset heltal [78] | 42 |
list | foranderlig | Liste , kan indeholde forskellige typer data | [4.0, 'string', True] [] |
NoneType[K 1] | uforanderlig | Et objekt, der repræsenterer fraværet af en værdi, ofte omtalt som Null på andre sprog. | None |
NotImplementedType[K 1] | uforanderlig | Objektet, der returneres ved overbelastning af operatører, når operandtyperne ikke understøttes. | NotImplemented |
range | uforanderlig | En sekvens af heltal fra en værdi til en anden, normalt brugt til at gentage en operation flere gange med for [79] | range(1, 10) range(10, -5, -2) |
set | foranderlig | Uordnet sæt , indeholder ikke dubletter; kan indeholde forskellige hashbare datatyper indeni | {4.0, 'string', True} set() |
str | uforanderlig | strengtype | 'Wikipedia' "Wikipedia" """Spænder flere linjer""" |
tuple | uforanderlig | Tuple . Den kan indeholde forskellige typer data i sig selv. Kan bruges som en uforanderlig liste og som poster med unavngivne felter [80] | Som en uforanderlig liste: Som optegnelser: [80] (4.0, 'string', True) ('single element',) () lax_coordinates = (33.9425, -118.408056) city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014) |
Sproget har en klar og konsekvent syntaks, gennemtænkt modularitet og skalerbarhed , hvilket gør kildekoden til programmer skrevet i Python let at læse. Når du sender argumenter til funktioner, bruger Python call -by-sharing [ 81 ] .
Sættet af operatører er ret traditionelt.
En af de interessante syntaktiske egenskaber ved sproget er indrykning af kodeblokke (mellemrum eller tabulatorer), så Python har ikke start/slut parenteser , som i Pascal , eller krøllede parenteser, som i C. Sådan et "trick" giver dig mulighed for at reducere antallet af linjer og tegn i programmet og lærer dig en "god" programmeringsstil. På den anden side kan opførselen og endda programmets korrekthed afhænge af de indledende mellemrum i teksten. For dem, der er vant til at programmere på sprog med eksplicit valg af begyndelsen og slutningen af blokke, kan denne adfærd i første omgang virke uintuitiv og ubelejlig.
Guido skrev selv [82] :
Det måske mest kontroversielle træk ved Python er brugen af indrykning til gruppeudsagn, som er taget direkte fra ABC . Dette er et af sprogets egenskaber, som ligger mig varmt om hjertet. Dette gør Python-koden mere læsbar på to måder. For det første reducerer brugen af indrykning visuel rod og gør programmer kortere, hvilket reducerer mængden af opmærksomhed, der kræves for at forstå den grundlæggende kodeenhed. For det andet giver det programmøren mindre frihed til at formatere, og giver derved mulighed for en mere konsistent stil, der gør det nemmere at læse andres kode. (Sammenlign f.eks. tre eller fire forskellige C -bøjler- konventioner , hver med stærke fortalere.)
Originaltekst (engelsk)[ Visskjule] Måske Pythons mest kontroversielle træk er dens brug af indrykning til udsagnsgruppering, som stammer direkte fra ABC. Det er et af sprogets træk, der ligger mig allermest på sinde. Det gør Python-koden mere læsbar på to måder. For det første reducerer brugen af indrykning visuel rod og gør programmer kortere, hvilket reducerer den opmærksomhed, der er nødvendig for at indtage en grundlæggende kodeenhed. For det andet giver det programmøren mindre frihed til at formatere, hvilket muliggør en mere ensartet stil, som gør det lettere at læse en andens kode. (Sammenlign for eksempel de tre eller fire forskellige konventioner for placering af bøjler i C, hver med stærke fortalere.)Sammensætning, syntaks, associativitet og forrang for operationer er ganske velkendte for programmeringssprog og er designet til at minimere brugen af parenteser. Sammenlignet med matematik afspejler operatorpræference den i matematik, hvor værditildelingsoperatoren =svarer til den typografiske operator ←. Mens operatorpræference undgår brugen af parenteser i mange tilfælde, kan parsing af store udtryk være tidskrævende, hvilket gør eksplicitte parenteser mere fordelagtige i sådanne tilfælde [45] .
Separat er det værd at nævne formateringsoperationen for strenge (den fungerer i analogi med funktionen printf()fra C), som bruger det samme symbol som at tage resten af divisionen:
>>> str_var = "verden" >>> print ( "Hej, %s " % str_var ) Hej , verdenI version 3.6 blev formaterede strengliterals eller f-strenge tilføjet for at gøre koden mere læsbar og kortfattet:
>>> str_var = "verden" >>> print ( f "Hej, { str_var } " ) # output ved hjælp af f-streng Hej , verdenPython har praktiske kædede sammenligninger . Sådanne forhold i programmer er ikke ualmindelige:
1 <= a < 10 og 1 <= b < 20Derudover er logiske operationer ( orog and) dovne : hvis den første operand er nok til at evaluere værdien af operationen, er denne operand resultatet, ellers evalueres den anden operand af den logiske operation. Dette er baseret på egenskaberne for logikkens algebra : for eksempel, hvis et argument for operationen "ELLER" ( or) er sandt, så er resultatet af denne operation altid sandt. Hvis den anden operand er et komplekst udtryk, reducerer dette omkostningerne ved dens beregning. Denne kendsgerning blev meget brugt indtil version 2.5 i stedet for den betingede konstruktion:
a < b og "mindre end" eller "større end eller lig med"Indbyggede datatyper har generelt en speciel syntaks for deres bogstaver (konsts skrevet i kildekoden):
"streng og Unicode-streng på samme tid" 'streng og Unicode-streng på samme tid' """også streng og Unicode-streng på samme tid""" Sandt eller falsk # booleske bogstaver 3.14 # flydende kommanummer 0b1010 + 0o12 + 0xA # tal i binære , oktale og hexadecimale 1 + 2 j # komplekst tal [ 1 , 2 , "a" ] # liste ( 1 , 2 , "a" ) # tuple { 'a' : 1 , 'b' : ' B' } # ordbog { 'a' , 6 , 8.8 } # sæt lambda x : x ** 2 # anonym funktion ( i for i i området ( 10 )) # generatorTil lister (og andre sekvenser) tilbyder Python et sæt udskæringsoperationer. En funktion er indeksering, som kan virke mærkelig for en begynder, men afslører dens konsistens, når du bruger den. Listeelementindekser starter ved nul. Registrering af en skive s[N:M]betyder, at alle elementer fra N inklusive til M, men ikke inkluderet, falder ind i skiven. I dette tilfælde kan indekset udelades. For eksempel betyder record s[:M], at alle elementer lige fra begyndelsen falder i skiven; notation s[N:]betyder, at alle elementer er inkluderet indtil slutningen af udsnittet; record s[:]betyder, at alle elementer fra begyndelsen til slutningen er inkluderet.
Navnet (identifikator) kan begynde med et bogstav i ethvert alfabet i Unicode , ethvert bogstav eller understregning, hvorefter tal også kan bruges i navnet. Du kan ikke bruge nøgleord som navn (deres liste kan findes af import keyword; print(keyword.kwlist)), og det er uønsket at omdefinere indbyggede navne. Navne, der begynder med en understregning, har en særlig betydning [83] .
På hvert punkt i programmet har tolken adgang til tre navnerum (det vil sige navn-til-objekt-tilknytninger): lokal, global og indbygget.
Navneomfang kan indlejres i hinanden (navne fra den omgivende kodeblok er synlige i den definerede funktion). I praksis er der flere gode manerer forbundet med omfang og navnebindinger, som du kan lære mere om i dokumentationen.
Python tilbyder en mekanisme til at dokumentere pydoc-kode. I begyndelsen af hvert modul, klasse, funktion indsættes en dokumentationsstreng - docstring . Dokumentationsstrenge forbliver i koden under kørsel, og dokumentationsadgang [84] (variabel __doc__) er indbygget i sproget, som det bruges af moderne IDE'er ( Integrated Development Environment ) (f.eks. Eclipse ).
Du kan interaktivt få hjælp, generere hypertekstdokumentation for et helt modul eller endda bruge til automatisk at teste et
Python er et multiparadigme programmeringssprog . Objektorienteret , strukturel [85] , generisk , funktionel programmering [27] og metaprogrammering [31] er fuldt understøttet . Grundlæggende støtte til aspektorienteret programmering ydes gennem metaprogrammering [34] . Mange andre teknikker, herunder kontrakt [86] [87] og logisk programmering [88] , kan implementeres ved hjælp af udvidelser.
Designet af Python-sproget er bygget op omkring en objektorienteret programmeringsmodel. Implementeringen af OOP i Python er gennemtænkt, men samtidig ret specifik i forhold til andre objektorienterede sprog . Alt i et sprog er et objekt, enten en forekomst af en klasse eller en forekomst af en metaklasse. Undtagelsen er den indbyggede basismetaklasse type. Så klasser er faktisk forekomster af metaklasser, og afledte metaklasser er forekomster af en metaklasse type. Metaklasser er en del af begrebet metaprogrammering og giver mulighed for at kontrollere klassearv, hvilket giver dig mulighed for at oprette abstrakte klasser, registrere klasser eller tilføje en hvilken som helst programmeringsgrænseflade til dem inden for et bibliotek eller en ramme [31] .
Klasser repræsenterer i det væsentlige en plan eller beskrivelse af, hvordan man opretter et objekt, og gemmer en beskrivelse af objektets egenskaber og metoder til at arbejde med det. OOP-paradigmet er baseret på indkapsling , arv og polymorfi [89] . Indkapsling i Python er repræsenteret ved evnen til at gemme offentlige og skjulte attributter (felter) i et objekt med tilvejebringelse af metoder til at arbejde med dem [89] , mens i virkeligheden alle attributter er offentlige, men der er en navnekonvention for at markere skjult egenskaber [90] . Nedarvning giver dig mulighed for at skabe afledte objekter uden at skulle omskrive kode, og polymorfi er evnen til at tilsidesætte ethvert objekts metoder (i Python er alle metoder virtuelle [90] ), såvel som overbelastning af metoder og operatorer . Overbelastning af metoder i Python er implementeret på grund af muligheden for at kalde den samme metode med et andet sæt argumenter [89] . Et træk ved Python er evnen til at ændre klasser efter at de er erklæret, tilføje nye attributter og metoder til dem [45] , du kan også ændre selve objekterne, som et resultat af hvilke klasser kan bruges som strukturer til lagring af vilkårlige data [ 90] .
Python understøtter multipel nedarvning. Multipel nedarvning i sig selv er kompleks, og dens implementeringer støder ind i problemer med at løse navnekollisioner mellem overordnede klasser og muligvis genarve fra den samme klasse i et hierarki. I Python kaldes metoder efter metodeopløsningsordenen (MRO), som er baseret på C3 lineariseringsalgoritmen [91] , i normale tilfælde behøver man ikke, når man skriver programmer, at vide hvordan denne algoritme virker, mens forståelse evt. være påkrævet ved oprettelse af ikke-trivielle klassehierarkier [92] .
Funktioner og funktioner, der er specifikke for Python:
Sprog, der understøtter dynamisk typning og objektorienteret programmering, betragtes normalt ikke inden for rammerne af generisk programmering, da generiske programmeringsproblemer løses på grund af fraværet af begrænsninger på datatyper [32] [33] . I Python opnås kraftigt indtastet generisk programmering ved at bruge sprogfunktioner i forbindelse med eksterne kodeanalysatorer [ 93] såsom Mypy [94] .
Selvom Python ikke oprindeligt var udtænkt som et funktionelt programmeringssprog [95] , understøtter Python programmering i stil med funktionel programmering, især [96] :
Men i modsætning til de fleste sprog, der er direkte fokuseret på funktionel programmering, er Python ikke et rent programmeringssprog, og koden er ikke immun over for bivirkninger [96] [97] .
Der er også specielle pakker i Python-standardbiblioteket operatortil functoolsfunktionel programmering [95] .
Python understøtter metaprogrammering [98] [31] .
Python-software (applikation eller bibliotek) er pakket som moduler, som igen kan pakkes ind i . Moduler kan findes både i mapper og i ZIP-arkiver . Moduler kan være af to typer i deres oprindelse: moduler skrevet i "ren" Python, og udvidelsesmoduler (udvidelsesmoduler) skrevet på andre programmeringssprog. For eksempel har standardbiblioteket et "rent" pickle-modul og dets C-ækvivalent: cPickle. Modulet er lavet som en separat fil, og pakken - som en separat mappe. Modulet tilsluttes programmet af operatøren import. Når det er importeret, er et modul repræsenteret af et separat objekt, der giver adgang til modulets navneområde. Under programafviklingen kan modulet genindlæses med funktionen reload().
Python understøtter fuld runtime- introspektion [99] . Det betyder, at du for ethvert objekt kan få alle oplysninger om dets interne struktur.
Brugen af introspektion er en vigtig del af det, der kaldes den pythoniske stil , og er meget udbredt i Python-biblioteker og rammer såsom PyRO , PLY, Cherry, Django og andre, hvilket sparer meget tid for programmøren, der bruger dem.
De data, der er nødvendige for introspektion, gemmes i særlige attributter. Så for eksempel kan du få alle brugerdefinerede attributter for de fleste objekter fra en speciel attribut - en ordbog (eller et andet objekt, der giver en grænseflade dict)__dict__
>>> klasse x ( objekt ): bestå .... >>> f = x () >>> f . attr = 12 >>> print ( f . __dict__ ) { 'attr' : 12 } >>> print ( x . __dict__ ) # fordi klasser er også forekomster af objekttype #, så de understøtter denne type introspektion { '__dict__' : < attribut '__dict__' af 'x'- objekter > , '__module__' .......Der er også andre attributter, hvis navne og formål afhænger af objektet:
>>> def f (): pass .... >>> f . func_code . co_code # få funktionsbytekode 'd \x00\x00 S' >>> f . __class__ # speciel attribut - reference til klassen for det givne objekt < type 'function' >Langt de fleste attributter, der understøtter introspektion, er klassebaserede, og disse kan igen hentes fra obj.__class__.__dict__. Nogle af de oplysninger, der er nedarvet fra basisklassen, deles af alle objekter, hvilket sparer hukommelse.
For at gøre det nemmere at få introspektiv information har Python et modul inspect[100] .
>>> def f ( x , y = 10 , ** mp ): bestå ... >>> inspicere . getargspec ( f ) ([ 'x' , 'y' ], Ingen , 'mp' , ( 10 ,))Ved hjælp af modulet er den newomvendte proces mulig - opbygning af et objekt ud fra dets komponentdele på udførelsesstadiet
>>> def f ( i ): returner j + i .... >>> j = 2 >>> f ( 1 ) 3 >>> import ny >>> g = ny . funktion ( f . func_code , { 'j' : 23 }) >>> g ( 1 ) 24Undtagelseshåndtering understøttes i Python gennem de sætninger try, except, else, finally, raise, der danner undtagelseshåndteringsblokken. Generelt ser blokken sådan ud:
prøv : # Her er kode, der kan give en undtagelsesforhøjelse Undtagelse ( " meddelelse" ) # Undtagelse, dette er en af standard undtagelsestyper (kun en klasse), # enhver anden kan bruges, inklusive din egen undtagen ( Undtagelsestype1 , Undtagelsestype2 , … ) som Variabel : # Koden i blokken udføres hvis undtagelsestypen matcher en af # typerne (ExceptionType1, ExceptionType2, ...) eller er en efterkommer af en # af disse typer. # Den resulterende undtagelse er tilgængelig i en valgfri variabel. undtagen ( Undtagelsestype3 , Undtagelsestype4 , … ) som Variabel : # Antallet af undtagen blokke er ubegrænset forhøjelse # Kast en undtagelse "ovenpå" den modtagne; ingen parametre - genkast modtaget undtagen : # Vil blive udført på enhver undtagelse, der ikke håndteres af indtastede blokke undtagen andet : # Blokkoden udføres, hvis ingen undtagelser blev fanget. endelig : # Vil blive udført alligevel, muligvis efter en matchende # undtagen eller andet blokDeling else, excepthar finallykun været mulig siden Python 2.5. Information om den aktuelle undtagelse er altid tilgængelig via sys.exc_info(). Udover værdien af undtagelsen gemmer Python også stakkens tilstand indtil det punkt, hvor undtagelsen kastes - den såkaldte traceback.
I modsætning til kompilerede programmeringssprog, i Python, fører brugen af en undtagelse ikke til væsentlige overhead (og ofte endda fremskynder udførelsen af programmer) og er meget udbredt. Undtagelser er i overensstemmelse med Pythons filosofi (punkt 10 i " Zen of Python " - "Fejl bør aldrig dæmpes") og er et af midlerne til at understøtte " andskrivning ".
Nogle gange er det mere praktisk at bruge en blok i stedet for eksplicit undtagelseshåndtering with(tilgængelig siden Python 2.5).
Iteratorer er meget udbredt i Python-programmer. Sløjfen forkan arbejde med både en sekvens og en iterator. De fleste samlinger giver iteratorer, iteratorer kan også defineres af brugeren på deres egne objekter. Standardbiblioteksmodulet itertoolsindeholder faciliteter til at arbejde med iteratorer.
Et af sprogets interessante funktioner er generatorer - funktioner, der gemmer den interne tilstand: værdierne af lokale variabler og den aktuelle instruktion (se også: coroutines ). Generatorer kan bruges som iteratorer til datastrukturer og til doven evaluering .
Når en generator kaldes, returnerer funktionen straks et iteratorobjekt, der gemmer det aktuelle udførelsespunkt og tilstanden for funktionens lokale variable. Når den næste værdi anmodes om (via en metode, der next()implicit kaldes i løkken for), fortsætter generatoren funktionen fra det forrige brudpunkt til det næste yieldeller sætning return.
Python 2.4 introducerede generatorudtryk , udtryk, der resulterer i en generator. Generatorudtryk giver dig mulighed for at gemme hukommelse, hvor du ellers skulle bruge en liste med mellemresultater:
>>> sum ( i for i i området ( 1 , 100 ) hvis i % 2 != 0 ) 2500Dette eksempel lægger alle ulige tal fra 1 til 99 sammen.
Fra og med version 2.5 understøtter Python fuldgyldige co-procedurer: du kan nu sende værdier til en generator ved hjælp af en metode send()og rejse undtagelser i dens kontekst ved hjælp af throw().
Python understøtter også indlejrede generatorer. For at oprette en todimensional matrix skal du f.eks. placere en listegenerator, der er en streng inde i generatoren af alle strenge:[[0 for j in range(m)] for i in range(n)]
Python 2.5 introducerede værktøjer til at styre udførelseskonteksten for en kodeblok - sætningen withog modulet contextlib. Se: eksempel .
Operatøren kan bruges i tilfælde, hvor nogle andre handlinger skal udføres før og efter nogle handlinger, uanset de undtagelser eller udsagn, der er smidt i blokken return: filer skal lukkes, ressourcer skal frigives, standard input output omdirigering er afsluttet, osv. Operatøren forbedrer læsbarhedskoden, hvilket betyder, at den hjælper med at forhindre fejl.
Funktionsdekoratorer er kaldbare objekter, der tager en anden funktion som argument. Funktionsdekoratører kan udføre operationer på en funktion og returnere enten selve funktionen eller en anden funktion, der erstatter den, eller et kaldbart objekt. Det vil sige, hvis en dekoratør kaldet dekorere tidligere var skrevet i koden, så er følgende kode [101] :
@decorate def target (): print ( 'running target()' )svarer til dette [101] :
def target (): print ( 'running target()' ) target = dekorere ( target )Et eksempel på brug af funktionen dekorator [101] :
>>> def deco ( func ): ... def indre (): ... print ( 'running indre()' ) ... returnere indre ... >>> @deco ... def mål (): .. .print ( 'running target()' ) >>> target () running inner() >>> target <function deco.<locals> .inner at 0.10063b598>Der er klassedekoratører [102] .
Det regulære udtryksformat er nedarvet fra Perl med nogle forskelle. For at bruge dem skal du importere modulet re[103] , som er en del af standardbiblioteket.
Det rige standardbibliotek er en af Pythons attraktioner . Der er værktøjer til at arbejde med mange netværksprotokoller og internetformater , for eksempel moduler til at skrive HTTP-servere og -klienter, til at parse og oprette mailmeddelelser, til at arbejde med XML osv. Et sæt moduler til at arbejde med operativsystemet giver dig mulighed for at skrive applikationer på tværs af platforme. Der er moduler til at arbejde med regulære udtryk , tekstkodninger , multimedieformater , kryptografiske protokoller, arkiver, dataserialisering , enhedstestunderstøttelse osv.
Ud over standardbiblioteket er der mange biblioteker, der giver en grænseflade til alle systemopkald på forskellige platforme; især på Win32-platformen understøttes alle Win32 API -kald såvel som COM -kald i et omfang, der ikke er mindre end Visual Basic eller Delphi . Antallet af applikationsbiblioteker til Python på forskellige områder er bogstaveligt talt enormt ( web , databaser , billedbehandling, tekstbehandling, numeriske metoder , operativsystemapplikationer osv.).
For Python er DB-API 2- databaseprogrammeringsgrænsefladespecifikationen blevet vedtaget, og pakker svarende til denne specifikation er udviklet til at få adgang til forskellige DBMS : Oracle , MySQL , PostgreSQL , Sybase , Firebird ( Interbase ), Informix , Microsoft SQL Server og SQLite . På Windows -platformen er adgang til databasen mulig via ADO ( ADOdb ). Den kommercielle mxODBC-pakke til DBMS-adgang via ODBC til Windows- og UNIX -platforme blev udviklet af eGenix [105] . Mange ORM'er er blevet skrevet til Python ( SQLObject , SQLAlchemy , Dejavu, Django ), softwareramme til udvikling af webapplikationer er blevet implementeret ( Django , Pylons , Pyramid ).
NumPy - biblioteket til at arbejde med multidimensionelle arrays kan nogle gange opnå videnskabelig ydeevne, der kan sammenlignes med specialiserede pakker. SciPy bruger NumPy og giver adgang til en bred vifte af matematiske algoritmer (matrix algebra - BLAS niveauer 1-3, LAPACK , FFT ...). Numarray [106] er specielt designet til operationer med store mængder videnskabelige data.
WSGI [107] er et gateway-interface med en webserver (Python Web Server Gateway Interface).
Python giver en enkel og praktisk C API til at skrive dine egne moduler i C og C++ . Et værktøj som SWIG giver dig mulighed for næsten automatisk at opnå bindinger til brug af C / C ++ biblioteker i Python-kode. Mulighederne for dette og andre værktøjer spænder fra automatisk generering af (C/C++/Fortran)-Python-grænseflader fra specielle filer (SWIG, pyste [108] , SIP [109] , pyfort [110] ), til at give mere bekvemme API'er (boost :: python [111] [112] , CXX [113] , Pyhrol [114] osv.). Standardbiblioteksværktøjet ctypes tillader Python-programmer at få direkte adgang til dynamiske biblioteker / DLL'er skrevet i C. Der er moduler, der giver dig mulighed for at indlejre C/C++-kode direkte i Python-kildefiler ved at oprette udvidelser i farten (pyinline [115] , væv [116] ).
En anden tilgang er at integrere Python-fortolkeren i applikationer. Python er let integreret i Java, C/C++, OCaml- programmer . Interaktion af Python-applikationer med andre systemer er også muligt ved hjælp af CORBA , XML-RPC , SOAP , COM.
Ved hjælp af Cython- projektet er det muligt at oversætte programmer skrevet på Python- og Pyrex -sprogene til C-kode med efterfølgende kompilering til maskinkode. Cython bruges til at forenkle skrivningen af Python-biblioteker, når du bruger det, bemærkes det, at koden er hurtigere og overhead reduceres.
Shedskins eksperimentelle projekt involverer at skabe en compiler til at transformere implicit indtastede Python-programmer til optimeret C++-kode. Siden version 0.22 giver Shedskin dig mulighed for at kompilere individuelle funktioner i udvidelsesmoduler.
Python og langt de fleste af dets biblioteker er gratis og kommer i kildekode. Desuden, i modsætning til mange åbne systemer, begrænser licensen ikke brugen af Python i kommerciel udvikling på nogen måde og pålægger ingen andre forpligtelser end at angive ophavsret.
En af kanalerne til distribution og opdatering af pakker til Python er PyPI ( Python Package Index ) .
Python leveres med et Tcl / Tk - baseret tkinter -bibliotek til opbygning af GUI -programmer på tværs af platforme .
Der er udvidelser, der giver dig mulighed for at bruge alle de store GUI-biblioteker - wxPython [117] , baseret på wxWidgets-biblioteket , PyGObject for GTK [118] , PyQt og PySide for Qt , og andre. Nogle af dem giver også omfattende database-, grafik- og netværksfunktioner, og drager fuld fordel af det bibliotek, de er baseret på.
For at skabe spil og applikationer, der kræver en ikke-standard grænseflade, kan du bruge Pygame- biblioteket . Det giver også omfattende multimedieværktøjer : med dens hjælp kan du styre lyd og billeder, afspille videoer . OpenGL -grafikhardwareaccelerationen leveret af pygame har en grænseflade på højere niveau end PyOpenGL [119] , som kopierer semantikken i OpenGL C-biblioteket. Der er også PyOgre [120] , som giver et link til Ogre , et objektorienteret 3D-grafikbibliotek på højt niveau. Derudover er der et pythonOCC-bibliotek [121] , der giver et link til OpenCascade 3D-modellerings- og simuleringsmiljøet [122] .
Til at arbejde med rastergrafik bruges Python Imaging Library .
PyCairo bruges til at arbejde med vektorgrafik .
Der er moduler, der giver dig mulighed for at styre typerne af funktionsparametre under kørsel, for eksempel typecheck [123] eller metodesignaturkontroldekoratorer [124] . En valgfri typedeklaration for funktionsparametre blev tilføjet i Python 3, fortolkeren kontrollerer ikke typer, men tilføjer kun den relevante information til funktionsmetadataene til efterfølgende brug af denne information af udvidelsesmoduler [125] .
Funktionsoverbelastning implementeres af forskellige tredjepartsbiblioteker, herunder PEAK [126] [127] . Planer, der ikke blev accepteret for overbelastningsunderstøttelse i Python3000 [128] blev delvist implementeret i overloading-lib [129] .
Wikiversity - artiklen " Python-programeksempler " indeholder eksempler på små programmer, der demonstrerer nogle af funktionerne i Python-sproget og dets standardbibliotek.
Hej verden! ' kan skrives på én linje:
print ( "Hej verden!" )Beregning af fakultetet for tallet 10 (10!):
def factorial ( n ): hvis n < 0 : hæv ArithmeticError ( 'Faktoriet af et negativt tal.' ) f = 1 for i i området ( 2 , n + 1 ): f *= i returnerer f udskrive ( faktorbestemt ( 10 )) # 3628800Implementering med rekursion :
def factorial ( n ): hvis n < 0 : hæv ArithmeticError ( 'Faktualiseringen af et negativt tal.' ) hvis ( n == 0 ) eller ( n == 1 ): returner 1 andet : returner faktorial ( n - 1 ) * n print ( fakulstisk ( 10 ))Python-standardbiblioteket giver en profiler (modul profile), der kan bruges til at indsamle statistik om de enkelte funktioners køretid. For at afgøre, hvilken version af koden der kører hurtigere, kan du bruge timeit. Målingerne i det følgende program giver os mulighed for at finde ud af, hvilke af strengsammenkædningsmulighederne der er mere effektive:
fra timeit import Timer tmp = "Python 3.2.2 (standard, 12. juni 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] på win32." def case1 (): # A. trinvise sammenkædninger i en sløjfe s = "" for i i området ( 10000 ): s += tmp def case2 (): # B. gennem en mellemliste og joinmetode s = [] for i i området ( 10000 ): s . tilføj ( tmp ) s = "" . slutte sig til _ def case3 (): # B. listeudtryk og joinmetode returnerer "" . join ([ tmp for i i området ( 10000 )]) def case4 (): # D. generator udtryk og joinmetode returnerer "" . join ( tmp for i i området ( 10000 )) for v i området ( 1 , 5 ): print ( Timer ( "func()" , "fra __main__ importer sag %s som func" % v . timeit ( 200 ) )Som ethvert programmeringssprog har Python sine egne kodeoptimeringsteknikker . Du kan optimere koden baseret på forskellige (ofte konkurrerer med hinanden) kriterier (stigning i ydeevne, fald i mængden af påkrævet RAM, kompakthed af kildekoden osv.). Oftest er programmer optimeret til eksekveringstid.
Der er flere regler, der er oplagte for erfarne programmører.
Python har følgende funktioner og tilhørende optimeringsregler.
Et værktøj kaldet Pychecker [130] vil hjælpe dig med at analysere din Python-kildekode og komme med anbefalinger om fundne problemer (for eksempel ubrugte navne, ændring af signaturen på en metode, når den er overbelastet osv.). I løbet af en sådan statisk analyse af kildekoden kan fejl også identificeres. Pylint [131] har til formål at løse lignende problemer, men har en tendens til at tjekke kodestil, finde kode med en lugt [132] .
Valget af sprog afhænger normalt af de opgaver, der skal løses, sprogenes funktioner og tilgængeligheden af biblioteker, der kræves for at løse problemet. Den samme opgave skrevet på forskellige sprog kan variere meget med hensyn til eksekveringseffektivitet, herunder forskelle, når den udføres på forskellige operativsystemer eller ved brug af forskellige compilere. Generelt kan sprog opdeles i tolket (scripting), kompileret til en mellemrepræsentation og kompileret, hvilket påvirker ydeevne og hukommelsesforbrug. Python omtales normalt som fortolket. Individuelle sprog kan også have deres egne styrker, i tilfældet med Python skiller lette at skrive programmer sig ud [133] .
Python sammenlignes med C++/Java i form af kortfattethed, enkelhed og fleksibilitet i Python [134] . Man kan sammenligne " Hej, verden " programmer skrevet på hvert af sprogene [134] .
C++ [134] | Java [134] | Python [134] |
---|---|---|
#include <iostream> int main () { std :: cout << "Hej verden!" << std :: endl ; returnere 0 ; } | public class HelloClass { public static void main ( String [] args ) { System . ud . println ( "Hej verden!" ); } } | print ( "Hej, verden!" ) |
Med hensyn til OOP er der i Python, i modsætning til C++ og Java, ingen adgangsmodifikatorer til klassefelter og -metoder, attributter og felter af objekter kan oprettes på farten under programafvikling, og alle metoder er virtuelle. Sammenlignet med Java tillader Python også operatøroverbelastning, hvilket gør det muligt at bruge udtryk, der er tæt på naturlige [134] . Tilsammen forenkler Pythons tilgang til OOP programmering, gør kode mere forståelig og tilføjer samtidig fleksibilitet til sproget [134] . På den anden side er Python-kode (såvel som andre fortolkede sprog) meget langsommere end tilsvarende C++-kode [135] og forventes generelt at være langsommere end Java [136] . C++-kode er mere produktiv end Python, mens den optager flere linjer. Ifølge forskning i algoritmer brugt i bioinformatik , har Python vist sig at være mere fleksibel end C++, og Java har vist sig at være et kompromis mellem ydeevnen af C++ og fleksibiliteten i Python [133] .
I Java og Python oprettes alle objekter på heapen , mens C++ tillader, at objekter oprettes både på heapen og på stakken afhængigt af den anvendte syntaks [137] . Ydeevnen påvirkes også af den måde, hvorpå der tilgås data i hukommelsen. I C++ og Java tilgås data med konstante forskydninger i hukommelsen, mens det i Python er gennem hash-tabeller . Brugen af pointere i C++ kan være ret svær for begyndere at forstå, og det kan tage noget tid at mestre den korrekte brug af pointere [133] .
Go og Python er drastisk forskellige sprog, dog sammenlignes de ofte med hinanden på grund af deres fælles niche - backend af webapplikationer. Som Jason Kincaid udtrykker det, kombinerer Go "ydeevnen og sikkerheden af kompilerede sprog som C++ med udviklingshastigheden i dynamiske sprog som Python" [138] . Til en vis grad er dette rigtigt: Go blev oprindeligt designet som et stærkt statisk skrevet kompileret sprog, der understøtter de maksimale funktioner i dynamiske sprog, hvor det stadig er muligt at sikre effektiv kompilering og vedligeholde ydelsen af kompilerede programmer. Fælles for begge sprog er brugen af automatisk hukommelsesstyring, tilstedeværelsen af indbyggede dynamiske samlinger (arrays og ordbøger), understøttelse af udsnit, en udviklet modulmekanisme og en enkel og minimalistisk syntaks. Der er mange flere forskelle, og det er ikke altid muligt klart at angive til fordel for, hvilket af sprogene de taler.
dynamiske muligheder. Hvis Python er et fuldstændig dynamisk sprog, og næsten alle elementer i programmet kan ændres under kørslen, herunder at konstruere nye typer på farten og ændre eksisterende, så er Go et statisk sprog med ret begrænsede reflektionsmuligheder, der kun fungerer med hensyn til datatyper skabt under udviklingen. Til en vis grad er en erstatning for dynamiske muligheder i Go kodegenerering, leveret af enkelheden i syntaksen og tilgængeligheden af de nødvendige værktøjer og systembiblioteker. Det er også planlagt at tilføje understøttelse af generiske stoffer i Go 2.0. Objektorienteret programmering. Python er bygget på "alt-objekt"-ideologien og har mange OOP-mekanismer, inklusive sjældne og atypiske. Go er et ganske typisk modulært proceduremæssigt programmeringssprog, hvor OOP-funktioner er begrænset til at understøtte grænseflader og muligheden for at integrere strukturer og grænseflader. Faktisk har Go ikke engang fuldgyldig arv. Derfor, hvis Python tilskynder til programmering i OOP-stilen, med konstruktion af trælignende afhængigheder mellem klasser og aktiv brug af arv, så er Go fokuseret på komponenttilgangen: komponenternes adfærd er sat af grænseflader, som måske ikke engang være relateret til hinanden, og implementeringen af grænseflader er placeret i struct-typer . "Duck typing" implementeret i Go fører til, at der ikke engang er formelle syntaktiske forbindelser mellem grænseflader og de strukturer, der implementerer dem. Parallel programmering. Til støtte for parallel programmering er Python betydeligt ringere end Go. Først og fremmest er GIL i Python en hindring for effektiv brug af systemer med et stort antal (ti eller flere) fysiske processorkerner. Et andet problem er manglen på effektive indbyggede midler til interaktion mellem parallelle tråde. Go inkluderer et primitivt goroutinesprog, der giver dig mulighed for at skabe "lette" tråde, og syntaks-understøttede rør, der tillader tråde at kommunikere. Som følge heraf er det, når man for eksempel opretter køsystemer i Go, ikke et problem at bruge hundreder eller endda tusindvis af samtidig eksisterende tråde, desuden med normal indlæsning af et hvilket som helst antal tilgængelige processorkerner, mens ingen af de eksisterende Python-implementeringer vil sikre en effektiv drift af et sådant antal tråde. . Fejlhåndtering, undtagelser. Python understøtter undtagelseshåndtering, mens Go implementerer mekanismer til eksplicit at returnere fejlkoder fra funktioner og håndtere dem på opkaldsstedet. Denne forskel kan vurderes på forskellige måder. På den ene side er undtagelser en bekvem og velkendt mekanisme til håndtering af programfejl, som giver dig mulighed for at koncentrere denne behandling i udvalgte kodefragmenter og ikke "udtvære" den i hele programteksten. På den anden side føler forfatterne af Go, at programmører alt for ofte ignorerer fejlhåndtering, idet de stoler på, at undtagelsen bliver kastet for at blive håndteret andre steder; i distribuerede applikationer overføres undtagelser ofte ikke mellem systemkomponenter og fører til uventede fejl, og i multitrådede applikationer kan en ubehandlet undtagelse i en tråd føre til blokering eller omvendt til et programnedbrud. Visuelle muligheder, syntaks. Python giver flere sprogfunktioner og primitiver, der er bekvemme til hurtig udvikling end Go. Dette skyldes i høj grad det faktum, at udviklerne af Go bevidst nægtede at inkludere nogle "fashionable" funktioner i sproget, hvoraf nogle blev anset for at provokere fejl, andre maskerede en bevidst ineffektiv implementering. For eksempel fremkalder tilstedeværelsen på sproget af en simpel operation med at indsætte et element i midten af et array dets hyppige brug, og hver sådan operation kræver som minimum at flytte "halen" af arrayet i hukommelsen, og nogle gange det kan kræve at allokere hukommelse og flytte hele arrayet. Ydeevne. Med hensyn til ydeevne i de fleste test, der implementerer typiske sæt af backend-operationer (forespørgselsbehandling, websidegenerering), overgår Go Python flere gange til flere størrelsesordener. Dette er ikke overraskende i betragtning af sprogets statiske karakter og det faktum, at Go-programmer kompileres direkte i koden på målplatformen. I systemer, hvor det meste af tiden brugt på at udføre databaseforespørgsler eller overføre information over netværket, er dette ikke afgørende, men i højt belastede systemer, der behandler et stort antal anmodninger, er fordelen ved Go ubestridelig. Forskellene i ydeevnen af Go- og Python-programmer er også påvirket af forskellene i implementeringen af parallelisme, der er nævnt ovenfor.Begge sprog tolkes, kompileres til en mellemrepræsentation, som derefter sendes til udførelse. I tilfælde af Python genereres en mellembytekode, mens Perl-kompileren genererer et syntakstræ. Hukommelseshåndtering på begge sprog er automatisk, og sprogene i sig selv bruges som scriptsprog og er velegnede til at skrive webapplikationer. Python-kodningstilgangen involverer en bedre forståelse af programoversigt på bekostning af ydeevne, mens Perl har mere frihed i syntaks, hvilket kan gøre Perl-programmer ulæselige for ikke-Perl-programmører [133] .
Lua er et simpelt sprog, der oprindeligt er designet til at blive indlejret i software og bruges til at automatisere komplekse operationer (såsom opførsel af bots i computerspil). Python kan også bruges på disse områder, den konkurrerer også med Lua i at skrive scripts til automatisering af computer- og styresystemstyring og i ikke-professionel selvprogrammering. I de senere år er begge sprog blevet indarbejdet i mobile enheder såsom programmerbare lommeregnere.
Begge sprog er dynamiske, fortolkede, understøtter automatisk hukommelsesstyring og har standardmidler til at interagere med software skrevet på andre sprog (hovedsageligt C og C++). Lua runtime er mere kompakt og kræver færre ressourcer at køre end Python, hvilket giver Lua en fordel ved indlejring. Ligesom Python understøtter Lua kompilering af kildekode til virtuel maskine-eksekverbar bytekode. Der er en JIT compiler implementering til Lua.
Lua er enklere end Python og har en mere klassisk Pascal-lignende syntaks. Der er kun otte indbyggede datatyper i sproget, og alle strukturerede typer (strukturer, opregninger, arrays, sæt) er modelleret ud fra en enkelt indbygget tabeltype, som faktisk er en heterogen ordbog. OOP er implementeret på tabeller og er baseret på en prototypemodel, som i JavaScript. Python giver flere muligheder, og dets strukturerede datatyper har hver deres egen implementering, hvilket forbedrer ydeevnen. OOP-mulighederne i Python er meget bredere, hvilket giver en fordel ved skrivning af komplekse programmer, men har ringe effekt på kvaliteten og ydeevnen af simple scripts, som Lua er fokuseret på.
Python, MATLAB og R bruges i databehandling og til at lære eleverne det grundlæggende i matematik og statistik. R er et sprog til at udføre statistiske beregninger, mens MATLAB kan betragtes som et programmeringssprog sammen med Python [139] .
Python, som et meget populært programmeringssprog, har påvirket følgende sprog:
Klassisk Python har en ulempe til fælles med mange andre fortolkede sprog - den relativt langsomme udførelseshastighed af programmer [147] . Til en vis grad forbedres situationen ved at gemme bytekoden (udvidelser .pycog, før version 3.5, .pyo), hvilket gør det muligt for tolken ikke at bruge tid på at analysere teksten i moduler ved hver start.
Der er implementeringer af Python-sproget, der introducerer højtydende virtuelle maskiner (VM'er) som en compiler-backend. Eksempler på sådanne implementeringer er PyPy , som er baseret på RPython; et tidligere initiativ er Papegøjeprojektet . Det forventes, at brugen af VM'er af LLVM-typen vil føre til de samme resultater som brugen af lignende fremgangsmåder til Java-sprogimplementeringer, hvor dårlig beregningsmæssig ydeevne stort set overvindes [148] . Vi må dog ikke glemme, at Pythons dynamiske karakter gør det uundgåeligt, at der opstår ekstra omkostninger under programafvikling, hvilket begrænser ydeevnen af Python-systemer, uanset hvilke teknologier der anvendes. Som et resultat bruges sprog på lavt niveau til at skrive kritiske sektioner af kode, hvormed integration leveres af mange programmer og biblioteker (se ovenfor).
I den mest populære implementering af Python-sproget er tolken ret stor og mere ressourcekrævende end i lignende populære implementeringer af Tcl , Forth , LISP eller Lua , hvilket begrænser dens brug i indlejrede systemer. Python er dog blevet overført til nogle platforme med relativt lav ydeevne. .
Python-fortolkeren i CPython (såvel som Stackless og PyPy [149] ) bruger tråd-usikre data, for at undgå ødelæggelse af hvilke, når de modificeres i fællesskab fra forskellige tråde, anvendes en global fortolkerlås - GIL (Global Interpreter Lock) [150 ] : under kodeeksekvering, en tråd Fortolkeren låser GIL, udfører i et fast tidsrum (standard 5 millisekunder [K 2] ) et antal instruktioner, frigiver derefter låsen og holder pause for at tillade andre tråde at køre. GIL'en frigøres også under I/O, ændring og kontrol af tilstanden af synkroniseringsprimitiver, når der udføres udvidelseskode, der ikke har adgang til fortolkerdata, såsom NumPy / SciPy . Således kan kun én tråd Python-kode køre i en enkelt Python-fortolkerproces ad gangen, uanset antallet af tilgængelige processorkerner.
Ydelsesstraffen fra GIL afhænger af programmernes art og systemets arkitektur. De fleste programmer er enkelttrådede eller kører kun nogle få tråde, hvoraf nogle er inaktive på et givet tidspunkt. Personlige computere har normalt et lille antal processorkerner, som indlæses af processer, der kører parallelt i systemet, så det reelle tab af ydeevne på personlige computere på grund af GIL er lille. Men i serverapplikationer kan det være praktisk at bruge snesevis og hundredvis (eller endda flere) af parallelle tråde (for eksempel i køsystemer, hvor hver tråd behandler data til en separat brugeranmodning) og servere i slutningen af 2010'erne har ofte snesevis og endda hundredvis af processorkerner, det vil sige, at de teknisk kan forsyne disse tråde med fysisk samtidig udførelse; under sådanne forhold kan GIL føre til et virkelig betydeligt fald i den samlede ydeevne, da det fratager programmet evnen til fuldt ud at bruge ressourcerne i multi-core-systemer.
Guido van Rossum sagde, at GIL "ikke er så slemt" og vil være i CPython, indtil "en anden" kommer med en ikke-GIL Python-implementering, der gør enkelttrådede scripts lige så hurtige [153] [154] .
Udviklingsopgaver omfatter arbejde med at optimere GIL [155] . Der er ingen planer om at udfase GIL i den nærmeste fremtid, da alternative mekanismer på enkelttrådede applikationer, som er flertallet, er langsommere eller bruger flere ressourcer:
En radikal løsning på problemet kunne være at skifte til Jython og IronPython , der kører på virtuelle Java-maskiner og .NET/Mono: disse implementeringer bruger slet ikke GIL.
Mens et af Pythons erklærede designprincipper er princippet om mindste overraskelse , peger kritikere på en række arkitektoniske valg, der kan være forvirrende eller forvirrende for programmører, der er vant til andre almindelige sprog [162] . Blandt dem:
Sammenlignet med Ruby og nogle andre sprog mangler Python muligheden for at ændre indbyggede klasser som int, str, float, listandre, hvilket dog gør det muligt for Python at forbruge mindre RAM og køre hurtigere. En anden grund til at indføre en sådan begrænsning er behovet for at koordinere med udvidelsesmoduler. Mange moduler (for at optimere ydeevnen) konverterer Python elementære typer til de tilsvarende C-typer i stedet for at manipulere dem gennem C API. Det eliminerer også mange potentielle faldgruber fra ukontrolleret dynamisk tilsidesættelse af indbyggede typer.
CPython er den vigtigste implementering af sproget. Den er skrevet i C og er bærbar på tværs af platforme. Grundlaget for hukommelsesstyring er brugen af en kombination af referencetællere og en skraldeopsamler, der er ansvarlig for at finde cykliske referencefangster [42] . Selvom sproget anses for at være fortolket, er det faktisk kompileret til en mellemliggende bytekode på højt niveau [166] [167] , som derefter udføres gennem en virtuel stackmaskine [42] . For eksempel kunne et funktionskald print()repræsenteres som [167] :
1 0 LOAD_NAME 0 ( print ) 2 LOAD_CONST 0 ( ' Hello World ! ' ) 4 CALL_FUNCTION 1 6 RETURN_VALUENavne i sproget er sent bundet, hvilket betyder, at du kan skrive kald til variabler, metoder og attributter, som endnu ikke eksisterer, men som skal deklareres på tidspunktet for udførelse af den kode, der bruger dem. Hvert objekt i Python har en hash-tabelordbog, hvorigennem attributnavne sammenlignes med deres værdier. Globale variabler kortlægges også via en ordbog. Et enkelt kald til en metode eller attribut kan efterfølges af et alternativt opslag i flere ordbøger [42] .
PyPy er en Python-implementering skrevet i RPython (en delmængde af Python med meget mindre dynamiske muligheder). Giver dig mulighed for nemt at teste nye funktioner. PyPy, ud over standard CPython, inkluderer funktionerne i Stackless, Psyco , AST modifikation i farten og meget mere. Projektet integrerer mulighederne for at analysere Python-kode og oversættelse til andre sprog og bytekoder på virtuelle maskiner ( C , LLVM , Javascript , .NET siden version 0.9.9). Fra 0.9.0 er det muligt fuldautomatisk at oversætte RPython til C, hvilket resulterer i en hastighed, der er acceptabel til brug (2-3 gange lavere end CPython med JIT deaktiveret for version 0.9.9). Som standard kommer PyPy med en indbygget JIT-compiler, som den er i stand til at køre meget hurtigere med end CPython.
Jython er en Python-implementering, der kompilerer Python -kode til Java-bytekode , der kan udføres af JVM . Det kan også bruges til at importere en klasse, hvis kildekode er skrevet i Java som et modul til Python [168] .
Der er også andre implementeringer.
Flere specialiserede undersæt af sproget er blevet skabt baseret på Python, hovedsageligt beregnet til statisk kompilering til maskinkode. Nogle af dem er anført nedenfor.
Ligesom Lisp og Prolog kan Python bruges interaktivt, hvor sætninger indtastet fra tastaturet straks udføres og resultatet vises på skærmen ( REPL ). Denne tilstand er praktisk både, når du lærer et sprog og under den professionelle udviklingsproces - til hurtigt at teste individuelle kodefragmenter - da den giver øjeblikkelig feedback. Det giver dig også mulighed for at bruge tolken som en lommeregner med et stort sæt funktioner.
Næsten alle Python IDE'er understøtter REPL til hurtig test.
Der er flere specialiserede IDE'er til Python-udvikling.
Derudover er der plug-ins til at understøtte Python-programmering til de universelle IDE'er Eclipse , KDevelop og Microsoft Visual Studio , samt understøttelse af syntaksfremhævning, kodefuldførelse og fejlfindings- og startværktøjer til en række almindelige teksteditorer.
Python er et stabilt og udbredt sprog. Det bruges i mange projekter og i forskellige kapaciteter: som et hovedprogrammeringssprog eller til at skabe udvidelser og integrere applikationer. En lang række projekter er implementeret i Python, og det bruges også aktivt til at lave prototyper til fremtidige programmer.
Python er et let sprog at lære, og det bliver ofte undervist som et førstesprog [27] , også når man lærer børn at programmere [185] . Som førstesprog er det velegnet, fordi programmer i det ligger tæt på det naturlige sprog, som folk er vant til at tænke på, og der kræves et minimum antal nøgleord for at skrive et korrekt program. På andre sprog, såsom C++ , er der en lang række forskellige syntakser og sprogelementer, som man skal være opmærksom på i stedet for at studere algoritmer [134] .
Som en open source-applikation bruges Python-fortolkeren over hele verden og leveres med Linux-baserede operativsystemer og Apple-computere . Python er populær blandt individuelle udviklere, men bruges også af store virksomheder i ret seriøse, profitorienterede produkter [186] . Reddit [46] er skrevet i Python . Dropbox har også en stærk brug af Python, og på grund af kompleksiteten af dynamisk skrivning og den store mængde kode, er virksomheden gået over til statisk skrivning med open source-projektet Mypy [187] Python er også flittigt brugt på Facebook [188 ] og Instagram [189] . Mange virksomheder bruger Python til hardwaretest, disse virksomheder omfatter Intel , Cisco , Hewlett-Packard og IBM . Industrial Light & Magic og Pixar bruger det i deres animationsfilm [186] .
Sproget er meget brugt af Google i sin søgemaskine, og Youtube er stort set skrevet ved hjælp af Python [186] [190] . Derudover har Google sponsoreret udviklingen af Python siden 2010 [191] [192] og understøttelsen af PyPI , hovedpakkedistributionssystemet til Python [191] [193] .
Pythons styrker er dens modularitet og evnen til at integrere med andre programmeringssprog, herunder som en del af komplekse komplekse applikationer og systemer [194] . Kombinationen af enkelhed og kortfattethed med et stort antal funktioner gør Python til et praktisk scriptsprog . . Mange projekter leverer et Python API til scripting, såsom Autodesk Maya [186] , Blender [195] og Houdini [196] 3D-modelleringsmiljøer og det gratis geografiske informationssystem QGIS [197] . Nogle projekter implementerer kernedelen i mere produktive programmeringssprog og giver en fuldgyldig API i Python for at forenkle arbejdet. . Motoren til den gratis videoeditor OpenShot er således implementeret i form af libopenshot- biblioteket , skrevet i C++ ved hjælp af C-biblioteker, og alle muligheder er fuldt dækket af Python API [198][ betydningen af det faktum? ] . US National Security Agency bruger Python til dataanalyse, og NASA bruger det til videnskabelige formål [186] . Af de værktøjer, der bruges hos NASA, kan man bemærke den gratis grafiske netværkssimulator GNS3 , som også har bevist sig i et virksomhedsmiljø og bruges i teknologivirksomheder, for eksempel hos Intel [199] . Cura [200] [201] er også skrevet i Python, et gratis og populært program til at skære 3D-modeller til udskrivning på 3D-printere .
Python, med NumPy- , SciPy- og MatPlotLib-pakker , bruges aktivt som et generelt videnskabeligt computermiljø som erstatning for almindelige specialiserede kommercielle pakker såsom Matlab , der giver lignende funktionalitet og en lavere indgangstærskel [202] . For det meste er det grafiske program Veusz også skrevet i Python.[203] , som giver dig mulighed for at skabe grafik af høj kvalitet klar til publicering i videnskabelige publikationer [204][ betydningen af det faktum? ] . Astropy -biblioteket er et populært værktøj til astronomiske beregninger [205][ betydningen af det faktum? ] .
Python er også velegnet til at udføre ikke-standardiserede eller komplekse opgaver i projektbygningssystemer , hvilket skyldes manglen på behovet for at prækompilere kildefiler. Google Test- projektet bruger det til at generere falsk kildekode til C++ klasser [206][ betydningen af det faktum? ] .
Python-fortolkeren kan bruges som et kraftfuldt shell- og scriptsprog til at skrive OS batch-filer. Den lette adgang fra Python-scripts til eksterne programmer og tilgængeligheden af biblioteker, der giver adgang til systemadministration, gør Python til et praktisk værktøj til systemadministration [207] . Det er meget brugt til dette formål på Linux-platformen: Python kommer normalt med systemet, i mange distributioner er installationsprogrammerne og den visuelle grænseflade af systemværktøjer skrevet i Python. Det bruges også til administration af andre Unix-systemer, især Solaris og macOS [207] . Selve sprogets og bibliotekernes tværplatformskarakter gør det attraktivt for ensartet automatisering af systemadministrationsopgaver i heterogene miljøer, hvor computere med forskellige typer operativsystemer bruges sammen.
Da det er et almindeligt sprog, er Python anvendeligt til næsten alle aktivitetsområder. Faktisk bruges Python af næsten alle velrenommerede virksomheder på den ene eller anden måde, både til daglige opgaver og til test, administration eller softwareudvikling [186] .
Python | |
---|---|
Fællesskab | |
Implementeringer | |
Andet |
|
Programmeringssprog | |
---|---|
|
![]() | ||||
---|---|---|---|---|
Ordbøger og encyklopædier | ||||
|