- Python nudi osnovne numeričke tipove (int, float, complex, bool) plus moćne pomoćne funkcije poput math, cmath, decimal i random za svakodnevne proračune.
- Modul numbers definira apstraktne bazne klase tako da se mnogi ugrađeni, NumPy i prilagođeni numerički tipovi mogu uniformno tretirati kao Number instance.
- Načini zaokruživanja, posebne vrijednosti (NaN, beskonačnosti) i tačna decimalna aritmetika putem decimala ključni su za robustan naučni i finansijski kod.
- Širi numerički Python ekosistem, posebno NumPy, proširuje osnovne tipove cijelim brojevima fiksne širine i visokoperformansnim nizovima za zahtjevna izračunavanja.
Rad s brojevima je srž većine Python programa., bez obzira da li gradite jednostavan skript, obrađujete naučne podatke ili pravite prototip algoritma. Razumijevanje kako Python predstavlja i manipuliše numeričkim vrijednostima je prvi korak ka pisanju pouzdanog i efikasnog koda koji se ponaša onako kako očekujete.
Kada ljudi govore o "numeričkom Pythonu", često misle na dvije stvari.s jedne strane, ugrađeni tipovi brojeva i standardni alati biblioteke poput math, cmath, decimal, random i numbers; s druge strane, širi ekosistem oko numeričkog računarstva, s bibliotekama kao što je 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 Boolean tip koji se ponaša kao vrlo mali član porodice cijelih brojeva. Svi se oni glatko integriraju s Python-ovim aritmetičkim operatorima.
Cijeli brojevi (int) predstavljaju cijele brojeve, pozitivne ili negativne, bez decimalne tačkeNe postoji fiksna gornja granica njihove veličine u standardnom Pythonu; sve dok imate memorije, vaš cijeli broj može rasti. Vrijednosti poput 1, -5 or 20234567890123456789 svi su važeći int slučajeve, i to možete potvrditi sa type(1) or type(-5), koji će se vratiti <class 'int'>.
Brojevi s pomičnim zarezom (float) se koriste za realne brojeve sa razlomljenom komponentomPišu se sa decimalnom tačkom, kao što je 2.0, -7.823457 or 0.5, ili sa naučnom notacijom kao što je 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.5, I type(4.5) is <class 'float'>.
Kompleksni brojevi (complex) kombinuju realni i imaginarni dio, napisano sa završnim znakom j za imaginarnu jedinicu. Vrijednost poput 2 + 3j ima realnu komponentu 2 i imaginarnu komponentu 3. Možete ih direktno konstruisati (npr. 3.14j) i pregledajte ih pomoću atributa kao što su .real i .imagili poziv .conjugate() da bi se dobio kompleksni konjugat. Ovo je posebno popularno u inženjerstvu, obradi signala i naučnom računarstvu.
Logičke vrijednosti (bool) su tehnički također numerički, jer 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 int, zbog čega se logičke vrijednosti besprijekorno integriraju u proračune i poređenja.
Python vam omogućava slobodno kombinovanje ovih numeričkih tipova u izrazima, prelazeći u opštiji tip kada je to potrebno. Dodavanje int na a float daje float, a kombinovanje float brojeva sa kompleksnim brojevima daje kompleksan 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 pri dijeljenju
Kada imate numeričke vrijednosti, koristite uobičajene aritmetičke operatore za rad s njima.sabiranje (+), oduzimanje (-), množenje (*), podjela (/), podjela poda (//), stepenovanje (**) i modulo (%). Python ovo primjenjuje na cijele brojeve, brojeve s pomičnim zakretnim momentom i kompleksne brojeve, vršeći promociju tipova po potrebi.
Podjela je jedno područje gdje je Python-ov dizajn vrlo promišljen.. Upotreba / uvijek daje rezultat s pomičnim zarezom kada su oba argumenta numerička, čak i ako su oba cijeli brojevi. Dakle 9 / 2 rezultata u 4.5, ne 4Ovo vas podstiče da razmišljate u smislu dijeljenja realnih brojeva po defaultu, što je obično ono što želite u naučnim ili finansijskim proračunima.
Ako vam je potrebno cjelobrojno dijeljenje koje odbacuje razlomljeni dio, koristite operator dijeljenja s podnom pločom. //. Na primjer, 9 // 2 proizvodi 4, I -9 // 2 prinosi -5, budući da je rezultat zaokružen na donju granicu (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 kao rezervnih opcija": funkcije koje prvo pokušavaju implementaciju specifičnu za tip, na primjer za racionalne brojeve, a zatim se vraćaju na ugrađene operatore kada je jedan operand regularni broj. int, float or complexOvo omogućava prilagođenim numeričkim tipovima da interoperiraju sa Python-ovim aritmetičkim sistemom koristeći posebne metode kao što su __add__ i __radd__.
Bibliotečki kod za racionalnu aritmetiku, kao što je Fraction tip, jasno ilustruje 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 konzistentnim i intuitivnim.
Ugrađene numeričke funkcije
Pored sirovih operatora, Python dolazi sa skupom ugrađenih funkcija koje znaju kako da rukuju brojevima.Ove funkcije su uvijek dostupne bez uvoza ikakvih podataka i rade sa 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 ravni).
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 pravila "zaokruživanja polovine prema gore" iz školskih udžbenika, Python-ovo ugrađeno pravilo round koristi strategiju "zaokruživanja polovine na par" za neriješene rezultate kako bi se smanjila statistička pristranost u ponovljenim proračunima.
Funkcije konverzije kao što su int() i float() konstruirati brojeve od drugih objekata. Zovem int(x) na float odbacuje decimalni dio (na primjer, int(1.9) is 1), I float(x) generira reprezentaciju s pomičnim zarezom iz cijelih brojeva, stringova ili kompatibilnih objekata. Prilikom konverzije iz float u int, ne dolazi do zaokruživanja; decimalni dio se jednostavno skraćuje.
Drugi ugrađeni moduli služe za reprezentaciju i agregacijuFunkcioniše kao hex() i oct() vrati string reprezentacije cijelih brojeva u heksadecimalnom ili oktalnom sistemu s odgovarajućim prefiksima (0x i 0o). Pomoćnici agregacije kao što su max() i min() skenira iterabilnu verziju ili niz argumenata kako bi se pronašla najveća ili najmanja vrijednost, dok pow() a ** operator izračunava potencije i opcionalno prihvata treći argument za modularno stepenovanje.
Napredni numerički alati: matematika, cmath i decimalni
Za sofisticiranije proračune, Python pruža 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 sa import math, dobijate pristup funkcijama i konstantama koje su obično potrebne u inženjerstvu, fizici i svakodnevnoj analitici, a sve su implementirane u efikasnom C kodu i rade na float vrijednosti.
math uključuje alate za teoriju brojeva i reprezentaciju kao što su math.ceil() za zaokruživanje na najbliži cijeli broj, math.floor() za zaokruživanje naniže, math.modf() podijeliti 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 izračunavanje stepena 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 pogodnosti, math izvozi fundamentalne konstante kao što su math.pi i math.eOvo je korisno kad god izračunavate površine, uglove ili eksponencijalni rast i želite konzistentne vrijednosti s dobrom preciznošću u cijeloj kodnoj bazi.
Kada trebate raditi sa kompleksnim brojevima, cmath modul igra istu ulogu za kompleksnu ravanNjegovi API ogledala math ali koristi kompleksne argumente i vraća kompleksne rezultate, tako da možete izračunati kompleksne eksponencijalne funkcije, logaritme i trigonometrijske funkcije bez ručnog rastavljanja brojeva na realne i imaginarne dijelove.
The decimal Modul cilja drugu bolnu tačku: tačnu aritmetiku sa bazom 10Standardni binarni brojevi s pokretnim zarezom ne mogu precizno predstaviti mnoge decimalne razlomke, tako da prorač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 finansijske primjene i svugdje gdje je potrebno vrlo strogo kontrolirati ponašanje zaokruživanja.
Podrazumevano, Python-ove operacije s pomičnim zarezom slijede ponašanje IEEE-754 i koriste reprezentaciju baze-2.Kada se vrijednost nalazi tačno na pola puta između dva reprezentativna broja, primjenjuje se "zaokruživanje polovine na parno", što znači da se polovina veza zaokružuje na dolje, a polovina naviše. Ovo izbjegava sistematsko odstupanje u velikim proračunima. Ako želite komercijalnu semantiku "zaokruživanja polovine naviše", 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 kreirajte kombinaciju cijelih brojeva, brojeva s pomičnim zarezom i kompleksnih vrijednosti, a zatim isprobajte osnovne operacije nad njima. Sabiranje i množenje je jednostavno, ali je posebno poučno eksperimentirati s dijeljenjem, dijeljenjem s donjim redom, zaokruživanjem i konverzijama, promatrajući kako se mijenja tip rezultata.
Konvertovanje između numeričkih tipova ponekad je neophodno kako bi se ispunila očekivanja 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 nazovi my_int = int(my_float)Štampanje my_int daje 1, I 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ćitiji tip – često se događa implicitno.Kada saberete cijeli broj i broj s pomičnim zarezom, Python vraća broj s pomičnim zarezom bez pitanja, budući da sistem realnih brojeva sadrži cijele brojeve. Ista promocija se dešava kada kombinujete broj s pomičnim zarezom i kompleksni broj: vrijednost s pomičnim zarezom se tretira kao da ima imaginarni dio nule, a rezultat je kompleksan.
Kompleksni brojevi uključuju nekoliko ugrađenih pogodnosti koje im daju prirodan osjećaj.Možete direktno pregledati a.real i a.imag Da biste dobili komponente, pozovite a.conjugate() da se okrene znak imaginarnog dijela i da se oni proslijede funkcijama u cmath bez ručne konverzije. Čak i ako ih rijetko koristite, poznavanje njihovog postojanja i načina na koji se ponašaju pomaže kada naiđete na naučni kod.
Tačnost i preciznost su uvijek važne pri radu s podacima s pomičnim zarezom.Efektivna preciznost standardnog Pythona float ima oko 15 decimalnih cifara; nakon toga, 16. cifra može biti nepouzdana. Za mnoge zadatke ovo je sasvim prihvatljivo, ali ako vam je potrebna tačna decimalna aritmetika ili predvidljivije zaokruživanje, decimal Modul vam daje potrebnu kontrolu po cijenu nekih performansi.
Slučajni brojevi i posebne numeričke vrijednosti
Generisanje slučajnih brojeva je još jedan čest zadatak u numeričkim Python radnim procesima., bez obzira da li pravite jednostavne igre, pokrećete Monte Carlo simulacije ili pišete testne slučajeve koji vježbaju granične uslove. Standardna biblioteka random Modul pruža osnove za takve scenarije.
random.randint(a, b) proizvodi pseudoslučajni cijeli broj između a i b, ukljOvo olakšava simuliranje bacanja kockica ili odabir nasumičnih indeksa na listi. 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 "granične" količine.Jedan je NaN („Nije broj“), dobijen na primjer pozivanjem 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.
Pored NaN-a, Python podržava pozitivnu i negativnu beskonačnost., konstruisan korištenjem float('inf') i float('-inf')Ovo je korisno kao kontrolne vrijednosti prilikom inicijalizacije varijabli za algoritme koji traže minimalne ili maksimalne vrijednosti ili prilikom modeliranja neograničenih raspona u numeričkim metodama.
Rad sa NaN-ovima zahtijeva posebnu pažnju jer se oni ne ponašaju kao obični brojevi.Poređenja koja uključuju NaN su uvijek lažna (č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 specifičnosti pomaže vam da efikasnije otklanjate greš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 pojedinačnu vrstu betona (kao int, float, complex i NumPy skalari). Ovdje se numbers dolazi modul, pružajući 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 za direktno instanciranje. Umjesto toga, konkretni numerički tipovi nasljeđuju od njih kako bi signalizirali da implementiraju potrebne operacije i svojstva.
Najopštiji ABC je numbers.Number, što predstavlja „bilo koji numerički tip“Ako želite testirati da li varijablu treba tretirati kao numeričku - možda tokom otklanjanja grešaka ili prilikom pisanja malih uslužnih skripti - možete kombinovati isinstance s ovom ABC-om. Na primjer, isinstance(x, Number) povraćaj True za ugrađene numeričke tipove i mnoge eksterne numeričke tipove, kao što su različiti NumPy skalari.
Praktična ilustracija koristi NumPy tipove zajedno sa Python-ovim ugrađenim tipovimaAko uvezete 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), zove isinstance(value, Number) za svaki ćete vidjeti da se svi računaju kao numerički. Ovo vam štedi pisanje dugog lanca provjera tipova za svaku određenu klasu.
To vrijedi napomenuti isinstance sam po sebi se smatra "mirisom" koda kada se koristi prekomjernoPrekomjerno oslanjanje na eksplicitnu provjeru tipova može ukazivati na dublje probleme u dizajnu objektno orijentiranog programa. Međutim, za brzo otklanjanje grešaka, istraživačke skripte ili male uslužne programe, provjera u odnosu na numbers.Number je moćan, pragmatičan alat za provjeru da li se vaše varijable zaista ponašaju kao brojevi.
Prošireni numerički ekosistemi: NumPy i prilagođeni tipovi
Iako osnovni Python nudi samo mali skup numeričkih tipova opšte namjene, širi ekosistem uveliko proširuje vaše mogućnosti.NumPy, posebno, uvodi mnogo više numeričkih varijanti dizajniranih za efikasno računanje nad velikim nizovima i matricama.
NumPy definira cijeli broj fiksne širine kao što su numpy.int64, numpy.int32, numpy.int16 i specijalizirane pseudonime poput numpy.int0Ovo podsjeća na tipove koda koji se nalaze u numerički orijentisanim jezicima niskog nivoa kao što su Fortran i C, gdje je poznavanje tačne veličine memorije i ponašanja brojeva ključno za performanse i interoperabilnost.
Pored cijelih brojeva, NumPy nudi tipove kao što su numpy.float64 i numpy.complex64, zajedno s mnogim drugima, koji se uredno integriraju s nizovima i ufuncsima (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 ilustrovano.
Python-ov dizajn je namjerno održavao osnovni numerički model jednostavnim i pristupačnim.Umjesto prisiljavanja svakog korisnika da upravlja desetinama različitih numeričkih tipova, fokusira se na tri osnovna numerička tipa (plus logičke vrijednosti), dok specijaliziranim bibliotekama olakšava proširenje ovog repertoara po potrebi. Okruženje usmjereno na inženjerstvo, poput onog koje je izgradila kompanija za simulacijski softver, prirodno će se uveliko oslanjati na ove proširene tipove i biblioteke.
Ako kreirate vlastite numeričke klase, slijedeći obrasce iz numbers i fractions pomaže vam da se uklopite u ekosistemPodklasiranjem odgovarajućeg ABC-a i implementacijom potrebnih specijalnih metoda (__add__, __radd__, __mul__, i tako dalje), vaši prilagođeni tipovi mogu prirodno komunicirati s Python-ovim operatorima, ugrađenim numeričkim funkcijama i drugim numeričkim bibliotekama.
Sve u svemu, numerički Python kombinuje čist sistem tipova jezgra, moćne module standardnih biblioteka i bogat ekosistem biblioteka. Kao i NumPy, stvara okruženje u kojem možete udobno preći s jednostavne aritmetike na napredne inženjerske prorač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.