Section author: Vedran Miletić
Osnovna sintaksa programskog jezika Python¶
Greg Stein u prezentaciji Python at Google kaže:
“Python has been an important part of Google since the beginning, and remains so as the system grows and evolved. Today dozens of Google engineers use Python, and we’re looking for more people with skils in this language” (Peter Norvig, Director of Search Quality at Google)
Google’s programming environment
Primary languages: C++, Java, Python
Python at eShop:
1995. “What in the world is Python?”
1996. “This is great stuff.”
(eShop gets assimilated by Microsoft)
Python at Microsoft:
1996. “It’s called what?”
1997. “You actually shipped Python code?” (MerchantServer 1.0)
1998. “Nice prototype. We’ll rewrite it in the next version.” And they did, in C++.
Python at CollabNet (poznati kao autori Subversiona):
2001. “No, we don’t really use Python here.”
2003. “Definitely write that in Python.”
Python at Google:
2004. “Of course we use Python. Why wouldn’t we?” Python caught on here [at Google] like a virus, moving from developer to developer.
-
programski jezik visoke razine,
naglasak na čitljivost koda,
vrlo bogata standardna biblioteka,
sličan C/C++-u, Perlu, Javi, Rubyju, JavaScriptu,
referentna implementacija je CPython:
napisana u C-u,
višeplatformska,
dostupna pod slobodnom licencom,
interpreter (nema kompajliranja).
danas vrlo korišten u raznim domenama, od numeričkog računanja u kvantnoj fizici i poravnavanja sekvenci gena do poslovne logike i web aplikacija
Google pretraga za “who uses python” daje nekoliko popisa).
postoji popis korisnih modula koji omogućuju primjenu u raznim domenama
-
verzija 0.9.0, Guido von Rossum na alt.sources,
verzija 1.0, 1995. 1.2, 1996. 1.4, …,
verzije 1.6 i 2.0, Python razvojni tim napušta CNRI, interes za Python u zajednici otvorenog koda raste,
verzija 3.0 poznata kao Python 3000 ili kraće Py3k, nekompatibilna s verzijom 2.0, promjene u sintaksi, izbačeni zastarjeli dijelovi.
Python 2 i Python 3 danas:
python
==python3
==python3.8
python2
==python2.7
Python 2 i Python 3 nekad:
python
==python2
==python2.7
python3
==python3.5
koristit ćemo Python 3.8 jer je Python 2.7 eksplicitno mrtav od 1. siječnja 2020. godine
Rad s Python interpreterom¶
interaktivni način rada
pokretanjem naredbe
python3
dobivamo ljusku u koju možemo unositi naredbe>>>
unos naredbe...
nastavak prethodnog retka
pokretanje programa pomoću interpretera
spremimo niz naredbi u datoteku s ekstenzijom
.py
i pokrenemo je interpreterompython3
zaglavlje je oblika
#!/usr/bin/env python3
env
tražipython3
na sustavu; on bi mogao biti u/usr/bin
,/usr/local/bin
ili čak u/opt/python3/bin
; autor skripte o tome ne mora brinuti
Unicode
Python 3 ga koristi u zadanim postavkama
kod Pythona 2 potrebno eksplicitno navesti u drugom retku zaglavlja
#!/usr/bin/env python # -*- coding: utf-8 -*-
-
vrlo detaljno i kvalitentno napisana, i mnogo ćemo je koristiti; možete je koristiti na kolokviju
naročito važni Tutorial i Library Reference
dinamički tipovi (engl. dynamic typing) – nema deklaracije tipa varijable, određuje se prema pridruženoj vrijednosti
a = 3 b = "rijec"
// ekvivalentan C++ kod int a = 3; char* b = "rijec";
tipovi (klase) varijabli
objektno orjentiran jezik: svaka varijabla je objekt
type() # vraća tip (klasu) objekta
osnovni tipovi varijabli
bool
,int
,long
,float
,complex
float
je pandan C++-ovomfloat
idouble
nepromjenjivi:
str
,bytes
,tuple
,frozenset
str
ibytes
su pandani C++-ovomstd::string
ichar*
tuple
je pandan C++-ovim poljima
promjenjivi:
list
,set
,dict
,bytearray
list
je pandan C++-ovomstd::list
istd::vector
set
je pandan C++-ovomstd::set
dict
je pandan C++-ovomstd::map
za svaki od tipova postoji istoimena funkcija (tzv. konstruktor) koja služi za stvaranje instanci klase i pretvaranje među različitim tipovima
osnovni operatori
=
,+
,-
,*
,**
,/
,//
,%
pridruživanje, zbrajanje, oduzimanje, množenje, potenciranje, dijeljenje, cjelobrojno dijeljenje, modulo dijeljenje
“hello world”: funkcija
print()
vrši ispis na ekranprint("Pozdrav Rijeci")
// ekvivalentan C++ kod #include <iostream> using namespace std; int main () { cout << "Pozdrav Rijeci" << endl; return 0; }
sustav pomoći
help()
– interpreter ima u sebi ugrađenu dokumentacijuhelp(xyz) # pomoć za funkciju xyz() help("xyz") # pomoć na temu xyz
Rad s ljuskom IPython¶
Ljuska IPython proširuje funkcionalnost osnovnog intepretera.
<Tab>
kompletira uneseni niz znakova do imena naredbe/varijable/funkcije/tipa/modula, dvostruki <Tab> nudi sve mogućnosti (isto kao u ljuscibash
).help(modul/funkcija/objektu)
ili modul/funkcija/objekt? daje detaljne informacije o modulu/funkciji/tipu, koje su pored toga lijepo formatirane.
Note
Intrepreter ipython
je moguće testirati i izravno u web pregledniku.
Podrška za Python u uređivaču teksta Emacs¶
Emacs u standardnoj distribuciji ima python.el
koji mu omogućuje napredno baratanje Python kodom:
python-shift-left
,C-c C-<
: Decrease indentation of the regionpython-shift-right
,C-c C-<
: Increase indentation of the regionpython-switch-to-python
,C-c C-z
: Start (or switch) to a Python shellpython-send-buffer
,C-c C-c
: Run the current buffer in the Python interpreterpython-send-region
,C-c C-r
: Run the selected code in the Python interpreterpython-describe-symbol
,C-c C-f
: Get help on a Python symbol (Better than visiting the slow Python website, right?)
Zadatak
Napišite “hello world” program u Pythonu s pozdravom po želji, a zatim ga modificirajte kako je opisano.
Pokušajte spomenuti način ispisati i varijable tipa
int
ifloat
.Isprobajte na koji način radi ispis znakovnih nizova s našim znakovima.
Ostavite proizvoljan znakovni niz sam u svom retku i pokušajte pokrenuti program. Što se ispisuje na ekran kod pokretanja programa? Što se mijena kod interaktivnog načina rada?
Objektni pristup programiranju¶
atribut objekta je konstanta vezana uz objekt
metoda objekta je funkcija vezana uz objekt
funkcija
dir()
vraća popis atributa i metoda
a = 5 # varijabla a će dinamički postati tipa int
dir() # vraća popis atributa i metoda tipa int
Zadatak
U Pythonu se varijabli može pridružiti vrijednost kompleksnog broja na nekoliko načina, a najjednostavniji je a = 2+3j
(naravno, vrijednosti 2 i 3 mogu se zamijeniti bilo kojim int
ili float
brojevima).
Pronađite način da ispište realni i imaginarni dio kompleksnog broja.
Pronađite način da ispište kompleksni konjugat tog broja. Objasnite koju razliku pravi par zagrada
()
nakon metode.
Naredbe if
, else
, for
, while
¶
Python zahtjeva točnu uvlaku koda; u protivnom, interpreter javlja grešku
nedostatak uvlake:
IndentationError: expected an indented block
višak uvlake:
IndentationError: unexpected indent
Emacs za Python uvlaku koristi 4 razmaka (preporučeno, PEP 8) i automatski pravilno uvlači pritiskom na tipku
Tab
None
– tip podataka ništa; (a
nedefiniran) != (a = None
)True
iFalse
– boolean tip podataka;False
suint(0)
,float(0.0)
,str("")
,list([])
operatori
and
ior
naredbe
if
ielse
if x < 0: print("Negative") elif x == 0: print("Zero") else: print("Positive")
// ekvivalentan C++ kod #include <iostream> using namespace std; int main () { if (x < 0) { cout << "Negative" << endl; } else if (x == 0) { cout << "Zero" << endl; } else { cout << "Positive" << endl; } return 0; }
tip podataka
range
funkcija
range([start,] stop[, step])
vraća niz brojeva odstart
dostep
u koracimastep
“početak uključen, kraj isključen” (prema idejama knjige C Traps and Pitfalls Andrewa Koeniga)
in
označava iteraciju po “elementima” nekog objekta (liste, uređene n-torke, rječnika, …)naredba
for
for x in range(2, 7): print(x, x**2)
// ekvivalentan C++ kod #include <iostream> using namespace std; int main () { for (int x = 2; x < 7; x++) { cout << x << " " << x * x << endl; } }
naredba
while
x = 0 while x < 5: x += 1 print(x, x**2)
// ekvivalentan C++ kod #include <iostream> using namespace std; int main () { int x = 0; while (x < 5) { x++; cout << x << " " << x * x << endl; } }
Zadatak
Napišite program koji ispisuje:
sve neparne brojeve u rasponu od 1 do 101 (uključujući 101),
sve brojeve djeljive s 3 u rasponu od 5 do 45 (uključujući 45).
Rad sa znakovnim nizovima¶
Python koristi i jednostruke i dvostruke navodnike za navođenje znakovnih nizova
"...'..."
,'..."...'
ili"...\"..."
mi ćemo koristiti dvostruke navodnike, s prekidnim znakom po potrebi
podnizovi znakovnih nizova rade po pravilu “početak uključen, kraj isključen”
a[i] # i-ti znak u nizu; ista sintaksa kao C++ a[i:j] # znakovi od i-tog do j-tog a[i:j:k] # svaki k-ti znak od i-tog do j-tog
str.strip()
miče razmake s početka i s krajastr.split()
cijepa znakovni niz u listu po razmacimastr.lower()
str.upper()
Zadatak
Neka je a = "AndrewKoenig"
.
Isprobajte čemu je jednako, pa objasnite zašto za iduće podnizove:
a[1:5]
,a[:3]
,a[2:]
,a[-3]
,a[:-1]
,a[1::2]
,a[::-1]
.
Pretvorite
a
u listu (korištenjem funkcijelist()
) i spremite je u varijablub
. Dobivate li iste rezultate kada tražite podliste?
Zadatak
Neka je a = "Miami 2 Ibiza"
.
Pretvorite
a
u listu (korištenjem funkcijelist()
) i spremite je u varijablub
.Pretvorite
a
u listu korištenjem metode split i spremite je u varijabluc
.Je li
b
jednakoc
? Objasnite zašto je ili zašto nije.
Rad s listama¶
ista sintaksa pristupanja pojedinom elementu kao kod znakovnih nizova
list.append()
dodaje element na kraj listelist.pop()
miče element s kraja listelist.insert()
ubacuje element u listu na određeno mjesto
Zadatak
Neka je a = [1, "Bok", [24, 7, 365], ["Da", "Ne"]]
.
Isprobajte čemu je jednako, pa objasnite zašto za iduće podliste:
a[1]
,a[2]
,a[2][0]
,a[2][4]
,a[3][1]
.
Promijenite vrijednost elementa
a[0]
na 5.Umetnite element “Swedish House Mafia” na mjesto 1.
Maknite element s kraja liste, a zatim na kraj liste umetnite listu koja sadrži brojeve 5, 4, 2.