Programski Jezik Python: Milan Bjelica
Programski Jezik Python: Milan Bjelica
UDZBENIK
ELEKTROTEHNICKOG FAKULTETA U BEOGRADU
Milan Bjelica
Beograd, 2018.
1 Uvod
1.1 je Python
Sta
S Wikipedije:
matematicki proracuni
crtanje graka funkcija
obrada TK signala
simulacija
upravljanje laboratorijskim instrumentima
programiranje mreznih aplikacija (Google, Youtube)
Radimo verziju 2 (tj. 2.7). Postoji i verzija 3, u pitanju je tzv. forking. Na danasnjem
stepenu razvoja, razlike se ticu sintakse naredbe/funkcije print, deljenja celih brojeva,
funkcije xrange i unicode stringova.
1
1.3 Kako se instalira?
1.3.1 Linux
Sve sto treba je prevuci iz baze python 2.7 i potrebne module npr. numpy, scipy, mat-
plotlib, pylab (obuhvata tri prethodna), python-serial... Neki moduli, kao npr. vxi11,
nisu u bazi, te ih treba preuzeti s njihovog sajta i slediti uputstvo za instalaciju (najcesce
jedna komanda u terminalu).
1.3.2 Win
1.4 Dokumentacija
2
2 Prvi koraci u Pythonu
2.1 Opste
celi (integers )
∗ obicni (plain integers ) celi brojevi u opsegu od -2147483648
do 2147483647, ili sirem
∗ dugi (long integers ) celi brojevi u neogranicenom rasponu
∗ Booleovi (booleans ) dve vrednosti koje se predstavljaju kao
False i True (s velikim pocetnim slovom). !
realni (oating point numbers ) npr. 7.0 ili 3.185
kompleksni (complex numbers ) npr. 3 + 4j
• nizovi (sequences ) konacni uredeni skupovi ciji su indeksi nenegativni
celi brojevi
3
2.3 Zapisi celih brojeva
Standardni zapis je u decimalnom brojnom sistemu, npr. -3. Pored njega, mogu se
koristiti i oktalni (npr. -0o27 ili -0O27), heksadecimalni (npr. -0x2F ili -0X2F) i binarni
sistem (npr. -0b110 ili -0B110).
Za konverziju zapisa u ove sisteme, koriste se redom funkcije oct, hex i bin, npr.
hex(0o472).
Oznaka Opis
z.real realni deo
z.imag imaginarni deo
abs(z) moduo
z.conjugate() konjugovano-kompleksni broj
Simbol Znacenje
+ sabiranje
− oduzimanje
∗ mnozenje
/ deljenje∗
∗∗ stepenovanje
// celobrojno deljenje
% ostatak pri cel. deljenju
∗
Ekvivalentno celobrojnom deljenju
ukoliko su oba operanda celi brojevi.
4
2.6 Logicke operacije
Operandi su tipa bool (True ili False; u mnogim slucajevima takode i 1 ili 0).
Simbol Znacenje
and logicko i
or logicko ili
not logicko ne
Simbol Znacenje
== je jednako
!= nije jednako
<> nije jednako
> vece od
< manje od
>= vece ili jednako
<= manje ili jednako
5
3 Koriscenje modula
Mnoge funkcije su sadrzane u specijalizovanim bibliotekama, tzv. modulima. Da bi se
ovakve funkcije mogle koristiti, odgovarajuci modul treba ucitati naredbom import.
Ucitani modul se brise naredbom del.
Umesto oznake m, mogli smo koristiti i bilo koju drugu; ako nam je cilj usteda vremena
(i izbegavanje gresaka u kucanju), bilo bi razumno da oznaka bude kraca od naziva !
modula.
6
4 Liste
Listu cine elementi uzajamno odvojeni zapetama, koji se nalaze unutar uglastih za-
grada:
A = [2, 8, 9.4, -13, 25]
Prvi element liste koja ima N elemenata ima indeks 0, drugi indeks 1, treci 2... dok
poslednji element ima indeks N − 1. Elementi se mogu indeksirati i unatrag, tako !
da poslednji ima indeks -1, pretposlednji -2... i prvi −N . Izdvajanje elemenata liste
ilustrovano je u narednoj tabeli.
Oznaka Znacenje
A[0] prvi element
A[1] drugi element
A[-1] poslednji element
A[-2] pretposlednji element
A[i:j] elementi od indeksa i do indeksa j − 1
A[0:3] elementi od prvog do treceg
A[:3] elementi od prvog do treceg
A[1:3] elementi od drugog do treceg
A[2:-1] elementi od treceg do pretposlednjeg
A[1:] elementi od drugog do poslednjeg
7
Lista koja sadrzi redom cele brojeve u zadatom opsegu generise se naredbom range.
Na primer, range(7) vraca listu duzine 7, ciji je prvi element 0, a poslednji 6.
Matrice su visedimenzionalne liste, npr. A = [[1, 2], [3, 4], [5, 6]]. Elemen-
tima matrica pristupa se analogno kao i elementima lista, npr. A[1][0].
8
5 Kontrola toka
Za razliku od programskih jezika koji programske blokove razdvajaju pomocu viticastih
zagrada ili kljucnih reci (npr. end), Python koristi uvlacenje teksta. !
# if elif else
if a > b:
print "a je vece od b"
elif b > a:
print "b je vece od a"
else:
print "a i b su jednaki"
9
6 Funkcije
Sledeci primer ilustruje denisanje i pozivanje korisnicke funkcije.
10
7 Stringovi
String (niska) je grupa simbola unutar apostrofa (') ili navodnika ("), npr. '13E033tm'.
Ukoliko string zauzima vise od jednog reda, kao delimiter se koriste tri apostrofa ('''), !
kao sto je to bio slucaj u primeru iz odeljka 6.
11
7.3 Formatirani izlaz
S funkcijom print() susreli smo se u primerima iz odeljka 5. Ona ispisuje svoj argu-
ment na monitoru:
n = 5
print(n)
print n # moze i bez zagrada
Funkciji se kao argument moze predati vise objekata, koji ne moraju biti istog tipa;
njihove vrednosti ce se ispisati u istom redu, razdvojene razmacima:
print(n, 18/5, 'abc?def')
Format ispisa podataka moze se zadati metodom format. Metoda se poziva nad strin-
gom koji predstavlja zeljeni format ispisa, dok joj se kao argument predaju podaci koje
treba ispisati: 'format_ispisa '.format(podaci ).
Dodatnim parametrima unutar viticastih zagrada mogu se zadati sirina polja za ispis
podatka, poravnanje, preciznost i vrsta zapisa broja.
Minimalna sirina polja zadaje se prirodnim brojem koji sledi posle simbola : na
primer, '{0:3},{1:5}' znaci da su za prvi podatak rezervisana tri mesta, a za drugi
pet; podaci su pri tome razdvojeni zarezom. Ukoliko je podatak veci, koristice se
onoliko mesta koliko je potrebno da bi se u potpunosti prikazao. Ukoliko se podaci ispi-
suju redom kojim su navedeni u argumentu metode format, vodeca cifra u viticastim
zagradama moze se izostaviti, npr. '{:3},{:5}'.
Kada je sirina polja veca od broja cifara, brojevi se poravnavaju uz desnu ivicu; nasu-
prot tome, stringovi se podrazumevano poravnavaju iz levu.
Preciznost oznacava koliko se cifara realnog broja ispisuje pre i posle decimalne tacke;
zadaje se prirodnim brojem koji sledi posle sirine polja i simbola . na primer,
'{:8.4}' znaci da je za ispis rezervisano osam mesta, a da se prikazuju cetiri cifre.
Vrsta zapisa broja zadaje se slovnom oznakom, prema tabeli. Podrazumevani ispis je
u decimalnoj notaciji.
12
Simbol Notacija ispisa broja
b binarna
c Unicode simbol
d decimalna
o oktalna
x heksadecimalna, mala slova a-f
X heksadecimalna, velika slova A-F
Primeri:
>>> n = 10
>>> '{:b}'.format(n)
'1010'
>>> '{:c}'.format(n)
'\n'
>>> '{:d}'.format(n)
'10'
>>> '{:o}'.format(n)
'12'
>>> '{:x}'.format(n)
'a'
>>> '{:X}'.format(n)
'A'
13
8 Unos podataka preko komandne linije
Podatak koji se unese preko komandne linije (prompta) cita se u vidu stringa naredbom
raw_input:
x = raw_input('Koji je danas dan? ')
print('Danas je ' + x + '.')
Ako je ulazni podatak druge prirode (npr. broj), potrebno je konvertovati mu format: !
y = raw_input('Unesite broj: ')
z = float(y)**2
print 'Njegov kvadrat je', z
14
9 Rad s datotekama
Naziv trenutnog radnog direktorijuma mozemo videti na sledeci nacin:
import os
print os.getcwd()
Datoteka se otvara komandom open, ciji je prvi argument naziv datoteke u vidu
stringa obavezan; drugi, opcioni argument, pokazuje otvara li se datoteka samo za
pisanje ('w' ili 'a') ili za citanje ('r'). Ukoliko datoteka vec postoji, kada se izabere
opcija 'w', novi sadrzaj se prepisuje preko postojeceg, dok se za opciju 'a' (append )
novi sadrzaj upisuje na kraj datoteke.
Metoda Opis
f.read(n) iz datoteke se cita n simbola (ili manje, ukoliko se
dode do kraja), koji se vracaju u vidu stringa
f.read() datoteka se cita do kraja i procitani sadrzaj se
vraca u vidu stringa
f.readline() iz datoteke se cita jedan red i vraca u vidu stringa
f.readlines() datoteka se cita do kraja i sadrzaj se vraca u vidu
liste redova
f.write(s) string s se upisuje u datoteku
f.close() datoteka se zatvara
Primer:
f = open('dat.txt', 'w') # datoteka dat.txt se otvara za pisanje
f.write('novi tekst') # string 'novi tekst' se upisuje u datoteku
f.close() # datoteka se zatvara
15
10 Izvrsavanje programa
Neka je Python program sacuvan u vidu datoteke prog.py. Iz komandne linije cemo
ga pokrenuti na sledeci nacin:
> python prog.py
Pod Linuxom moze biti neophodno da se u prvoj liniji programa oznaci putanja do
Python interpretera: !
#!/usr/bin/python
Ako program treba da prihvata ulazne argumente, npr. dva numericka parametra, realni
broj m i ceo broj k, tada treba postupiti na sledeci nacin:
import sys
m = float(sys.argv[1])
k = int(sys.argv[2])
16
11 Matematicke funkcije
U nastavku ovoga odeljka, podrazumevacmo da je ucitan moduo pylab
from pylab import *
Osnovna naredba je plot, ciji su argumenti redom niz vrednosti po apscisi, niz vre-
dnosti po ordinati i, opciono, parametri linije, npr. plot(x, y, 'b-').
Simboli za opis vrste linije i oznake boja dati su u tabelama na narednoj strani.
17
Simbol Znacenje Oznaka Znacenje
'-' puna linija 'b' plava
'--' isprekidana linija 'g' zelena
'-.' ½tacka-crta 'r' crvena
':' tackasta linija 'c' svetloplava
'.' tackasti marker 'm' ljubicasta
'o' kruzni marker 'k' crna
'w' bela
Kada se u istom prozoru crta vise graka, pozeljno je postaviti legendu u kojoj ce biti
objasnjeno na koju se funkciju (ili skup podataka) odnosi svaki od njih. To se postize
stringovskim argumentom label.
0.0
f(x)
0.5
1.00 1 2 3 4 5 6
x
18
12 Upravljanje instrumentima
12.1 Uvod
je cilj:
Sta
Potrebni moduli:
12.2 Pyserial
Pre pocetka, proveriti koji je kabl potreban, null-modem ili straight-through. Stan-
dardna podesavanja serijskog porta u Pythonu su 9600 bps, 8-N-1. !
Pozeljno je zadati razuman timeout, da se u slucaju greske program ne bi vreteo u
mrtvoj petlji. !
19
Win, npr. COM2
import serial
instr = serial.Serial(1) # indeksiranje krece od mule!
instr.timeout = 5 # na odgovor se ceka max. pet sekundi
Pri radu s modulom pyserial, neophodno je zavrsiti svaku naredbu propisanim ter-
minatorom (a to pise u uputstvu za programiranje instrumenta). !
Primer: zelimo da na osciloskopu podesimo dvaput veci vertikalni razmer od trenutnog.
Za upit trenutnog razmera, koristi se naredba CHannel<n>:SCAle?, a za podesavanje
razmera CHannel<n>:SCAle value . Terminator je line feed (<LF>, \n).
# pitamo instrument koliki je tekuci vertikalni razmer kanala 1
instr.write('CH1:SCA?\n')
# procitamo odgovor kao string i konvertujemo ga u realni broj
scale = float(instr.readline())
# novi razmer je dvaput veci
newscale = scale * 2
# razmer se zadaje naredbom CH1:SCA numericka_vrednost
# pravimo string ovog formata i saljemo ga instrumentu
# ne zaboravljamo terminator!
instr.write('CH1:SCA ' + str(newscale) + '\n')
12.3 USB
Nije potreban terminator. Metoda ask salje upit i cita odgovor. Nema eksplicitnog
zatvaranja objekta. !
import usbtmc
fg = usbtmc.Instrument(0x0957, 0x1755)
fg.ask('*idn?')
20
12.4 Ethernet LAN
21
13 Obrada rezultata merenja
Neka je X niz s N rezultata merenja.
from pylab import *
Funkcija Opis
min(X) minimalna vrednost
max(X) maksimalna vrednost
mean(X) matematicko ocekivanje
median(X) medijana
var(X) varijansa, u imeniocu N
var(X, ddof = 1) varijansa, u imeniocu N − 1
std(X) standardna devijacija, u imeniocu N
std(X, ddof = 1) standardna devijacija, u imeniocu N − 1
histogram(X, bins = k) histogram s k ½stubica
Funkcija Opis
boxplot(X) boks-dijagram
hist(X, bins = k) histogram s k ½stubica
22
14 Obrada telekomunikacionih signala
Uzorci signala gracki se predstavljaju naredbom stem. Specijalizovane funkcije vezane
za DSP dostupne su u modulu scipy.signal:
Funkcija Opis
convolve(x, y) izracunavanje konvolucije signala x i y
correlate(x, y) izracunavanje korelacije signala x i y
hilbert(x) izracunavanje analitickog signala
pomocu Hilbertove transformacije
decimate(x, q) decimiranje signala x za faktor q
resample(x, n) interpoliranje signala x do n uzoraka
23
512 ekvidistantno rasporedenih tacaka, ako je prirodan broj, frekvencije se racunaju
u toliko tacaka, ako je niz, kasnjenje se racuna na tim vrednostima; whole - opcioni
argument, kao za funkciju frequz. Izlazi: vektor normalizovanih frekvencija, w (u
radijanima po uzorku) i grupno kasnjenje, gd.
Funkcija Opis
firwin(N, f) NF ltar, Hammingov prozor
firwin(N, f, window = 'blackman') NF ltar, Blackmanov prozor
firwin(N, f, pass_zero = False) VF ltar, Hamming
firwin(N, [f1, f2], pass_zero = False) propusnik opsega, Hamming
firwin(N, [f1, f2], window = 'bartlett') nepropusnik opsega, Bartlett
# vrednosti parametara
fs = 48000.
n = 320
f1 = 1000.
A1 = 1.
f2 = 15000.
A2 = 0.5
Pn = 1.e-3
fc = 6000.
N = 32
t = arange(n)/fs
24
x = A1*sin(2*pi*f1*t) + A2*sin(2*pi*f2*t) + sqrt(Pn)*randn(len(t))
figure(1)
plot(t, x)
xlabel('t [s]')
ylabel('x(t)')
title('Vremenski oblik ulaznog signala')
figure(2)
plot(arange(n)*fs/n, abs(fft(x)/n))
xlabel('f [Hz]')
ylabel('|X(jf)|')
title('Amplitudski spektar ulaznog signala')
show()
b = firwin(N+1, fc/(fs/2))
w, h = freqz(b, 1)
subplot(211)
title('Amplitudska i fazna karakteristika filtra')
plot(w*.5*fs/pi, abs(h))
ylabel('|H(jf)|')
subplot(212)
plot(w*.5*fs/pi, unwrap(arctan2(imag(h),real(h))))
xlabel('f [Hz]')
ylabel('argH(jf)')
show()
y = lfilter(b, 1., x)
plot(t, y)
xlabel('t [s]')
ylabel('y(t)')
title('Vremenski oblik izlaznog signala')
show()
1.5 Vremenski oblik ulaznog signala 0.45 Amplitudski spektar ulaznog signala
0.40
1.0
0.35
0.5 0.30
0.25
|X(jf)|
0.0
x(t)
0.20
0.5 0.15
0.10
1.0
0.05
1.5
0.000 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.000 10000 20000 30000 40000 50000
t [s] f [Hz]
25
1.2 Amplitudska i fazna karakteristika filtra 1.5 Vremenski oblik izlaznog signala
1.0
|H(jf)| 0.8 1.0
0.6
0.4
0.5
0.2
0.00 5000 10000 15000 20000 25000 0.0
y(t)
0
5
0.5
arg{H(jf)}
10
15 1.0
20
250 5000 10000 15000 20000 25000 1.5
0.000 0.001 0.002 0.003 0.004 0.005 0.006 0.007
f [Hz] t [s]
Na drugi nacin, IIR ltri se projektuju u dva koraka, tako sto se u prvom odredi
red ltra kojim se postize zeljeni gabarit, dok se u drugom koraku odreduje funkcija
prenosa:
1. 2. Tip ltra
buttord butter Butterworthov
cheb1ord cheby1 cebisevljev I vrste
cheb2ord cheby2 cebisevljev II vrste
ellipord ellip Cauerov (elipticki)
26
15 Programiranje mreznih aplikacija
Moduo socket pruza funkcionalnosti za pristup mreznom interfejsu.
27
15.2 Primeri
15.2.2 UDP
Klijentski program:
from socket import *
serverName = '78.30.142.18' # npr.
serverPort = 12000 # npr.
clientSocket = socket(AF_INET, SOCK_DGRAM)
# poruka za slanje je u promenljivoj message
clientSocket.sendto(message, (serverName, serverPort))
# prijem odgovora:
response, serverAddress = clientSocket.recvfrom(2048)
clientSocket.close()
Server:
from socket import *
serverPort = 12000 # npr, isto kao za klijent
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((, serverPort))
while True:
message, clientAddress = serverSocket.recvfrom(2048)
# odgovor je u promenljivoj answer
serverSocket.sendto(answer, clientAddress)
Posto je UDP nekonektivni protokol, svejedno je hocemo li pri testiranju prvo pokrenuti
serversku ili klijentsku aplikaciju.
28
15.2.3 TCP
Klijent:
from socket import *
serverName = '78.30.142.18' # npr.
serverPort = 12000 # npr.
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
# poruka za slanje je u promenljivoj message
clientSocket.send(message)
# prijem odgovora:
response = clientSocket.recv(2048)
clientSocket.close()
Server:
from socket import *
serverPort = 12000 # npr, isto kao za klijent
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((, serverPort))
serverSocket.listen(1) # max. 1 konekcija
while True:
# prihvata se dolazna konekcija
connectionSocket, addr = serverSocket.accept()
# prima se podatak
message = connectionSocket.recv(2048)
# odgovor je u promenljivoj answer
connectionSocket.send(answer)
connectionSocket.close()
29
Sadrzaj
1 Uvod 1
3 Koriscenje modula 6
4 Liste 7
5 Kontrola toka 9
6 Funkcije 10
7 Stringovi 11
9 Rad s datotekama 15
10 Izvrsavanje programa 16
11 Matematicke funkcije 17
12 Upravljanje instrumentima 19
Recenzenti:
prof. dr Aleksandra Smiljanic,
doc. dr Mirjana Simic-Pejovic
Izdaje i stampa:
Elektrotehnicki fakultet
Beograd, 2018.
Tiraz: 50 primeraka
ISBN: 978-86-7225-058-9