<jupyter_start><jupyter_text>Uvod<jupyter_code>print("Zdravo, svijete.")<jupyter_output>Zdravo, svijete.<jupyter_text>Kalkulator i osnovni tipovi brojeva> postoje `int` i `float` (ali ne postoji `double`, za vas ljubitelje nekih drugih programskih jezika)<jupyter_code>2 + 2
type(4)
print(2. + 2)
type(2. + 2)<jupyter_output><empty_output><jupyter_text>- U Python-u 3 ne postoji razlika izmedju `int` i `long`<jupyter_code>42**42
type(42*42)
(42**42).bit_length()<jupyter_output><empty_output><jupyter_text>Dijeljenjem se uvijek dobije `float`<jupyter_code>2 / 2
3 / 2<jupyter_output><empty_output><jupyter_text>Note: Vazna razlika izmedju starijeg Python-a 2 i novijeg Python-a 3. Za old-style dijeljenje sa `int` se moze koristiti `\\`. Rezultat ce biti prvi manji intedzer.<jupyter_code>3 // 2<jupyter_output><empty_output><jupyter_text>Imaju i kompleksni brojevi<jupyter_code>complex(1,2)
1+2j
1 + 2j - 2j<jupyter_output><empty_output><jupyter_text>Biljeska: Za rad sa decimalama i razlomcima pogledajte detalje u [`decimal`](https://docs.python.org/3/library/decimal.htmlmodule-decimal) i [`fraction`](https://docs.python.org/3/library/fractions.htmlmodule-fractions) modulima. &nbsp; Mozemo li izracunati nesto korisno i nauciti nekoliko nacina da se kodira ista matematicka formula<jupyter_code># Prijedjeni put za vrijeme t sa ubrzanjem a, (sa pocetnom brzinom 0)

t = 1.0  # vrijeme, s
a = 9.8  # ubrzanje, m/s^2

# predjeni put 1/2 a*t**2
s = 0.5*a*t*t
print(s) # this is the distance in meters

s1 = a*(t**2)/2
print(s1)

s2 = 0.5*a*pow(t,2)
print(s2)<jupyter_output>4.9
4.9
4.9<jupyter_text>Primjetimo da se:   - **varijable** dodjeljuju usput   - mnozenje, dijeljenje i stepenovanje se odvija kako smo ocekivali<jupyter_code>print(6 / 5) ; print(9 / 5)

print(6 // 5) ; print(9 // 5) # podsjecanje
6 % 5  # modulo
1 << 2 # pomjeri broj 1 dva bita ulijevo
x = 2 ; y = 3  ## dodijeli dve varijable u istom redu
print(x)
print(y)<jupyter_output>2
3<jupyter_text>Logicke operacije<jupyter_code>a = True # T
b = False # neT
type(a)
# a ili b
print(a or b)
print(a | b)
# a i b
print(a and b)
print(a & b)<jupyter_output>False
False<jupyter_text>Neka svojstva logickih operacija i veza<jupyter_code>1 == True
0 != False
not(b)
not(10.0 - 6.0)
x = None    # None nije ni true or false
None == False<jupyter_output><empty_output><jupyter_text>Obicno se za testiranje da li je objekat odredjenog tipa nesto sto ocekujemo koristi funkcija **`isinstance()`**. O funkcijama kasnije, sad zamislite da je to jednostavno komanda!<jupyter_code># I brojevi su objekti u objektno orjentisanom Python-u. Samim time imaju set svojih osobina.

isinstance(1, object)
isinstance(1,(int,float))
# ili ovako
(1.212).is_integer()
type(1 + 2j)
isinstance("STORM", str)

# STORM: Studentska Organizacija Masinskog Fakulteta Univerziteta u Banjaluci<jupyter_output><empty_output><jupyter_text>Sad smo se pomalo upoznali sa svim ugradjenim tipovima koji postoje u Python-u: **`int`**, **`bool`**, **`str`**, **`float`**, **`complex`**  StringoviStingovi su nizovi karaktera. Karakter je bilo koje slovo, broj ili znak.Stringovi su indeksirani, sto znaci da se svakom karakteru ili grupi karaktera se moze pristupiti uz pomoc rednog broja njihovih pozicija u stringu. Index postoji s lijeva na desno (pozitivni) i sa desna na lijevo (negativni) Takodje ih se moze nastavljati koristeci znak `+`.Oni su `immutable`, sto znaci da se uz pomoc indeksa ne moze promijeniti ni jedan karakter u stringu.Moze ih se formatirati i porediti.<jupyter_code>ime_grada = 'Ban<NAME>'
type(ime_grada)
ime_grada[6:]
ime_grada[-4:]
ime_grada[-1]<jupyter_output><empty_output><jupyter_text>**Zadatak:** kako koristeci indeksiranje od kraja stringa doci do slova "B"?<jupyter_code># ime_grada[?]
# mozemo vrsiti poredjenje koristeci logicke operacije
ime_grada[:5] == 'Banja'<jupyter_output><empty_output><jupyter_text>String literals: http://docs.python.org/reference/lexical_analysis.htmlstring-literals```     \n   = novi red  (\r = return)     \t   = tab```<jupyter_code>print("bla\nbla\tbla")
# raw (sirovi) strings
print(r'Ignorisacu znakove \r\n i ispisati ih kao da su samo stringovi.')

# Trostruki navodnici su dobri za dugacke stringove ponekad
y = '''\n\nSad
ste
nesto
novo 
naucili.
'''
print(y)
print(ime_grada)

a = "Banja"
b = "Luka"
razmak = " "

ime_grada == a + razmak + b<jupyter_output>Banja Luka<jupyter_text>Kako dobiti input od korisnika<jupyter_code>temp_f = input("Unesi temperaturu u farenhajtima: ")

# Tip unesenog podatka ce automatski biti string!

temp_c = (5.0/9.0)*(float(temp_f) - 32.0)

print("\nKonvertovano u celzijuse temperatura iznosi:", temp_c)<jupyter_output>Unesi temperaturu u farenhajtima:  70<jupyter_text>Kontrola toka programa (petlje)  Basic Control (Flow)Python ima:    if...elif...else,  for,  whileKao i:    break, continue (within loops)    A nema:    case (explicitly), gotoDoduse ima:  `pass`  If ... elif ... else (ako ste navikli na case, koristite elif vise puta)<jupyter_code>### Unutar petlje uvijek je potrebno uvuci kod 4 spejsa ili 1 tab

x =  1
if x > 0:
    print("X je pozitivan broj")
else:
    print("X nije pozitivan broj")
x = 0
if x > 0 and x < 5:
    print("X je pozitivan broj manji od 5")
elif x >= 5:
    print("X je pozitivan broj veci ili jednak 5")
elif x == 0:
    pass # nece nista vratiti
else:
    print("X je negativan broj")
    
# Redosljed je bitan!<jupyter_output><empty_output><jupyter_text>While petlja<jupyter_code># da li vam je poznata ova sintaksa za matematicke operacije?
x = 1
x += 2
print(x)
x /= 2
print("Podijelili smo prethodni rezultat sa 2 i dobili", x)
# primjer za while petlju
x = -1
y = 0
while True:
    print("X je pozitivan broj" if x > 0 else "X nije pozitivan broj")
    x *= -1
    y += 1
    if y > 5:
        break
# Jupyter notebook ima ugradjene 'magic' fukcije
# %magic
%ls
# Ovo ce raditi u svakom python-u, pa je cesto korisnije za programiranje softvera i aplikacija

# ucitaj paket koji sadrzi grupu funkcija, npr. paket koji omogucava komunikaciju sa operativnim sistemom
import os

# gdje se nalazim na disku
print('gdje se nalazim na disku?', os.getcwd(), '\n') # get current working directory

# pomjeram se folder navise u stablu
os.chdir('..')  # change directory
print('sad sam u folderu navise:', os.getcwd(), '\n')

# vracam se u pocetni folder
os.chdir('sveske')
print('vracam se u pocetni folder', os.getcwd(), '\n')
%timeit range(0,1000)<jupyter_output>570 ns ± 78.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
{'fraction_non_alphanumeric': 0.11760196258816313, 'fraction_numerical': 0.02269242563630788, 'mean_word_length': 4.908514492753623, 'pattern_counts': {'":': 0, '<': 66, '<?xml version=': 0, '>': 69, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '528225', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 2854, 'n_tokens_neox': 2767, 'n_words': 752, 'path': 'sveske/dan2_1.ipynb', 'repo_name': 'milica325/unibl_radionica', 'size': '6523'}