Python - Brojevi, tipovi konverzacije i matematika


Tip broja podataka u Pythonu (Number Data Type)

Python podržava cijele brojeve, brojeve s pomičnom zarezom (decimalne brojeve) i složene brojeve. U Pythonu su definisane kao int, float i complex classes. Cijeli brojevi i pomične tačke razdvajaju se prisutnošću ili odsutnošću decimalne tačke. Na primjer, 5 je cijeli broj, dok je 5.0 broj s pomičnom zarezom (floating-point).

Kompleksni brojevi zapisani su u obliku x + yj, gdje je x stvarni dio, a y imaginarni dio. Možemo koristiti funkciju type() da bismo znali kojoj klasi pripada varijabla ili vrijednost funkcije isinstance() kako bismo provjerili pripada li određenoj klasi. Pogledajmo primjer:

a = 5

print(type(a))

print(type(5.0))

c = 5 + 3j
print(c + 3)

print(isinstance(c, complex))

Iako cijeli brojevi mogu biti bilo koje dužine, broj s pomičnim zarezom (floating-point number) precizan je samo do 15 decimalnih mjesta (16. mjesto je neprecizno). Brojevi s kojima se svakodnevno bavimo decimalnog su broja (baza 10). Ali programeri moraju raditi s binarnim (baza 2), heksadecimalnim (baza 16) i oktalnim (baza 8) brojnim sistemima. U Pythonu ove brojeve možemo predstaviti odgovarajućim prefiksom ispred tog broja. Sljedeća tabela navodi ove prefikse.

Sistem brojeva Prefiks
Binarni '0b' ili '0B'
Oktalni '0o' ili '0O'
Heksadecimalni '0x' ili '0X'

Evo nekoliko primjera:

# Ispisuje: 107
print(0b1101011)

# Ispisuje: 253 (251 + 2)
print(0xFB + 0b10)

# Ispisuje: 13
print(0o15)


Tip pretvaranja (Type Conversion)

Možemo pretvoriti jednu vrstu broja u drugu. Ovo je poznato i kao prisilno pretvranje (coercion). Operacije poput sabiranja, oduzimanja prisiljavaju cijeli broj da implicitno pluta (automatski), ako je jedan od operandi float.

>>> 1 + 2.0
3.0

Gore možemo vidjeti da je 1 (cijeli broj) prisiljen u 1.0 (float) za sabiranje, a rezultat je takođe broj s pomičnom zarezom. Takođe možemo koristiti ugrađene funkcije poput int(), float() i complex() za eksplicitno pretvaranje između tipova. Te se funkcije mogu čak pretvoriti iz stringova.

>>> int(2.3)
2
>>> int(-2.8)
-2
>>> float(5)
5.0
>>> complex('3+5j')
(3+5j)

Prilikom pretvaranja iz float-a u cijeli broj, broj se skraćuje (decimalni dijelovi se uklanjaju).



Python decimal brojevi (Decimal)

Python ugrađeni float klase izvodi neke proračune koji bi nas mogli zapanjiti. Svi znamo da je zbir 1.1 i 2.2 je 3.3, ali čini se da se Python ne slaže.


Šta se dešava?

Ispada da se brojevi s pomičnom zarezom implementiraju u računarski hardver kao binarni razlomci, jer računar razumije samo binarne brojeve (0 i 1). Iz tog razloga, većina decimalnih razlomaka koje poznajemo ne može se precizno pohraniti u naš računar. Uzmimo primjer. Razlomak 1/3 ne možemo predstaviti kao decimalni broj. To će dati 0,33333333 ... što je beskrajno dugo i možemo ga samo približiti.

Ispada da će decimalni razlomak 0,1 rezultovati beskonačno dugim binarnim razlomkom od 0,000110011001100110011 ... a naše računar ga pohranjuje samo kao konačan broj. Ovo će biti približno 0,1, ali nikada neće biti jednako. Dakle, to je ograničenje našeg računarskog hardvera, a ne greška u Pythonu.

>>> 1.1 + 2.2
3.3000000000000003

Da bismo prevladali ovaj problem, možemo koristiti decimalni modul koji dolazi s Python-om. Dok brojevi s pomičnom zarezom (floating-point numbers) imaju preciznost do 15 decimalnih mjesta, decimalni modul ima preciznost koju može postaviti korisnik. Da vidimo razliku:

import decimal

print(0.1)

print(decimal.Decimal(0.1))

Ispisuje:


0.1
0.1000000000000000055511151231257827021181583404541015625


Ovaj se modul koristi kada želimo provesti decimalne izračune onako kako smo naučili u školi. Takođe čuva značaj. Znamo da je 25,50 kg preciznije od 25,5 kg, jer ima dvije decimale u odnosu na jedno.

from decimal import Decimal as D

print(D('1.1') + D('2.2'))

print(D('1.2') * D('2.50'))

Ispisuje:


3.3
3.000


Primijetite prateće nule u gornjem primjeru. Mogli bismo se pitati, zašto ne implementuje decimalni broj Decimal svaki put, umjesto float-a? Glavni razlog je efikasnost. Operacije s pomičnim zarezom izvode se brže od decimalnih operacija.


Kada koristiti decimalni znak umjesto float-a?

U sljedećim slučajevima obično koristimo decimalni znak.

  • Kada radimo financijske aplikacije kojima je potreban tačan decimalni prikaz.
  • Kada želimo kontrolisati nivo preciznosti koji je potreban.
  • Kada želimo primijeniti pojam značajnih decimalnih mjesta.


Python razlomci (Fractions)

Python pruža operacije koje uključuju razlomljene brojeve kroz svoj frakcijski modul. Razlomak ima brojilac i imenilac, koji su obe cjelobrojne vrijednosti. Ovaj modul ima podršku za racionalnu aritmetiku brojeva. Objekte razlomaka možemo stvoriti na razne načine. Pogledajmo ih.

import fractions

print(fractions.Fraction(1.5))

print(fractions.Fraction(5))

print(fractions.Fraction(1,3))

Dok stvaramo razlomak iz float-a, mogli bismo dobiti neke neobične rezultate. To je zbog nesavršenog binarnog predstavljanja broja s pomičnim zarezom kao što je objašnjeno u prethodnom dijelu. Srećom, razlomci nam omogućavaju instanciranje i sa stringom. Ovo je preferisana opcija kada se koriste decimalni brojevi.

import fractions

# Kao float
# Ispisuje: 2476979795053773/2251799813685248
print(fractions.Fraction(1.1))

# Kao string
# Ispisuje: 11/10
print(fractions.Fraction('1.1'))

Ovaj tip podataka podržava sve osnovne operacije. Evo nekoliko primjera.

from fractions import Fraction as F

print(F(1, 3) + F(1, 3))

print(1 / F(5, 6))

print(F(-3, 10) > 0)

print(F(-3, 10) < 0)


Python Matematika (Mathematics)

Python nudi module poput math i random izvođenja različitih matematika poput trigonometrije, logoritama, vjerovatnoće, statistike, itd.

import math

print(math.pi)

print(math.cos(math.pi))

print(math.exp(10))

print(math.log10(1000))

print(math.sinh(1))

print(math.factorial(6))

Evo kompletne liste funkcija i atributa dostupnih u Python math modulu.

import random

print(random.randrange(10, 20))

x = ['a', 'b', 'c', 'd', 'e']

# Dobijanje nasumičnog izbora
print(random.choice(x))

# Nasumično x
random.shuffle(x)

# Ispiši nasumično x
print(x)

# Ispis slučajnog elementa
print(random.random())

Kada pokrenemo program, dobijemo izlaz na sljedeći način (vrijednosti se mogu razlikovati zbog slučajnog ponašanja)


18
e
['c', 'e', 'd', 'b', 'a']
0.5682821194654443