- Python pakub põhilisi numbritüüpe (int, float, complex, bool) ning võimsaid abilisi nagu math, cmath, decimal ja random igapäevaste arvutuste jaoks.
- Numbrite moodul defineerib abstraktsed baasklassid, seega saab paljusid sisseehitatud, NumPy ja kohandatud numbritüüpe käsitleda ühtselt Numberi eksemplaridena.
- Ümardamisviisid, eriväärtused (NaN, lõpmatused) ja täpne kümnendarvutus kümnendsüsteemi kaudu on usaldusväärse teadusliku ja finantskoodi jaoks üliolulised.
- Laiem numbriline Pythoni ökosüsteem, eriti NumPy, laiendab põhitüüpe fikseeritud laiusega täisarvude ja suure jõudlusega massiividega raskete arvutuste jaoks.
Numbritega töötamine on enamiku Pythoni programmide keskmes, olenemata sellest, kas lood lihtsat skripti, töötled teadusandmeid või prototüüpid algoritmi. Pythoni numbriliste väärtuste esitamise ja manipuleerimise mõistmine on esimene samm usaldusväärse ja tõhusa koodi kirjutamiseks, mis käitub ootuspäraselt.
Kui inimesed räägivad numbrilisest Pythonist, peavad nad sageli silmas kahte asjaühel pool sisseehitatud numbritüübid ja standardsed teekitööriistad, näiteks math, cmath, decimal, random ja numbers; teiselt poolt numbrilise andmetöötluse laiem ökosüsteem koos selliste teekidega nagu NumPy, mis laiendavad keelt täiendavate numbritüüpide ja vektoriseeritud tehtega. See juhend tutvustab teile üksikasjalikult seda alust, alates põhitüüpidest kuni keerukamate abstraktsioonideni.
Pythoni põhinumbrilised tüübid
Python defineerib mitu sisseehitatud numbrilist kategooriat, mis katavad enamiku igapäevastest vajadustest: täisarvud täisarvude jaoks, ujukomaarvud reaalarvude jaoks koos kümnendmurdudega, kompleksarvud reaal- ja imaginaarosadega väärtuste jaoks ning spetsiaalne Boole'i tüüp, mis käitub nagu väga väike täisarvude perekonna liige. Kõik need integreeruvad sujuvalt Pythoni aritmeetiliste operaatoritega.
Täisarvud (int) tähistavad täisarve, positiivseid või negatiivseid, ilma komakohataStandardses Pythonis pole nende suurusele kindlat ülempiiri; seni kuni teil on mälu, saab teie täisarv kasvada. Väärtused nagu 1, -5 or 20234567890123456789 on kõik kehtivad int juhtumeid ja saate seda kinnitada type(1) or type(-5), mis naaseb <class 'int'>.
Ujukomaarvud (float) kasutatakse murdosaga reaalarvude puhulNeed kirjutatakse komaga, näiteks 2.0, -7.823457 or 0.5või teadusliku tähistusega, näiteks 1e8 (mis tähendab 100 000 000). Kui sooritate selliseid toiminguid nagu jagamine, isegi täisarvude vahel, siis Python sageli edastab tulemuse float; näiteks, 9 / 2 saagikus 4.5ja type(4.5) is <class 'float'>.
Kompleksarvud (complex) ühendab reaalse osa ja imaginaarse osa, kirjutatud lõpuga j imaginaarühiku jaoks. Väärtus nagu 2 + 3j on reaalne komponent 2 ja imaginaarne komponent 3. Neid saab otse konstrueerida (nt 3.14j) ja kontrollige neid selliste atribuutidega nagu .real ja .imagvõi helistage .conjugate() komplekskonjugaadi saamiseks. Need on eriti populaarsed inseneriteaduses, signaalitöötluses ja teadusarvutustes.
Boole'i väärtused (bool) on tehniliselt samuti numbrilised, Sest True ja False käituvad aritmeetilistes avaldistes nagu täisarvud 1 ja 0. Näiteks True + 2 hindab 3Sisemiselt bool on alamklass int, mistõttu integreeruvad tõeväärtusväärtused sujuvalt arvutustesse ja võrdlustesse.
Python võimaldab teil neid numbritüüpe avaldistes vabalt segada, vajadusel üldisemaks tüübiks ülendades. Lisades int kuni float annab tulemuseks floatja ujukomaarvude kombineerimine kompleksarvudega annab kompleksse tulemuse: avaldised nagu 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) kogu töö ilma suurema tseremooniata.

Aritmeetilised operaatorid ja jagamiskäitumine
Kui sul on numbrilised väärtused, kasutad nendega töötamiseks tavalisi aritmeetilisi operaatoreid.: liitmine (+), lahutamine (-), korrutamine (*), jaotus (/), põrandajaotus (//), astendamine (**) ja modulo (%). Python rakendab neid täisarvude, ujukomaarvude ja kompleksarvude puhul, teostades vajadusel tüübiedendamist.
Jaotus on üks valdkond, kus Pythoni disain on väga tahtlik. Kasutades / annab alati ujukomaarvu tulemuse, kui mõlemad argumendid on numbrilised, isegi kui need mõlemad on täisarvud. Seega 9 / 2 tulemuseks on 4.5, mitte 4See julgustab teid vaikimisi mõtlema reaalarvude jagamise terminitele, mis on tavaliselt see, mida teaduslikes või finantsarvutustes vaja läheb.
Kui vajate täisarvude jagamist, mis jätab murdosa kõrvale, kasutate põrandajagamise operaatorit //. Näiteks, 9 // 2 toodab 4ja -9 // 2 saagikus -5, kuna tulemus on ümardatud negatiivse lõpmatuse poole (floord down). Lisaks divmod(a, b) annab sulle korraga nii jagatise kui ka jäägi, tagastades paari, mis peegeldab (a // b, a % b).
Kulisside taga koordineerib Python hoolikalt, kuidas erinevad numbrilised maitsed omavahel suhtlevadStandardteegis võib näha sisemist mustrit, mis hõlmab „operaatorite varuvariante”: funktsioone, mis proovivad esmalt tüübispetsiifilist implementatsiooni, näiteks ratsionaalarvude puhul, ja seejärel pöörduvad tagasi sisseehitatud operaatorite juurde, kui üks operand on regulaarne. int, float or complexSee võimaldab kohandatud numbritüüpidel Pythoni aritmeetilise süsteemiga suhelda, kasutades spetsiaalseid meetodeid, näiteks __add__ ja __radd__.
Ratsionaalse aritmeetika teekikood, näiteks Fraction tüüp, illustreerib seda strateegiat selgeltKahe lisamisel Fraction juhtudel arvutab see uue murru lugejate ja nimetajate ristkorrutamise teel. Kui lisate Fraction tavalise täisarvu või eksemplari kujul numbers.Rational, kasutab see täpset ratsionaalalgoritmi. Kui teine operand on float or complex, teisendub see laiemaks tüübiks ja delegeerib tavalistele operaatoritele, hoides käitumise järjepideva ja intuitiivsena.
Sisseehitatud numbrilised funktsioonid
Lisaks tooroperaatoritele on Pythonis sisseehitatud funktsioonide komplekt, mis oskavad numbreid käsitleda.Need funktsioonid on alati saadaval ilma midagi importimata ja töötavad nii standardsete numbritüüpide kui ka kõigi kohandatud objektide puhul, mis rakendavad õigeid erimeetodeid.
abs(x) tagastab oma argumendi absoluutväärtuse, muutes negatiivsed arvud positiivseks ja jättes positiivsed väärtused muutmata. Kui annate edasi objekti, mis defineerib __abs__(), delegeerib Python sellele meetodile. Kompleksarvude puhul abs() tagastab suuruse (kauguse alguspunktist komplekstasandil).
round(x, ndigits) annab sulle väärtuse, mis on ümardatud antud arvu kümnendkohtadeni. Kui ndigits on välja jäetud või None, tagastab see lähima täisarvu. Erinevalt kooliõpiku „poole võrra ümardamise” reeglist on Pythoni sisseehitatud round kasutab korduvate arvutuste statistilise kallutatuse vähendamiseks viikide korral strateegiat „ümardab poole võrdseks“.
Teisendusfunktsioonid, näiteks int() ja float() konstrueeri numbreid teistest objektidestHelistades int(x) ujukil eemaldab murdosa (näiteks int(1.9) is 1), Ja float(x) loob täisarvudest, stringidest või ühilduvatest objektidest ujukoma esituse. Ujukomaarvude teisendamisel täisarvudeks ümardamist ei toimu; kümnendosa lihtsalt kärbitakse.
Teised sisseehitatud elemendid täidavad esitus- ja koondamisrolleFunktsioonid nagu hex() ja oct() tagastab täisarvude stringi esituse kuueteistkümnendsüsteemis või kaheksandsüsteemis koos sobivate eesliidetega (0x ja 0o). Koondamise abilised, näiteks max() ja min() skannib itereeritavat objekti või argumentide jada, et leida suurim või väikseim väärtus, samal ajal kui pow() ja ** operaator arvutab astmeid ja valikuliselt aktsepteerib kolmandat argumenti modulaarse astendamise jaoks.
Täiustatud numbrilised tööriistad: matemaatika, CMath ja kümnend
Keerukamate arvutuste jaoks pakub Python spetsiaalseid standardseid teekimooduleid selle asemel, et põhikeelt paisutada. Numbrilise töö jaoks on kõige olulisemad math, cmath ja decimal, igaüks neist on suunatud konkreetsele probleemide alamhulgale.
. math moodul keskendub reaalarvulise ujukomaarvutusega matemaatikalePärast selle importimist import math, saate juurdepääsu funktsioonidele ja konstantidele, mida tavaliselt vajatakse inseneriteaduses, füüsikas ja igapäevases analüütikas, mis kõik on rakendatud tõhusas C-koodis ja töötavad float väärtused.
math sisaldab arvuteoreetilisi ja esitusvahendeid nagu math.ceil() ümardamiseks lähima täisarvuni, math.floor() allapoole ümardamiseks, math.modf() ujukoma jagada murd- ja täisosadeks ning math.frexp() / math.ldexp() sisemise binaaresitusega töötamiseks. See pakub ka võimsus- ja logaritmilisi rutiine, näiteks math.exp(), math.log(), math.log10(), math.pow() ja math.sqrt(), samuti trigonomeetrilisi ja hüperboolseid funktsioone, näiteks math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() ja math.tanh().
Mugavuse huvides math ekspordib põhikonstandid nagu math.pi ja math.eNeed on käepärased alati, kui arvutate pindalasid, nurki või eksponentsiaalset kasvu ja soovite kogu koodis saada järjepidevaid ja hea täpsusega väärtusi.
Kui teil on vaja töötada kompleksarvudega, siis cmath moodul mängib sama rolli komplekstasandilSelle API peeglid math aga kasutab keerulisi argumente ja tagastab keerulisi tulemusi, nii et saate arvutada keerulisi eksponentsiaale, logaritme ja trigonomeetrilisi funktsioone ilma numbreid käsitsi reaalseteks ja imaginaarseteks osadeks jagamata.
. decimal moodul on suunatud teisele valupunktile: täpne kümnendsüsteemStandardne binaarne ujukomaarv ei suuda paljusid kümnendmurde täpselt esitada, seega arvutused nagu 0.1 + 0.2 annab veidi ebaühtlase tulemuse. decimal.Decimal möödahiilib sellest, kasutades suvalist kümnendsüsteemi täpsusega aritmeetikat, mis teeb sellest ideaalse lahenduse finantsrakenduste ja kõikjal, kus tuleb ümardamist väga täpselt kontrollida.
Vaikimisi järgivad Pythoni ujukomaarvutused IEEE-754 käitumist ja kasutavad kahebaasist esitust.Kui väärtus asub täpselt kahe esitatava arvu keskel, rakendatakse põhimõtet „ümarda pool paarisarvuni“, mis tähendab, et pooled seotud arvudest ümardatakse allapoole ja pooled ülespoole. See väldib süstemaatilist triivi suurtes arvutustes. Kui soovite kommertslikku „ümarda poole üles“ semantikat, saate konfigureerida decimal kasutatav kontekst ROUND_HALF_UP, mis nihutab väärtusi alati nullist 5 võrra eemale.
Numbriliste tüüpidega töötamine praktikas
Numbrite interaktiivse käitumise uurimine on suurepärane viis intuitsiooni arendamiseks.Käivita Pythoni interpretaator ja loo segu täisarvudest, ujukomatest ja kompleksväärtustest ning proovi seejärel nende peal põhitehteid. Liitmine ja korrutamine on lihtne, aga eriti õpetlik on katsetada jagamist, jagamist põrandani, ümardamist ja teisendusi, jälgides, kuidas tulemuse tüüp muutub.
Numbriliste tüüpide teisendamine on mõnikord vajalik API ootustele vastamiseks või loogika lihtsustamiseks.Kui sul on ujukoma ja soovid ainult selle täisarvulist osa, määra see muutujale, näiteks my_float = 1.9 ja siis helista my_int = int(my_float)Trükkimine my_int annab 1ja type(my_int) kinnitab, et tegemist on intPea meeles, et murdosa visatakse ära, mitte ei ümardata.
Vastupidine suund – edutamine üldisemaks tüübiks – toimub sageli kaudselt.Kui liita täisarv ja ujukoma, tagastab Python ujukoma ilma küsimata, kuna reaalarvusüsteem sisaldab täisarve. Sama edutamine toimub ujukoma ja kompleksarvu kombineerimisel: ujukomaväärtust käsitletakse nulli imaginaarosana ja tulemus on kompleksarv.
Kompleksarvudel on mitu sisseehitatud mugavust, mis muudavad need loomulikuksSaate otse kontrollida a.real ja a.imag Komponentide saamiseks helistage a.conjugate() imaginaarosa märgi ümberpööramiseks ja nende edastamiseks funktsioonidele cmath ilma käsitsi teisendamiseta. Isegi kui te neid harva kasutate, on nende olemasolu ja käitumise teadmine teadusliku koodiga kokkupuutumisel abiks.
Ujukomaandmete käsitlemisel on täpsus ja korrektsus alati olulisedStandardse Pythoni efektiivne täpsus float on umbes 15 kümnendkohta; sellest kaugemal võib 16. number olla ebausaldusväärne. Paljude ülesannete puhul on see täiesti vastuvõetav, kuid kui vajate täpset kümnendarvutust või prognoositavamat ümardamist, siis decimal moodul annab sulle vajaliku kontrolli teatud jõudluse hinnaga.
Juhuslikud arvud ja erilised arvväärtused
Juhuslike arvude genereerimine on numbrilistes Pythoni töövoogudes veel üks sagedane ülesanne., olenemata sellest, kas loote lihtsaid mänge, käitate Monte Carlo simulatsioone või kirjutate teste, mis harjutavad äärealasid. Standardteegi random moodul pakub selliste stsenaariumide jaoks põhitõdesid.
random.randint(a, b) tekitab pseudojuhusliku täisarvu vahemikus a ja b, kaasa arvatudSee teeb täringute veeretamise simuleerimise või loendist juhuslike indeksite valimise lihtsaks. Ujukoma väärtuste puhul toimivad funktsioonid nagu random.random() ja seotud abilised genereerivad ühtlaseid juhuslikke numbreid vahemikes nagu [0.0, 1.0), mis on valmis teie konkreetse jaotuse jaoks skaleerimiseks või teisendamiseks.
Python paljastab ka mõned numbrilised väärtused, mis esindavad ebatavalisi või äärmuslikke suurusi.Üks on NaN („mitte number“), mis saadakse näiteks kutsudes float('nan')NaN tähistab määratlemata või esindamatuid tulemusi, näiteks nulli jagamise tulemust nulliga või sisendandmetest rikutud numbrivälja parsimise tulemust.
Lisaks NaN-ile toetab Python positiivset ja negatiivset lõpmatust, ehitatud kasutades float('inf') ja float('-inf')Need on kasulikud kontrollväärtustena muutujate initsialiseerimisel algoritmide jaoks, mis otsivad minimaalseid või maksimaalseid väärtusi, või piiramata vahemike modelleerimisel numbrilistes meetodites.
NaN-idega töötamine nõuab erilist hoolt, kuna need ei käitu nagu tavalised numbrid.NaN-i sisaldavad võrdlused on alati valed (isegi nan == nan) ja NaN-iga aritmeetika kipub NaN-i tulemuse kaudu levitama. Kuigi see juhend ei süvene NaN-i semantikasse sügavale, aitab nende iseärasuste teadvustamine teil andmevooge ja numbrilisi algoritme tõhusamalt siluda.
Abstraktsed numbrilised hierarhiad numbrimooduliga
Koodi keerukamaks muutudes võite vajada paindlikku viisi numbriliste väärtuste äratundmiseks. ilma iga üksiku betoonitüübi suhtes käsitsi kontrollimata (näiteks int, float, complex ja NumPy skalaarid). Siin toimub numbers moodul tuleb sisse, pakkudes numbriliste tüüpide abstraktset hierarhiat.
. numbers moodul defineerib abstraktsed baasklassid (ABC-d), mis kirjeldavad numbrilist käitumistNagu Number, Complex, Real, Rational ja IntegralNeed klassid ei ole mõeldud otse loomiseks. Selle asemel pärivad neilt konkreetsed numbrilised tüübid, mis annab märku, et nad rakendavad nõutavaid toiminguid ja omadusi.
Kõige üldisem ABC on numbers.Number, mis esindab „mis tahes numbrilist tüüpi”Kui soovite testida, kas muutujat tuleks käsitleda numbrilisena – näiteks silumise ajal või väikeste utiliidiskriptide kirjutamisel –, saate kombineerida isinstance selle ABC-ga. Näiteks isinstance(x, Number) Tulu True sisseehitatud numbritüüpide ja paljude väliste numbritüüpide, näiteks mitmesuguste NumPy skalaaride jaoks.
Praktiline näide kasutab NumPy tüüpe koos Pythoni sisseehitatud tüüpidega.Kui impordite NumPy kui np ja seejärel tsükliga üle selliste väärtuste nagu 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) ja np.int32(89), helistades isinstance(value, Number) Iga klassi puhul näete, et need kõik loetakse numbrilisteks. See säästab teid iga konkreetse klassi jaoks pika tüübikontrollide ahela kirjutamisest.
Väärib märkimist, et isinstance ennast peetakse liigse kasutamise korral koodi "lõhnaks"Liigne sõltuvus otsesest tüübikontrollist võib viidata objektorienteeritud programmi sügavamatele disainiprobleemidele. Siiski võib kiire silumise, uurimuslike skriptide või väikeste utiliitide puhul kontrollida tüübikontrolli... numbers.Number on võimas ja praktiline tööriist, mis kontrollib, kas teie muutujad käituvad tõepoolest numbritena.
Laiendatud numbrilised ökosüsteemid: NumPy ja kohandatud tüübid
Kuigi Pythoni põhikeel pakub vaid väikest valikut üldotstarbelisi numbritüüpe, laiendab laiem ökosüsteem teie valikuid oluliselt.Eelkõige NumPy tutvustab palju uusi numbrilisi variante, mis on loodud tõhusaks arvutamiseks suurte massiivide ja maatriksite peal.
NumPy defineerib fikseeritud laiusega täisarvutüüpe, näiteks numpy.int64, numpy.int32, numpy.int16 ja spetsiaalsed varjunimed, näiteks numpy.int0Need meenutavad tüüpe, mida leidub madala taseme numbriliselt orienteeritud keeltes, näiteks Fortran ja C, kus numbrite täpse salvestusmahu ja käitumise teadmine on jõudluse ja koostalitlusvõime seisukohalt oluline.
Lisaks täisarvudele pakub NumPy tüüpe nagu numpy.float64 ja numpy.complex64koos paljude teistega, mis integreeruvad kenasti massiivide ja u-funktsioonidega (universaalsed funktsioonid). Need tüübid registreeruvad tavaliselt sobivate ABC-de eksemplaridena numbers moodul, mistõttu kontrollitakse numbers.Number töötage nagu eelnevalt illustreeritud.
Pythoni disain hoidis põhilise numbrilise mudeli tahtlikult lihtsa ja ligipääsetavanaSelle asemel, et sundida iga kasutajat haldama kümneid erinevaid numbrilisi maitseid, keskendub see kolmele baasnumbrilisele tüübile (lisaks tõeväärtustele), muutes samal ajal spetsialiseeritud teekide jaoks selle repertuaari vajaduse järgi laiendamise lihtsaks. Insenerikeskne keskkond, näiteks simulatsioonitarkvara ettevõtte loodud keskkond, tugineb loomulikult suuresti nendele laiendatud tüüpidele ja teekidele.
Kui loote oma numbrilised klassid, järgides mustreid alates numbers ja fractions aitab sul ökosüsteemiga sobitudaSobiva ABC alamklassidesse jagamise ja vajalike erimeetodite rakendamise abil (__add__, __radd__, __mul__jne), saavad teie kohandatud tüübid loomulikult suhelda Pythoni operaatorite, sisseehitatud numbriliste funktsioonide ja teiste numbriteekidega.
Kokkuvõttes ühendab numbriline Python puhta põhitüübisüsteemi, võimsad standardsed teekimoodulid ja rikkaliku teekide ökosüsteemi. nagu NumPy, luues keskkonna, kus saate mugavalt liikuda lihtsast aritmeetikast keerukate tehniliste arvutusteni. Kui olete omandanud, kuidas täisarvud, ujukomad, kompleksarvud, eriväärtused, ümardamisreeglid ja abstraktsed numbriklassid kokku sobivad, saate oma koodi üle enesekindlamalt arutleda, vältida peeneid vigu ja valida iga numbrilise ülesande jaoks õiged tööriistad.