Python kniha Ondrej Sika
Python kniha Ondrej Sika
[email protected] http://ondrejsika.com
Domovska stranka knihy je https://ondrejsika.com/books/python-kniha
Venovano Terezce Kramplove, studentce mediciny, ktera chce programovat
Obsah 1 Predmluva
8
2 Uvod 2.1 Proc Python? . . . . . . . . . . . . . . . . . . 2.2 Co je Python? . . . . . . . . . . . . . . . . . .
9 9 9
3 Terminal 11 3.1 Linux . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Windows . . . . . . . . . . . . . . . . . . . . . 12 4 Instalace 4.1 Python . . . . . . 4.2 Textovy editor . . 4.3 PIP . . . . . . . 4.4 Windows a OSX 5 Syntaxe 5.1 Klicova slova 5.2 Komentare . . 5.3 Promenne . . 5.4 Odsazovani .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
13 13 13 14 14
. . . .
15 15 15 16 16
6 Prvni program - Hello world
17
7 Shell 18 7.1 Python shell . . . . . . . . . . . . . . . . . . . 18 7.2 IPython . . . . . . . . . . . . . . . . . . . . . 18 8 Datove typy 8.1 int (cele cislo) 8.2 float (desetine 8.3 str (retezec) . 8.4 bool . . . . .
. . . . cislo) . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
22 23 24 25 26
8.5 8.6 8.7 8.8 8.9
NoneType, None tuple (N-tice) . . list (seznam) . . . dict (slovnik) . . set (mnozina) . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
27 27 28 30 32
9 Vyrazy 34 9.1 Zakladni a matematicke vyrazy . . . . . . . . 34 9.2 Logicke spojky . . . . . . . . . . . . . . . . . 36 9.3 Iterables . . . . . . . . . . . . . . . . . . . . . 37 10 Podminky 39 10.1 Klasicke if . . . . . . . . . . . . . . . . . . . . 39 10.2 Inline if . . . . . . . . . . . . . . . . . . . . . 40 11 Cykly 11.1 While . . . . . . . . . . . . 11.2 For . . . . . . . . . . . . . . 11.2.1 Prochazeni seznamu 11.2.2 range, xrange . . . . 11.2.3 enumerate . . . . . . 11.3 break, continue . . . . . . . 11.3.1 break . . . . . . . . . 11.3.2 continue . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
12 Funkce 12.1 Klasicka definice . . . . . . . . . . . . . . . 12.2 Inline funkce . . . . . . . . . . . . . . . . . 12.3 Argumenty . . . . . . . . . . . . . . . . . 12.3.1 Defaultni hodnota . . . . . . . . . 12.3.2 Promenny pocet argumentu (*args) 12.4 Dekoratory . . . . . . . . . . . . . . . . . 13 Objektove orientovane programovani 5
. . . . . . . .
. . . . . .
. . . . . . . .
41 41 42 42 42 44 44 44 45
. . . . . .
47 47 48 48 49 49 50 51
13.1 13.2 13.3 13.4 13.5
Objekt . . . . . . . . . . Tridy . . . . . . . . . . . Inicializace objektu . . . Atributy . . . . . . . . . Metody . . . . . . . . . 13.5.1 Specialni metody 13.5.2 Staticke metody . 13.6 Property . . . . . . . . . 13.7 Dedicnost . . . . . . . . 13.8 Super . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
51 51 51 52 52 53 55 56 57 58
14 Moduly, knihovny, importy 14.1 Interni moduly . . . . . . 14.1.1 time . . . . . . . . 14.1.2 datetime . . . . . . 14.2 Vlastni moduly . . . . . . 14.3 Moduly tretich stran . . . 14.3.1 pypi . . . . . . . . 14.3.2 git, github . . . . . 14.3.3 instalace ze zdroju 14.4 Tvorba vlastniho balicku . 14.4.1 setup.py . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
60 60 61 62 63 64 65 66 67 67 68
. . . . . . .
70 70 70 72 72 72 73 73
15 Prace se soubory 15.1 Cteni ze souboru . . . . . . . . . 15.2 Zapis do souboru . . . . . . . . . 15.3 Prace se souborovym systemem . 15.3.1 Kopirovani souboru . . . . 15.3.2 Presouvani souboru . . . . 15.3.3 Vytvareni adresaru . . . . 15.3.4 Mazani souboru a adresare
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
16 Vyjimky 75 16.1 try/except . . . . . . . . . . . . . . . . . . . . 75 6
16.2 raise . . . . . . . . . . . . . . . . . . . . . . . 78 16.3 assert . . . . . . . . . . . . . . . . . . . . . . 78 17 Shrnurti
80
7
1
Predmluva
Proc jsem se rozhodl napsat knihu? Mam okolo sebe hodne lidi, kteri by se radi zacli programovani venovat, bohuzel nemam knihu, kterou bych jim doporucil. Tak jsem se rozhodl ji napsat. Cilem teto knihy je prestavit zakladni casti programovani lidem, kteri s nim nemaji zadne zkusenosti. Ty co nevi, co je promenna a podobne. Knihu jsem se rozhod vydat jako open source, protoze jsem jeho velkym zastancem a take proto abych trosku prispel komunite vyvojaru. Kazdy si ji bude moct stahnout a treba mi po precteni neco prispet na dalsi kninzky. Domovska stranka knizky je http://ondrejsika.com/books/python-kniha kde najdete veskere informace o knize, moznost stazeni pdf i feedback formular. Ukazky kodu z knihy jsou dostupne v repozitari na adrese: http://url.os1.cz/python-kniha-code-examples Preji vsem zajimave cteni.
8
2 2.1
Uvod Proc Python?
Proc jsem se rozhodl psat uvod do programovani v Pythonu? Mam k tomu vice duvodu, s Pythonem pracuji denne a hodne dlouhou dobu, mam s nim velmi veke zkusenosti. Dale si myslim, ze to bude pro vas prijemne, chova se tak jak by jste cekaly, zadne zaludnosti a cista syntaxe. Python se pouziva pro vyuku programovani na MIT (Massachusetts Institute of Technology), coz take o necem svedci.
2.2
Co je Python?
Nejdrive bych chtel ukazat Zend of Python. 1 2
In [1]: import this The Zen of Python , by Tim Peters
3 4 5 6 7 8 9 10 11
12 13 14
Beautiful is better than ugly . Explicit is better than implicit . Simple is better than complex . Complex is better than complicated . Flat is better than nested . Sparse is better than dense . Readability counts . Special cases aren ’ t special enough to break the rules . Although practicality beats purity . Errors should never pass silently . Unless explicitly silenced .
9
15
16
17
18 19
20
21
22
In the face of ambiguity , refuse the temptation to guess . There should be one - - and preferably only one -- obvious way to do it . Although that way may not be obvious at first unless you ’ re Dutch . Now is better than never . Although never is often better than * right * now . If the implementation is hard to explain , it ’ s a bad idea . If the implementation is easy to explain , it may be a good idea . Namespaces are one honking great idea -let ’ s do more of those ! Jednoduse reseno, Python se snazi k problemu pristupopvat jednoduse a intitivne. Python je tu uz pomerne dlouho, vznikl v roce 1991 a jeho puvodnim autorem je Guido van Rossum. Dnes se o vyvoj stara Python Software Foundation pod jeho benevolentnim dohledem. Python je multiparadigmaticky programovaci jazyk, coz znamena ze muzeme problemy resit ruznymi zpusoby (imperativne, funkcionalne, objektove, ...).
10
3
Terminal
Pri programovani je dulezite umet pouzivat prikazovy radek na Linuxu se mu rika terminal. Vsechny pojmy znamenaji jedno, cerne (ono nemusi byt vzdy cerne) okno kam se pisi prikazy.
3.1
Linux
V ukazkach budu pouzivat Linux, proto se mu budeme venovat vice. Presneji distribuci Ubuntu. V Ubuntu si vyhledejte aplikaci Terminal a spuste ji. Niceho se nelekejte, v terminalu bude napsano neco takoveho: 1
sika@x1 :~ $ Prvni cast je uzivatelske jmeno, druha je pocitac a za dvojteckou je cesta. Tilda znamena ze jste v domovskem adresari. Pokud chcete vypsat co se ve slozce nachazi napiste prikaz ls
1
ls Prikaz vypise
1
Documents Downloads Music Pokud chcete vytvorit slozku, treba s nazvem programovani, napiste prikaz a stisknete enter.
1
mkdir programovani
11
Pokud znovu vypiseme obsah slozky uvidime ze se nas adresar vytvoril 1
Documents Downloads Music programovani pro prepnuti se do naseho adresare programovani slouzi prikaz cd (change directory). Napiseme
1
cd programovani a vidime, ze jsme v adrsari programovani podle zmeneneho zacatku radky:
1
sika@x1 :~/ programovani$
3.2
Windows
Nechci zde podrobne popisovat i praci v prikazovem radku, ale chci popsat rozdily pro ty co jej chteji pouzit. Prace ve Windows prikazovem radku je dost podobna jako v Linuxovem terminalu, ale ma nejake odlisnosti. Hlavni je to, ze Linux rozlisuje mala a velka pismena zatimco windows ne. Vetsina prikazu je stejna, akorat prikaz na vypsani obsahu adresare ls je ve Windows prikaz dir. Prikaz dir funguje i v Linuxu, ale nepouziva se tam. V prikazovem radku je nohem vice odlisnosti, ale nam tyto zaklady staci.
12
4
Instalace
Vetsinu prikladu budu provadet v Pythonu na Linuxu, proto bude lepsi, kdyz budete take pouzivat Linux. Ukazu i instalaci na Windows a na Mac, ale nejlepsi varianta pro tyto systemy je VirtualBox s Ubuntu Linuxem.
4.1
Python
Pouzivam Debian, proto vsechny systemove prikazy budou pro nej a jeho derivaty jako je Ubuntu, Mint, ... Ve vetsine distribuci je Python jiz nainstalovan, pouzivaji ho komponenty systemu. Budeme pouzivat Python3, ten uz tak bezny neni, proto ho nainstalujeme prikazem: 1
sudo apt - get install python3
4.2
Textovy editor
Je nutne si nainstalovat textovy editor pro psani kodu. Uplne staci gedit - tej je v nekterych distribucich linuxu predinstalovan, ale muzeme si ho doinstalovat prikazem: 1
sudo apt - get install gedit Pokud chcete pouzivat jine editory, muzete pouzit treba SublimeText a nebo Atom.io.
13
4.3
PIP
PIP neboli Python install package je program, kterym instaluje dalsi Python balicky. Je dobre si ho nainstalovat, v knize ho budeme jeste pouzivat. Instaluje se prikazem: 1
sudo apt - get install python3 - pip
4.4
Windows a OSX
Pokud prece jen budete chtit mit Python na Windows, staci nainstalovat exe soubor z https://www.python.org/downloads /windows/. Pro OSX je to podobne, jen je treba stahnout .pkg soubor z https://www.python.org/downloads/mac-osx/. Pro OSX jsou prikazy v terminalu stejne jako v linuxu (na nem budu ukazovat priklady), protoze oba pouzivaji BASH. Pro windows je to trosku jine.
14
5
Syntaxe
5.1
Klicova slova
Klicova slova jsou prikazy, ktere maji v Pythonu preddefinovanou funkci. Je jich pomerne hodne, proto zde vypisu jen ty zakladni. Je dulezite mit na pameti, ze nemuzete promennou pojmenovat jako nejake klicove slovo. Pokud to udelate, Python vypise syntax error. • if - pominka • while - cyklus • for - cyklus • def - definice funkce • class - definice tridy • import - nacitani knihoven • from - nacitai knihoven • not - operator • in - operator • ...
5.2
Komentare
Komentare v Pythonu zacinaji znakem #. 1 2
# Program Hello World print ( ’ Hello World ’)
15
5.3
Promenne
Promena je misto, kam muzeme ukladat nejake hodnoty. Muzeme si ji pojmenovat libovolne, ale nesmime ji pojmenovat jednim z klicovych slov. Zadefinujme se promennou a s hodnotou 5, promennou b s hodnotou 3 a do promenne c vlozme jejich soucet. Je to trivialni a intuitivni. 1 2 3
a = 5 b = 3 c = a + b
5.4
Odsazovani
Python pouziva pro definici bloku kodu odsazovani. Blok kodu je napriklad telo funkce, nebo kod ktery se ma vykonat po splneni podminky if. Bloky jsou odsazene o 4 mezery. Je vice typu odzazovani, ale pro zacatek nam tento staci. 1 2 3 4
if a == b : # Toto je blok kodu print ’ Hello ’ print a
16
6
Prvni program - Hello world
Python se snazi delat veci jednoduse a proto zde nejsou zadne nutne hlavicky, hlavni funkce a dalsi veci, ktere nejsou primo nutne pro beh programu. Pokud chceme vytvorit nas prvni program, ktery nam vypise na obrazovku Hello world (to se tak dela), bude nam stacit pouze 1 radka kodu. Otevreme si nejaky editor zdrojoveho kodu, treba gedit nebo sublime a vytvome v nem soubor prvni.py a do nej napisme: 1
print ( ’ Hello world ’) Program spustime z terminalu prikazem python3:
1 2
sika@x1 :~ $ python3 prvni . py Hello world A to je vse. Nic sloziteho.
17
7
Shell
Python je interpretovany jazyk a vetsina interpretovanych jazyku ma shell ktery primo spracovana zadane prikazy. Pro vyvoj a zkouseni je to velmi uzitecne.
7.1
Python shell
Tento shell je v zakladu Pythonu. Pokud spustite samotny prikaz python3, spusti se shell. 1
2 3
4
Python 3.4.2 ( default , Oct 8 2014 , 10:45:20) [ GCC 4.9.1] on linux Type " help " , " copyright " , " credits " or " license " for more information . >>> Tento shell je velmi jednoduchy, neumi napovidani a ostatni veci ktere jsou velmi prijemne, proto budu pouzivat na ukazky IPython.
7.2
IPython
IPython je interaktivni shell. Jeho velkou vyhodou je doplnovani a napoveda. Instalace IPython neni v zakladu distribuce, mame 2 moznosti jak jej nainstalovat. 18
Preferuji instalaci prez pip: 1
sudo pip install ipython Pokud by tato instalace z nejakeho duvodu selhala, muzete jej nainstalovat z distribucnich balicku.
1
sudo apt - get install ipython
Spusteni IPython nasledne spustim prikazem: 1
2
Python 3.4.2 ( default , Oct 8 2014 , 10:45:20) Type " copyright " , " credits " or " license " for more information .
3 4
5
6 7 8
IPython 1.2.1 -- An enhanced Interactive Python . ? -> Introduction and overview of IPython ’ s features . % quickref -> Quick reference . help -> Python ’ s own help system . object ? -> Details about ’ object ’ , use ’ object ?? ’ for extra details .
9 10
In [1]:
Doplnovani Pri psani prikazu, promnenne, ... muzeme zmackout tabulator a IPython nam sam doplni cely nazev. 19
Pokud mame nekde definovanovanou promennou variable , kdyz napiseme vari a zmackneme tab tak se nam nazev doplni. Pokud mame promenne 2, treba variable1 a variable2 po zmacknuti tabulatoru se nam doplni cast ktera je stejna a ukaze se napoveda. 1
In [1]: variable1 = 1
2 3
In [2]: variable2 = 2
4 5 6
In [3]: vari variable1 variable2
7 8
In [3]: variable
Napoveda IPython ma take napovedu k jednotlivim objektum. Napriklad pokud chci vedet jak funguje funkce sum, staci napsat sum?. 1 2 3 4 5 6
In [1]: sum ? Type : builtin_function_or_method String Form : < built - in function sum > Namespace : Python builtin Docstring : sum ( sequence [ , start ]) -> value
7 8
9
Return the sum of a sequence of numbers ( NOT strings ) plus the value of parameter ’ start ’ 20
10
11
( which defaults to 0) . is empty , return start .
21
When the sequence
8
Datove typy
Tato kapitola popisuje zakladni datove typy, ktere Python ma a se kterymi si dlouhou dobu vystacite. Datovy typ je druh dat s kterym pocitac umi nejak zachazet. Predstavte si ze mame 2 cisla, dokazeme je secit. Pokud mam 2 jmena, secist je urcite nedokazeme. Datovy typ urcuje operace, ktere s nim muzeme provadet a take jak je ulozen v pameti pocitace. Pokud chceme zjistit typ promenne, muzeme na to pouzit built-in funkci ”type”: 1 2
In [1]: type (1) Out [1]: int
3 4 5
In [2]: type (1.5) Out [2]: float
6 7 8
In [3]: type ( ’ Hello ’) Out [3]: str
9 10 11
In [4]: type (1+1.5) Out [4]: float
12 13
In [5]: a = 5
14 15 16
In [6]: type ( a ) Out [6]: int
22
Pretypovani Pokud chceme zmenit datovy typ, rikame tomu precislovani. Treba potrebujeme udelat z retezce ’1’ cele cislo 1. Neni jednodusi zavolat funkci daneho typu, v nasem pripade funkci int a vlozit do ni to co chceme pretypovat. Pokud se pretypovani nepodari, treba protoze nelze pretypovat ’a’ na cislo, Python vyhodi vyjimku ValueError. 1 2
In [1]: int ( ’1 ’) Out [1]: 1
3 4 5
In [2]: int ( ’a ’) ValueError : invalid literal for int () with base 10: ’a ’
8.1
int (cele cislo)
Int (integer) je celociselny datovy typ. S cisly muzeme delat vsechny standartni matematicke operace. 1 2
In [1]: 5 + 3 Out [1]: 8
3 4 5
In [2]: 5 - 3 Out [2]: 2
6 7 8
In [3]: 5 * 3 Out [3]: 15 Deleni je trosku specifictejsi. Pokud jako operator pouzijeme pouze / vrati nam Python vysledek deleni do datoveho typu
23
”float”. Pokud chceme delit celociselne, musime pouzit operator //. 1 2
In [1]: 5/3 Out [1]: 1.6666666666666667
3 4 5
In [2]: 5//3 Out [2]: 1 Umocnujeme pomoci operatoru **.
1 2
In [1]: 5 ** 3 Out [1]: 125
8.2
float (desetine cislo)
Presneji floating point, ale to nas nemusi trapit dulezite je ze tento typ umoznuje praci s desetinymi cislu. Desetina cisla jsou cisla, takze neni divne ze operace s nimy jsou stejne jako s datovym typem int. Zapis desetineho cisla muzeme zkratit takto: nemusime psat 0.5, staci .5 pokud chi mit cislo 1 v typu float, nemusim psat 1.0, staci 1. 1 2
In [1]: .5 Out [1]: 0.5
3 4 5
In [2]: 1. Out [2]: 1.0
24
8.3
str (retezec)
Datovy typ str (string) neboli retezec je datovy typ ktery uklada text. Namisto matematickych operaci dokazeme texty spojovat a nasobit. Text piseme do apostrofu. Pokud se v textu ma apostrof vyskytnout dejte pred nej zpetne lomitko. 1 2
In [1]: ’ hello world ’ Out [1]: ’ hello world ’
3 4 5
In [2]: ’ mother \ ’ s book ’ Out [2]: " mother ’ s book " Muzete pouzit pro vkladani stringu i uvozovky, ale nepouziva se to. Spojovani retezcu
1 2
In [1]: ’ hello ’ + ’ ’ + ’ world ’ Out [1]: ’ hello world ’ Nasobeni retezcu
1 2
In [1]: 2 * ’ hello ’ Out [1]: ’ hello hello ’ Delka retezce Pro zjisteni delky obecne existuje funkce len, ktera vrati delku retezce, n-tice, seznamu, ...
1 2
In [1]: len ( ’ hello ’) Out [1]: 5 Protoze je v Pythonu kazdy datovy typ objekt, ma ruzne metody. Ukazka pouziti techto metod:
25
1
In [1]: s = ’ hello ’
2 3 4
In [2]: s . capitalize () Out [2]: ’ Hello ’
5 6 7
In [3]: s . upper () Out [3]: ’ HELLO ’ Z retezce se da vybrat konkretni znak timto zkusobem:
1 2
In [1]: s [0] Out [1]: ’H ’ Dale je mozne retezec prochazet prez for cyklus:
1
In [1]: s = ’ Hello ’
2 3 4 5 6 7 8 9
In [2]: for c in s : ...: print ( c ) H e l l o
8.4
bool
Boolean je datovy typ True nebo False. Boolean je vetsinou vysledkem nejakeho vyrazu, napriklad: 1 2
In [1]: ’ hello ’ == str Out [1]: False
3
26
4 5
In [2]: type ( ’ hello ’) == str Out [2]: True O vyrazech budu psat v dalsi kapitole.
8.5
NoneType, None
NoneType je specialni datovy typ pro None. None je zvlastni hodnota, ktera znamena ze hodnota neni. Pokud mam funkci ktera nema navratovou hodnotu (return ...), tak vrati None.
8.6
tuple (N-tice)
N-tice je soubor hodnot oddelenych carkou, neco jako vektor. N-tice se nedaji modifikovat, protoze jsou ulozeny do jednoho mista v pameti. 1
In [1]: ntice = (1 , 2 , 3) Z n-tice muzeme vybrat konkretni hodnotu takto. Prvni index je 0.
1 2
In [1]: ntice [0] Out [1]: 1
3 4 5
In [2]: ntice [2] Out [2]: 3 Pokud chcete ntici zapsat do n ruznych promennych, muzete to udelat takto:
27
1
In [1]: a , b , c = (1 , 2 , 3)
2 3 4
In [2]: a Out [2]: 1
5 6 7
In [2]: b Out [2]: 2
8 9 10
In [2]: c Out [2]: 3 N-tice muzeme spojovat, spejni vytvori novou n-tici.
1 2
In [1]: (1 , 2 , 3) + (4 , 5 , 6) Out [1]: (1 , 2 , 3 , 4 , 5 , 6) N-tice muzeme prochazet for cyklem stejne jako retezce nebo seznamy:
1 2 3 4 5
In [1]: for i in (1 , 2 , 3) : ...: print ( i ) 1 2 3
8.7
list (seznam)
Seznam je pro programatora dost podobny n-tici, ale funguje odlisne. Neni ulozen sekvencne a proto se do nej da pridavat a ubirat. Seznam vytvorime []. 1
In [1]: seznam = [1 ,2 ,5] 28
2 3 4
In [2]: seznam Out [2]: [1 , 2 , 5] Do seznamu se da pridavat na konec pomoci metody append :
1
In [3]: seznam . append (8)
2 3 4
In [4]: seznam Out [4]: [1 , 2 , 5 , 8] a z konce odebirat metodou ”pop”, ktera vrati odebrany prvek.
1 2
In [5]: seznam . pop () Out [5]: 8
3 4 5
In [6]: seznam Out [6]: [1 , 2 , 5] Muzeme take zjistit index daneho prvku:
1
In [1]: seznam = [1 ,2 ,4]
2 3 4
In [2]: seznam . index (2) Out [2]: 1 Pristupovat k jedenotlivim polozkam ze seznamu se da stejne jako u retezcu a n-tic prez index.
1
In [1]: seznam = [1 ,2 ,5]
2 3 4
In [2]: seznam [1] Out [2]: 2
29
Ze seznamu muzeme odstranit konkretni prvek pomoci metody remove: 1
In [1]: seznam = [1 ,2 ,4]
2 3
In [2]: seznam . remove (2)
4 5 6
In [3]: seznam Out [3]: [1 , 4] Nebo podle indexu klicovym slovem del:
1
In [1]: seznam = [1 ,2 ,4]
2 3
In [2]: del seznam [1]
4 5 6
In [3]: seznam Out [3]: [1 , 4]
8.8
dict (slovnik)
V seznamech a n-ticich nam zalezelo na popradi prvku, ale v slovniku to definovane neni. Slovnik pristupuje ke svym prvkum po klici a ne po indexu. Slovnik se sklada z dvojic klic-hodnota. Klice musi byt unikatni. Slovnik se definuje takto: 1
In [1]: slovnik = { ’ name ’: ’ Ondrej ’ , ’age ’: 22}
2 3 4
In [2]: slovnik Out [2]: { ’ age ’: 22 , ’ name ’: ’ Ondrej ’} 30
Pristup po klici. 1 2
In [3]: slovnik [ ’ name ’] Out [3]: ’ Ondrej ’
3 4 5
In [4]: slovnik [ ’ age ’] Out [4]: 22 Pokud chceme ze slovniku udelat seznam klicu nebo hodnot, muzeme pouzit metody keys a values.
1 2
In [5]: slovnik . keys () Out [5]: [ ’ age ’ , ’ name ’]
3 4 5
In [6]: slovnik . values () Out [6]: [22 , ’ Ondrej ’] Nebo muzeme vyuzit metodu items, ktera vrarti tuples ( key, value).
1 2
In [7]: slovnik . items () Out [7]: [( ’ age ’ , 22) , ( ’ name ’ , ’ Ondrej ’) ] To se hodi na prochazeni for cyklem
1
2 3 4
In [8]: for key , value in slovnik . items () : ...: print key , ’: ’ , value age : 22 name : Ondrej Pokud chcete trosku optimalizovat, muzete vyuzit generatory a misto metod keys, values a items ktere se volaji s predponou iter, takze iterkeys, itervalues a iteritems .
31
Ze slovniku muzeme odstranit konkretni prvek (stejne jako u seznamu) pomoci prez del podle klice. 1
In [1]: slovnik = { ’ name ’: ’ Ondrej ’ , ’age ’: 22}
2 3
In [2]: del slovnik [ ’ age ’]
4 5 6
In [3]: slovnik Out [3]: { ’ name ’: ’ Ondrej ’}
8.9
set (mnozina)
Mnozina je datovy typ pro ukladani unikatnich objektu (napriklad cisel) bez poradi. Prochazeni je mnohem rychlejsi nez u seznamu. Casto se vyzivaji se pro pripady kontroly zda jsme nejakou informaci jiz dostali ci nikoliv. 1
In [1]: mnozina = {1 ,2 ,3}
2 3 4
In [2]: mnozina Out [2]: {1 , 2 , 3} Do mnoziny se da pridavat:
1
In [3]: mnozina . add (4)
2 3 4
In [4]: mnozina Out [4]: {1 , 2 , 3 , 4} daji se porovnavat a kontrolovat pritomnost prvku:
1 2
In [5]: mnozina == {1 ,2} Out [5]: False
3
32
4 5
In [6]: 1 in mnozina Out [6]: True Mnozina ma take metodu pop ale ta funguje podivne.
33
9 9.1
Vyrazy Zakladni a matematicke vyrazy
Vyraz je kus kodu ktery po vyhodnoceni vrati bud pravdu nebo nepravdu. Vyrazi se pouzivaji v podmikach a cyklech pro rozhodovani. Vyraz se sklada z operatoru a operanu. Pokud mame vyraz 1 == 1, tak jednicky jsou operandy a == je operator. Tyto vyrazy snad neni potreba vysvetlovat snad jen pripomenout ze se porovnava dvena rovnase, protoze jedno prirazuje hodnotu do promenne. Dale je dobre zminit ze nerovna se pouziva !=. Zde jsou zakladni ciselne vyrazy: 1 2
In [1]: 1 == 2 Out [1]: False
3 4 5
In [2]: 1 == 1 Out [2]: True
6 7 8
In [3]: 1 < 1 Out [3]: False
9 10 11
In [4]: 1 <= 1 Out [4]: True
12 13 14
In [5]: 1 > 2 Out [5]: False
15
34
16 17
In [6]: 1 >= 2 Out [6]: False
18 19 20
In [7]: 1 != 3 Out [7]: True Pouziti operatoru == a != nemusime pouzivat poze pro cisla, muzeme tim porovnavat skoro vse. Napriklad retezce:
1 2
In [1]: ’ ahoj ’ == ’ ahoj ’ Out [1]: True
3 4 5
In [2]: ’ ahoj ’ == ’ hello ’ Out [2]: False Pokud chceme znegovat vyraz, pouzijme not.
1 2
In [1]: not ’ ahoj ’ == ’ ahoj ’ Out [1]: False
3 4 5
In [2]: not False Out [2]: True Protoze Python se snazi mit prijemnou syntaxy, muzeme operatory == nahradit operatorem is.
1 2
In [1]: ’ ahoj ’ is ’ ahoj ’ Out [1]: True Pokud chceme nahradit operator !=, mame 2 moznosti. Bud pouzit is not a nebo znegovat cely vyraz kde je not na zacatku. Prvni varianta je cistsi.
1 2
In [1]: ’ ahoj ’ is not ’ ahoj ’ Out [1]: False
3
35
4 5
In [2]: not ’ ahoj ’ is ’ ahoj ’ Out [2]: False
9.2
Logicke spojky
Vyrazy muzeme spojovat. Kdyz se vyraz vyhodnoti, dostaneve hodnotu True nebo False, potom je skladame logickymi spojkami. V prikladech si ukazeme jen skladani True/False hodnot pomoci logickych spokek. Hodnoty True/False zastupuji nejake vyrazy, ktere tyto hodnoty vraci. OR Logicke or, neboli ”nebo”je logicka spojka, ktera vrati True, pokud alespon jeden operator bude True. Takto vypada pravdivostni tabulka: A B A or B False False False False True True True False True True True True Ukazka: 1 2
In [1]: True or False Out [1]: True
3 4 5
In [2]: False or False Out [2]: False
36
AND Logicke and je podobne, akorat vrati True, pouze kdyz jsou oba parametry True. A B A or B False False False False True False True False False True True True Ukazka: 1 2
In [1]: True and False Out [1]: False
3 4 5
In [2]: True and True Out [2]: True
9.3
Iterables
Pro iterables (seznamy, n-tice, ...) muzeme pouzit operator in, ktery vrati True pokud se dana polozka nachazi v seznamu a False kdyz ne. 1 2
In [1]: 1 in [0 , 1 , 2] Out [1]: True
3 4 5
In [2]: 5 in [0 , 1 , 2] Out [2]: False Operator in se da pouzit i na vyhledavani v retezcich:
1 2
In [1]: ’ hello ’ in ’ hello world ’ Out [1]: True 37
3 4 5
In [2]: ’ hello ’ in ’ ahoj svete ’ Out [2]: False Muzeme take vyhledavat v mnozinach. V mnozinach je mnohem rychlejsi vyhledavani nez v n-ticich a seznamech.
1 2
In [1]: 1 in {0 , 1 , 2} Out [1]: True Operator in se da pouzit i ve variante not in.
1 2
In [1]: 1 not in (0 , 1 , 2) Out [1]: False Pokud pouziju in na slovnik, vrati True, pokud existuje dany klic.
1 2
In [1]: ’a ’ in { ’a ’: 1 , ’b ’: 2} Out [1]: True
3 4 5
In [2]: ’x ’ in { ’a ’: ’x ’ , ’b ’: ’y ’} Out [2]: False
38
10
Podminky
Podminky jsou soucasti temer vsech programu. Je to misto, kde se program vetvi na zaklade nejake splnene nebo nesplnene podminky.
10.1
Klasicke if
Vetsinou pouzivame klasickou definici podminky. Pokud se podminka vyhodnoti jako pravda, provede se nasledujici blok. 1 2
if promenna == 100: print ( ’ promenna ma hodnotu 100 ’) Pokud chceme pridat blok, ktery se ma vykonat, pokud neni podminka sppnena, pouzijeme else:
1 2 3 4
if promenna == 100: print ( ’ promenna ma hodnotu 100 ’) else : print ( ’ promenna nema hodnotu 100 ’) Muzeme jeste pridat dalsi podminky prez elif, coz znamena, kdyz neprojde prvni, zkus druhou, treti, ... Kdyz neprojde zadna, vykonej else, poku je definovano.
1 2 3 4 5 6
if promenna == 100: print ( ’ promenna ma hodnotu 100 ’) elif promenna == 200: print ( ’ promenna ma hodnotu 200 ’) else : print ( ’ promenna nema hodnotu 100 ani 200 ’)
39
10.2
Inline if
Pokud chcete podminkou priradit 2 ruzne hodnoty, mate 2 moznosti. Toto je ten klasicky zapis, ktery je zbytecne slozity 1 2 3 4
if source >= 0: result = ’ source >= 0 ’ else : result = ’ source < 0 ’ Toto je prepsani do inline stylu:
1
result = ’ source >= 0 ’ if source >=0 else ’ source < 0 ’ Ze zacatku to muze vypadat dost desive, ale urcite se na to zvyknete. Je dulezite teto funkcionality nezneuzivat.
40
11 11.1
Cykly While
While ciklus ma velmi jednoduchou strukturu. Dokud je podminka splnena, cyklus se provadi. Tento cyklus se pouziva pro nekonecne cykly a nebo cykly kdy predem nezname jeho delku. Nekonecy cyklus se zapise takto: 1 2
while True : do_something () Nebo nam nase funkce do something muze neco vracet a podle toho se rozhodovat zda cyklus ukoncit.
1 2 3
wh = True while wh : wh = do_something () Pokud nam funkce vrati False, cyklus se ukonci. Dalsim prikladem muze byt program vypisujici cisla od 0 do 5:
1
In [1]: i = 0
2 3 4 5 6 7 8 9 10 11
In [2]: while i <= 5: ...: print i ...: i += 1 ...: 0 1 2 3 4 41
12
5
11.2
For
For cyklus slouzi k prochazeni seznamu, stringu, ... a k provedeni daneho poctu iteraci. 11.2.1
Prochazeni seznamu
Pokud mame seznam, muzeme vsechny jeho prvky projit takto. 1 2 3
seznam = [ ’ hello ’ , ’ nice ’ , ’ world ’] for word in seznam : print ( word ) Program vypise toto:
1 2 3
hello nice world
11.2.2
range, xrange
Pokud chci provest nejaky pocet iteraci, mohu si pomoci funkce range vytvorit pole ktere bude mit hodnoty od 0 do n-1. To pak pouziji pro vstup for cyklu: 1 2
In [1]: range (5) Out [1]: [0 , 1 , 2 , 3 , 4]
3 4 5
In [2]: type ( range (5) ) Out [2]: list 42
lepsi je pouzit funkci xrange, ta nevytvori pole ale generator, ktery je uspornejsi v pameti. Jinak se jeji chovani nezmeni. Pro male hodnoty je to jedno. 1 2
In [1]: xrange (5) Out [1]: xrange (5)
3 4 5
In [2]: type ( xrange (5) ) Out [2]: xrange Potom bude cyklus vypadat takto:
1 2
for i in range (3) : print ’ Hello ’ + i Program vypise toto:
1 2 3
Hello 0 Hello 1 Hello 2 Funkce range muze mit vice parametru. Pokud je zadan jenom jeden je to pocet prvku v poli od 0 do n-1.
1 2
In [1]: range (10) Out [1]: [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9] Pokud jsou zadany 2 parametry prvni urcuje zacetek a druhy konec. Presneji od a do b-1.
1 2
In [1]: range (5 , 10) Out [1]: [5 , 6 , 7 , 8 , 9] Pokud zadam 3 parametry, prvni dva jsou zacatek a konec, treti parametr je krok.
1 2
In [1]: range (5 , 10 , 2) Out [1]: [5 , 7 , 9] 43
11.2.3
enumerate
Enumerate vytvori generator, ktery ocisluje prvky vstupniho pole. 1
In [1]: seznam = [ ’ hello ’ , ’ nice ’ , ’ world ’]
2 3 4
In [2]: enumerate ( seznam ) Out [2]: < enumerate at 0 x7f059eb850a0 >
5 6 7
In [3]: list ( enumerate ( seznam ) ) Out [3]: [(0 , ’ hello ’) , (1 , ’ nice ’) , (2 , ’ world ’) ] Ve for cyklu to muzeme vyuzit takto:
1 2
for i , word in enumerate ( seznam ) : print (i , ’: ’, word ) a program vypise:
1 2 3
0: hello 1: nice 2: world
11.3
break, continue
Techto prikazu by se nemelo zneuzivat, ale hodi se. 11.3.1
break
Pokud chci cyklus prerusit (for i while) tak muzu pouzit prikaz break, ktery ukonci zpracovani cyklu. 44
1 2 3
while True : if not do_something () : break a ve for cyklu je to stejne:
1 2 3
for name in names : if not do_something ( name ) : break Jeste konkretni priklad. Pokud narazi na prazdne jmeno, cyklus zkonci:
1
2 3 4
for name in [ ’ Ondrej ’ , ’Jan ’ , ’’, ’ Martin ’]: if not name : break print ( name ) Program nam vypise:
1 2
Ondrej Jan
11.3.2
continue
Prikaz continue prezkoci zbyvajici cast cyklu a pokracuje dalsi iteraci. Treba pokud i % 2 je 0 tak ma hodnotu vypsat, pokud ne tak pokracuje: 1 2 3 4
for i in xrange (10) : if i % 2: continue print ( i )
45
Vypise: 1 2 3 4 5
0 2 4 6 8 a % b je matematicka operace modulo, zbytek po celocislelnem deleni. Priklad 3 % 2 = 1, 3 % 10 = 3 a 8 % 4 = 0. A to je asi vse, co potrebujete znat o cyklech.
46
12 12.1
Funkce Klasicka definice
Funkce dela presne to co od ni ocekavame. Dostane vstupni parametry, neco s nimi provede a vrati nejakou hodnotu. Funkce se definuje klicovym slovem def za nim nasleduje jmeno funkce a po nem v zavorkach parametry. Potom dvojtecka a v odsazeni nasleduje telo funkce. Klicove slovo return vrati hodnotu a ukonci funkci. Pokud funkce return neobsahuje, funkce zkonci az se provede cele jeji telo. Definice funkce vypata takto: 1 2
def function ( arg1 , arg2 ) : return arg1 + arg2 volani funkce potom vypada takto:
1 2
In [1]: function (1 , 2) Out [1]: 3
3 4 5
In [2]: function (5 , 3) Out [2]: 8 Samozrejme muze byt funkce bez parametru nebo navratove hodnoty:
1 2
def function_without_args () : return ’ Hello world ’
3 4 5
def function_without_return ( arg1 ) : print ( arg1 ) Jejich volani vypada potom takto: 47
1 2
In [1]: function_without_args () Out [1]: ’ Hello world ’
3 4 5
In [2]: function_without_return (5) 5
12.2
Inline funkce
Inline funkce maji specialni pripady pouziti, ale funguji jako normalni funkce, akorat se definuji jednou radkou a nemusi mit nazev. Funkce muze a nemusi mit parametry. Tato funkce ovsem musi mit navratovou hodnotu. Ukazky deklarace inline funkce: 1
In [1]: function = lambda arg1 , arg2 : arg1 + arg2
2 3
In [2]: function_without_args = lambda : ’ Hello world ’ Jejich volani vypada potom takto:
1 2
In [1]: function (5 , 3) Out [1]: 8
3 4 5
In [2]: function_without_args () Out [2]: ’ Hello world ’
12.3
Argumenty
Ted se podivame na moznosti prace s atributy funkci. V Pythonu je to velmi prijemne. 48
12.3.1
Defaultni hodnota
Kazdemu parametru muzeme nastavit defaultni hodnotu. Priklad asi mluvi za vse: 1 2
def hello ( name = ’ somebody ’) : return ’ Hello ’ + name Pokud spustime s parametrem:
1 2
In [1]: hello ( ’ Ondrej ’) Out [1]: ’ Hello Ondrej ’ a pokud spustime bez nej:
1 2
In [1]: hello () Out [1]: ’ Hello somebody ’
12.3.2
Promenny pocet argumentu (*args)
Funkce muze mit promenny pocet argumentu. K tomu slouzi specialni syntaxe *args pri definici funkce. Ta zaruci ze v promenne args bude seznam parametru funkce. 1 2 3 4 5
def product (* args ) : result = 1 for arg in args : result *= arg return result Tato funkce vynasobi vsechny argumenty mezi sebou a nezalezi na jejich poctu.
1 2
In [14]: product () Out [14]: 1 49
3 4 5
In [15]: product (1) Out [15]: 1
6 7 8
In [16]: product (1 , 2) Out [16]: 2
9 10 11
In [17]: product (1 , 2 , 3) Out [17]: 6
12.4
Dekoratory
Dekoratory jsou funkce, ktere obaluji nejakou jinou funkci a mohou rozsirovat jeji funkcionalitu. Dekorator je vlastne elegantni zapis vnoreni funkci jiz pri definici.
50
13
Objektove orientovane programovani
Objektove orientovane programovani je metoda pri ktere jsou zakladni casti objekty.
13.1
Objekt
Je abstrakce, ktera ma ruzne atributy a metody.
13.2
Tridy
Tridy definuji jak maji dane skupiny objektu pracovat. Vytvareji objety podle zadanych pravidel s ruznymi atributy a metodami. Konvence je psat nazvy velkym cammel-case (napriklad MojeTrida). Definice tridy muze vypadat takto: 1 2
class Pes : pass # pass znaci prazdne telo podminky , cyklu , ...
13.3
Inicializace objektu
Objekt vytvorime zavolanim tridy, presneji jejiho konstruktoru. Konstrutor muzeme nadefinovat, ale to se dozvite dale. Objekty obvykle pojmenovavame malymi pismeny s podtrzitky (napriklad. muj objekt). 51
1
alik = Pes ()
13.4
Atributy
Objekt muze mit atributy, to jsou promenne jakehokoliv typu, ktere jsou svazane s danym objektem. K tomu abychom mohli efektivne pracovat s atributy, potrebujeme znat alespon zakladni metodu tridy, konstruktor.
13.5
Metody
Metody jsou funkce definovane v tele tridy, ktere jsou svazane s objektem. Jejich prvni parametr je vzdy objekt, konvence pouziva self. Dalsi atributy jsou nepovine. Pri volani techtometod pouzivame teckovou notaci objekt. metoda(). Parametr self se doplni automaticky, ostatni parametry (pokud jsou pozadovany) vyplnime standartne. 1 2 3 4 5
class Pes ( object ) : def stekni ( self ) : print ’Haf ’ def stekni_n ( self , n ) : print n * ’ Haf ’
6 7 8 9
alik = Pes () alik . stekni () alik . stekni_n (3)
52
13.5.1
Specialni metody
Nektere metody jsou vyhrazene pro specialni ucely, maji jmenou konvenci __specialnimetoda__. Konstruktor Jednou ze specialnich metod je konstruktor. Ten se spousti pri inicializaci objektu. Konstruktor se jmenuje __init__ . Pokud si nadefinujeme vlastni konstruktor, muzeme vyuzit vyhody objektoveho programovani. Metoda nema definovanou navratovou hodnotu (return), protoze vraci objekt. Nadefinujme si znovu tridu Pes, tentokrart s konstruktorem a s nejakymi atributy. 1 2 3 4 5
class Pes ( object ) : def __init__ ( self , jmeno , vek , vaha ) : self . jmeno = jmeno self . vek = vek self . vaha = vaha
6 7 8 9
alik = Pes ( ’ Alik ’ , 3 , 20) ben = Pes ( ’ ben ’ , 8 , 10)
10 11 12
alik . jmeno ben . vek
53
str Dalsi specialni metoda je __str__. Pokud chcete objekt prevest na retezec (treba ho chcete vypsat) tak definujte metodu __str__. Pokud nemame metodu str, vypsani objektu vypada takto: 1 2 3
class Pes ( object ) : def __init__ ( self , jmeno ) : self . jmeno = jmeno
4 5 6 7 8
alik = Pes ( ’ Alik ’) print ( alik ) < __main__ . Pes object at 0 x7f2ddf33cfd0 > Pokud metodu __str__ zadefinujeme, muze vystup vypadat takto:
1 2 3 4 5
class Pes ( object ) : def __init__ ( self , jmeno ) : self . jmeno = jmeno def __str__ ( self ) : return self . jmeno
6 7 8 9 10
alik = Pes ( ’ Alik ’) print ( alik ) Alik Takovych metod je mnoho, pokud je budete potrebovat, jsou v dokumentaci pythonu, ale vetsinou bude stacit konstruktor (__init__).
54
13.5.2
Staticke metody
Staticke metody jsou metody ktere nepracuji s objektem. Slouzi treba k vytvareni vice objektu a nebo jako pomocne funkce. Staticke metody se oznacuji dekoratorem @staticmethod . Ukazka staticke metody muze vytvorit objekt s nahodnymi daty, napriklad: 1
import random
2 3 4 5 6 7
class Pes ( object ) : def __init__ ( self , jmeno , vek , vaha ) : self . jmeno = jmeno self . vek = vek self . vaha = vaha
8 9 10 11
12 13
@staticmethod def nahodny_pes () : jmeno = random . choice ([ ’ alik ’ , ’ ben ’ , ’ dick ’]) vek = random . randint (1 , 10) vaha = random . randint (1 , 50)
14 15 16 17 18 19 20 21 22
pes = Pes . nahodny_pes () pes . jmeno pes . vek pes . vaha pes2 = Pes . nahodny_pes () pes2 . jmeno pes2 . vek pes2 . vaha 55
13.6
Property
Property je metoda, ktera se pri inicializaci objektu spocita a pote se k ni pristupuje jako k atributu. Metoda, ktera se ma chovat jeko atribut (property) oznacime dekoratorem @property. 1
import datetime
2 3 4 5 6 7
class Pes ( object ) : def __init__ ( self , jmeno , vek , vaha ) : self . jmeno = jmeno self . vek = vek self . vaha = vaha
8 9 10 11
@property def rok_narozeni () : return datetime . date . today () . year - self . vek
12 13 14 15 16
pes = Pes ( ’ Alik ’ , 1 , 10) pes . rok_narozeni pes . vek = 2 pes . rok_narozeni Pokud bychom nepouzili property ale jen normalni metodu, dopadlo by volani takto:
1
import datetime
2 3 4 5 6
class Pes ( object ) : def __init__ ( self , jmeno , vek , vaha ) : self . jmeno = jmeno self . vek = vek 56
self . vaha = vaha
7 8
@property def rok_narozeni () : return datetime . date . today () . year - self . vek
9 10 11
12 13 14 15 16 17
pes = Pes ( ’ Alik ’ , 1 , 10) pes . rok_narozeni pes . rok_narozeni () pes . vek = 2 pes . rok_narozeni () Musime pridat zavorky (volani funkce) a nekde to neni uplne vhodne.
13.7
Dedicnost
Dedicnost je skladani trid ... Pokud ma napriklad trida nejake atributy a metody muzeme v oddedenych tridat tyto metody a atributy vyuzivat. Dedeni trid se dela takto, trida Pes je oddedena od tridy Zvire. 1 2 3
In [1]: class Zvire ( object ) : ...: pass ...:
4 5 6 7
In [2]: class Pes ( Zvire ) : ...: pass ...:
57
Tady je realna ukazka jak dedeni funguje. V tride Pes i Kocka muzeme pouzivat atributy a metody tridy Zvire. 1 2 3 4
In [1]: class Zvire ( object ) : def vydej_zvuk ( self ) : print self . zvuk ...:
5 6 7 8
In [2]: class Pes ( Zvire ) : ...: zvuk = ’Haf ’ ...:
9 10 11 12
In [3]: class Kocka ( Zvire ) : ...: zvuk = ’ Mnau ’ ...:
13 14
In [4]: pes = Pes ()
15 16 17
In [5]: pes . vydej_zvuk () Haf
18 19
In [6]: kocka = Kocka ()
20 21 22
In [7]: kocka . vydej_zvuk () Mnau
13.8
Super
Pokud ma rodic stejnou metodu jako potomek, potom plati metoda potomka. Pokud se chcete z potomka dostat na metodu rocice, musite pouzit funkci super. 1
In [1]: class Pes ( object ) : 58
2 3 4 5 6
def __init__ ( self , jmeno ) : self . jmeno = jmeno def stekni ( self ) : print ’ Haf % s ! ’ % self . jmeno ...:
7 8 9 10 11 12
In [2]: class VelkyPes ( Pes ) : def stekni ( self ) : super ( VelkyPes , self ) . stekni () print ’ Jsem velky pes ! ’ ...:
13 14
In [4]: alik = Pes ( ’ Alik ’)
15 16 17
In [5]: alik . stekni () Haf Alik !
18 19
In [6]: rex = VelkyPes ( ’ Rex ’)
20 21 22 23
In [7]: rex . stekni () Haf Rex ! Jsem velky pes !
59
14
Moduly, knihovny, importy
Modul je sada funkci, trid, ... zamerene na jedno tema. Napriklad v modulu math jsou funkce na matematicke vypocty, napriklad sin a nebo sqrt (square root, odmocnina).
14.1
Interni moduly
Python ma hodne funkcionality v internich modulech, protoze je to pro porgramatora prehlednejsi a ne vzdy potrebuje vsechny vyuzivat. Pokud napriklad tvorite kalkulacku, je vam sada funkci pracujicich s casem k nicemu. K funkcim z modulu muzeme pristupovat vice zpusoby, zde je ukazka jak muzeme pristupovat k funkci sqrt z knihovny math: Knihovnu muzeme nejdrive celou naimportovat a pak vyuzivat jeji funkce: 1
In [1]: import math
2 3 4
In [2]: math . sqrt (9) Out [2]: 3.0 Nebo muzeme importovat pouze nektere funkce:
1
In [1]: from math import sqrt
2 3 4
In [2]: sqrt (9) Out [2]: 3.0 Je jedno co pouzijeme vysledek je stejny. Nekdy se hodi to i to, zalezi na konkretnim pripadu pouziti. V dalsi casti reknu kde se jeden zpusob hodi vic nez druhy a proc. 60
Muze se nam stat, ze uz objekt math z nejako duvodu mame a zaroven jej potrebujeme importovat. Muzeme to vyresit tak ze modul math muzeme importovat pod jinym jmenem: 1
In [1]: import math as python_math
2 3 4
In [2]: python_math . sqrt (9) Out [2]: 3.0 To a same muzeme udelat i s konkretni funkci:
1
In [1]: from math import sqrt as odmocnina
2 3 4
In [2]: odmocnina (9) Out [2]: 3.0 Myslim, ze je dobre ukazat dva moduly pro praci z casem, time a datetime. Oba pracuji s casem, ale kazdy jinym zpusobem. 14.1.1
time
Knihovna time pracuje s casem jako z cislem (int/float) poctu vterin od 1. 1. 1970. Ma v sobe zakladni funkci (zase time) ktera vrati tento pocet sekund, rika se mu unix time, pokud je na vteriny. 1
In [1]: import time
2 3 4
In [2]: time . time () Out [2]: 1428847292.480358
5 6 7
In [3]: int ( time . time () ) Out [3]: 1428847292 61
# unix time
Zde bych nepouzival metodu from time import time, protoze bych nevedel jsite, jaky zpusob jsem pouzil a bylo by to matouci. 14.1.2
datetime
Knihovna datetime pouziva misto primitivnich datovych typu pro praci s casem a datem objekty ktere nabizeji jednoduche metody pro praci s nimi. 1
In [1]: import datetime
2 3
In [2]: now = datetime . datetime . now ()
4 5 6
In [3]: now . strftime ( ’% H :% M ’) Out [3]: ’16:08 ’
7 8 9
In [4]: now . isoformat () Out [4]: ’2015 -04 -12 T16 :08:29.848344 ’ Pokud cheme konvertovat cas mezi temito knihovnami, muzeme pouzit tyto 2 funkce:
1
In [1]: import time
2 3
In [2]: import datetime
4 5 6
7
In [3]: def time2datetime ( t ) : ...: return datetime . datetime . fromtimestamp ( t ) ...:
8 9
In [4]: def datetime2time ( dt ) :
62
10
11
...: return time . mktime ( dt . timetuple () ) ...: Pouziti je potom jednoduche:
1
In [5]: now = int ( time . time () )
2 3 4
In [6]: now Out [6]: 1428848080
5 6
In [7]: now_dt = time2datetime ( now )
7 8 9
In [8]: now_dt Out [8]: datetime . datetime (2015 , 4 , 12 , 16 , 14 , 40 , 654836)
10 11
In [9]: now2 = datetime2time ( now_dt )
12 13 14
In [10]: now == now2 Out [10]: True
14.2
Vlastni moduly
Vetsinou budete chtit delit program do vice souboru a adresaru. Timto efektivne vytvarite moduly. V teto kapitole si ukazeme ze neni tezke s nimi pracovat a ze to vlastne uz umime. Pokud mame dva soubory knihovna.py a program.py ve stejnem adresari, muzeme si soubory jednoduse naimportovat. Sobor knihovna.py: 63
1 2
def hello () : print ( ’ Hello ! ’) Sobor program.py:
1 2
import knihovna knihovna . hello () Po spusteni program.py vypise:
1
Hello ! Pokud chceme tridit soubory i do adresaru, neni to take tezke. Je tu pouze pravidlo, aby Python videl nejaky adresar jako modul musi obsahovat soubor __init__.py. Pokud tedy dame nasi knihovnu do adresare libs i se zminovanym souborem init, muzeme k ni pristoupit z naseho program.py takto:
1 2
from lib import knihovna knihovna . hello () Interni moduly Pythonu a ty nase se chovaji uplne stejne, jde o to ze je Python chape jako rovnocene a jejich poradi se nastavuje v python path (sys.path), ale to je nad ramec knihy. Dulezite je ze tak jak pristupujete k lokalnim souborum, muzete pristupovat k internim modulum i modulum tretich stran.
14.3
Moduly tretich stran
Pokud mate nejaky kod (knihovnu), ktera by se dala prepouzit ve vice projektech, pak z ni muzete udelat balicek a publikovat ho na internetu jako opensource a kazdy si ho 64
muze stahnout a pouzit do sveho projektu. Je to velmi zasluzna cinnost. Python ma svuj balickovaci system zvany pip (python install package). Nainstalujeme ho prikazem: 1
sudo apt - get install python - pip Timto prikazem muzeme instalovat balicky z ruznych zdroju velmi jednoduse. 14.3.1
pypi
Pypi neboli Python Package Index, je databaze Python balicku, ktere muzete jednoduse nainstalovat pomoci pip. V dalsi casti si ukazeme, jak balicek vytvorit. Balicky z pypi se instaluji prikazem sudo pip install < package name>. Priklad instalace balicku pythonkniha. 1
sudo pip install pythonkniha Na webu https://pypi.python.org je vyhledavani, kde muzete balicek najit a zjistit nejake dulezite informace: autora, repoziar, verze, dokumentaci, ... Podle dokumentace muzeme zjistit co balicek obsahuje za kod a muzeme nejaky pouzit:
1
In [1]: import pythonkniha
2 3 4
In [2]: pythonkniha . authors Out [2]: ( ’ Ondrej Sika < ondrej@ondrejsika . com > ’ , ) Pokud chceme nejakou specifickou verzi balicku, muzeme ji explicitne zadat, jinak se stahne ta nejnovejsi: 65
1
sudo pip install pythonkniha ==1 Pokud chcete balicek aktualizovat:
1
sudo pip install pythonkniha -- upgrade A nebo smazat:
1
sudo pip uninstall pythonkniha
14.3.2
git, github
Balicky muzete instalovat take z Gitovych repozitaru. Pro ty co se s Gitem nesetkali, Git je verzovaci nastroj ktery velmi pomaha pri vyvoji. Urcite je dobre jej znat a ovladat alespon jeho zakladni prikazy a pouziti. Pro vice informaci o zacatkach v Gitu se podivejte na dalsi moji knihu: Git kniha na adrese: http://ondrejsika.com/books/git-kniha. Pro pouzivani techto funkci je nutno mit GIT nainstalovany. 1
sudo apt - get install git Pokud instalujeme balicek z gitu, muze to vypadat takto:
1
sudo pip install git + https :// github . com / ondrejsika / pythonkniha - package . git Github je sluzba hostujici repozitare ruznych opensource projektu. Je to nejpopularnejsi sluzba na sdileni opensource kodu. Ovsem neni jedina, existuje jeste bitbucket.org, gitlab.com, ... Misto nazvu baliku je git+ a cesta k repozitari. Muze byt i prez ssh, ale musite mit svuj klic na Githubu. 66
Muzeme si take vybrat z jake vetve nebo revize balicek nainstalujeme, to se dela podobne jako verze u klasicke instalace z pypi. 1
sudo pip uninstall git + https :// github . com / ondrejsika / pythonkniha - package . git == stable
14.3.3
instalace ze zdroju
Posledni moznosti je instalace balicku ze zdroju, tato moznost neni tak casta, protoze vetsinou jsou balicky v pypi a nebo jsou na Githubu. Kazdy balicek obsahuje soubor setup.py ve kterem jsou zakladni informace o balicku a zaroven timto soborem balicek instalujeme. Dale se dozvime jak takovyto soubor vytvorit a udelat si vlastni balicek. Pokud si stahneme a rozbalime balicek pythonkniha do slozky, bude obsahovat tyto 2 soubory: pythonkniha.py a setup .py. Pro instalaci spustte prikaz: 1
sudo python setup . py install Odstraneni baicku je zase prez pip uninstall.
14.4
Tvorba vlastniho balicku
Zde si ukazeme jak vytvorit co nejjednodussi Python balickek. Pokusim se napsat jednoduse to co jsem blogoval [6]. 67
Vytvorime si jednoduchy balicek, ktery bude obsahovat soubor s jedinou promennou authors. Vytvorime si adresar ve kterem budeme balicky tvorit, ja si vytvorim ~/pypi/ a v nem si jeste udelam adresar pythonkniha coz bude muj balicek. Ted v nem vytvorim 2 soubory, pythonkniha.cz a setup.py . V prvnim souboru je nase logika, nase knihovna. Ted je to jen jedna promenna, ale pro nasi ukazku to staci. V druhem souboru je nastaveni balicku a zaroven jeho instalator (viz. instalace ze zdroju). Soubor pythonkniha je velmi jednoduchy: 1
authors = ( ’ Ondrej Sika < ondrej@ondrejsika . com > ’ , ) To je cela nase knihovna, muzeme z ni zjistit kdo je autor :) 14.4.1
setup.py
Soubor setup.py je trozku slozitejsi, ale ne o moc. Obsahuje nejake zakladni informace o balicku. Toto je ukazka nejjednodusi verze balicku: 1
from setuptools import setup
2 3 4 5 6 7
setup ( name = ’ pythonkniha ’ , version = ’1 ’ , py_modules = [ ’ pythonkniha ’] , )
68
Samozrejme do balicku muzeme pridat ruzna data jako je autor, mainteiner, zarazeni balicku, licence, ... setup.py potom muze vypadat treba takto: 1
from setuptools import setup
2 3 4 5 6 7 8 9 10
11
12 13 14
15
16
17
18 19
setup ( name = ’ pythonkniha ’ , version = ’1 ’ , py_modules = [ ’ pythonkniha ’] , author = ’ Ondrej Sika ’ , author_email = ’ ondrej@ondrejsika . com ’ , url =" https :// github . com / ondrejsika / pythonkniha - package " , license =" http :// ondrejsika . com / license / mit . txt " , description =" Example Python package " , classifiers =[ ’ Programming Language :: Python :: 2.7 ’ , ’ Programming Language :: Python :: 3 ’ , ’ Programming Language :: Python :: 3.3 ’ , ’ Programming Language :: Python :: 3.4 ’ , ], ) Vsechny parametry lze najit v dokumentaci
69
15 15.1
Prace se soubory Cteni ze souboru
Nejdrive je nutne soubor otevrit, to se dela funkci open. Potom muzu precist obsah souboru pomoci read: 1
In [1]: file = open ( ’ file . txt ’)
2 3 4
In [2]: file . read () Out [2]: ’ Hello ,\ nI am a text file \n ’ Nebo mohu cist soubor po radkach:
1
In [1]: file = open ( ’ file . txt ’)
2 3 4
In [2]: file . readline () Out [2]: ’ Hello ,\ n ’
5 6 7
In [3]: file . readline () Out [3]: ’I am a text file \n ’
8 9 10
In [4]: file . readline () Out [4]: ’’
15.2
Zapis do souboru
Zapis je vemi podobny cteni, zase je treba otevrit soubor ale musime dodat jeste jeden attribut a to mod otevreni souboru. Defaultni mod je "r" jako read a pro zapis muzeme pouzit "w" (write) pro prepsani celeho souboru a nebo "a" (append) pro pripsani dat. 70
Pokud soubor kam chceme zapisovat neexistuje, sam se vytvori. 1
In [1]: file = open ( ’ file2 . txt ’ , ’w ’)
2 3
In [2]: file . write ( ’ Hello \n ’)
4 5
In [3]: file . write ( ’ world \n ’)
6 7
In [4]: file . close () Metoda close zapise vsechny zmeny v souboru. V souboru je toto:
1 2
Hello world Pokud ted pouzijeme znovu stejny postup s write modem, obsah souboru se prepise
1
In [1]: file = open ( ’ file2 . txt ’ , ’w ’)
2 3
In [2]: file . write ( ’ Ahoj \n ’)
4 5
In [3]: file . write ( ’ svete \n ’)
6 7
In [4]: file . close () V souboru je toto:
1 2
Ahoj svete Pokud pouziji mode append mohu k souboru pripsat dalsi text. 71
1
In [1]: file = open ( ’ file2 . txt ’ , ’a ’)
2 3
In [2]: file . write ( ’ jeste neco \n ’)
4 5
In [3]: file . close () V souboru je toto:
1 2 3
Ahoj svete jeste neco
15.3
Prace se souborovym systemem
Pro praci se souborovym systemem musime importovat knihovnu os. 15.3.1
Kopirovani souboru
Pro kopirovani je potreba knihovna shutil. 1
In [1]: import shutil
2 3
In [2]: shutil . copy ( ’ file2 . txt ’ , ’ file3 . txt ’)
15.3.2
Presouvani souboru
To uz jde udelat pomoci knihovny os. 1
In [1]: import os
2
72
3
In [2]: os . rename ( ’ file3 . txt ’ , ’ file4 . txt ’) Tato funkce pouze presouva soubor. Nedokaze vytvorit slozku kam by se mel novy soubor presunout. To je mozne udelat funkci os.renames, o ktere si murete precit v dokumentaci. 15.3.3
Vytvareni adresaru
Prikaz funkce os.mkdir vytvori jeden adresar, funkce os. makedirs vytvori vsechny potrebne rodicovske adresare. 1
In [1]: import os
2 3
In [2]: os . mkdir ( ’ newdir ’)
4 5
In [3]: os . makedirs ( ’ newdir2 / otherdir ’)
15.3.4
Mazani souboru a adresare
Prikaz funkce os.remove smaze soubor, funkce os.rmdir smaze prazdny adresar. 1
In [1]: import os
2 3
In [2]: os . remove ( ’ file4 . txt ’)
4 5
In [3]: os . rmdir ( ’ newdir ’) Pokud chceme mazat rekurzivne, to znamena vsecny soubory a slozky, muzeme pouzit zase funkci z shutil. 73
1
In [1]: import shutil
2 3
In [2]: shutil . rmtree ( ’ newdir2 ’)
74
16
Vyjimky
Python ma hezky zpracovany system vyjimek. Pokud nastane nejaka chyba, python ji propaguje dokud se neodchyti. Pokud ji nikdo neodchyti, program spadne. Je hodne druhu vyjimek, toto jsou nejcastejsi: • ValueError • TypeError • IndexError • KeyError • ZeroDivisonError • ...
16.1
try/except
Pro odchyceni vyjimky se pouziva try/except bloky. V bloku try provadime kod kde ocekavame chybu a v bloku except chybu zpracovavame. Ukazeme si jednoduchy priklad. Mame jako parametr skriptu cislo stranky kterou ma zobrazit. Uzivatel ovsem zadava text a ne cislo, pokud ho zada spatne a Pythou se jej nepodari pretypovat, tak vyhodi chybu. Ta urcite neni hezka a radeji bychom uzivateli vypsali neco ve smyslu musite zadat cislo. Prvni ukazka je co se stane, kdyz nebudete chybu odchytavat: 1
In [1]: int ( input () ) 75
2
a
3 4
ValueError : invalid literal for int () with base 10: ’a ’ A druha je s odchycenim chyby:
1 2 3 4 5 6 7
In [1]: try : ...: int ( input () ) ...: except : ...: print ( ’ Zadejte cislo ’) ...: a Zadejte cislo Tohle je trosku nebezpecne odchyceni chyby, protoze odchyti vsechny chyby. Pokud v nem napiseme syntaxovou chybu a nevsimneme si ji, program bude pokazde rikat zadejte cislo i kdyz cislo bude zadano spravne.
1 2 3 4 5 6 7 8
In [1]: try : ...: int ( input () ) ...: syntax error ...: except : ...: print ( ’ Zadejte cislo ’) ...: 1 Zadejte cislo Muzeme ovsem zajistit aby se odchitila jen nektery typ chyb. Pokud chceme odchytit jen nektery typ, muzeme jej specifikovat pri volani except. Prvni ukazka bude fungovat stejne, druha ovsem propusti syntax error spravne.
1
In [1]: try : 76
2 3 4 5 6 7
8 9 10
...: int ( input () ) ...: syntax error ...: except ValueError : ...: print ( ’ Zadejte cislo ’) ...: File " < ipython - input -1 - ec2c1b3aa215 >" , line 3 syntax error ^ SyntaxError : invalid syntax Muzeme ovsem chtit odchytit vice vijimek najednou, musime zadat jako n-tici nebo jako seznam.
1 2 3 4 5
In [1]: try : ...: item = items [ int ( index ) ] ...: except ( ValueError , IndexError ) : ...: print ( ’ Zadejte cislo ’) ...: Pokud cheme dostat objekt chyby pro dalsi zpracovani pridame dalsi promennou do except bloku:
1 2 3
4 5 6
In [1]: try : ...: item = items [ int ( index ) ] ...: except ( ValueError , IndexError ) , err : ...: print ( ’ Zadejte cislo ’) ...: send_error_mail ( err ) ...:
77
16.2
raise
Mozna budete potrebovat nejakou chybu vyvolat vy. K tomu slouzi volani raise. Napriklad kdyz mame nejakou funkci, ktera pracuje jen z kladnymi cisly, je pro nas zaporne cislo na vstupu ValueError . 1
In [1]: val = -5
2 3 4
5
In [3]: if val < 0: raise ValueError ( ’ Must be positive number ’) ...:
6 7
ValueError : Must be positive number
16.3
assert
Assert se pouziva pro jednoduche kontroly, jejim vstupem je vyraz, pokud neni true, vrati chybu: 1
In [1]: assert 1 == 1
2 3 4
5
In [2]: assert 1 == 2 < ipython - input -2 - a810b3a4aded > in < module >() ----> 1 assert 1 == 2
6 7
AssertionError : Assert vrati AssertionError, my mu muzeme nastavit chybovou hlasku. 78
1
2
3
In [1]: assert 1 == 2 , ’ numbers are not equals ’ < ipython - input -1 - e1ca344d24cb > in < module >() ----> 1 assert 1 == 2 , ’ numbers are not equals ’
4 5
AssertionError : numbers are not equals A to je asi vse co je do zacatku nutne znat o chybach.
79
17
Shrnurti
Touto moji prvni knihou jsem chtel ukazate ze zacit programovat neni tak tezke a doufam ze se mi to povedlo. Pokud by vas zajimalo, jak vase nabyte znalosti Pyhonu pouzit na webu, doporucuji Flask knihu (http://url.os1.cz/flask-kniha), dozvite se v ni od zakladu jak spoustet svuj Python kod na webu. Doufam, ze se vam libila. Prosim, napiste mi vas nazor a pripominky na
[email protected] a neco tweetnete :) Za zpetnou vazbu budu velmi rad.
80
Reference [1] Python 3.4.3 documentation (site). (brezen 2015). https://docs.python.org/3.4/ [2] Python (site). (brezen 2015). https://www.python.org/ [3] Wikipedia: Python. (brezen 2015). https://cs.wikipedia.org/wiki/Python [4] RNDr. Tom´aˇs Holan, Ph.D.: Programov´an´ı II: Slajdy z druh´e pˇredn´aˇsky. (brezen 2015). http://ksvi.mff.cuni.cz/~holan/sl_2014_LS_02. pdf [5] Daryl Harms, Kenneth McDonald: Zaˇc´ın´ame Programovat v jazyce Python. Computer Press, Brno, 2008. ISBN 978-80-251-2161-0. [6] Python Blog: Tvorba Python bal´ıˇcku. (brezen 2015). https://pythonblog.cz/2013/08/09/tvorbapython-balicku.html
81
ISBN 978-80-7340-097-2
9 788073 400972