Programovanie v PYTHONE Veronika Dillingerová 1 Programy vs Skripty •PROGRAM •súbor strojových inštrukcií spracovávaných priamo procesorom. •vzniká prekladom zdrojového kódu programovacieho jazyka. •Prekladané jazyky: –C/C++ – Fortran •SKRIPT •textový súbor obsahujúci príkazy a riadiace sekvencie, ktoré sú vykonávané interpreterom použitého skriptovacieho jazyka. •Skriptovací jazyky: –bash –gnuplot –awk –JavaScript –PHP 2 Programy vs Skripty •PROGRAM •ľahká optimalizácia •rýchle vykonávanie •nutnosť rekompilácie •nedá sa vytvárať samospustiteľný kód • •SKRIPT •nevyžaduje rekompiláciu •vytváranie samospustiteľného kódu •zlá optimalizovateľnosť •pomalšie vykonávanie • 3 4 Kompilované programovacie jazyky •(napr. Pascal, C, C++) •pred spustením sú najprv kompletne preložené kompilátorom •výsledkom je väčšia rýchlosť, ale tiež väčšia náročnosť na správne zapísaný kód 5 Interpretované programovacie jazyky •(napr. BASIC, Perl, Python, shell) •interpretované jazyky, které sa iba interpretujú (z toho dôvodu sú pomalšie) •interpretované jazyky, ktoré sa prekladajú, ale iba do medzikódu, nie do strojového kódu počítača (napr. Java, Python) 6 •Interpretované jazyky •ktoré sa po spustení za behu programu prekladajú do strojového kódu počítača •(napr. Java, pokiaľ sa použije systém JIT) •Skriptovacie jazyky •špecializované k riešeniu určitých problémov • Awk, Perl, html, Php, VBA, Bash 7 PYTHON 8 Volne dostupné výukové učebnice Pythonu •http://www.root.cz/knihy/oddeleni/vyvoj-a-knihypro-vyvojare/ • • •Think Python - Allen Downey (en) •Učebnice jazyka Python – Jan Švec 9 Vlastnosti jazyka •vysoko-úrovňový – velká miera abstrakcie •interpretovaný programovací jazyk ("skriptovací jazyk") •dynamicky typovaný programovací jazyk •voľne a ľahko dostupný na všetkých platformách •široká nabídka knihoven 10 Využití Pythonu •skriptovanie • vedecké výpočty (chemoinformatika, bioinformatika, ...) •webové aplikácie • administrácia • grafika • audio • networking • hry • aplikácie pre chytré telefóny • ... 11 Analýza dát 12 Python, NumPy, SciPy, Pandas, matplotlib, Kartograph, networkx, . . . Firmy používajúce PYTHON 13 Pracovné prostredie •IDE •IDE – vývojové prostredie •IDLE, Wing, PyStudio, Eclipse … • •Shell •Prostredie, kde sa vykonávaju prikazy priamo po napísaní •Príkazový riadok 14 Hello world! • print ("Hello World! ") • 1.Zadajte príkaz priamo do shellu 2.Vytvorte súbor MyFirstSkript.py a spustite ho pomocou F5 v IDLE (Python GUI) 15 Premenná (variable) •má svoj názov (identifikátor, identifier): a • odkazuje na miesto v pamäti, kde je uložená tzv. hodnota (value) premennej, prepojenie premennej a jej hodnoty robíme pomocou priradenia (assign) (=) • a = 1 • Python je jazyk s dynamickou typovou kontrolou (do premennej môžete uložiť čokoľvek, ale hodnoty si pamätajú svoj typ) • a = 10 + “a” •názov premennej sa môže skladať z malých (a veľkých) písmen (bez diakritiky), čísel a podtržítka (_), nesmie začínať číslom, podtržítkom začínajú špeciálne premenné •názov premennej sa nesmie zhodovať so žiadnym z 34 kľúčových slov jazyka Python: • and, as, assert, break, class, continue, def, del, elif, else, expect, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield, True, False, None 16 Základné dátové typy • boolean (booleovský typ) nadobúda buď hodnoty True nebo False • Čísla môžu byť celé (integer; 1 a 2), reálne (float; 1.1 a 1.2) nebo komplexné (complex; 3+1j). •Reťazce (string) sú postupnosti Unicode znakov. Tuto podobu môže mať napríklad html dokument. •Bajty (byte) a pole bajtov, napríklad súbor s obrázkom vo formáte jpeg. •Zoznamy (list) sú usporiadané postupnosti hodnôt. •N-tice (tuple) sú usporiadané, nemenné postupnosti hodnôt. •Slovníky (dictionary) sú neusporiadané kolekcie dvojíc kľúč-hodnota. 17 Matematické operátory •+ súčet (napr. 10 + 3) •- rozdiel (napr. 10 - 3) • * násobenie (napr. 10 * 3) •/ delenie (napr. 10/3) •// celočíselné delenie (napr. 10 // 3 = ??) •% modulo (zbytok po celočíselnom delení; • napr. 10 % 3 = ??) • ** umocňovanie (napr. 10 ** 3) •() zátvorky •abs() funkcia, ktorá vracia absolútnu hodnotu •round(x,2) zaokrúhli x na 2 desatinné miesta • •Špeciálne typy priradenia: += -= *= /= %= //= • a += 1 a = a + 1 18 Úloha •Vyriešte rovnicu • • •Pre x1 = 11 a x2 = 66 • •Výsledok zaokrúhlite na 4 desatinné miesta 19 Logické operátory •and a •or alebo •not negácia •== je rovno •! =, <> nie je rovno •> je väčšie •< je menšie •>= je väčšie alebo rovno •<= je menšie alebo rovno •is, is not je, nie je (napr.: 1 is int() alebo a is not None) • in, not in je v, nie je v (napr.: ’pes’ not in ’Harapes’ alebo ’a’ in ’test’) • •poradie operácií: matematické operácie; < > <= >=; == !=; •<>; is, is not; in, not in; not; and; or 20 Char (znak) •ľubovolný znak na klavesnici aj mimo ňu •Python nemá špeciálny typ pre znak, používa preňho string, ale má preňho vstavané funkcie •funkcia chr() vracia znak pre zadanú ASCII hodnotu •funkcia ord() vracia ASCII hodnotu pre zadaný znak 21 22 http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Ascii_Table-nocolor.svg/1000px-Ascii_Table -nocolor.svg.png Reťazec •je postupnosť znakov •Python rozpoznáva reťazce ohraničené úvodzovkami " a apostrofmi ’ • reťazec = "ja som reťazec" •Reťazce sa dajú – spojovať (reťaziť) pomocou operátoru + • "ahoj "+ "uživateli " –opakovať operátorom * • "ahoj " * 10 • pristupovať ku konkrétnemu znaku pomocou indexu • reťazec[0] alebo reťazec [1:4] • na reťazce môžeme volať vstavané funkcie • "ja som reťazec ".find("ja") • môžeme zisťovať dĺžku reťazca • len("test") 23 Prístup k hodnotám •môžeme pristupovať k akémukoľvek znaku pomocou jeho indexu string[x], kde kladné čísla od nuly určujú index zľava a zaporné čísla určujú index zprava • "Danny"[0] "Danny"[1] "Danny"[-1] •cez dvojbodku môžeme nadefinovať rozsah •string[x:y], kde tieto výrazy si odpovedajú: •string[:] == string •string[x:] == string[x:len(string)] •string[:y] == string[0:y] •čo bude výsledkom? •"Danny"[1:4] "Danny"[2:2] "Danny"[2:] •"Danny"[-2:] "Danny"[:2] "Danny"[:-2] 24 Vstavané funkcie •Hľadanie –count •string1.count(string2) • "Danny".count("ny") •vracia počet výskytu string2 v String1 –find •string1.find(string2) • "Danny".find("n") •vracia index prvého výskytu string2 v string1 • • •nahradzovanie a rozdeľovanie –replace •string.replace(old, new) • "Danny".replace("an", "e") •nahradí old za new v reťazci string –split •string.split(sep) • "1 2 3".split(" ") •Vracia list reťazcov, ktoré vzniknú rozdelením string podle sep 25 Zmena veľkosti •upper •string.upper() • "danny".upper() •zväčší všetky písmena • •lower •string.lower() • "DANNY".lower() •zmenší všetky písmena •title •string.title() • "danny je pes".title() •zväčší prvé písmena slov • •capitalize •string.capitalize() • "danny je pes".capitalize() •zväčší prvé písmeno reťazca 26 Vstup a výstup •Vstup: •raw_input() v Pythonu 2.x nebo input v Pythonu 3 •argumenty programu (cez modul sys): • import sys • if len(sys.args) > 1: • print sys.argv[1] • zo súboru •Výstup: • print() • sys.stdout a sys.stderr • do súboru • 27 Vstup zo súboru •otvorenie súboru open(name, mode) • módy: r , r+ , w , t , b • čítanie dát v súbore read • zápis dát do súboru write •uzatvorenie súboru close • •myfile = open("test.txt", "r") •data = myfile.read() •myfile.close() 28 Úloha •Stiahnite si súbor •Uložte do priečinku v ktorom pracujete (tam kde si ukládáte skripty) • •V skripte: •Otvorte súbor "Kocur v botach.txt" •Spočítajte výskyt slova "kocour" v texte •Vypíšte počet • 29 Vetvenie programu 30 Podmienka •if ‘podmienka‘: • print("Podmienka splnena.") • •if 9 > 5: • print("Deväť je väčšie ako päť.") • •age = 20 •is_man = True •if age >= 18 and is_man: • print("Plnoletý muž.") 31 Podmienka •if ‘podmienka‘: • print("Podmienka splnená.") •else: • print("Podmienka nesplnená.") • •if 9 < 5: • print("Deväť je menšie ako päť.") •else: • print("Deväť je väčšie ako päť.") •Podmienka if .. elif .. else •if ‘podmienka‘ and ‘podmínka2‘: • print("Podmienka splnená.") •elif ‘podmienka2‘: • print("Aspoň podmienka2 splnená.") •else: • print("Podmienky nesplnené.") 32 •Podmienka if .. else Úloha •Napíšte skript, ktorý načíta číslo zo štandardného vstupu a zistí, či je číslo deliteľné 3 alebo 5 alebo obomi. 33 Cykly 34 Podobne ako podmienky sa riadia logickým výrazom, ktorý rozhoduje o spustení príslušného bloku, tieto bloky môžu bežať i niekoľkokrát po sebe. Cyklus while •while ‘podmienka‘: • blok • blok • •i = 0 •while i < 10: • print(i) • i += 1 35 Úloha •Napíšte cyklus, ktorý vypíše prvých 10 čísel fibonacciho postupnosti •Fibonacciho postupnosť je postupnosť čísiel, v ktorej každý ďalší člen je súčtom dvoch predchádzajúcich. • • •(1, 1, 2, 3, 5, 8, 13, 21...) • • 36 F_n = F_{n-2} + F_{n-1} Cyklus for •cyklus s predom známym počtom opakovaní • •for i in ...: • blok • blok • •for i in range(10): • print(i) • • • • • • 37 data = [[i*j for i in range(10)] for j in range(10)] for row in data: print(sum(row)) Prerušenie cyklu •break vynúti ukončenie cyklu •continue vynúti ukončenie vykonávania bloku a spustí ďalšiu smyčku • •for i in range(100): • if i%3 == 0: • print("<3") • continue • if i >= 10: • break • print(i) 38 Úloha •Napíšte skript, ktorý vypíše štvorec zložený z písmen x, dĺžku zadá užívateľ •Napíšte skript tak, aby bol štvorec prázdny • X X X X X X X X • X X X X X X • X X X X X X • X X X X X X X X • •Aby funkcia print písala do riadku, je treba pridať na koniec čiarku , • print " X", 39 Typy polí •Zoznamy (List) • list = [“abc”, 1, 3.14] •N-tice (Tuples) • tuple = {“abc”, 1, 3.14} •Množiny (Set) • set = {“abc”, 1, 3.14} •Slovníky (Dictionary) • dict = {“string” : “abc”, “integer” : 1, “float” : 3.14} 40 List (zoznam) •patria do kolekcií, podobne ako N-tice a slovník • vytvárame pomocou hranatých zátvoriek [] •["a", "b", "c", "d"] •každý prvok má svoj automatický index, ktorý odpovedá poradiu 41 Práce se zoznamy •vytvorenie •zoznam1 = [1, 1, 2, 3, 5, 8, 13] •zoznam2 = list(zoznam1) •zoznam3 = zoznam1[:] •zoznam4 = zoznam1 # nejedna se o novy list, iba odkaz na starý •zoznam5 = range(2,20,2) # [2, 4, 6, 8, 10, 12, 14, 16, 18] • • pridávame prvky •zoznam1.append(21) # [1, 1, 2, 3, 5, 8, 13, 21] •zoznam2.insert(2, 90) # [1, 1, 90, 2, 3, 5, 8, 13] •zoznam3.extend([21, 34]) # [1, 1, 90, 2, 3, 5, 8, 13, 21, 34] •zoznam3.append([21, 34])# [1, 1, 2, 3, 5, 8, 13, [21, 34]] 42 Práca so zoznamami •mazanie •zoznam1.remove(1) # [1, 2, 3, 5, 8, 13, 21] •last = zoznam1.pop() # last = 21; [1, 1, 2, 3, 5, 8, 13] • výber pomocou []: rovnako ako u reťazcov •zoznam1[1] •zoznam1[1:5] •zoznam1[-2:] • prehodenie smeru •zoznam1.reverse() # [13, 8, 5, 3, 2, 1, 1] •Vyhľadávanie •zoznam1.index(5) # 4 •zoznam1.count(1) # 2 • zoradenie •zoznam = [1, 4, 3, 6, 2, 5] •zoznam.sort() # [1, 2, 3, 4, 5, 6] •zoznam.sort(reverse=True) # [6, 5, ... 43 • počítanie •zoznam1 = [1, 1, 2, 3, 5, 8, 13] •len(zoznam1) # 7 •sum(zoznam1) # 33 •min(zoznam1) # 1 •max(zoznam1) # 13 • •prechádzanie •for item in [1, 2, 3]: • print(item) •for i in range(0,len(zoznam1)): • print(zoznam1[i]) •for item in (zoznam1): • print (item) • • • 44 Práca so zoznamami Tuple (N-tice) •vytvárame pomocou jednoduchých zátvoriek () •môžeme s nimi pracovať podobne ako so zoznamami, iba ich nemôžeme meniť, tzn. že funkcia append a ďalšie nie sú dostupné •môžeme jednoducho prevádzať na list pomocou list((1,2)) a podobne späť tuple([1,2]) 45 Množiny •Neusporiadaná množina jedinečných hodnôt •Vytvorenie: A={1,2,3}; B={3,4,5} • •Prienik A&B # {3} •Zjednotenie A|B # {1, 2, 3, 4, 5} •Rozdiel A-B # {1, 2} •Symetricky rozdiel A^B # {1, 2, 4, 5} 46 Množiny •Základné operácie s množinami • •len(s) # vráti počet prvkov •x in s # testuje či je x v množine •s.issubset(t) # testuje či každý prvok množiny s je v t •s.union(t) # nová množina obsahujúca prvky s aj t •s.intersection(t) # množina s prvkami v oboch •s.difference(t) # to isté ako s-t •s.symmetric_difference(t) # v s alebo t ale nie v oboch 47 Dictionary (slovník) •vytvárame pomocou zložených zátvoriek {} •{1: one, 2: two} • prvok v slovníku sa skládá z kľúča a jeho hodnoty •1 a 2 sú kľúče, ich hodnoty sú one, resp. two • nefungují zde indexy, na hodnoty sa dotazujeme pomocou kľúča • každý kľúč je unikátny, žiadny slovník nemôže obsahovať dva rovnaké kľúče 48 Operácie so slovníkmi •vytvorenie •dict = {’Name’: ’Zara’, ’Age’: 7, ’Class’: ’First’} •čítanie •print(dict[’Name’]) # Zara • úprava hodnôt •dict[’Age’] = 8 # úprava stávajúcej hodnoty •dict[’School’] = "DPS School„ # pridanie novej • zmazanie hodnôt •del dict[’Name’] •dict.clear() # zmaže všetky položky •del dict # zmaže celý slovník •prechádzanie hodnôt •for key in dict: • print(key) • print(dict[key]) 49 Funkcie •opakované spúšťanie rovnakého (veľmi podobného) kódu na rôznych miestach algoritmu •ľahšie uvažovanie o problému, deľba práce 50 Funkcie •funkcia je časť programu (je podprogram, angl. subroutine), ktorá sa dá volať opakovane z rôznych častí programu • každá funkcia má svoj identifikátor (podobne ako premenná), pomocou ktorého ju môžeme volať • moja_funkcia() • požiadavky na funkciu môžeme špecifikovať pomocou parametrov • moja_funkcia(parametr1, parametr2) • výsledok funkcie môže byť predaný ako návratová hodnota • navratova_hodnota = moja_funkcia() 51 Definice funkce •pomocou kľúčového slova def a bloku • def moja_funkcia(parameter): • pass • •návratovú hodnotu definujeme kľúčovým slovom return, •POZOR: po jej zavolaní sa už v prevádzaní funkcie nepokračuje • def moja_funkcia(parameter): • print() • return True • print() # nedosiahnuteľný kód • •pomocí return môžeme navracať hodnotu, hodnotu premennej alebo tiež nič (None) • def moja_funkcia(parameter): • return 52 Funkcie - príklady 53 Rekurzia •definovanie funkcie pomocou seba samej •funkcia, ktorá v svojom tele volá samu seba •volanie funkcie je vždy podmienené, aby bolo zaručené, že výpočet skončí • •def sequence(n): • if n > 1: • sequence(n-1) • print(n) • • 54 Úloha •Napíšte funkciu, ktorá vráti faktoriál zo zadaného čísla • •def faktorial(a): • … • return faktoral 55 Úloha •Napíšte funkciu, ktorá zistí či zadaný reťazec je palyndrom •Palyndrom je ľubovoľná postupnosť symbolov, ktorá je rovnaká (má rovnaký význam) pri čítaní z oboch strán (zľava doprava i sprava doľava). •oko, kajak, jelenovi pivo nelej, 191 ... •Bez diakritiky •Zjednodušenie: –Zadávanie reťazca bez medzier –Všetky písmená malé/veľké 56