0% found this document useful (0 votes)
163 views

Programski Jezik Python: Milan Bjelica

The document is a textbook on the Python programming language for students of telecommunications from the University of Belgrade. It introduces Python, explains why it is being taught, how to install it, and provides an overview of basic Python concepts like data types, operations, modules, and lists.

Uploaded by

Aldin Beganovic
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
163 views

Programski Jezik Python: Milan Bjelica

The document is a textbook on the Python programming language for students of telecommunications from the University of Belgrade. It introduces Python, explains why it is being taught, how to install it, and provides an overview of basic Python concepts like data types, operations, modules, and lists.

Uploaded by

Aldin Beganovic
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 32



UDZBENIK 
ELEKTROTEHNICKOG FAKULTETA U BEOGRADU

Milan Bjelica

Programski jezik Python


skripta za studente telekomunikacija

Beograd, 2018.
1 Uvod

1.1  je Python
Sta

S Wikipedije:

Python is a widely used general-purpose, high-level programming language.


Its design philosophy emphasizes code readability, and its syntax allows
programmers to express concepts in fewer lines of code than would be pos-
sible in languages such as C++ or Java. The language provides constructs
intended to enable clear programs on both a small and large scale.
Python supports multiple programming paradigms, including object-orien-
ted, imperative and functional programming or procedural styles. It featu-
res a dynamic type system and automatic memory management and has a
large and comprehensive standard library.
Python interpreters are available for installation on many operating sys-
tems, allowing Python code execution on a wide variety of systems.

Tvorac Pythona je Guido van Rossum (1990).

Ime mu potice od TV serije Monty Python's Flying Circus.

1.2 Zasto ga ucimo?


• slobodni softver
• lako se uci
• prvi programski jezik na MIT
• bogate biblioteke:

 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

Preporuka je da se instalira distribucija Canopy sa sajta www.enthought.com, koja


sadrzi najveci broj standardnih modula. One ostale, poput pySeriala, treba preuzeti s
njihovog sajta i slediti uputstvo za instalaciju.

1.4 Dokumentacija

Python je jako dobro i detaljno dokumentovan. Za uvodni kurs, dovoljne su online


reference sa sajta www.python.org/doc i sa sajtova pripadajucih modula. Veoma
dobri materijali za samostalno ucenje mogu se preuzeti sa sajta predmeta Praktikum
iz softverskih alata u elektronici (prof. Pejovic).

2
2 Prvi koraci u Pythonu

2.1 Opste

Za sada radimo terminalski  izvrsavamo komandu po komandu u prozoru IDLE, dok


cemo pisanje programa probati nesto kasnije.

Python je case sensitive  razlikuje velika i mala slova. Razmake ignorise. !


Komentar pocinje simbolom #. Ukoliko komanda (ili izraz) ne moze da stane u jedan
red, za prelazak u novi treba kucati simbol \.

Pomoc za neku naredbu dobijamo kucanjem help(naredba ).

Dodeljivanje vrednosti je standardno  npr. a = 1.17 ili X = 8.

2.2 Vrste podataka od interesa za nas


• brojevi

 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

 niske/stringovi (strings )  npr. '13E033TM'


 n-torke (tuples )
 liste (lists )  npr. [1, 9, 10, 78]
• preslikavanja (mappings )

• izvrsivi tipovi (callable types )

 funkcije koje denisu korisnici (user-dened functions )


 metode koje denisu korisnici (user-dened methods )

Funkcija type(argument ) vraca kojoj vrsti podataka pripada argument.

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).

2.4 Kompleksni brojevi

Imaginarna jedinica oznacava se simbolom j ili J. Kompleksni broj se moze formirati


funkcijom complex, npr. a = complex(1, 2), ili se moze zadati eksplicitno, npr. b =
3 + 4j.
Osnovne funkcije i metode nad kompleksnim brojevima navedene su u tabeli. U pri-
meru je pretpostavljeno da je kompleksni broj smesten u promenljivu z.

Oznaka Opis
z.real realni deo
z.imag imaginarni deo
abs(z) moduo
z.conjugate() konjugovano-kompleksni broj

2.5 Python kao kalkulator  racunske operacije

Simbol Znacenje
+ sabiranje
− oduzimanje
∗ mnozenje
/ deljenje∗
∗∗ stepenovanje
// celobrojno deljenje
% ostatak pri cel. deljenju

 Ekvivalentno celobrojnom deljenju
ukoliko su oba operanda celi brojevi.

Ukoliko se rezultat operacije dodeljuje jednom od operanada, tada se moze koristiti


sazeti zapis, npr. a ∗∗= 3 umesto a = a∗∗3. !

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

2.7 Operatori poredenja

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.

Kao primer, razmotrimo koriscenje trigonometrijskih funkcija i konstante p:


import math
math.sin(math.pi/4)

Ocigledno, ovakvo pozivanje funkcija (i konstanti) ne samo da je naporno, vec je i


programski kod nepregledan. Obrisimo stoga modul math (del math) i kucajmo
import math as m
m.sin(m.pi/4)
del m

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.

Moduo mozemo ucitati i tako da bude podrazumevani deo radnog prostora:


from math import *
sin(pi/4)

6
4 Liste
Listu cine elementi uzajamno odvojeni zapetama, koji se nalaze unutar uglastih za-
grada:
A = [2, 8, 9.4, -13, 25]

4.1 Indeksiranje elemenata liste

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

4.2 Operacije nad listama

Operacija Opis Primer upotrebe


len duzina (broj elemenata) liste len(A)
del brisanje liste ili elementa del A[2]
append dopisivanje novog elementa A.append([5, 7])
extend konkateniranje novih elemenata na listu A.extend([5, 7])
reverse obrtanje redosleda elemenata A.reverse()
sort sortiranje elemenata A.sort()
index indeks prvog javljanja elementa A.index(5)
count broj ponavljanja elementa u listi A.count(5)
remove uklanjanje elementa iz liste A.remove(5)
in nalazi li se element u listi 5 in A

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.

4.3 Nizovi i matrice

Nizovi se mogu shvatiti kao liste. Prazan niz A inicijalizuje se naredbom A = [] i


potom popunjava metodom append. Operatorom dodeljivanja vrednosti (=) ne moze !
se upisati podatak u nepostojeci clan niza. Niz koji ima npr. deset nula generise se
naredbom [0]*10.

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"

# for petlja, indeksiranje po listi


W = range(100)
for i in W:
print 'korak broj', i+1

# for petlja, indeksiranje po stringu


Q = 'programski jezik Python'
for j in Q:
print j

9
6 Funkcije
Sledeci primer ilustruje denisanje i pozivanje korisnicke funkcije.

def pdv(osnovica, stopa):


'''Funkcija koja racuna porez na dodatnu vrednost.
Argumenti su poreska osnovica i stopa (u %).'''
return osnovica * (1 + stopa/100.)

pdv(100, 8) # pozivanje funkcije


help(pdv) # pomoc
del pdv # brisanje 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.

Podatak drugog tipa prevodi se u string naredbom str.

Simboli unutar stringa indeksiraju se analogno elementima lista (odeljak 4.1).

7.1 Operacije nad stringovina

Simbol Opis Primer upotrebe


len duzina (broj elemenata) stringa len(s)
+ konkateniranje s + 'abc'
* ponavljanje s ∗ 5
[] indeksiranje elementa s[5]
[:] izdvajanje opsega s[2:7]
in nalazi li se element u stringu 'a' in s

7.2 Metode nad stringovima

Primer primene Opis


s.capitalize() Kopija stringa s u kome je prvi simbol  ukoliko se radi o
slovu  napisan kao veliko slovo.
s.count(target ) Broj pojavljivanja podstringa target u stringu s.
s.find(target ) Indeks prvog pojavljivanja podstringa target u stringu s.
s.lower() Kopija stringa s napisana malim slovima.
s.replace(old, new ) Kopija stringa s u kojoj su  gledano sleva udesno  sva po-
javljivanja podstringa old zamenjena podstringom new .
s.split(sep ) Lista podstringova stringa s, za koje je delimiter podstring
sep .
s.upper() Kopija stringa s napisana velikim slovima.

11
7.3 Formatirani izlaz

7.3.1 Funkcija print()

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')

7.3.2 Metoda format

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 ).

Format ispisa zadaje se unutar viticastih zagrada. Na primer, '{0}:{2};{1}' znaci


da se prvi podatak (s indeksom 0) ispisuje na pocetku, potom sledi dvotacka, pa treci
podatak (indeks 2), iza njega tacka-zarez i, na kraju, drugi podatak (indeks 1). Ukoliko
se podaci ispisuju redosledom kojim su navedeni  prvi, drugi, treci...  viticaste
zagrade se mogu ostaviti prazne ('{}:{};{}').

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.

Metode za rad s datotekama navedene su u tabeli.

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])

Program se sad iz komandne linije poziva uz numericke vrednosti argumenata, npr.


> python prog.py 127.0 -5

16
11 Matematicke funkcije
U nastavku ovoga odeljka, podrazumevacmo da je ucitan moduo pylab
from pylab import *

ili moduli numpy, scipy i matplotlib, koje on sadrzi.

11.1 Tabeliranje funkcija

Sve vaznije matematicke funkcije  a takode i konstante  dostupne su u modulu


numpy. Iako kao argument prihvataju i liste, zbog mogucnosti kasnijeg crtanja njihovih
graka, bilo bi pozeljno da argumenti budu nizovi (arrays ). Postojecu listu mozemo
konvertovati u niz naredbom array, ili mozemo napraviti niz nekom od naredbi zeros,
ones ili arange (ima znacenje kao array(range)).
Funkcija linspace generise niz cije su vrednosti ekvidistantno raspodeljene u zadatom
opsegu, dok funkcija logspace generise logaritamski raspodeljene vrednosti.
x = arange(0, 1, .01)*2*pi # moze i preko linspace
y = cos(x)
z = sin(x)

11.2 Snimanje i ucitavanje rezultata

Rezultate matematickih izracunavanja cesto je potrebno sacuvati na disku i odatle


kasnije ponovo ucitati. Preporuceni format je u vidu binarne .npy datoteke:
np.save('vrednosti_y.npy', y)
w = np.load('vrednosti_y.npy')

11.3 Crtanje graka funkcija

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-').

Za logaritamsku razmeru po osama, umesto plot koriste se naredbe semilogx, semi-


logy ili loglog.
Grak se prikazuje naredbom show(). Ponavljanjem naredbi za crtanje pre show, u
istom prozoru moze se iscrtati vise graka.

Simboli za opis vrste linije i oznake boja dati su u tabelama na narednoj strani.

Pored koordinata tacaka koje treba prikazati na graku, te simbola za speciciranje


vrste i boje linije ili markera, naredbe plot, semilogx, semilogy i loglog uzimaju i
neke opcione argumente.

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.

Ukoliko se grak priprema za stampu, pozeljno je podebljati linije zadavanjem vece


vrednosti parametra linewidth.

Oznake na koordinatne ose postavljaju se naredbama xlabel i ylabel, a naslov graka


naredbom title.
plot(x, y, 'b-', label = 'cos', linewidth = 2)
plot(x, z, 'r', label = 'sin', linewidth = 2)
legend()
xlabel('x')
ylabel('f(x)')
title('Prvi grafik u Pythonu')
xlim([0, 2*pi]) # opseg vrednosti po apscisi
ylim([-1, 1]) # opseg vrednosti po ordinati
show()

1.0 Prvi grafik u Pythonu


cos
sin
0.5

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

• poslati instrumentu komandu preko racunara, kao ekvivalent zickom pritiskanju


½dugmica na prednjoj ploci,
• preuzeti rezultate merenja na racunar, kao ekvivalent njihovom zapisivanju na
papir,
• (kasnije:) obraditi ove rezultate

Kako se to u principu radi:

1. otvorimo i kongurisemo Python objekat pridruzen instrumentu,


2. (opciono) adresiramo instrument,
3. objektu posaljemo string koji sadrzi naredbu/upit,
4. ako je u pitanju upit, procitamo odgovor, ponovo u vidu stringa,
5. na kraju zatvorimo objekat.

Potrebni moduli:

• pyserial (za RS-232)


• pyusb + usbtmc (USB)
• Python VXI-11 (Ethernet LAN)

Jako vazno (iz iskustva):


Pre samog povezivanja, treba detaljno prouciti dokumentaciju instrumenta
i razjasniti detalje o potrebnom kablu, parametrima komunikacije, skupu !
komandi, terminatoru linije i formatu odgovora.

12.2 Pyserial

12.2.1 Otvaranje i kongurisanje porta

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

Ubuntu, prvi port


import serial
par = serial.Serial(0, timeout = 2) # moze i ovako

12.2.2 Slanje i citanje podatka

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.2.3 Zatvaranje porta


instr.close()

12.3 USB

Identikatori instrumenta su Vendor ID, Product ID i, opciono, Serial Number.

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

Identikator instrumenta je njegova IP adresa. Potrebno je na instrumentu  i, even-


tualno racunaru  podesiti kompatibilne maske podmreze i adrese mreznog prolaza.
Ukoliko se instrument prikljucuje direktno na racunar, koristi se crossover kabl, u !
suprotnom straight-through.

Nije potreban terminator. Metoda ask salje upit i cita odgovor. !


import vxi11
sa = vxi11.Instrument('147.91.10.54')
sa.ask('*idn?')
sa.close() # zatvaranje objekta

21
13 Obrada rezultata merenja
Neka je X niz s N rezultata merenja.
from pylab import *

13.1 Deskriptivna statistika

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

13.2 Vizuelizacija raspodele

Funkcija Opis
boxplot(X) boks-dijagram
hist(X, bins = k) histogram s k ½stubica

13.3 Polinomska regresija

Neka je X niz s vrednostima nezavisne i Y niz s vrednostima zavisne promenljive. Koe-


cijenti polinoma p(x) = p[0] * x**deg + ... + p[deg], koji u smislu minimalne
srednje kvadratne greske opisuje zavisnost Y = p(X) racunaju se kao
p = polyfit(X, Y, deg)

Za potrebe grackog prikaza, regresioni polinom mozemo jednostavno tabelirati na


sledeci nacin:
fit_fn = poly1d(p)
Y_fit = fit_fn(X)

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

14.1 Spektralna analiza

Jednodimenzionalna diskretna Fourierova transformacija racuna se naredbom fft iz


modula pylab.

U modulu scipy.signal dostupne su i sledece funkcije:

periodogram  ocena spektralne gustine snage metodom periodigrama,


spectrogram  izracunavanje spektrograma metodom uzastopnih Fourierovih transfor-
macija.

14.2 Projektovanje ltara

Sledece funkcije dostupne su u modulu scipy.signal:

y = lfilter(b, a, x)  ltriranje signala x kroz ltar ciji su koecijenti polinoma u


brojniku funkcije prenosa b, a polinoma u nazivniku a;

w, h = freqz(b, a=1, worN=None, whole=0, plot=None)  izracunavanje frekven-


cijskog odziva ltra. Koecijenti polinoma u brojniku su b, a u nazivniku a (podra-
zumevana vrednost je a = 1). Treci argument je opcioni i oznacava broj tacaka u
kojima se racuna frekvencijski odziv (podrazumevana vrednost je 512). cetvrti ar-
gument oznacava racunaju li se vrednosti ferkvencija na gornjoj polovini jedinicnog
kruga (0), ili na celom krugu (True). Poslednji argument oznacava poziva li se odmah
crtanje graka frekvencijskog odziva, ili ne. Izlazi funkcije su vektor normalizovanih
frekvencija, w (u radijanima po uzorku) i frekvencijski odziv, h;

w, gd = group_delay((b, a), w=None, whole=False)  izracunavanje grupnog kasnjenja


digitalnog ltra. Znacenja argumenata: b, a - koecijenti polinoma u brojniku i na-
zivniku funkcije prenosa; w - opcioni argument, ako je None, frekvencije se uzimaju u

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.

14.2.1 FIR ltri

Osnovna funkcija za projektovanje FIR ltra je firwin iz modula scipy.signal. Njen


prvi argument je broj koecijenata ltra (red ltra uvecan za jedan), a drugi su normali-
zovane frekvencije koje odgovaraju granicama propusnih/nepropusnih opsega. Funkcija
vraca koecijente ltra. Ako je red ltra paran, ltar je tipa I; u suprotnom je tipa II.

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

Funkcijom remez projektuje se minimax optimalni ltar, prema Remez algoritmu.

Primer: Generisacemo n = 320 uzoraka signala


x(t) = A1 sin(2πf1 t) + A2 sin(2πf2 t) + nG (t),

gde je A1 = 1, f1 = 1 kHz, A2 = 0.5 i f2 = 15 kHz i nG (t) Gaußov sum srednje snage


Pn = 1 mW, uzetih s frekvencijom fs = 48 kHz. Projektovacemo Hammingov NF FIR
ltar 32. reda, granicne frekvencije propusnog opsega fc = 6 kHz i propustiti signal
x(t) kroz njega.

from pylab import *


from scipy.signal import firwin, lfilter, freqz

# 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]

14.2.2 IIR ltri

Osnovna funkcija za projektovanje IIR ltara je iirdesign iz modula scipy.signal:

iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba')

Njeni argumenti su, redom:


• granicne kruzne ucestanosti propusnih (wp) i nepropusnih opsega (ws), normali-
zovane na Nyquistovu kruznu ucestanost;
• maksimalno slabljenje (u decibelima) u propusnom (gpass) i nepropusnom opse-
gu (gstop);
• vrsta ltra  analogni (analog = True), ili digitalni (u suprotnom);
• aproksimacija funkcije prenosa  Butterworthova ('butter'), cebisevljeva I vrste
('cheby1'), cebisevljeva II vrste ('cheby2'), Cauerova ('ellip'), ili Bessel-
-Thomsonova ('bessel');
• vrsta izlaza  brojnik i nazivnik ('ba'), nule, polovi i dobitak ('zpk') ili sekcije
drugog reda ('sos').

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)

Izuzetak su Bessel-Thomsonovi ltri, koji se projektuju u jednom koraku, naredbom


bessel.

26
15 Programiranje mreznih aplikacija
Moduo socket pruza funkcionalnosti za pristup mreznom interfejsu.

Osnovna funkcija je socket.socket([family[, type[, proto]]]), kojom se pravi


novi socket objekt. Argumenti su joj, redom:

• adresna familija  AF_INET (podrazumevana), AF_INET6 ili AF_UNIX; na


Linux platformama i AF_PACKET i PF_PACKET;
• vrsta socketa  SOCK_STREAM (podrazumevana), SOCK_DGRAM ili neka
od raspolozivih SOCK_ konstanti, prema dokumentaciji (npr. SOCK_RAW);
• numericka oznaka protokola (najcesce nula i moze se izostaviti).

15.1 Metode za rad nad objektima

socket.accept()  Prihvata konekciju. Potrebno je da socket bude povezan s adresom


i da osluskuje konekcije. Vraca se par (conn, address), gde je conn novi socket objekt
koji moze da salje i prima podatke po konekciji, a address je adresa povezana sa
socketom na drugoj strani konekcije.

socket.bind(address)  Povezuje socket koji prethodno nije imao adresu s adresom.


Format adrese zavisi od adresne familije.

socket.close()  Zatvara se socket.


socket.connect(address)  Uspostavlja se konekcija ka udaljenom socketu na speci-
ciranoj adresi. Format adrese zavisi od adresne familije.

socket.listen(backlog)  ½Osluskuje se dolazna konekcija. Argumentom backlog


zadaje se maksimalan broj simultanih konekcija.

socket.recv(bufsize[, flags])  Prima se podatak sa socketa i predstavlja strin-


gom. Argumentom bufsize zadaje se maksimalna kolicina podataka koji se mogu
odjednom procitati. Preporuka je da to bude relativno mali broj stepena 2, npr. 4096.
Argument flags je opcion i podrazumevana vrednost mu je nula.

socket.recvfrom(bufsize[, flags])  Kao za metodu recv(), s tim sto se sada


vraca par (string, address). String je primljeni podatak, a address je adresa
socketa koji ga je poslao. Format adrese zavisi od adresne familije.

socket.send(string[, flags])  Salje se podatak na socket, koji prethodno mora


biti povezan na udaljeni socket, a vraca se broj poslatih bajtova. Opcioni argument
flags ima isto znacenje kao za metodu recv().
socket.sendto(string, flags, address)  Kao prethodna metoda, s tim sto se
sada zadaje adresa odredista.

27
15.2 Primeri

15.2.1 Raw Ethernet

Direktan pristup mreznom interfejsu moguc je iz Linuxa. Potrebno je da racunari koji


komuniciraju na ovaj nacin budu unutar istog kolizionog domena.
from socket import *
s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth0", 0)) # interfejs je eth0
# pretpostavka je da promenljiva packet sadrzi
# validan zapis Ethernet okvira
# okvir se moze napraviti npr. modulom dpkt
s.send(packet) # slanje
s.recv(2048) # prijem
s.close()

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()

TCP je konektivni protokol, pa je stoga neophodno prvo pokrenuti serversku aplikaciju.

29
Sadrzaj
1 Uvod 1

2 Prvi koraci u Pythonu 3

3 Koriscenje modula 6

4 Liste 7

5 Kontrola toka 9

6 Funkcije 10

7 Stringovi 11

8 Unos podataka preko komandne linije 14

9 Rad s datotekama 15

10 Izvrsavanje programa 16

11 Matematicke funkcije 17

12 Upravljanje instrumentima 19

13 Obrada rezultata merenja 22

14 Obrada telekomunikacionih signala 23

15 Programiranje mreznih aplikacija 27


dr Milan Bjelica,
Univerzitet u Beogradu  Elektrotehnicki fakultet
email: [email protected]

PROGRAMSKI JEZIK PYTHON:


SKRIPTA ZA STUDENTE TELEKOMUNIKACIJA
elektronski pomocni udzbenik

Recenzenti:
prof. dr Aleksandra Smiljanic,
doc. dr Mirjana Simic-Pejovic

Nastavno-naucno vece Elektrotehnickog fakulteta odobrilo je objavljivanje


ovoga nastavnog materijala odlukom broj 1313/4 od 12.7.2016. godine.

Izdaje i stampa:
Elektrotehnicki fakultet
Beograd, 2018.

Tiraz: 50 primeraka

ISBN: 978-86-7225-058-9

Delo je licencirano pod uslovima licence


Creative Commons
Autorstvo  Deliti pod istim uslovima 4.0

Tekst ove knjige slozen je u programskom paketu LATEX 2ε .

CIP - Êàòàëîãèçàöèjà ó ïóáëèêàöèjè - Íàðîäíà áèáëèîòåêà Ñðáèjå, Áåîãðàä


004.43PYTHON(0.034.2)
ÁJÅËÈÖÀ, Ìèëàí, 1977-
Programski jezik Python [Elektronski izvor] : skripta za studente
telekomunikacija : [elektronski pomocni udzbenik] / Milan Bjelica. -
Beograd : Univerzitet, Elektrotehnicki fakultet, 2018 (Beograd :
Univerzitet, Elektrotehnicki fakultet). - 1 elektronski opticki disk
(CD-ROM) ; 12 cm. - (Udzbenik Elektrotehnickog fakulteta u Beogradu)
Sistemski zahtevi: Nisu navedeni. - Nasl. sa naslovne strane dokumenta. -
Tiraz 50.
ISBN 978-86-7225-058-9
a) Ïðîãðàìñêè jåçèê "Python"
COBISS.SR-ID 258999820

You might also like