- Python nudi osnovne numeričke tipove (int, float, complex, bool) plus moćne pomagače poput math, cmath, decimal i random za svakodnevne izračune.
- Modul numbers definira apstraktne bazne klase tako da se mnogi ugrađeni, NumPy i prilagođeni numerički tipovi mogu uniformno tretirati kao instance klase Number.
- Načini zaokruživanja, posebne vrijednosti (NaN, beskonačnosti) i točna decimalna aritmetika putem decimala ključni su za robustan znanstveni i financijski kod.
- Širi numerički Python ekosustav, posebno NumPy, proširuje osnovne tipove s cijelim brojevima fiksne širine i visokoučinkovitim nizovima za zahtjevna izračunavanja.

Rad s brojevima je srž većine Python programa, bez obzira pišete li jednostavan skript, obrađujete znanstvene podatke ili izrađujete prototip algoritma. Razumijevanje načina na koji Python predstavlja i manipulira numeričkim vrijednostima prvi je korak u pisanju pouzdanog i učinkovitog koda koji se ponaša onako kako očekujete.
Kada ljudi govore o "numeričkom Pythonu", često misle na dvije stvaris jedne strane, ugrađeni tipovi brojeva i standardni alati biblioteke poput math, cmath, decimal, random i numbers; s druge strane, širi ekosustav oko numeričkog računanja, s bibliotekama poput NumPy koje proširuju jezik dodatnim numeričkim tipovima i vektoriziranim operacijama. Ovaj vodič vas detaljno vodi kroz te osnove, od osnovnih tipova do naprednih apstrakcija.
Osnovni numerički tipovi u Pythonu
Python definira nekoliko ugrađenih numeričkih kategorija koje pokrivaju većinu svakodnevnih potreba: cijeli brojevi za cijele brojeve, brojevi s pomičnim zarezom za realne vrijednosti s decimalnim brojevima, kompleksni brojevi za vrijednosti s realnim i imaginarnim dijelovima i poseban Booleov tip koji se ponaša kao vrlo mali član obitelji cijelih brojeva. Svi se oni glatko integriraju s Python-ovim aritmetičkim operatorima.
Cijeli brojevi (int) predstavljaju cijele brojeve, pozitivne ili negativne, bez decimalne točkeU standardnom Pythonu ne postoji fiksna gornja granica njihove veličine; sve dok imate memorije, vaš cijeli broj može rasti. Vrijednosti poput 1, -5 or 20234567890123456789 svi su važeći int slučajeve, a to možete potvrditi i s type(1) or type(-5), koji će se vratiti <class 'int'>.
Brojevi s pomičnim zarezom (float) koriste se za realne brojeve s frakcijskom komponentomPišu se s decimalnom točkom, kao što je 2.0, -7.823457 or 0.5ili sa znanstvenom notacijom poput 1e8 (što znači 100,000,000). Kada izvodite operacije poput dijeljenja, čak i između cijelih brojeva, Python često rezultat pretvara u float; na primjer, 9 / 2 prinosi 4.5i type(4.5) is <class 'float'>.
Kompleksni brojevi (complex) kombiniraju realni i imaginarni dio, napisano s posljednjom crtom j za imaginarnu jedinicu. Vrijednost poput 2 + 3j ima realnu komponentu 2 i imaginarnu komponentu 3. Možete ih izravno konstruirati (npr. 3.14j) i pregledajte ih pomoću atributa kao što su .real i .imagili nazovite .conjugate() kako bi se dobio kompleksni konjugat. Oni su posebno popularni u inženjerstvu, obradi signala i znanstvenom računarstvu.
Booleove vrijednosti (bool) su tehnički također numerički, Jer je True i False ponašaju se kao cijeli brojevi 1 i 0 u aritmetičkim izrazima. Na primjer, True + 2 procjenjuje se na 3Interno, bool je podklasa od int, zbog čega se logičke vrijednosti besprijekorno integriraju u izračune i usporedbe.
Python vam omogućuje slobodno miješanje ovih numeričkih tipova u izrazima, prelazeći u općenitiji tip kada je to potrebno. Dodavanje int do float daje float, a kombiniranje float brojeva s kompleksnim brojevima daje složen rezultat: izraze poput 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) sav rad bez dodatne ceremonije.

Aritmetički operatori i ponašanje dijeljenja
Nakon što imate numeričke vrijednosti, koristite uobičajene aritmetičke operatore za rad s njimazbrajanje (+), oduzimanje (-), množenje (*), dijeljenje (/), podjela poda (//), potenciranje (**) i modulo (%). Python ih primjenjuje na cijele brojeve, brojeve s pomičnim decimalom i kompleksne brojeve, izvodeći promociju tipova po potrebi.
Podjela je jedno područje gdje je Python-ov dizajn vrlo promišljen, koristeći / uvijek daje rezultat s pomičnim zarezom kada su oba argumenta numerička, čak i ako su oba cijeli brojevi. Dakle 9 / 2 Rezultati u 4.5, Ne 4To vas potiče da razmišljate u smislu dijeljenja realnih brojeva prema zadanim postavkama, što je obično ono što želite u znanstvenim ili financijskim izračunima.
Ako vam je potrebno cjelobrojno dijeljenje koje odbacuje razlomljeni dio, koristite operator dijeljenja s podom. //, Na primjer, 9 // 2 proizvodi 4i -9 // 2 prinosi -5, budući da je rezultat zaokružen prema dolje (zaokružen prema negativnoj beskonačnosti). Osim toga, divmod(a, b) daje vam i količnik i ostatak odjednom, vraćajući par koji odražava (a // b, a % b).
Iza kulisa, Python pažljivo koordinira kako različite numeričke varijante međusobno djelujuInterni obrazac koji možete vidjeti u standardnoj biblioteci je ideja "operatora koji se vraćaju": funkcije koje prvo pokušavaju implementaciju specifičnu za tip, na primjer za racionalne brojeve, a zatim se vraćaju ugrađenim operatorima kada je jedan operand regularni. int, float or complexTo omogućuje prilagođenim numeričkim tipovima međudjelovanje s Python-ovim aritmetičkim sustavom korištenjem posebnih metoda poput __add__ i __radd__.
Bibliotečni kod za racionalnu aritmetiku, kao što je Fraction tip, jasno ilustrira ovu strategijuPrilikom dodavanja dva Fraction instance, izračunava novi razlomak unakrsnim množenjem brojnika i nazivnika. Ako dodate Fraction na običan cijeli broj ili instancu numbers.Rational, koristi precizni racionalni algoritam. Ako je drugi operand float or complex, pretvorit će se u taj širi tip i delegirati regularnim operatorima, održavajući ponašanje dosljednim i intuitivnim.
Ugrađene numeričke funkcije
Osim sirovih operatora, Python dolazi sa skupom ugrađenih funkcija koje znaju kako rukovati brojevima.Ove funkcije su uvijek dostupne bez uvoza ičega i rade na standardnim numeričkim tipovima, plus svim prilagođenim objektima koji implementiraju odgovarajuće posebne metode.
abs(x) vraća apsolutnu vrijednost svog argumenta, pretvarajući negativne brojeve u pozitivne, a pozitivne vrijednosti ostavljajući nepromijenjenima. Ako proslijedite objekt koji definira __abs__(), Python će delegirati toj metodi. Za kompleksne brojeve, abs() vraća magnitudu (udaljenost od ishodišta u kompleksnoj ravnini).
round(x, ndigits) daje vam vrijednost zaokruženu na određeni broj decimalnih mjesta, Ako ndigits je izostavljeno ili None, vraća najbliži cijeli broj. Za razliku od školskog pravila "zaokruživanja polovice prema gore", Python-ovo ugrađeno pravilo round koristi strategiju "zaokruživanja polovice na par" za neriješene rezultate kako bi se smanjila statistička pristranost u ponovljenim izračunima.
Funkcije konverzije poput int() i float() konstruirati brojeve od drugih objekataPozivanje int(x) na float odbacuje decimalni dio (na primjer, int(1.9) is 1), A float(x) stvara prikaz s pomičnim zarezom iz cijelih brojeva, nizova znakova ili kompatibilnih objekata. Prilikom pretvorbe iz float u int, ne dolazi do zaokruživanja; decimalni dio se jednostavno skraćuje.
Drugi ugrađeni elementi služe za reprezentaciju i agregacijuFunkcionira kao hex() i oct() vrati nizove prikaza cijelih brojeva u heksadecimalnom ili oktalnom sustavu s odgovarajućim prefiksima (0x i 0o). Pomoćnici agregacije kao što su max() i min() skenira iterabilnu datoteku ili niz argumenata kako bi se pronašla najveća ili najmanja vrijednost, dok pow() i ** operator izračunava potencije i opcionalno prihvaća treći argument za modularno potenciranje.
Napredni numerički alati: matematika, cmath i decimalni
Za sofisticiranije izračune, Python nudi namjenske module standardne biblioteke umjesto da se preopterećuje osnovni jezik. Najvažniji za numerički rad su math, cmath i decimal, pri čemu svaki cilja na određeni podskup problema.
The math Modul se fokusira na matematiku s pomičnim zarezom u realnim vrijednostimaNakon uvoza s import math, dobivate pristup funkcijama i konstantama koje su obično potrebne u inženjerstvu, fizici i svakodnevnoj analitici, a sve je implementirano u učinkovitom C kodu i radi na float vrijednosti.
math uključuje alate za teoriju brojeva i reprezentaciju poput math.ceil() za zaokruživanje na najbliži cijeli broj, math.floor() za zaokruživanje prema dolje, math.modf() razdvojiti broj s pomičnim zarezom na decimalne i cjelobrojne dijelove i math.frexp() / math.ldexp() za rad s internom binarnom reprezentacijom. Također pruža rutine za potenciju i logaritamske funkcije poput math.exp(), math.log(), math.log10(), math.pow() i math.sqrt(), kao i trigonometrijske i hiperboličke funkcije kao što su math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() i math.tanh().
radi praktičnosti, math izvozi temeljne konstante poput math.pi i math.eOvo je korisno kad god izračunavate površine, kutove ili eksponencijalni rast i želite konzistentne vrijednosti s dobrom preciznošću u cijeloj kodnoj bazi.
Kada trebate raditi s kompleksnim brojevima, cmath modul igra istu ulogu za kompleksnu ravninuNjegovi API zrcali math ali koristi složene argumente i vraća složene rezultate, tako da možete izračunati složene eksponencijalne funkcije, logaritme i trigonometrijske funkcije bez ručnog rastavljanja brojeva na realne i imaginarne dijelove.
The decimal modul cilja drugu bolnu točku: točnu aritmetiku s bazom 10Standardni binarni broj s pomičnim zarezom ne može precizno predstaviti mnoge decimalne razlomke, pa izračuni poput 0.1 + 0.2 dati malo drugačiji rezultat. decimal.Decimal zaobilazi ovo korištenjem aritmetike s bazom 10 proizvoljne preciznosti, što ga čini idealnim za financijske primjene i svugdje gdje morate vrlo strogo kontrolirati ponašanje zaokruživanja.
Prema zadanim postavkama, Python-ove operacije s pomičnim zarezom slijede ponašanje IEEE-754 i koriste reprezentaciju baze-2.Kada se vrijednost nalazi točno na pola puta između dvaju reprezentativnih broja, primjenjuje se "zaokruživanje polovice na parno", što znači da se polovica veza zaokružuje prema dolje, a polovica prema gore. Time se izbjegava sustavno odstupanje u velikim izračunima. Ako želite komercijalnu semantiku "zaokruživanja polovice prema gore", možete konfigurirati decimal kontekst za korištenje ROUND_HALF_UP, što uvijek pomiče 5 vrijednosti dalje od nule.
Rad s numeričkim tipovima u praksi
Istraživanje interaktivnog ponašanja brojeva odličan je način za razvoj intuicije.Pokrenite Python interpreter i stvorite kombinaciju cijelih brojeva, brojeva s pomičnim zarezom i kompleksnih vrijednosti, a zatim isprobajte osnovne operacije nad njima. Zbrajanje i množenje je jednostavno, ali je posebno poučno eksperimentirati s dijeljenjem, dijeljenjem na tlo, zaokruživanjem i pretvorbama, promatrajući kako se mijenja tip rezultata.
Pretvaranje između numeričkih tipova ponekad je potrebno kako bi se uskladilo s očekivanjima API-ja ili pojednostavila logika.Ako imate broj s pomičnim zarezom i želite samo njegov cijeli broj, dodijelite ga varijabli poput my_float = 1.9 a zatim nazovite my_int = int(my_float)Tisak my_int daje 1i type(my_int) potvrđuje da je to intImajte na umu da se razlomljeni dio odbacuje, a ne zaokružuje.
Obrnuti smjer – prelazak na općenitiji tip – često se događa implicitno.Kada zbrojite cijeli broj i broj s pomičnim zarezom, Python vraća broj s pomičnim zarezom bez pitanja, budući da sustav realnih brojeva sadrži cijele brojeve. Ista promocija događa se kada kombinirate broj s pomičnim zarezom i kompleksni broj: vrijednost s pomičnim zarezom tretira se kao da ima imaginarni dio nule, a rezultat je kompleksan.
Kompleksni brojevi uključuju nekoliko ugrađenih pogodnosti koje im daju prirodan osjećajMožete izravno pregledati a.real i a.imag da biste dobili komponente, nazovite a.conjugate() obrnuti predznak imaginarnog dijela i proslijediti ih funkcijama u cmath bez ručne pretvorbe. Čak i ako ih rijetko koristite, poznavanje njihovog postojanja i načina na koji se ponašaju pomaže vam kada naiđete na znanstveni kod.
Točnost i preciznost uvijek su važne pri radu s podacima s pomičnim zarezom.Efektivna preciznost standardnog Pythona float ima oko 15 decimalnih znamenki; nakon toga, 16. znamenka može biti nepouzdana. Za mnoge zadatke ovo je sasvim prihvatljivo, ali ako vam je potrebna točna decimalna aritmetika ili predvidljivije zaokruživanje, decimal modul vam daje potrebnu kontrolu na štetu nekih performansi.
Slučajni brojevi i posebne numeričke vrijednosti
Generiranje slučajnih brojeva još je jedan čest zadatak u numeričkim Python tijekovima rada., bez obzira na to izrađujete li jednostavne igre, pokrećete Monte Carlo simulacije ili pišete testne slučajeve koji vježbaju rubne uvjete. Standardna biblioteka random Modul pruža osnove za takve scenarije.
random.randint(a, b) proizvodi pseudoslučajni cijeli broj između a i b, uključujućiTo olakšava simuliranje bacanja kockica ili odabir slučajnih indeksa na popisu. Za vrijednosti s pomičnim zarezom, funkcije poput random.random() i srodni pomoćnici generiraju uniformne slučajne brojeve u rasponima kao što su [0.0, 1.0), spremne za skaliranje ili transformaciju za vašu određenu distribuciju.
Python također otkriva nekoliko numeričkih vrijednosti koje predstavljaju neobične ili "rubne" količineJedan je NaN („Nije broj“), dobiven na primjer pozivom float('nan')NaN označava nedefinirane ili nereprezentativne rezultate, kao što je rezultat dijeljenja nule s nulom ili parsiranja oštećenog numeričkog polja iz ulaznih podataka.
Osim NaN-a, Python podržava pozitivnu i negativnu beskonačnost., konstruirano korištenjem float('inf') i float('-inf')Korisne su kao kontrolne vrijednosti pri inicijalizaciji varijabli za algoritme koji traže minimalne ili maksimalne vrijednosti ili pri modeliranju neograničenih raspona u numeričkim metodama.
Rad s NaN-ovima zahtijeva poseban oprez jer se ne ponašaju kao obični brojevi.Usporedbe koje uključuju NaN su uvijek lažne (čak i nan == nan), a aritmetika s NaN-om teži širenju NaN-a kroz rezultat. Iako ovaj vodič ne zalazi duboko u NaN semantiku, poznavanje njihovih osobitosti pomaže vam da učinkovitije otklanjate pogreške u podatkovnim kanalima i numeričkim algoritmima.
Apstraktne numeričke hijerarhije s modulom brojeva
Kako vaš kod postaje sofisticiraniji, možda će vam trebati fleksibilan način prepoznavanja "numeričnih" vrijednosti. bez ručne provjere za svaku pojedinu vrstu betona (kao što int, float, complex i NumPy skalari). Ovdje se numbers dolazi modul koji pruža apstraktnu hijerarhiju numeričkih tipova.
The numbers modul definira apstraktne bazne klase (ABC) koje opisuju numeričko ponašanje, Kao što su Number, Complex, Real, Rational i IntegralOve klase nisu namijenjene izravnom instanciranju. Umjesto toga, konkretni numerički tipovi nasljeđuju ih kako bi signalizirali da implementiraju potrebne operacije i svojstva.
Najopćenitija abeceda je numbers.Number, što predstavlja „bilo koji numerički tip“Ako želite testirati treba li varijablu tretirati kao numeričku - možda tijekom otklanjanja pogrešaka ili prilikom pisanja malih uslužnih skripti - možete kombinirati isinstance s ovom abecedom. Na primjer, isinstance(x, Number) vraća True za ugrađene numeričke tipove i mnoge vanjske numeričke tipove, kao što su razni NumPy skalari.
Praktična ilustracija koristi NumPy tipove uz Python-ove ugrađene tipoveAko uvozite NumPy kao np a zatim petljom prelazite preko vrijednosti poput 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) i np.int32(89), zovem isinstance(value, Number) za svaki ćete vidjeti da se svi računaju kao numerički. To vam štedi pisanje dugog lanca provjera tipova za svaku određenu klasu.
Važno je napomenuti da je isinstance sam po sebi se smatra kodnim "mirisom" kada se koristi prekomjernoPrekomjerno oslanjanje na eksplicitnu provjeru tipova može ukazivati na dublje probleme u dizajnu objektno orijentiranog programa. Uz to, za brzo otklanjanje pogrešaka, istraživačke skripte ili male uslužne programe, provjera u odnosu na numbers.Number je moćan, pragmatičan alat za provjeru ponašaju li se vaše varijable doista kao brojevi.
Prošireni numerički ekosustavi: NumPy i prilagođeni tipovi
Iako jezgra Pythona nudi samo mali skup numeričkih tipova opće namjene, širi ekosustav uvelike proširuje vaše mogućnosti.NumPy, posebno, uvodi mnogo više numeričkih varijanti osmišljenih za učinkovito računanje nad velikim nizovima i matricama.
NumPy definira cjelobrojne tipove fiksne širine kao što su numpy.int64, numpy.int32, numpy.int16 i specijalizirane pseudonime poput numpy.int0To nalikuje vrstama tipova koji se nalaze u niskorazinskim, numerički orijentiranim jezicima poput Fortrana i C-a, gdje je poznavanje točne veličine pohrane i ponašanja brojeva ključno za performanse i interoperabilnost.
Osim cijelih brojeva, NumPy nudi tipove poput numpy.float64 i numpy.complex64, zajedno s mnogim drugima, koji se lijepo integriraju s nizovima i ufuncovima (univerzalnim funkcijama). Ovi tipovi se obično registriraju kao instance odgovarajućih ABC-ova iz numbers modul, zbog čega provjerava numbers.Number raditi kao što je ranije prikazano.
Python je namjerno održavao osnovni numerički model jednostavnim i pristupačnimUmjesto prisiljavanja svakog korisnika da upravlja desecima različitih numeričkih vrsta, fokusira se na tri osnovna numerička tipa (plus logičke vrijednosti), a istovremeno specijaliziranim bibliotekama olakšava proširenje ovog repertoara po potrebi. Okruženje usmjereno na inženjerstvo, poput onog koje je izgradila tvrtka za simulacijski softver, prirodno će se uvelike oslanjati na ove proširene tipove i biblioteke.
Ako izgradite vlastite numeričke klase, slijedeći obrasce iz numbers i fractions pomaže vam da se uklopite u ekosustavPodklasiranjem odgovarajućeg ABC-a i implementacijom potrebnih posebnih metoda (__add__, __radd__, __mul__, i tako dalje), vaši prilagođeni tipovi mogu prirodno komunicirati s Pythonovim operatorima, ugrađenim numeričkim funkcijama i drugim numeričkim bibliotekama.
Sve u svemu, numerički Python kombinira čist sustav tipova jezgre, moćne module standardnih biblioteka i bogat ekosustav biblioteka. poput NumPy-a, stvarajući okruženje u kojem možete udobno prijeći s jednostavne aritmetike na napredne inženjerske izračune. Nakon što shvatite kako se cijeli brojevi, brojevi s pomičnim zarezom, kompleksni brojevi, posebne vrijednosti, pravila zaokruživanja i apstraktne numeričke klase uklapaju, možete sigurnije razmišljati o svom kodu, izbjegavati suptilne greške i odabrati prave alate za svaki numerički zadatak s kojim se susrećete.