- Пајтон нуди основне нумеричке типове (int, float, complex, bool) плус моћне помоћне функције попут math, cmath, decimal и random за свакодневна израчунавања.
- Модул numbers дефинише апстрактне основне класе тако да се многи уграђени, NumPy и прилагођени нумерички типови могу третирати једнообразно као инстанце Number.
- Режими заокруживања, посебне вредности (NaN, бесконачности) и тачна децимална аритметика путем децималног система су кључни за робустан научни и финансијски код.
- Шири нумерички Пајтон екосистем, посебно NumPy, проширује основне типове са целим бројевима фиксне ширине и високоперформансним низовима за тешка израчунавања.
Рад са бројевима је у сржи већине Пајтон програма, без обзира да ли правите једноставан скрипт, обрађујете научне податке или правите прототип алгоритма. Разумевање како Пајтон представља и манипулише нумеричким вредностима је први корак ка писању поузданог, ефикасног кода који се понаша онако како очекујете.
Када људи говоре о „нумеричком Пајтону“, често мисле на две ствари: с једне стране, уграђени типови бројева и стандардни библиотечки алати као што су math, cmath, decimal, random numbers; са друге стране, шири екосистем око нумеричког рачунарства, са библиотекама као што је NumPy које проширују језик додатним нумеричким типовима и векторизованим операцијама. Овај водич вас детаљно води кроз те основе, од основних типова до напредних апстракција.
Основни нумерички типови у Пајтону
Пајтон дефинише неколико уграђених нумеричких категорија које покривају већину свакодневних потребаЦели бројеви за целе бројеве, бројеви са покретним зарезом за реалне вредности са децималним бројевима, комплексни бројеви за вредности са реалним и имагинарним деловима и посебан Булов тип који се понаша као веома мали члан породице целих бројева. Сви се они глатко интегришу са Пајтоновим аритметичким операторима.
Цели бројеви (int) представљају целе бројеве, позитивне или негативне, без децималне тачкеНе постоји фиксна горња граница њихове величине у стандардном Пајтону; све док имате меморије, ваш цео број може да расте. Вредности попут 1, -5 or 20234567890123456789 сви су важећи int примери, и то можете потврдити са type(1) or type(-5), који ће се вратити <class 'int'>.
Бројеви са покретним зарезом (float) се користе за реалне бројеве са разломљеном компонентомПишу се са децималном тачком, као што је 2.0, -7.823457 or 0.5, или са научном нотацијом као што је 1e8 (што значи 100,000,000). Када изводите операције као што је дељење, чак и између целих бројева, Пајтон често унапређује резултат у float; на пример, 9 / 2 ииелдс 4.5, i type(4.5) is <class 'float'>.
Комплексни бројеви (complex) комбинују реални део и имагинарни део, написано са завршном цртом j за имагинарну јединицу. Вредност као што је 2 + 3j има реалну компоненту 2 и имагинарну компоненту 3. Можете их директно конструисати (нпр. 3.14j) и прегледајте их помоћу атрибута као што су .real .imagили позив .conjugate() да би се добио комплексни конјугат. Ово је посебно популарно у инжењерству, обради сигнала и научном рачунарству.
Булеове вредности (bool) су технички такође нумерички, Јер True False понашају се као цели бројеви 1 и 0 у аритметичким изразима. На пример, True + 2 процењује се на 3Интерно, bool је поткласа од int, због чега се булове вредности беспрекорно интегришу у прорачуне и поређења.
Пајтон вам омогућава слободно комбиновање ових нумеричких типова у изразима, прелазећи у општији тип када је потребно. Додавање int до float приноси а float, а комбиновање бројева са покретним зарезом и комплексних бројева производи сложен резултат: изразе попут 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) сви раде без додатних церемонија.

Аритметички оператори и понашање при дељењу
Када добијете нумеричке вредности, користите уобичајене аритметичке операторе за рад са њима: сабирање (+), одузимање (-), множење (*), подела (/), подела пода (//), степеновање (**) и по модулу (%). Пајтон их примењује на целе бројеве, бројеве са покретним децималом и комплексне бројеве, вршећи промоцију типа по потреби.
Дељење је једно подручје где је Пајтонов дизајн веома промишљен. Користећи / увек даје резултат са покретним зарезом када су оба аргумента нумеричка, чак и ако су оба цели бројеви. Дакле 9 / 2 Резултати 4.5, Не 4Ово вас подстиче да размишљате у смислу дељења реалних бројева по подразумеваним подешавањима, што је обично оно што желите у научним или финансијским прорачунима.
Ако вам је потребно целобројно дељење које одбацује разломљени део, користите оператор дељења са површином. //. На пример, 9 // 2 производи 4, i -9 // 2 ииелдс -5, пошто је резултат заокружен надоле ка негативној бесконачности. Поред тога, divmod(a, b) даје вам и количник и остатак одједном, враћајући пар који одражава (a // b, a % b).
Иза кулиса, Пајтон пажљиво координира како различити нумерички укуси међусобно делујуИнтерни образац који можете видети у стандардној библиотеци је идеја „резервних оператора“: функције које прво покушавају са имплементацијом специфичном за тип, на пример за рационалне бројеве, а затим се враћају на уграђене операторе када је један операнд регуларан. int, float or complexОво омогућава прилагођеним нумеричким типовима да интерагују са Пајтоновим аритметичким системом користећи посебне методе као што су __add__ __radd__.
Библиотечки код за рационалну аритметику, као што је Fraction тип, јасно илуструје ову стратегијуПриликом додавања два Fraction инстанци, израчунава нови разломак унакрсним множењем бројилаца и именилаца. Ако додате Fraction на обичан цео број или инстанцу numbers.Rational, користи прецизан рационални алгоритам. Ако је други операнд float or complex, конвертоваће се у тај шири тип и делегирати регуларним операторима, одржавајући понашање доследним и интуитивним.
Уграђене нумеричке функције
Поред сирових оператора, Пајтон се испоручује са скупом уграђених функција које знају како да обрађују бројеве.Ове функције су увек доступне без потребе за увозом ичега и раде са стандардним нумеричким типовима, плус са свим прилагођеним објектима који имплементирају одговарајуће посебне методе.
abs(x) враћа апсолутну вредност свог аргумента, претварајући негативне бројеве у позитивне, а позитивне вредности остављајући непромењене. Ако проследите објекат који дефинише __abs__(), Пајтон ће делегирати тој методи. За комплексне бројеве, abs() враћа магнитуду (растојање од координатног почетка у комплексној равни).
round(x, ndigits) даје вам вредност заокружену на задати број децималних места. Ако ndigits је изостављено или None, враћа најближи цео број. За разлику од правила „заокружи половину навише“ из школских уџбеника, уграђено правило Пајтона round користи стратегију „заокруживања пола на пар“ за нерешене резултате како би се смањила статистичка пристрасност у поновљеним прорачунима.
Функције конверзије као што су int() float() конструишите бројеве од других објеката. Цаллинг int(x) на броју са покретним зарезом одбацује разломљени део (на пример, int(1.9) is 1), И float(x) производи репрезентацију са покретним зарезом из целих бројева, стрингова или компатибилних објеката. Када конвертујете из float у int, не врши се заокруживање; децимални део се једноставно скраћује.
Остали уграђени елементи служе за репрезентацију и агрегацијуФункције попут hex() oct() врати стринг репрезентације целих бројева у хексадецималном или окталном систему са одговарајућим префиксима (0x 0o). Помоћници агрегације као што су max() min() скенирајте итерабилну ставку или низ аргумената да бисте пронашли највећу или најмању вредност, док pow() и ** оператор израчунава степене и опционо прихвата трећи аргумент за модуларно степеновање.
Напредни нумерички алати: математика, cmath и децимални
За софистицираније прорачуне, Пајтон пружа наменске модуле стандардне библиотеке уместо да се преоптерећује основни језик. Најважнији за нумерички рад су math, cmath decimal, при чему сваки циља на одређени подскуп проблема.
math Модул се фокусира на математику са покретним зарезом у реалним вредностимаНакон увоза са import math, добијате приступ функцијама и константама које су обично потребне у инжењерству, физици и свакодневној аналитици, све имплементирано у ефикасном C коду и које функционише на float вредности.
math укључује алате за теорију бројева и репрезентацију kao takav math.ceil() за заокруживање на најближи цео број, math.floor() за заокруживање наниже, math.modf() да се број са покретним флоатом подели на разломљене и целобројне делове, и math.frexp() / math.ldexp() за рад са интерном бинарном репрезентацијом. Такође пружа рутине за степеновање и логаритамске функције као што су math.exp(), math.log(), math.log10(), math.pow() math.sqrt(), као и тригонометријске и хиперболичке функције као што су math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() math.tanh().
ради погодности, math извози фундаменталне константе као што су math.pi math.eОво је корисно кад год израчунавате површине, углове или експоненцијални раст и желите конзистентне вредности са добром прецизношћу у целој вашој кодној бази.
Када треба да радите са комплексним бројевима, cmath модул игра исту улогу за комплексну раванЊегови API огледала math али користи сложене аргументе и враћа сложене резултате, тако да можете израчунати сложене експоненцијале, логаритме и тригонометријске функције без ручног разлагања бројева на реалне и имагинарне делове.
decimal Модул циља другу болну тачку: тачну десетичну аритметикуСтандардни бинарни број са покретним зарезом не може прецизно да представи многе децималне разломке, тако да се израчунавања попут 0.1 + 0.2 дати мало другачији резултат. decimal.Decimal заобилази ово коришћењем произвољне прецизне десетичне аритметике, што га чини идеалним за финансијске примене и свуда где морате веома строго контролисати понашање заокруживања.
Подразумевано, операције са покретним зарезом у Пајтону прате понашање IEEE-754 и користе репрезентацију базе 2.Када се вредност налази тачно на пола пута између два репрезентабилна броја, примењује се „заокруживање половине на парно“, што значи да се половина веза заокружује надоле, а половина нагоре. Ово избегава систематско померање у великим прорачунима. Ако желите комерцијалну семантику „заокруживања половине нагоре“, можете конфигурисати decimal контекст за коришћење ROUND_HALF_UP, што увек помера 5 вредности даље од нуле.
Рад са нумеричким типовима у пракси
Истраживање интерактивног понашања бројева је одличан начин за развијање интуицијеПокрените Пајтон интерпретер и креирајте комбинацију целих бројева, бројева са покретним дељењем и комплексних вредности, а затим испробајте основне операције над њима. Сабирање и множење је једноставно, али је посебно поучно експериментисати са дељењем, дељењем на дно, заокруживањем и конверзијама, посматрајући како се тип резултата мења.
Конвертовање између нумеричких типова је понекад неопходно да би се испунила очекивања API-ја или да би се поједноставила логикаАко имате број са покретним зарезом и желите само његов део са целим бројем, доделите га променљивој као што је my_float = 1.9 а затим назовите my_int = int(my_float). Штампање my_int даје 1, i type(my_int) потврђује да је у питању intИмајте на уму да се разломљени део одбацује уместо да се заокружује.
Супротан смер – прелазак на општији тип – често се дешава имплицитноКада саберете цео број и број са покретним зарезом, Пајтон враћа број са покретним зарезом без питања, јер систем реалних бројева садржи целе бројеве. Иста промоција се дешава када комбинујете број са покретним зарезом и комплексан број: вредност са покретним зарезом се третира као да има имагинарни део нуле, а резултат је комплексан.
Комплексни бројеви укључују неколико уграђених погодности које их чине природнимМожете директно прегледати a.real a.imag да бисте добили компоненте, позовите a.conjugate() да обрну знак имагинарног дела и да их проследе функцијама у cmath без ручне конверзије. Чак и ако их ретко користите, сазнање да постоје и како се понашају помаже када наиђете на научни код.
Тачност и прецизност су увек битне када се ради са подацима са покретним зарезомЕфективна прецизност стандардног Пајтона float је око 15 децималних цифара; преко тога, 16. цифра може бити непоуздана. За многе задатке, ово је сасвим прихватљиво, али ако вам је потребна тачна децимална аритметика или предвидљивије заокруживање, decimal Модул вам даје контролу која вам је потребна по цену неких перформанси.
Случајни бројеви и посебне нумеричке вредности
Генерисање случајних бројева је још један чест задатак у нумеричким Пајтон токовима рада., без обзира да ли правите једноставне игре, покрећете Монте Карло симулације или пишете тест случајеве који вежбају граничне услове. Стандардна библиотека random Модул пружа основе за такве сценарије.
random.randint(a, b) производи псеудо-случајни цео број између a b, укључујућиОво олакшава симулацију бацања коцкица или избор случајних индекса на листи. За вредности са покретним зарезом, функције попут random.random() и сродни помоћници генеришу униформне случајне бројеве у опсезима као што су [0.0, 1.0), спремне за скалирање или трансформацију за вашу одређену дистрибуцију.
Пајтон такође открива неколико нумеричких вредности које представљају неуобичајене или „граничне случајеве“ величинеЈедан је NaN („Није број“), добијен на пример позивањем float('nan')NaN означава недефинисане или нерепрезентабилне резултате, као што је резултат дељења нуле са нулом или парсирања оштећеног нумеричког поља из улазних података.
Поред NaN, Пајтон подржава позитивну и негативну бесконачност, конструисано коришћењем float('inf') float('-inf')Ове су корисне као контролне вредности приликом иницијализације променљивих за алгоритме који траже минималне или максималне вредности или приликом моделирања неограничених опсега у нумеричким методама.
Рад са NaN-овима захтева посебну пажњу јер се они не понашају као обични бројевиПоређења која укључују NaN су увек нетачна (чак и nan == nan), а аритметика са NaN тежи да пропагира NaN кроз резултат. Иако овај водич не залази дубоко у NaN семантику, свесност о њиховим особеностима помаже вам да ефикасније отклањате грешке у каналима података и нумеричким алгоритмима.
Апстрактне нумеричке хијерархије са модулом бројева
Како ваш код постаје софистициранији, можда ће вам бити потребан флексибилан начин за препознавање „нумеричких“ вредности без ручне провере за сваку појединачну врсту бетона (нпр. int, float, complex и NumPy скаларе). Овде се numbers долази модул, пружајући апстрактну хијерархију нумеричких типова.
numbers Модул дефинише апстрактне основне класе (ABC) које описују нумеричко понашање, као што су Number, Complex, Real, Rational IntegralОве класе нису намењене за директно инстанцирање. Уместо тога, конкретни нумерички типови наслеђују од њих како би сигнализирали да имплементирају потребне операције и својства.
Најопштији азбучни језик је numbers.Number, што представља „било који нумерички тип“Ако желите да тестирате да ли променљиву треба третирати као нумеричку — можда током дебаговања или приликом писања малих услужних скрипти — можете комбиновати isinstance са овом азбуком. На пример, isinstance(x, Number) повраћај True за уграђене нумеричке типове и многе екстерне нумеричке типове, као што су разни NumPy скалари.
Практична илустрација користи NumPy типове заједно са уграђеним функцијама ПајтонаАко увезете NumPy као np а затим петљом прелазите преко вредности као што је 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) np.int32(89), зове isinstance(value, Number) за сваки ћете видети да се сви рачунају као нумерички. Ово вам штеди писање дугог ланца провера типа за сваку појединачну класу.
Вреди то напоменути isinstance сам по себи се сматра „мирисом“ кода када се користи прекомерноПрекомерно ослањање на експлицитну проверу типова може указивати на дубље проблеме у дизајну објектно оријентисаног програма. Уз то речено, за брзо отклањање грешака, истраживачке скрипте или мале услужне програме, провера у односу numbers.Number је моћан, прагматичан алат за проверу да ли се ваше променљиве заиста понашају као бројеви.
Проширени нумерички екосистеми: NumPy и прилагођени типови
Иако основни Пајтон нуди само мали скуп нумеричких типова опште намене, шири екосистем значајно проширује ваше могућности.NumPy, посебно, уводи много више нумеричких варијација дизајнираних за ефикасно израчунавање над великим низовима и матрицама.
NumPy дефинише целобројне типове фиксне ширине као што су numpy.int64, numpy.int32, numpy.int16 и специјализоване псеудониме као што су numpy.int0Ови типови подсећају на врсте које се налазе у нисконивоским, нумерички оријентисаним језицима као што су Фортран и C, где је познавање тачне величине меморије и понашања ваших бројева неопходно за перформансе и интероперабилност.
Поред целих бројева, NumPy нуди типове као што су numpy.float64 numpy.complex64, заједно са многим другим, који се лепо интегришу са низовима и уфунцима (универзалним функцијама). Ови типови се обично региструју као инстанце одговарајућих ABC-ова из numbers модул, због чега се проверава у односу на numbers.Number рад као што је раније илустровано.
Пајтонов дизајн је намерно одржавао основни нумерички модел једноставним и приступачнимУместо да приморава сваког корисника да управља десетинама различитих нумеричких врста, фокусира се на три основна нумеричка типа (плус булове вредности), док специјализованим библиотекама олакшава проширивање овог репертоара по потреби. Окружење фокусирано на инжењерство, попут оног које је изградила компанија за симулациони софтвер, природно ће се у великој мери ослањати на ове проширене типове и библиотеке.
Ако правите сопствене нумеричке класе, пратећи обрасце из numbers fractions помаже вам да се уклопите у екосистемПодкласирањем одговарајућег ABC-а и имплементацијом потребних специјалних метода (__add__, __radd__, __mul__, и тако даље), ваши прилагођени типови могу природно да интерагују са Пајтоновим операторима, уграђеним нумеричким функцијама и другим нумеричким библиотекама.
Све у свему, нумерички Пајтон комбинује чист систем типова језгра, моћне модуле стандардних библиотека и богат екосистем библиотека. попут NumPy-ја, стварајући окружење у којем можете удобно прећи са једноставне аритметике на напредне инжењерске прорачуне. Када схватите како се цели бројеви, бројеви са покретним децималом, комплексни бројеви, посебне вредности, правила заокруживања и апстрактне нумеричке класе уклапају, можете са више самопоуздања размишљати о свом коду, избећи суптилне грешке и одабрати праве алате за сваки нумерички задатак на који наиђете.