Python opuštenoVodič za početnike uz koji se osećate pametno
Brian Overland
Python opuštenoISBN 978-86-7991-402-6
Autorizovan prevod sa engleskog jezika prvog izdanja knjige Python Without Fear
Original Copyright© 2018. by Pearson Education, Inc. Copyright© prevoda, 2018. CET Computer Equipment and Trade, Beograd
Sva prava zadržana. Nijedan deo ove knjige ne može biti reprodukovan, snimljen, ili emitovan na bilo koji način: elektronski, mehanički, fotokopiranjem, ili drugim vidom, bez pisane dozvole izdavača. Informacije korišćene u ovoj knjizi nisu pod pa-tentnom zaštitom. U pripremi ove knjige učinjeni su svi napori da se ne pojave greške. Izdavač i autori ne preuzimaju bilo kakvu odgovornost za eventualne greške i omaške, kao ni za njihove posledice.
Prevod Milan D. Milošević
Recenzent Milena Marić
Gl. i odg. urednik Dubravka Dragović Šehović
Lektor Milanka Vorkapić Stojanović
Priprema za štampu Predrag Bujić
Izdavači CET Computer Equipment and Trade Beograd, Skadarska 45 tel/fax: 011 3243-043, 3235-139, 3237-246 www.cet.rs
Računarski fakultet Beograd, Knez Mihailova 6/VI tel: 011 2627-613, 2633-321 www.raf.edu.rs
Za izdavača Dragan Stojanović, direktor
Tiraž 1000
Štampa „Pekograf”, Beograd
Nastavno-naučno veće Računarskog fakulteta na 123. sednici održanoj 16. 3. 2018. godine donelo je odluku da knjiga Python opušteno bude štampana kao univerzitetski udžbenik.
vii
Sadžaj
Predgovor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xvii
Zaobilaženje „neočekivanih zamki”. . . . . . . . . . . . . . . . . . . . . . . .xviiKako da razmišljate na način jezika Python . . . . . . . . . . . . . . . . . .xviiUobičajene i napredne mogućnosti. . . . . . . . . . . . . . . . . . . . . . . . xviiiUčenje na više različitih načina. . . . . . . . . . . . . . . . . . . . . . . . . . . xviiiŠta se dešava „ispod haube” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviiiZašto Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Zahvalnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Biografija autora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
Poglavlje 1 Upoznajte Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
Kratka istorija jezika Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1Po čemu je Python različit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2Kako ova knjiga funkcioniše. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3Instaliranje jezika Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4Početak korišćenja jezika Python u okruženju IDLE . . . . . . . . . . . . .6Ispravljanje grešaka unutar okruženja IDLE . . . . . . . . . . . . . . . . . . .6Rešavanje problema sa krajevima redova . . . . . . . . . . . . . . . . . . . . . .7Dodatna pomoć: onlajn izvori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
viii Sadržaj
Poglavlje 2 Python safari: brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9Python i brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Intermeco Zašto jezik C++ ne podržava beskonačne cele brojeve? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
Intermeco Koliko je gugl velik broj? . . . . . . . . . . . . . . . . . . . . . . .13Python i brojevi sa pokretnim zarezom . . . . . . . . . . . . . . . . . . . . . .14Dodeljivanje brojeva promenljivama . . . . . . . . . . . . . . . . . . . . . . . .17
Intermeco Šta Python zapravo radi dodeljivanjem vrednosti? . . .21Konvencije za davanje naziva promenljivama koje se koriste
u ovoj knjizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23Neke Python prečice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23Poglavlje 2 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
Poglavlje 3 Vaši prvi programi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
Temperatura raste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29Intermeco Kako Python koristi uvlačenje redova . . . . . . . . . . . . .33
Prikazivanje poruka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35Sintaksni rezime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
Primer 3.1. Kvadratna jednačina kao funkcija . . . . . . . . . . . . . .38Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
Preuzimanje tekstualnih ulaznih podataka . . . . . . . . . . . . . . . . . . .41Preuzimanje brojčanih ulaznih vrednosti . . . . . . . . . . . . . . . . . . . . .43
Primer 3.2. Kvadratna formula sa ulaznim i izlaznim podacima . . 44Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
Formatiranje stringova u rezultatima . . . . . . . . . . . . . . . . . . . . . . . .46Primer 3.3. Skript za formulu za rastojanje . . . . . . . . . . . . . . . . .47Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
Poglavlje 3 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
Poglavlje 4 Odluke i petlje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53
Odluke unutar računarskog programa . . . . . . . . . . . . . . . . . . . . . . .53Uslovni i Bulovi operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55Ključne reči if, elif i else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56
Intermeco Programi i roboti u filmu Svet zapada . . . . . . . . . . . . .56Primer 4.1. Unesite svoje godine . . . . . . . . . . . . . . . . . . . . . . . . .59Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
ixSadržaj
Iskaz while: petljanje kroz petlju . . . . . . . . . . . . . . . . . . . . . . . . . . .60Primer 4.2. Faktorijeli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65Primer 4.3. Štampanje Fibonačijevih brojeva . . . . . . . . . . . . . . .67Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
Iskaz „daj mi pauzu” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70Primer 4.4. Igrica pogađanja brojeva. . . . . . . . . . . . . . . . . . . . . .71Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72Intermeco Binarno pretraživanje i „O” složenost . . . . . . . . . . . . .74
Poglavlje 4 Rezime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75
Poglavlje 5 Python liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
Kako to radi Python: sve je napravljeno od kolekcija . . . . . . . . . . .77Obrada listi petljom for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80Menjanje elemenata iskazom for (to se ne može!) . . . . . . . . . . . . . .82
Primer 5.1. Aplikacija za sortiranje . . . . . . . . . . . . . . . . . . . . . . .83Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
Indeksiranje i isecanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85Kopiranje podataka u isečke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88Opsezi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
Primer 5.2. Prepravljen program za faktorijele . . . . . . . . . . . . . .91Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92Primer 5.3. Eratostenovo sito. . . . . . . . . . . . . . . . . . . . . . . . . . . .93Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94Optimizovanje koda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
Funkcije liste i ključna reč in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97Intermeco Ko je bio Eratosten?. . . . . . . . . . . . . . . . . . . . . . . . . . .98
Poglavlje 5 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
Poglavlje 6 Skupovna notacija za liste i prebrojavanje . . . . . . . . . 101
Indeksi i funkcija enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Povratak na metodu za formatiranje stringova. . . . . . . . . . . . . . . . 103
Primer 6.1. Prikazivanje tabele. . . . . . . . . . . . . . . . . . . . . . . . . . 104Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
x Sadržaj
Skupovna notacija za liste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Primer 6.2. Razlika kvadrata susednih brojeva . . . . . . . . . . . . . 109Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Intermeco Dokazivanje jednakosti . . . . . . . . . . . . . . . . . . . . . . . 111
„Dvodimenzionalna” skupovna notacija liste . . . . . . . . . . . . . . . . 112Skupovna notacija za liste sa uslovom . . . . . . . . . . . . . . . . . . . . . . 114
Primer 6.3. Eratostenovo sito 2 . . . . . . . . . . . . . . . . . . . . . . . . . 115Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Optimizovanje koda: skupovi . . . . . . . . . . . . . . . . . . . . . . . . . . 117Primer 6.4. Pitagorine trojke . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Intermeco Značaj Pitagore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Poglavlje 6 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Poglavlje 7 Python stringovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Pravljenje stringova znacima navoda . . . . . . . . . . . . . . . . . . . . . . . 125Indeksiranje i „odsecanje” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127Pretvaranje stringova/brojeva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Primer 7.1. Brojanje nula na kraju . . . . . . . . . . . . . . . . . . . . . . 131Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Intermeco Python znaci nasuprot Python stringova . . . . . . . . . 135
Zabavno i korisno odbacivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Primer 7.2. Prebrojavanje nula, verzija 2 . . . . . . . . . . . . . . . . . . 137Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Deljenje: metoda split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Građenje stringova nadovezivanjem (+) . . . . . . . . . . . . . . . . . . . . . 139
Primer 7.3. Sortiranje reči u redu. . . . . . . . . . . . . . . . . . . . . . . . 141Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Metoda join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Poglavlje 7 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Poglavlje 8 Operacije sa pojedinačnim karakterima . . . . . . . . . . . 147
Pravila za davanje naziva u ovom poglavlju . . . . . . . . . . . . . . . . . . 147Pristupanje pojedinačnim znacima (kraći prikaz) . . . . . . . . . . . . . 148Dobijanje pomoći za metode za rad sa stringovima . . . . . . . . . . . 148Provera velikih i malih slova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149Pretvaranje malih slova u velika i obrnuto . . . . . . . . . . . . . . . . . . . 150
xiSadržaj
Proveravanje palindroma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Primer 8.1. Pretvaranje slova u stringovima u velika slova . . . . 152Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Primer 8.2. Dovršavanje programa za proveru palindroma . . . 154Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Intermeco Čuveni palindrom . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Pretvaranje u ASCII kôd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Pretvaranje ASCII kodova u znake . . . . . . . . . . . . . . . . . . . . . . . . . 160
Primer 8.3. Šifrovanje stringova . . . . . . . . . . . . . . . . . . . . . . . . . 161Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162Intermeco Umetnost kriptografije . . . . . . . . . . . . . . . . . . . . . . . 164Primer 8.4. Dešifrovanje stringova . . . . . . . . . . . . . . . . . . . . . . 165Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Poglavlje 8 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Poglavlje 9 Napredne tehnike za rad sa funkcijama . . . . . . . . . . . 167
Višestruki argumenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Vraćanje više od jedne vrednosti . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Intermeco Prosleđivanje i uređivanje liste . . . . . . . . . . . . . . . . . . 170Primer 9.1. Razlika i zbir dve tačke . . . . . . . . . . . . . . . . . . . . . . 172Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Argumenti po nazivu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Podrazumevani argumenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Primer 9.2. Mašina za sabiranje . . . . . . . . . . . . . . . . . . . . . . . . 176Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Uvoženje funkcija iz modula. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178Primer 9.3. Igra bacanja kockica (kreps) . . . . . . . . . . . . . . . . . . 179Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180Intermeco Određivanje kvota u kladionici . . . . . . . . . . . . . . . . . 182
Poglavlje 9 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Poglavlje 10 Lokalne i globalne promenljive . . . . . . . . . . . . . . . . . . . . 187
Lokalne promenljive, za šta su one dobre? . . . . . . . . . . . . . . . . . . . 187Lokalne nasuprot globalnih promenljivih . . . . . . . . . . . . . . . . . . . 188Upoznavanje sa ključnom rečju global . . . . . . . . . . . . . . . . . . . . . . 190
xii Sadržaj
Python „zamka za lokalne promenljive” . . . . . . . . . . . . . . . . . . . . 190Intermeco Da li jezik C++ ima lakša pravila za oblast važenja? . 191Primer 10.1. Bitls profil ličnosti (BPL) . . . . . . . . . . . . . . . . . . . . 192Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Primer 10.2. Rimski brojevi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198Intermeco Šta se to dešava sa rimskim brojevima? . . . . . . . . . . . 200Primer 10.3. Dekodiranje rimskih brojeva . . . . . . . . . . . . . . . . 201Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Poglavlje 10 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Poglavlje 11 Operacije sa datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Razlika između tekstualnih i binarnih datoteka . . . . . . . . . . . . . . 207Modul os (operativni sistem) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Intermeco Izvršavanje na drugim sistemima . . . . . . . . . . . . . . . 211Otvaranje datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Upisivanje u tekstualnu datoteku . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Primer 11.1. Upisivanje u datoteku sa zahtevom za unošenje . . 214Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Čitanje tekstualne datoteke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Datoteke i upravljanje izuzecima . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Intermeco Prednosti bloka try/except. . . . . . . . . . . . . . . . . . . . . 219Primer 11.2. Čitanje teksta sa brojevima redova . . . . . . . . . . . . 220Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Ostali načini rada sa datotekama . . . . . . . . . . . . . . . . . . . . . . . . . . 223Poglavlje 11 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Poglavlje 12 Rečnici i skupovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Zašto su nam potrebni rečnici, g. bibliotekaru? . . . . . . . . . . . . . . . 227Dodavanje i menjanje parova ključ-vrednost . . . . . . . . . . . . . . . . . 229Pristupanje vrednostima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230Pretraživanje ključeva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Intermeco Čime se objašnjava „magija” rečnika . . . . . . . . . . . . 232Primer 12.1. Lični telefonski imenik . . . . . . . . . . . . . . . . . . . . . 233Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
xiiiSadržaj
Pretvaranje rečnika u liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Primer 12.2. Čitanje stavki po prefiksu . . . . . . . . . . . . . . . . . . . 236Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Primer 12.3. Učitavanje i snimanje datoteka . . . . . . . . . . . . . . . 238Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Sve o skupovima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241Operacije na skupovima . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Intermeco Zašto su skupovi toliko bitni? . . . . . . . . . . . . . . . . . 244Primer 12.4. Prepravljeno Eratostenovo sito . . . . . . . . . . . . . . . 244Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Poglavlje 12 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Poglavlje 13 Matrice: dvodimenzionalne liste. . . . . . . . . . . . . . . . . . . 249
Jednostavne matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Pristupanje elementima. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250Nepravilne matrice i dužina reda . . . . . . . . . . . . . . . . . . . . . . . . . . 251Množenje (*) i liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252Python problem sa matricama . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253Kako se prave N*M matrice: rešenje. . . . . . . . . . . . . . . . . . . . . . . . 254
Intermeco Zašto ovo nije lakše? . . . . . . . . . . . . . . . . . . . . . . . . . 255Primer 13.1. Tablica množenja . . . . . . . . . . . . . . . . . . . . . . . . . 256Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257Prime 13.2 Matrica koju inicijalizuje korisnik . . . . . . . . . . . . . 258Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Kako se rotira matrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Intermeco Za i protiv „skupljanja otpada” . . . . . . . . . . . . . . . . 263Primer 13.3. Potpun primer rotiranja . . . . . . . . . . . . . . . . . . . . 264Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Poglavlje 13 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Poglavlje 14 Pobeđivanje u igrici iks-oks . . . . . . . . . . . . . . . . . . . . . . . . 271
Osmišljavanje table za igru iks-oks. . . . . . . . . . . . . . . . . . . . . . . . . 271Plan za ovo poglavlje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Faza 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Faza 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Faza 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
xiv Sadržaj
Python if/else uslov u jednom redu . . . . . . . . . . . . . . . . . . . . . . . . . 274Primer 14.1. Jednostavna igra za dva igrača . . . . . . . . . . . . . . . 274Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276Intermeco Varijante igre iks-oks . . . . . . . . . . . . . . . . . . . . . . . . . 279
Metoda count za liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Primer 14.2. Igra za dva igrača sa utvrđivanjem pobednika . . . 280Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Uvođenje računara u igru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285Primer 14.3. Računar kao igrač: računar igra prvi . . . . . . . . . . 287Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Igranje kao drugi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Intermeco Umetnost heuristike. . . . . . . . . . . . . . . . . . . . . . . . . . 292
Poglavlje 14 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Poglavlje 15 Klase i objekti I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Šta je objekat? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295Klase u jeziku Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Kako da definišem jednostavnu klasu? . . . . . . . . . . . . . . . . . . . 297Kako da klase iskoristim za stvaranje objekata? . . . . . . . . . . . . 297Kako da objektima pridružim podatke? . . . . . . . . . . . . . . . . . . 298Kako da pišem metode? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Neizbežna _ _init_ _ metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Intermeco Čemu tolika opsednutost sobom? . . . . . . . . . . . . . . . 302
Projektovanje klase za bazu podataka . . . . . . . . . . . . . . . . . . . . . . 303Intermeco Klase iz jezika C++ u odnosuna klase iz Python-a . . 304Primer 15.1. Praćenje zaposlenih . . . . . . . . . . . . . . . . . . . . . . . . 305Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Definisanje ostalih metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309Projektovanje klase Tačka3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Klasa Tačka3D i podrazumevani argumenti. . . . . . . . . . . . . . . . . . 312Trodimenzionalna igra iks-oks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Primer 15.2. Pronalaženje 3D pobede . . . . . . . . . . . . . . . . . . . . 313Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314Primer 15.3. Izračunavanje načina za pobedu . . . . . . . . . . . . . . 315Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Poglavlje 15 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
xvSadržaj
Poglavlje 16 Klase i objekti II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Dobijanje pomoći iz stringova za dokumentovanje . . . . . . . . . . . . 321Tipovi funkcije i „preklapanje” . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Intermeco Šta je to dinamičko određivanje tipova?. . . . . . . . . . . 325Liste argumenata promenljive dužine . . . . . . . . . . . . . . . . . . . . . . . 326
Primer 16.1. Klasa TačkaN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329Optimizovanje koda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Nasleđivanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Klasa Fraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Primer 16.2. Proširivanje klase Fraction . . . . . . . . . . . . . . . . . . 334Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Promenljive i metode klase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Promenljive instance kao „podrazumevane” vrednosti . . . . . . . . . 339
Primer 16.3. „Autmatizovana” klasa Poligon . . . . . . . . . . . . . . 340Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342Intermeco Zašto je ovo dobro? . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Poglavlje 16 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Poglavlje 17 Konvejeva igra života . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Intermeco Uticaj „života” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347Igra života: pravila igre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348Generisanje broja suseda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350Osmišljavanje programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Primer 17.1. Prilagođena klasa Matrica . . . . . . . . . . . . . . . . . . 352Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Premeštanje klase Matrica u modul . . . . . . . . . . . . . . . . . . . . . . . . 354Primer 17.2. Prikazivanje matrice života . . . . . . . . . . . . . . . . . . 355Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Čuvena klizajuća šara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358Primer 17.3. Čitav program Igre života . . . . . . . . . . . . . . . . . . . 358Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360Intermeco Da li Igra života stvara život?. . . . . . . . . . . . . . . . . . . 363
Poglavlje 17 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
xvi Sadržaj
Poglavlje 18 Napredne Python tehnike . . . . . . . . . . . . . . . . . . . . . . . . . 367
Generatori. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367Korišćenje moći generatora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Primer 18.1. Generator nasumičnih brojeva . . . . . . . . . . . . . . . 370Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372Intermeco Koliko je nasumično zapravo „nasumično”? . . . . . . . 373
Svojstva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Metode za čitanje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Metode za postavljanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Uporedo korišćenje metoda za čitanje i postavljanje . . . . . . . . . . . 378Primer 18.2. Objekat više nivoa temperature. . . . . . . . . . . . . . . 379Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Dekoratori: funkcije koje obuhvataju druge funkcije. . . . . . . . . . . 382Python dekoratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Primer 18.3. Dekoratori kao alatka za otklanjanje grešaka . . . 387Kako to radi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Poglavlje 18 Rezime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Dodatak A Tabela redosleda operacija u jeziku Python . . . . . . . . 391
Dodatak B Rezime najvažnijih pravila formatiranja za Python 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
1. Formatiranje običnog teksta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3932. Argumenti za formatiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3933. Određivanje redosleda argumenata . . . . . . . . . . . . . . . . . . . . . . 3934. Poravnavanje udesno unutar polja veličine N . . . . . . . . . . . . . . . 3945. Poravnavanje ulevo unutar polja veličine N . . . . . . . . . . . . . . . . 3946. Odsecanje: ograničavanje veličine polja za prikaz . . . . . . . . . . . 3947. Kombinovanje odsecanja i poravnavanja . . . . . . . . . . . . . . . . . . 3958. Dužina i tačnost brojeva sa poketnim zarezom . . . . . . . . . . . . . 3959. Znak za dopunjavanje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Dodatak C Rečnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Indeks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
xvii
PredgovorPostoji mnogo besplatnih načina za učenje programiranja, a mnogi od njih su o jeziku Python. Da bi neka knjiga zavredila vašu pažnju, mora da bude dobra... zapravo, mnogo, mnogo dobra.
Ovu knjigu sam napisao kao knjigu kakvu bih voleo da je postojala kada sam pre nekoliko godina počeo da učim Python. Poput svih ostalih, postepeno sam usvajao pojedine pojmove prelistavajući na desetine raznih knjiga i pre-gledajući desetine lokacija na internetu.
Ali, ovo je Python, a on ne bi trebalo da bude težak!Problem je u tome da nije svako učenje lako i brzo kao što bi trebalo da
bude. Niti su sve knjige ili sajtovi za učenje zabavni. Možete, na primer, da pretražite više sajtova uzaludno pokušavajući da pronađete objašnjenje koje zaista vredi.
To je ono što ovu knjigu čini onakvom kakvu bih voleo da sam imao kada sam počinjao učenje.
Zaobilaženje „neočekivanih zamki”Mnogo toga se u jeziku Python radi relativno lako, ali ima nekoliko stvari koje bi trebalo da budu lake, a teže su nego u drugim jezicima. To je posebno tačno ako već imate iskustva u programiranju. Način na koji Python radi neke stvari je često toliko različit od pristupa na koje ste se navikli u ostalim jezicima, tako da satima možete da zurite u ekran sve dok vam neko ne ukaže na lako rešenje.
Ili, možete da kupite ovu knjigu.
Kako da razmišljate na način jezika PythonBlisko problemu sa „zamkama” je i to da razumete kako se razmišlja u jeziku Python. Sve dok ne razumete način na koji Python oblikuje svoj svet, pisaćete programe slično tome kako to rade programeri u jeziku C. Ti programi rade,
xviii
ali ne koriste nijednu od mogućnosti koje čine da Python bude alatka za brzo programiranje.
a_list = [’Ne’, ’radite’, ’to’, ’kao’ ,’u’, ’jeziku’, ’C’]for x in a_list: print(x, end=’ ’)
Ovo parče koda prikazuje:
Ne radite to kao u jeziku C
Uobičajene i napredne mogućnostiPonavljam, mada je Python uopšteno gledano lakši od drugih jezika, to nije uvek baš tako. Neke od najvažnijih uobičajenih mogućnosti jezika Python teško se razumeju ako se ne objasne na dobar način. U ovoj knjizi velika pažnja se posvećuje uobičajenim i ponekim naprednim mogućnostima, uklju-čujući pregledne liste, generatore, višedimenzione liste (matrice) i dekoratore.
Učenje na više različitih načinaNačin podučavanja koji koristim u ovoj knjizi drugačiji je od onih koje mo-žete da pronađete na drugim mestima. Često koristim primere, naravno, ali ponekad su samo pravi prikaz nekog pojma ili dobra analogija jedino što je različito. Ponekad je to rad sa primerima koji vas izazivaju da nešto promenite koristeći ono što ste upravo naučili. Međutim, način podučavanja u čitavoj knjizi stalno podržava istu ideju.
Šta se dešava „ispod haube”Mada je ova knjiga namenjena onima koji su početnici u programiranju, ona može da posluži i ljudima koji žele da znaju kako Python radi i po čemu se u suštini razlikuje „ispod haube”. To jest, na koji način Python obavlja odre-đene operacije interno? Ako želite više od pojednostavljenog upoznavanja, ova knjiga je za vas.
xix
Zašto Python?Naravno, ako se dvoumite između programskih jezika, pre svega želite da znate zašto bi uopšte trebalo da koristite Python.
Python je veoma brzo preuzeo dobar deo sveta programiranja. Još uvek postoje stvari za koje su neophodne mogućnosti nižeg nivoa koje nude jezici C ili C++, ali videćete da je Python alatka za brz razvoj aplikacija time što višestruko nagrađuje trud programera. Često, sa samo nekoliko linija koda, možete da uradite zapanjujuće stvari.
Tačnije rečeno, program za koji je u jeziku Python potrebno 100 redova mogao bi potencijalno da se protegne na 1000 ili 2000 redova napisanih u jeziku C. Python možete da iskoristite za „proveru ideje”: tokom popodneva napišete Python program kako biste videli da li ispunjava potrebe vašeg pro-jekta; pošto se uverite da je program koristan, možete ponovo da ga napišete u jeziku C ili C++, ako želite, kako biste bolje iskoristili resurse računara.
Imajući to u vidu, nadam se da ćete mi se pridružiti na ovom opuštenom, uzbudljivom i zabavnom putovanju. I zapamtite ovo:
x = [’Python’, ’je’, ’sjajan’]print(’ ’.join(x))
Registrujte svoju kopiju knjige Python opušteno na veb stranici InformIT kako biste lakše pristupali dopunama i/ili ispravkama kada ih i ako ih bude. Postupak registrovanja počinjete tako što odete na adresu informit.com/register, prijavite se i napravite nalog. Unesite ISBN broj originalnog izdanja ove knjige (9780134687476) i pritisnite dugme Submit. Na kartici Registered Pro ducts potražite link Access Bonus Content koji se nalazi odmah pored ove knjige i pratite ovaj link kako biste pristupili postoje-ćem dodatnom materijalu. Ako želite da budete obaveštavani o eksklu-zivnim ponudama novih izdanja i dopunama, molimo da u odgovarajuće polje unesete znak za potvrdu kako biste od nas dobijali e-poruke.
xxiii
Biografija autoraPovremeno, Brian Overland je bio zadužen, ili je bar učestvovao, u pisanju dokumentacije za skoro sve jezike koje je Microsoft korporacija ikad proda-vala: Macro Assembler, FORTRAN, COBOL, Pascal, Visual Basic, C i C++. Nasuprot drugima, napisao je hrpu koda u svim tim jezicima. Nikada nije pisao dokumentaciju za jezik u kojem ne bi mogao da napiše iole pristojan program.
On je godinama bio momak „za sve” u Microsoftu i opisivao je kako se koriste alatke neophodne za podršku novim tehnologijama, kao što su RISC obrada, proširenja programa za povezivanje i upravljanje izuzecima.
Jezik Python je njegovu pažnju prvi put privukao pre nekoliko godina, kada je shvatio da bi mnoge od svojih omiljenih aplikacija – igricu Game of Life, recimo, ili prevodioca za reverznu poljsku notaciju – mogao da napiše mnogo kraće nego u bilo kom računarskom jeziku koji je do tada video.
Kada ne istražuje nove računarske jezike, radi mnoge druge stvari, pri čemu većina njih obuhvata pisanje. Uživa u gledanju filmova i pisanju priča. Dva puta je bio u finalu literarnog takmičenja za severozapadnu obalu Pacifika.
1
1
Šta biste rekli ako vam kažem da postoji računarski jezik koji je u odnosu na druge računarske jezike lakši za učenje, lakši za početnike i sa kojim možete lakše da uradite mnogo toga koristeći samo nekoliko redova koda?
Po mišljenju miliona, taj jezik je Python. Proistekao iz jezika koji se zvao ABC (kao u „prosto kao ABC”), stekao je veliki broj poklonika tokom poslednje dve decenije. Zajednici Python programera pridružilo se već toliko programera da postoji preko 100000 besplatnih paketa koji rade sa osnovnom Python postavkom.
Pridružite se tom Python stampedu. U ovoj knjizi pokazaću vam kako da počnete čak i ako imate ograničeno programersko iskustvo. Takođe, provešću vas kroz „zamke” – stvari koje Python radi toliko drugačije da zbunjuju i iskusnije programere. Ova knjiga je podjednako namenjena kako novim tako i iskusnijim programerima, a u njoj se objašnjava šta se sve dešava skriveno unutra.
Kratka istorija jezika PythonJezik Python je 1991. godine izumeo holandski programer Guido van Rossum, koji je dobar deo jezika preuzeo iz jezika ABC (ne treba ga mešati sa jezikom C).
ABC je imao mnoge mogućnosti koje i danas postoje u jeziku Python. Van Rossum, koji u Python svetu ima titulu Do broćudni doživotni diktator (engl. Benevolent Dictator for Life – BDFL), je u jezik takođe ugradio i elemente jezika Modula3.
Upoznajte Python
A B C
Prosto kao„ABC”!!
2 Poglavlje 1 Upoznajte Python
Van Rossum je jeziku dao naziv prema BBCovoj humorističkoj seriji Leteći cirkus Montija Pajtona, tako da je veza sa pitonima (engl. python) posredna, mada je član glumačke ekipe John Clesse prvobitno predložio reč „Python” pošto podseća na nešto „klizavo i ljigavo” (izvor: Wikipedia.org). Tako se ona našla tamo gde jeste – bilo kako bilo, postoji neka veza sa gmizavcima.
Od tada je razvijeno nekoliko verzija jezika Python, pri čemu su dodavane važne mogućnosti, a poslednja verzija je Python 3.0. Ova knjiga koristi Python 3.0, mada obuhvata i napomene o tome kako se dati primeri mogu prilagoditi verziji Python 2.0.
Po čemu je Python različit Prvo što treba da znate o jeziku Python jeste to da je Python besplatan.
Većina Python proširenja je besplatna i ona se dobijaju uz osnovno preuzimanje. Ovi moduli nude mogućnosti kao što su funkcije za matematičke, datumske/vremenske, razlomačke i proračune sa slučajnim vrednostima, kao i tkinter koji podržava grafički korisnički interfejs koji radi na raznim platformama. Ponavljam, sve to je besplatno.
Podrška za rad sa brojevima ugrađena u Python je zadivljujuća, pošto obuhvata kompleksne brojeve, brojeve sa pokretnim zarezom, razlomke (iz modula Fractions), kao i „beskonačne celobrojne vrednosti”.
Python je privukao verne poklonike. Većina programera nudi biblioteke – nazvane paketi – svojim kolegama Python programerima, najčešće besplatno. Do njih možete da dođete tako što ćete u svom veb čitaču potražiti Python Package Index i zatim otići do odgovarajuće stranice. U trenutku dok ovo pišem, postoji preko 107000 paketa.
Na prvi pogled, Python program može da liči na kôd u drugim jezicima, ali, ako se pogleda pažljivije, uočavaju se znatne razlike.
� Nasuprot većini jezika, Python nema sintaksu sa „početkom bloka” ili „krajem bloka” – svi međusobni odnosi se zasnivaju na uvlačenju! Mada nekom C programeru to može da izgleda pomalo nezgodno, time se održava dosledan izgled koji početnici mnogo lakše shvataju.
� Python nema deklaracije promenljivih. Promenljive pravite tako što im dodeljujete vrednosti. Time je napravljen veliki pomak u smeru pojednostavljivanja sintakse jezika, ali se time takođe stvaraju „zamke” na dubljem nivou. Ova knjiga će pomoći da ih zaobiđete.
� Python se izuzetno mnogo zasniva na ideji iteracije, što znači višestruko ponavljanje petlje kroz nizove. Ovaj koncept je duboko ugrađen u strukture višeg nivoa (liste, rečnike i skupove). Koristite ih kako treba i obavićete mnogo toga na malom prostoru.
3Kako ova knjiga funkcioniše1
Za Python se obično smatra da je jezik za pravljenje „prototipova” ili „brzo razvijanje aplikacija” zbog njegovih mogućnosti. U jeziku Python možete brzo da napišete neki program. Ako posle toga želite da povećate efikasnost računara na nižem nivou, možete kasnije da taj program prepišete u jezik C ili jezik C++.
Kako ova knjiga funkcionišeČvrsto sam uveren u to da je učenje na primerima dobro kao i teorija. Plan je da u ovoj knjizi osnove jezika Python (kao i neke uobičajene i napredne mogućnosti) učimo tako što ćemo raditi sledeće:
� Upoznavanje sa nekom Python osobinom, korišćenjem sintaksnih dijagrama i kraćih primera,
� Prikazivanje osnovnog primera kojim se pokazuje praktična primena određene mogućnosti,
� Dodavanje odeljka „Kako to radi” kojim se primer koda razmatra red po red,
� Navođenje više vežbanja kojima vas izazivamo da promenite i prilagodite odgovarajući primer.
Pošto Python ima interaktivno razvojno okruženje, IDLE, obično vas pozivam da i sami napravite kraće primere.
Ova knjiga koristi više ikonica u margini kako biste lakše uočili dodatne napomene.
Ovi odeljci opisuju neka od osnovnih pravila Python sintakse. Bilo šta što bi trebalo da se preko tastature unese baš onako kako je prikazano (kao što su ključne reči ili znaci interpunkcije) napisano je podebljano. Sa druge strane, za mesta za unos teksta, koja sadrže tekst koji sami unosite, koristi se kurziv. Na primer, u sintaksi za naredbu global, sama ključna reč je napisana podebljano, dok je naziv promenljive – koji vi dajete – napisan kurzivom.
global naziv_promenljive
Ova ikona označava blok pseudokoda, gde se sistematično opisuju pojedini koraci u programu svakodnevnim jezikom, a ne rečnikom koji koristi Python. Međutim, kako se Python iskazi često ne razlikuju mnogo od svakodnevnog jezika, nije bilo potrebe da uvek koristim pseudokod. Korist od njega, tu i tamo, može biti u tome da ukratko prikažem zamisao na kojoj se neki program zasniva.
Ova ikona označava odeljak u kome se analiziraju pojedini redovi iz većeg primera, ili samo oni redovi koji nisu jasni već sami po sebi.
Ključna Sintaksa
Ključna reč
Pseudokod
Kako to radi
4 Poglavlje 1 Upoznajte Python
Ova ikona označava odeljak u kome se daju vežbe koje se zasnivaju na prethodno datom primeru. Python ćete naučiti mnogo brže ako uradite bar poneki od tih primera.
Ova ikona prethodi odeljku u kome se pokazuje kako se prerađuje ili u znatnoj meri unapređuje neki primer. Ovo se ne primenjuje na sve primere. Kada se koristi u ovoj knjizi, razlog je u tome što se u nekom primeru koristi najočigledniji način da se nešto uradi; „optimizovano” rešenje će potom prikazati kako bi iskusniji, veštiji Python programeri rešili to isto.
Instaliranje jezika Python Postupci za instaliranje jezika Python su u suštini isti bez obzira na to da li koristite sistem koji se zasniva na Windows, Macintosh ili bilo kom drugom operativnom sistemu koji Python podržava.
Ovo su osnovni koraci:
1 Idite na Python matičnu stranicu: python.org.
2 Otvorite meni Downloads.
3 Ako se pojavi ekran Downloads for Windows, pritisnite mišem dugme Python 3.6.1. Ako vaš računar ne pokreće Windows operativni sistem, potrebno je da izaberete odgovarajući operativni sistem tako što ćete ga pronaći u izboru koji se nudi u meniju Downloads.
4 Pritisnite mišem dugme Save File.
5 Pronađite datoteku koju ste na taj način upravo sačuvali; svi operativni sistemi obično imaju mesto na kojem smeštaju preuzete datoteke. Ova sačuvana datoteka sadrži program za instaliranje. Dva puta brzo pritisnite mišem na tu sačuvanu datoteku i pratite uputstva.
Ako sve prođe kako treba, Python je instaliran na vašem računaru sa svim osnovnim modulima, uključujući i tkinter (koji se koristi za razvoj programa u grafičkom okruženju). Sada je neophodno da napravite određeni izbor. Da biste počeli korišćenje jezika Python, možete da koristite „osnovni interaktivni režim rada” – koji radi svoj posao ali nije ništa posebno – ili možete da koristite IDLE, interaktivno razvojno okruženje.
Nedvosmisleno vam preporučujem ovo drugo. IDLE, pored toga što radi sve ono što radi i osnovni interaktivni režim rada, nudi mnogo više od toga. U sledećem odeljku opisujem nekoliko načina na koje korišćenjem IDLE okruženja možete mnogo da uštedite na vremenu.
Vežbe
Optimizacija
5Instaliranje jezika Python 1
Evo kako izgleda osnovni interaktivni režim rada. Nudi samo elementarne mogućnosti za menjanje koda i nema podršku za učitavanje programa iz tekstualnih datoteka.
Evo kako izgleda IDLE okruženje. Obratite pažnju na menije koji se u njemu nude. Možete da radite mnogo toga – uključujući učitavanje programa iz tekstualnih datoteka i ispravljanje grešaka u njima – što ne možete da radite u osnovnom interaktivnom režimu rada.
U operativnom sistemu Windows, aplikacija za osnovni interaktivni režim rada trebalo bi da se nađe na meniju Start. Ali, to nije Python koji želite. Mnogo bolje je da izaberete Programs, izaberete Python i konačno izaberete IDLE.
6 Poglavlje 1 Upoznajte Python
U sistemu Mac (podrazumeva se da ste pre toga preuzeli Python, uključujući i IDLE), da biste koristili IDLE biće potrebno da otvorite Finder i izaberete Applications; zatim izaberite Python i na kraju izaberite IDLE. Program koji ste preuzeli možda čak ni nema osnovni režim rada.
Početak korišćenja jezika Python u okruženju IDLEPokrenite IDLE, okruženje za interaktivni razvoj programa. To je mesto na kom ćete provoditi najviše vremena dok budete učili Python i odakle sve počinje. Koristite opcije koje nudi vaš operativni sistem kako biste odgovarajuću ikonicu smestili na radnu površinu tako da kasnije mnogo lakše možete da pokrećete IDLE.
Pošto pokrenete IDLE, videćete odzivnik, sličan ovome:
>>>
Pošto se odzivnik pojavi, možete da unesete neku Python naredbu ili izraz. Možete da dobijete i pomoć tako što ćete ukucati komandu help iza koje sledi naziv tipa, slično ovome:
>>>help(str)
Ovde pokazujem da se za unos korisnika – karaktere koje treba uneti preko tastature – koriste podebljana slova; za rezultat koji daje Python koriste se obična slova. Ovu konvenciju koristim kroz čitavu knjigu.
Ispravljanje grešaka unutar okruženja IDLEJedna od najvećih prednosti okruženja IDLE je da omogućava lako ispravljanje grešaka. Recimo da ste uneli sledeće:
>>>x = z
Kao što ćete naučiti u narednim poglavljima, ovaj iskaz dodele bi proizveo grešku ako promenljivoj z pre toga nije dodeljena neka vrednost. Okruženje bi odgovorilo ispisivanjem poruke poput ove:
Traceback (most recent call last): File „<pyshell#205>”, line 1, in <module> x = zNameError: name ’z’ is not defined
U ovom slučaju, nije teško da se ponovnim unošenjem prepravi pogrešan iskaz. Međutim, pretpostavimo da imate nešto veći blok koda u kome postoje greške i da ne želite da sve ponovo kucate ispočetka. Ovo je primer:
7Rešavanje problema sa krajevima redova1
def print_nums(n): i = 1 while i <= n: print(i, end=’\t’) i +++= 1
Problem sa ovim blokom koda je da se završava redom i +++= 1 umesto redom i += 1. Na ovom mestu bi trebalo da se nađe samo jedan znak plus (+).
Želeli biste da ispravite ovu grešku, ali ne želite da prekucavate sve ove iskaze. Srećom, u jeziku Python ispravljanje grešaka je izuzetno lako. Samo uradite sledeće:
1 Postavite kursor na bilo koji red u bloku koda. (Ako se blok koda sastoji od samo jednog reda, postavite kursor na kraj tog reda.)
2 Pritisnite taster Enter.
Voilà! Čitav blok koda se ponovo pojavljuje, pri čemu se kursor nalazi na njegovom kraju; sada možete da popravite šta god je potrebno da se popravi. Koristite tastere sa strelicama da biste se vratili na bilo koji iskaz i zatim popravite ono što je potrebno. Kada završite, da biste taj blok koda vratili u program, postavite kursor na kraj poslednjeg reda i dva puta pritisnite taster Enter.
Zapamtite ovu tehniku. Sa njom ćete uštedeti dosta vremena pri radu.
Rešavanje problema sa krajevima redovaZbog načina na koji Python tumači redove programa, ne možete slobodno da prelazite preko fizičkih ograničenja redova kao što je to moguće u jeziku C. Međutim, šta da radite ako je potrebno da uneste neki zaista dugačak red?
Kraj fizičkog reda obično označava završetak Python iskaza, pošto ne postoji sintaksa za završetak reda kao u jeziku C. Međutim, otvaranjem male, srednje ili vitičaste zagrade taj red se automatski prividno prenosi u naredni red. Evo primera:
ukupan_iznos = (ovaj_iznos + onaj_iznos + neki_veliki_broj + komada + dodatni_iznos )
Otvaranjem zagrade, (, u gornjem redu stvara se mogućnost da slobodno nastavite pisanje ovog iskaza u drugom redu, sve dok se zagrada ne zatvori. Ovo je jedan slučaj u kome uvlačenje nije bitno osim zbog bolje čitljivosti koda. (Obično, Python primorava na dosledno korišćenje uvlačenja.)
Povremeno, ova tehnika ne može da vam pomogne. Ako je neophodno da fizički nastavite neki red, a nemate drugu mogućnost, možete da koristite obrnutu kosu crtu.
8 Poglavlje 1 Upoznajte Python
>>>moj_str = ’Uneo sam zaista veoma dug \red sa kodom.’
Iz ovog primera proističe pitanje: šta ako vam u navedenom nizu znakova treba obična obrnuta kosa crta? Odgovor je da je potrebno da koristite dvostruku obrnutu kosu crtu, \\, koja predstavlja pravu obrnutu kosu crtu.
>>>moj_str = ’Uneo sam obrnutu kosu crtu \\ \u ovaj dug red koda.’
U 7. poglavlju, „Python stringovi”, podrobnije obrađujemo kako se prave stringovi sa znacima navoda.
Na nekoliko prethodnih stranica dao sam neke savete za preživljavanje u jeziku Python. Sada, ako ste spremni, vreme je da krenemo na Python safari.
Dodatna pomoć: onlajn izvoriU ovom poglavlju, savetovao sam vas da preuzmete Python 3.0 ili noviji. Ako koristite stariju verziju jezika Python 2.0, većina koda iz ove knjige će raditi, ali je potrebno da uradite neka podešavanja. Mada dajem napomene o razlikama između verzija, dodatnu pomoć o tome možete da pronađete na sledećim veb stranicama:
wiki.python.org/moin/Python2orPython3
wiki.python.org/moin/PortingToPy3k/BilingualQuickRef
Mada se u većini poglavlja u ovoj knjizi daju primeri koji su relativno kratki i koje lako možete da ponovo prekucate, u poglavljima pri kraju knjige dati su nešto duži listinzi programa. Možda će vam biti lakše ako biste preuzeli odgovarajući kôd. Listinge programa možete da pronađete na ovoj adresi:
brianoverland.com/books