# primeri-12, Python



# Python, pocinjemo, kalkulator
2+2
2-3
2*3

3/4*100 
3.0/4.0*100.0 
3.0/4*100 
3./4*100



# Python, da rascistimo celobrojno deljenje
# help(type) 
type 
# type() 
type(3) 
type(3.0) 
type(3.) 
type(10/3) 
type(10.0/3) 
type(10/3.) 
type(10./3.) 



# Python, mislili ste da je sa deljenjem gotovo?
10.0/3.0 
10.0//3.0 
-10.0//3.0 
-10/3



# Python, stepenovanje i long
2^3 
3^2 
3^3 
10^10 
2**3 
2 ** 3 
3 ** 2 
10 ** 10 
type(10**10) 
3**64 
type(3**3) 
type(3**64)



# Python, ostatak pri celobrojnom deljenju
10%3 
11%3 
12%3 
t=54+12 
print t 
type(t) 
s=t/60 
m=t%60 
print s 
print m 
print s, m 
print 'proteklo je', s, 'sat i', m, 'minuta'



# Python, uvod u "da rascistimo ^", operatori poredjenja
2 == 2 
2==2 
3 == 2 
2 != 3 
2 != 2 
2 <> 2 
2 <> 3 
2 > 3 
2 < 3 
2 >= 1 
2 >= 2 
2 >= 3 
2 <= 1 
2 <= 2 
2 <= 3



# Python, logicke operacije, ;, \ i #
type(True); type(False)
a = True
b = False
type(a)
a and b   # logicko i
not a     # logicko ne
a and a
a or not a
a or (not a)
a or \
not b     # ovako se nastavlja red



# Python, zapisi brojeva
012
0o12
0O12
0x35
0X35
0b11
0B11



# Python, konverzija zapisa brojeva
oct(10)
hex(53)
bin(3)



# Python, da konacno rascistimo ^, operacije nad bitima
a = 0b0101
a
b = 0b0011
b
a & b
bin(a & b)
bin(a | b)
bin(a ^ b)
bin(0)
bin(~0)
bin(2)
bin(~2)
~2
2 << 1
2 << 4
32 >> 2
3 >> 1



# Python, a sada nesto sasvim drugacije: kompleksni brojevi
# j*j
1j*1j
2J * 2J
type(1J)
abs(3+4j)
complex(1,2)
a = 2 + 3j
type(a)
a.real
a.imag
a.conjugate()
a * a.conjugate()
del a
# type(a)
	


# Python, malo ozbiljnija matematika, moduli
# sin(1)
import math
type(math)
dir(math)
# help(math)
# help(math.sin)
math.sin(1)
math.e
math.pi
math.sin(math.pi/2)
# math.exp(math.pi*1j)+1
math.cos(math.pi) + 1j * math.sin(math.pi) + 1



# Python, namespaces
del math
import math as m
m.sin(m.pi / 4) ** 2
m.exp(1) - m.e
del m
from math import *
sin(pi / 4) ** 2
exp(1) - e
e
e = 32
e
pi
pi = 14
pi



# Python, assignment operators
a = 1
a += 1
print a
a *= 2
print a
a /= 2
print a
a -= 4
print a
a **= 3
a %= 3
print a
-8 / 3
a = 11.0
a //= 3
print a		



# Python, funkcije
def pdv(x):
    return x * 1.20

type(pdv)	
pdv(100)
pdv(150)		
	


# Python, funkcije, help
def pdv(x):
    'ovo je funkcija koja racuna pdv'
    return x * 1.20

pdv(100)
#help(pdv)



# Python, funkcije, help u vise redova
def pdv(x):
    '''ovo je funkcija koja racuna pdv
	
    a pdv je porez na dodatu vrednost'''
    return x * 1.20

pdv(100)
#help(pdv)



# Python, funkcije, opcioni argumenti
def pdv(x, stopa = 20):
    return x*(1 + stopa/100)

pdv(100)
pdv(150)

def pdv(x, stopa = 20):
    return x * (1 + stopa/100.)

pdv(100)
pdv(150)
pdv(100, stopa=23)
pdv(100, 23)

del pdv
# pdv(10)



# Python, kontrola toka
def parnost(n):
    if n/2*2 == n:
        print 'paran'
    else:
        print 'neparan'

parnost(4)
parnost(5)
parnost(4.2)
parnost(5.1)



# Python, ispitivanje tipa
def parnost(n):
    if type(n) != "<type 'int'>":
        print 'argument nije ceo broj'
        return
    if n/2*2 == n:
        print 'paran'
    else:
        print 'neparan'

parnost(4.2)
parnost(4)
parnost(3)

type(4)
type(type(4))
type("<type 'int'>")



# Python, ispitivanje tipa, sada radi
def parnost(n):
    if str(type(n)) != "<type 'int'>":
        print 'argument nije ceo broj'
        return
    if n/2*2 == n:
        print 'paran'
    else:
        print 'neparan'

parnost(4.2)
parnost(4)
parnost(3)



# Python, ispitivanje tipa, moze i ovako
def parnost(n):
    if type(n) != type(1):
        print 'argument nije ceo broj'
        return
    if n/2*2 == n:
        print 'paran'
    else:
        print 'neparan'
		        
parnost(4.2)
parnost(4)
parnost(3)
parnost(4.)



# Python, konverzije tipova i jos ponesto
del parnost
int(-4.2)
int(4.2)
# long(_)
# float(_)
float(5)
divmod(10, 3)
divmod(12, 3)
pow(2, 8)
2 ** 8
str(float(2**8))



# Python, liste
a = [1, 2, 5, 6]
type(a)
a[0]
a[1]
a[2]
a[3]
# a[4]
a[-1]
a[-2]
a[-3]
a[-4]
# a[-5]
print a
len(a)	



# Python, liste, slicing and mutability
a[1:3]
a[1:2]
a[1:-2]
a[2:]
a[:2]
a[:-2]
a[3] = 7
print a



# Python, liste, dodavanje i brisanje elemenata
# a + 9
a + [9]
a = a + [9]
len(a)
del a[(len(a)-1)]
print a
del a[1]
print a
len(a)



# Python, liste, metodi append i extend
a = [1, 2, 3, 4]
a.append(5)
print a
b = [6, 7]
a.append(b)
print a
len(a)
del a[5]
a.extend(b)
print a
len(a)
del a[5:]
print a




# Python, liste, range
a = range(5)
len(a)
print a
a = range(4, 10)
len(a)
print a
a = range(3, 10, 2)
print a
a = range(10, 0, -2)
print a		



# Python, stack
a = []
type(a)
a.append(1)
a.append(2)
a.append(3)
a.pop()
a.pop()
print a
a = range(10)
a.pop(3)
print a



# Python, liste, insert
a = range(10)
a.insert(3, 4)
print a
a.insert(0, 1)
print a
a.insert(len(a), 'kraj')
print a



# Python, liste, reverse, sort
a = range(10)
a.reverse()
print a
a.reverse()
print a
a = [3, 4, 2, 1]
a.sort()
print a



# Python, liste, brojanje i brisanje
a=[3, 2, 3, 1, 4, 3, 2, 2, 5, 2]
a.count(2)
a.count(3)
a.remove(3)
a.count(3)
print a
a.remove(3)
print a
a.remove(3)
print a
# a.remove(3)




# Python, in operator
3 in a
4 in a
a.remove(4)
4 in a



# Python, liste, index metod
print a
a.index(2)
a.index(5)
a.index(1)
# a.index(3)



# Python, aliases
a = 3
b = a
a is b
a == b
b += 1
a == b
a is b



# Python, aliases with lists
a = [1, 2, 3]
b = a
a is b
a == b
b[1] = 0
a == b
print a
a is b
c = a[:]
c == a
c is a
c[1] = 2
c == a
print c
print a



# Python, matrice
a = [[1, 2], [3, 4]]
len(a)
len(a[1])
print a[1][1]
print a[0][0]



# Python, inicijalizacija nizova
a = []
print a
a = [0]*10
print a
a = [[1]*3]*3
print a



# Python, for petlja
a = range(10)
for i in a:
    print i + 1, '/', len(a)



# Python, for petlja, over string
a = 'neobicno bas'
for znak in a:
    print znak



# Python, if-else
a = 'abrakadabra'
b = ''
for znak in a:
    if znak != 'a':
        b += znak
    else:
        b += '_'
print b



# Python, if-elif-else
a = 'abrakadabra'
b = ''
for znak in a:
    if znak == 'a':
        b += '_'
    elif znak == 'k':
        b += '*'
    else:
        b += znak
print b



