IB111 Základy programování Radek Pelánek 2018 Dnešní prednáška • shrnutí základů, zkouškový Kahoot • vývojová prostředí, editory • správa verzí • knihovny, praktický vývoj v Pythonu • přehled programovacích jazyků o návaznosti IB111 shrnutí o shrnutí základních témat • co je potřeba hladce umět pro další studium • upozornění na problematické body 4 □ ► < SI ► < Řízení toku výpočtu • podmíněný příkaz • cykly: for, while o funkce, return 4/69 Datové typy • čísla (int, float) • řetězce • seznamy, n-tice • slovníky 5/69 Indexování • indexování od nuly • rozlišování mezi: • indexem i • hodnotou na příslušné pozici a [i] • rozdíl mezi indexováním seznamu a slovníku • vnořené struktury, indexování • data[x] [y] vs. data[x,y] • interpretace indexování „zleva" 4 □ ► < SI ► < • základní řadicí algoritmy: bubble sort, select sort, insert sort a použití vestavěného řazení • sorted(alist) vs. alist. sort () • řazení podle kritéria: key • dekompozice problému na funkce • čistá funkce, vedlejší efekt • předávání parametrů, změna parametrů • rozlišování, vhodné použití: • funkce, která mění parametry • funkce, která vrací nový objekt Proměnné • globální, lokální • vytvoření aliasu vs. kopie (mělká, hluboká) • měnitelné vs. neměnitelné typy • indexování slovníku • předávání parametrů funkcím 9/69 • základní princip se b e-reference • čtení, interpretace rekurzivního kódu • jednoduchá rekurze s návratovou hodnotou Objekty • rozlišení „třída" vs. „objekt" • metody, datové atributy • vestavěné typy jsou objekty, použití objektové notace • vlastní definice jednoduchých tříd, použití objektů • __init__ • metody, význam self • datové atributy 11/69 Čtení komplexních výrazů • výrazy podle priorit operátorů • volání funkcí „zevnitř" • indexování, tečková notace „zleva" len(alice.mother.daughters[0].daughters) data[x][get_value(a, b[3])] putpixel(get_coordinates(n), change_color(getpixel((x,y)))) • základní představa, co je (není) „pěkný" kód • PEP8 doporučení • komentáře, dokumentace 13/69 Vývojová prostredí, editory IDLE dostatečný pro jednoduché příklady, do budoucna chcete něco lepšího... žádoucí vlastnosti editoru: • syntax highlighting • odsazování, párování závorek • autocomplete, suggest • PEP8 kontrola • podpora ladění • podpora refaktorizace • ... 14/69 Vývojová prostredí, editory příklady různých typů editorů: • IDLE základní editor používaný v tomto kurzu • emacs, vi (+příkazová řádka) obecné editory, příp. se specifickou konfigurací • pyCharm „silný" editor speciálně pro Python, vhodné obzvlášť pro velké projekty • ipython, jupyter interaktivní použití (prolínání program a výsledků), v prohlížeči In [14]: rnd.seed(33) dicethrow = rnd.randint(l, 6+1, lae) side = np.zerDs(6, dtype='int') for i in range(6): side[i] = np.count_nonzero(dicethrow == i + 1) print('number of times', i + 1, 'is', side[i]) print('total number of throws ', sum(side)) number of times 1 is 17 number of times 2 is 17 number of times 3 is 15 number of times 4 is 24 number of times 5 is 19 number of times 6 is 8 total number of throws 19S Back to Exercise 1 Answers to Exercise 2 In [15]: N = 1000 tails = np.sum(rnd.randint(0, 1 + 1, (5, 1000)), axis=0) counttails = np.zeros(6) for i in range(6): counttails[i] = np.count_nonzero(tails == i) plt.plot(range(0, 6), counttails / N, 'bo') pit.xlabel('number of tails in five flips') pit.ylabel('probability'); c 3C n 25 J 0.20 - f 0.15 C LC D 05 0 12 3 4 5 number of tails in five flips http://nbviewer.jupyter.org/github/mbakker7/exploratory_computing_with_python/blob/niaster/ notebook9_discrete_random_variables/py_exploratory_conip_9_sol.ipynb 16/69 xkcd: Real Programmers nano? REAL PROGRAMMERS USE emocs \ HEY REAL USE vin- TKE^OPEN THEIR HANDS M> LET THE i WELL, REAL USE ed- I NO, AE^L pR0GRAnri£ft6 USE art. THE DISTURBANCE RIFPLE5 O/TWARD, CHANGING THE ELOU OFTHF/EPDY CURRENTS IN THE UPPER ATMOSPHERE► 1 H^i JU REAL FflOGRAnrEfcS USE A MAGNETIZED NEEDLE AND A STEADV HAND. / WHICH ACT AS LEASES THAT DEFLECT INCOMING C0$t\\Z RAYBr FOCUSINGTHEn TO STRIKE THE DRIVE PLATTER AND FLIP THE DESIRED BFT. THESE CAUSE MOflCVTTrtRf ROCKETS OF HIGHER-PRESSURE AlRTOCOfln, excise he Bur real PROGrwinE^G U5E 6UTTERFUE&. \ mice. tOURSE THERE5 AW ET1AC5 COMMAND TO DO THAT oh YEftHi Good ql dtoit; efiacs. https://xkcd.com/378/ 17/69 Správa verzí • naivní přístup: • myprogram.py, myprogram2.py, myprogram_oct_24. py • myprogram_zaloha.py, myprogram_pokus.py • myprogram_f inal. py, myprogram_really_f inal. py • sofistikovanější přístup - „version controľ' o automatizavaná správa verzí • podpora týmové práce • mnoho různých řešení: git, cvs, svn, ... 18/69 • současné populární řešení a distributed revision control • GitHub - repozitář, (primárně) veřejné projekty • gitlab.fi.muni.cz - repozitář na Fl, umožňuje snadno vytvářet soukromé projekty 19/69 další témata pro praktické použití: • funkcionální prvky: map, filter, lambda funkce, ... • obecnější předávání parametrů, indexování, využití objektů, práce se soubory, ... • iterátory, výjimky, ... • využívání modulů Python moduly užitečné moduly v základní distribuci • math: matematické funkce • random: náhodná čísla • sys: „systémové" funkce a proměnné • os: spolupráce s operačním systémem • re: regulární výrazy • datetime: práce s časem • json: práce se soubory ve formátu JSON Python knihovny, frameworky Příklady známých „externích" knihoven: • Django: webový framework • NumPy, SymPy, SciPy: efektivní numerické výpočty, symbolické výpočty, vědecké výpočty, statistika a Pandas: práce s daty (především „tabulkovými"), SQL-like operace • matplotlib: tvorba grafů, vizualizace • pygame: vývoj her • scrapy: „scrapování" dat z webu • Tensorflow: strojové učení, deep learning • přehled • klasifikace, vlastnosti • historie • způsoby užití • neseriózní postřehy 23/69 nterpretace, kompilace kompilovaný program zdrojový kód (program) překladač /-\ strojový kód f-N vstupy ^ -i (--> bezici /-\ výstupy ^ -i program ^ -i interpretovaný program zdrojový kód (program) interpret ^ -i výstupy vstupy 24/69 Programovací jazyky: klasifikace I nízko-úrovňové • kompilované • nutnost řešit specifika konkrétního systému • explicitní práce s pamětí • náročnější vývoj (nízká efektivita práce) • vysoká efektivita programu • interpretované • nezávislé na konkrétním systému • využití abstraktních datových typů • snadnější vývoj (vysoká efektivita práce) • nižší efektivita programu nikoliv dvě kategorie, ale plynulý přechod; zjednodušeno vysoko-úrovňové 25/69 movacŕ jazyky: klasifikace II zjednodušená klasifikace a použití nízko-úrovňové C, FORTRAN, ... vestavěné systémy, rychlé výpočty objektové C++, Java, C#, ... klasické aplikace, rozsáhlé systémy skriptovací Python, PHP, JavaScript, Perl, ... programování pro web, skriptování, prototypy deklarativní Prolog, LISP, Haskell, ... umělá inteligence Jazyky se liší v práci s typy MV NEW LAMGUAGC íbOB&tí; I3ur IT => v KJ> 'M] => Tfl* cs {1/6} tfl> (2/0)+2 = > NflP _ > ''+'" = y fjrl&e = > TRUE Oo] > +2 = > 12 [lfl> 2+2 = > DOME > RANIGEO, 5) [13] > FL00R(!0.5) = > I = > I = > I = > I___!0,5___ https://xkcd.com/1537/ 27/69 3 Programming Language Family Tree H 1950 1955 19Ö0 1965 1970 1975 1980 1935 1990 1995 Assembler Algol-W Pascal M o dula-£ Modula-3 -—-__ Obefon-2 |C omp orient Pascal 2000 1 November, 2000 APL ML 1 I'.'Iiüitl'il 1 Has ksll Fortran 90 (C) Fachhochschule Aargau Fir Technic, Wirtschaft und Gestaltung ■] Q Nord westschwei! A family tree of languages Some of the 2400 + programming languages Fortran LISP 29/69 Historie programovacích jazyků prapočátky: • 19. století: Charles Babbage, Ada Lovelace, děrné štítky, • 30. léta: teoretické základy programování, Turingův stroj, lambda kalkul (Alonzo Church) • 40. léta: první počítače, strojový kód, asembler 30/69 Historie programovacích jazyků 50. a 60. léta: první vysokourovňové jazyky (v některých aplikacích přežívají dodnes) • ALGOL • COBOL • FORTRAN - vědecko-technické výpočty (užíván stále) • BASIC • „jazyk pro začátečníky" • Beginner's All-purpose Symbolic Instruction Code • rozšířen v 70. a 80. letech na „mikropočítačích" • výborný jazyk pro vytvoření špatných programátorských návyků 32/69 INPUT "What is your name: "; U$ 20 PRINT "Hello 11; US 30 INPUT "How many stars do you want: "; N 40 S$ = " 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want more stars? "; A$ 100 IF LEN(AS) = O THEN GOTO 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" OR AS = "y" THEN GOTO 30 130 PRINT "Goodbye U$ 140 END https://en.wikipedia.org/wiki/BASIC Historie programovacích jazyků • 70. léta • rozvoj základních paradigmat (imperativní, objektové, funkcionální, logické) • C, Pascal, Prolog • 80. a 90. léta • další rozvoj jazyků, specializace, nové prvky související např. s nástupem internetu • C++, Perl, Haskell, Ruby, R, Java, JavaScript, PHP • současnost • nové verze jazyků 9 vznik nových jazyků: Go, Dart, Kotlin, Julia Rosseta Code • rosettacode.org • stejné problémy řešené v mnoha programovacích jazycích programming languages were • weapons https : //9gag. com/gag/anXEbeO/if-programming-languages-were-weapons • religions http: //blog. aegisub. org/2008/12/if-programming-languages-were-religions . html • boats http: //compsci . ca/blog/if-a-programming-language-was-a-boat/ • vehicles http://crashworks.org/if_programming_languages_were_vehicles/ killing a dragon: https : //blogs . oracle. com/roumen/how-to-kill-a-dragon-with-various-programming-languages 36/69 důležitý aspekt přehledu: různé jazyky mají různé rysy, (ne)výhody a aplikační domény nedůležitý aspekt přehledu: volba citátů a přirovnání (značně subjektivní, pro zpestření, ...) 37/69 C would be Judaism - it's old and restrictive, but most of the world is familiar with its laws and respects them. The catch is, you can't convert into it - you're either into it from the start, or you will think that it's insanity Also, when things go wrong, many people are willing to blame the problems of the world on it. C is a nuclear submarine. The instructions are probably in a foreign language, but all of the hardware itself is optimized for performance. 4 □ ► 4 ^ >■ 4 > 4 S ► 38/69 • nízko úrovňové programování • „blízko hardwaru" o optimalizace rychlosti výpočtu 39/69 mnoho jazyků staví na syntaxi C základní rozdíly oproti Pythonu: • vyznačování bloků kódu, (ne)významnost bílých znaků • explicitně typovaný jazyk 40/69 C syntax: ukázka ciferný součet #include int SumDigits(unsigned long long n, const int base) { int sum = 0; for (; n; n /= base) sum += n °/0 base; return sum; } int main() { printf (,,0/0d °/0d °/0d\nM, SumDigits(1, 10), SumDigits(12345, 10), SumDigits(123045, 10)); return 0; } 41/69 Objektové jazyky odvozené od C Ch—h, C^, Java, ... 9 kompilované (Java - bytecode) • (většinou) explicitně typované • typicky „silně objektové" • vhodné pro „velké projekty" C++ is a set of nunchuks, powerful and impressive when wielded but takes many years of pain to master and often you probably wish you were using something else. 43/69 Java is a cargo ship. It's very bulky. It's very enterprise^ y. Though it can also carry a lot of weight. Will carry a project, but not very fun to drive. 4 □ ► 4 ^ >■ 4 > 4 S ► 44/69 Java: Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } 45/69 interpretované, „skriptovací" jazyky • JavaScript • Python • Perl • PHP • Ruby typické užití: vývoj webu (front-end, back-end), zpracování dat, skriptování, prototypová ní, ... 4 ^ >■ 4 ± k < -Š ► 46/69 interpretované jazyky flexibilnější než kompilované typická ukázka: příkaz eval • „vyhodnocení výrazu v řetězci" • může usnadnit práci • ale nebezpečné (zejména nad uživatelským vstupem) 47/69 JavaScript is a sword without a hilt. 48/69 a i přes podobnost názvu nemá s Javou mnoho společného • interpretovaný jazyk • „jazyk webového front-endu" 49/69 PHP is a bamboo raft. A series of hacks held together by string. Still keeps afloat though. Ruby is difficult to describe. It's sleek, sexy, and very fun to drive. Here's a picture. Very trendy. 51/69 Perl would be Voodoo - An incomprehensible series of arcane incantations that involve the blood of goats and permanently corrupt your soul. Often used when your boss requires you to do an urgent task at 21:00 on friday night. Perl used to serve the same purpose as Python, but now only bearded ex-hippies use it. 4 □ ► 4 ^ >■ < ► 4 S ► 52/69 Deklarativní jazyky • imperativní programování: program je posloupnost instrukcí („jak" má počítač počítat) • deklarativní programování: program je popis toho, co se má udělat 53/69 Deklarativní jazyky • logické programování: Prolog 9 funkcionální programování: Lisp, Haskell typické užití: umělá inteligence, výpočty, „výuka principů, které využijete jinde" (funkcionální prvky dnes v mnoha dalších jazycích) Prolog is an Al weapon, you tell it what to do, which it does but then it also builds some terminators to go back in time and kill your mom. 4 □ ► 4 ^ >■ 4 > 4 S ► 55/69 mother_child(trude, sally). father_child(tom, sally). father_child(tom, erica). father_child(mike, torn). sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y). 56/69 Lisp is a shiv which comes in many forms. Anyone who uses this is probably crazy and dangerous. 4 □ ► 4 ^ >■ 4 > 4 S ► 57/69 Lisp: ideální jazyk pro milovníky závorek. (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) 58/69 code urittem iw hpřvbl IS GÜARPMTEED Tb HAVE no Side EfFßrra https://xkcd.com/1312/ 59/69 bsort :: Ord a => [a] -> [a] bsort s = case _bsort s of t I t == s -> t I otherwise -> bsort t where _bsort (x:x2:xs) I x > x2 = x2:(_bsort (x:xs)) I otherwise = x:(_bsort (x2:xs)) bsort s = s 60/69 Matematický software nástroje vyvinuté primárně jako „matematický software", ale obsahují obecný programovací jazyk • Mathematica • MATLAB • R 61/69 Mathematica Mathematica is a low earth orbit projectile cannon, it could probably do amazing things if only anyone could actually afford one. 62/69 Esoterické programovací jazyky „karikatury" programovacích jazyků - dobrá karikatura umožňuje uvědomit si důležité aspekty originálu • Brainfuck • AsciiDots • Whitespace • LOLCODE • OSTRAJava ++++++++++i «+++++++++++++++. >. +++, /#$<. *-w \#i/ HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE :-] >++.>+ banik pyco tryda Ostrava{ rynek(){ Konzola.pravit("Toz vitaj") pyco fajront pyco Jaký jazyk je nejlepší? 64/69 Jaký jazyk je nejlepšŕ? • neexistuje „univerzální" jazyk, každý má své (ne)výhody • lepší otázka: „Jaký jazyk je nejlepší pro danou situaci?" • problém, který řešíme • tým, který problém řeší • „legacy code" • učte se různé jazyky 4 ^ >■ 4 ± k < -Ž ► 64/69 Popularita jazyků těžko měřitelné, existuje řada pokusů různými metrikami • vyhledávání na webu • počty knížek o jazyku • výskyty v inzerátech • dotazy na StackOverflow (a podobných stránkách) • projekty na GitHubu (a podobných repozitářích) Popularita jazyků na vršku se vesměs vyskytují (abecedně): C, C++, Java, JavaScript, Python konkrétní příklad indexu popularity: TIOBE Programming Community Index Soli r; e: mvuv.tio íe. cc n 3; 25 2: 15 1: ^™ Java Python C++ — Visual Basic NET — C# JavaScript — PHP — SQL Objective-C 2002 2;;- 200S 2003 2010 2012 2014 2016 201B 66/69 dál? • algoritmy (směr k větší abstrakci) • IB002 Algoritmy a datové struktury I - programátorské úlohy v Pythonu • navazující IV003 Algoritmy a datové struktury II • programování podrobněji (směr k nižší abstrakci, jak funguje počítač) • PB071 Principy nízkoúrovňového programování - jazyk C, správa paměti, práce s řetězci • objektově-orientované programování • PB161 Programování v jazyce C++ (a navazující) • PB162 Programování v jazyce Java (a navazující) 67/69 Co dál? • jiná paradigmata • IB015 Neimperativní programování - Haskell, Prolog • více o jazyce Python a jiných jazycích • PV248 Kurz jazyka Python • PV249 Vývoj v jazyce Ruby • PV178 Uvod do vývoje v C#/.NET (a navazující předměty) • teorie programování, vyčíslitelnost a složitost - učí se v rámci různých předmětů (IB102, IB107) 68/69 vás programování baví! 69/69