IB111 Základy programování Radek Pelánek 2018 Rozcvička 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 12 4 5 6 7 8 9 10 11 12 13 5 6 7 8 9 10 11 12 13 14 6 7 8 9 10 11 12 13 14 15 7 8 9 10 11 12 13 14 15 16 8 9 10 11 12 13 14 15 16 17 9 10 11 12 13 14 15 16 17 18 10 11 12 13 14 15 16 17 18 19 Základní konstrukce • proměnné, operace • řízení toku výpočtu: • podmiňovací příkaz (if-else) • cykly (for, while) • funkce • důraz na princip použití (k čemu to je), ilustrace použití, přemýšlení o problému • ilustrace na příkladech • zdůraznění častých problémů • syntax (zápis) jen zběžně, zdaleka ne vše z jazyka Python • syntax je však potreba také umět! • cvičení 9 samostudium, např. howto.py.cz • některé aspekty zjednodušeně, později v kurzu podrobněji nŕ poznámky k syntaxi • „case sensitive" - velikost písmen důležitá • diakritika, české názvy - Python 3 umožňuje, al predmetu se držíme anglických písmen a názvů o komentáře - symbol # 4 □ ► 4 ť5P ► 4 Proměnné: príklad Problém: vypočítat výšku mostu na základě času pádu koule vstup: čas výstup: výška t = float(input()) h = 0.5 * 10 * t * t print(h) >0 q,o • udržují hodnotu • udržovaná hodnota se může měnit - proto proměnné • typy: • číselné: int, float, ... • pravdivostní hodnota (bool) • řetězec (string) • seznam / pole • slovník Názvy proměnných o posloupnost písmen, číslic a znaků '_' • bez mezer, více slov pomocí: • lower_case_with_underscores, CamelCase, mixedCase • nelze použít klíčová slova (if, while, and, True, ...) • lze použít některé další prvky jazyka (napr. názvy typů), ale není to vůbec dobrý nápad Výrazy a operace • výrazy: kombinace proměnných a konstant pomocí operátorů • operace: 9 aritmetické: sčítání, násobení, ... • logické: and, or, not, ... • zřetězení řetězců • ... • preference operátorů, pořadí vyhodnocování Proměnné a výrazy: příklady x = 13 y = x 7, 4 y = y + i y += i # modulo a = (x==3) and (y==2) b = a or not a s = "petr" t = "klic" u = s + t z = x + s # error: cannot add int and string is v Pythonu: přirazení, rovnost • přiřazení = x = 3 znamená „přiřaď do x hodnotu 3" • test na rovnost == x == 3 znamená „otestuj zda v x je hodnota 3" • častá chyba: záměna = a == • varování: is x is 3 se chová zdánlivě jako ==, ale jsou tam roz pokročilý programovací prvek, teď nepoužívat! Zápis v Pythonu: operace • většina operací „intuitivní": + , *, /9 and, • umocňování: ** • dělení se zbytkem: °/0 • celočíselné dělení: // • zkrácený zápis: „y += 5" znamená „y = y + 5 3 + 2**3 < 15 or "pes" == "kos" poradí vyhodnocování vesměs intuitivní („jako matematice") pokud na pochybách: o konzultujte dokumentaci • závorkujte zkrácené vyhodnocování: 1+1 == 2 or x == 4 □ ► 4 ť5P ► 4 Operace, pořadí vyhodnocování Operator Description lambda Lambda expression if — else Conditional expression or Boolean OR and Boolean AND not X Boolean NOT in, not in, is, is not, ■:, <=, >, > = , ■;>, L=, == Comparisons, including membership tests and identity tests, 1 Bitwise OR - Bitwise XOR Bitwise AND Shifts + > " Addition and subtraction Multiplication, division, remainder [3] Positive, negative, bitwise NOT Exponentiation [9] x[index], x [ index.: index] , x {arguments L L L) , x.. attribute Subscription, slicing, call, attribute reference (expressions L L L ) 5 [ expressions L L L ] , { key [ datum i i L } , " expressions ■ ■ ■ ^ Binding or tuple display, list display, dictionary display, string conversion >0 q,o • fádky pod sebou • alternativně oddělit středníkem (avšak nedoporučeno) x = 2; y = 3 • varování: and neslouží k sekvenčnímu řazení NE: x = 2 and y = 3 Typové systémy programovacích jazyků Označuje typy programátor v kódu? • explicitní - programátor v kódu deklaruje typ napr. int x; • implicitní - interpret určuje typ automaticky Jak se provádí typová kontrola? • statické - na základě kódu (při kompilaci, před interpretací) • dynamické - za běhu programu 4 □ ► 4 [fP ► 4 '. • dynamické implicitní typování • typ se určuje automaticky • typ proměnné se může měnit • rozdíl oproti statickému explicitnímu typování (většina kompilovaných jazyků jako C, Pascal, Java) • „deklarace" proměnné: první přiřazení hodnoty • zjištění typu: funkce type, isinstance • možnost explicitního pretypovaní o x = float(3); s = str(158) Proměnné a paměť (více později) • základní výpis: print (x) • více hodnot: print (x, y, z, sep=";") • bez odřádkování: print (x, end=MM) • další možnosti: sys.write, .format, .rjust ... (rozdíl oproti Python 2) Podmínky: príklad Příklad: počítání vstupného vstup: věk výstup: cena vstupenky if age < 18: price = 50 else: price = 100 Lze zapsat bez použití if? Jak? Podmíněný příkaz if : příkazl else: příkaz2 • podle toho, zda platí podmínka, se provede jed • podmínka - typicky výraz nad proměnnými • else větev nepovinná • vícenásobné větvení: if - elif - ... - else (switch v jiných jazycích) Blok kódu • co když chci provést v podmíněné větvi více příkazů? • blok kódu • Python: vyznačeno odsazením, standardně 4 znaky • jiné jazyky: složené závorky { }, begin-end >0 q,o Podmíněný příkaz: příklad if age < 6: print("Free entry") elif age < 15: price += 20 print("Child") elif age < 60: price += 100 print("Adult") else: price += 50 print("Senior") If/elif/else: poznámka mnohonásobný if/elif/elif/.../elif/else: • většinou indikace nevhodného zápisu • elegantnější řešení: cyklus + seznam, slovník.. Cykly: příklady o vstupné za celou rodinu výpis posloupnosti čísel výpočet faktoriálu převod čísla na binárni zápis • opakované provádění sekvence příkazů • známý počet opakování cyklu: • příkaz f or • „opakuj k krát" • neznámý počet opakování cyklu: • příkaz while • „opakuj dokud není splněna podmínka" for x in range(n): příkazy • provede příkazy pro všechny hodnoty x ze zadaného intervalu • range(n) - interval od 0 do n-1 (tj. n opakování) • range (a, b) - interval od a do b-1 • for/range lze použít i obecněji (nejen intervaly) -později/samostudium Faktoriál pomocí for cyklu • Co to je faktoriál? K čemu se používá? • Kolik je „5! "? • Jak vypočítat „n!11 (n je vstup od uživatele)? Faktoriál pomocí for cyklu n = int(inputO) f = 1 for i in ranged, n+1): f = f * i print(f) První posloupnost z úvodní přednášky 1 0 0 2 8 22 52 114 240 494 for i in range(n): print(2**i - 2*i, end=" ") >0 0,0 Zanořovani • řídicí struktury můžeme zanořovat, napr. • podmínka uvnitř cyklu • cyklus uvnitř cyklu • ... • libovolný počet zanoření (ale ...) Rozcvička 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 12 4 5 6 7 8 9 10 11 12 13 5 6 7 8 9 10 11 12 13 14 6 7 8 9 10 11 12 13 14 15 7 8 9 10 11 12 13 14 15 16 8 9 10 11 12 13 14 15 16 17 9 10 11 12 13 14 15 16 17 18 10 11 12 13 14 15 16 17 18 19 Rozcvička programem n = 10 total = 0 for i in ranged, n+1) for j in range(n): print(i+j, end total += i+j print() print("The result is", Rozcvička programem - hezčí formátování for i in ranged, n+1) : for j in range(n): print(str(i+j).ljust(2), end=M ") print() While cyklus while : příkazy • provádí příkazy dokud platí podmínka • může se stát: • neprovede příkazy ani jednou • provádí příkazy do nekonečna (nikdy neskončí) - to většinou znamená chybu v programu Faktoriál pomocí while cyklu n = int(input()) f = 1 while n > 0: f = f * n n = n - 1 print(f) Další příkazy pro řízení cyklů • break - ukončí provádění cyklu (nejvnitrnějšího) • continue - ukončí aktuální iteraci cyklu a přejde na další • else větev může být i u cyklu • někdy užitečné, ale snadno zneužitelné (nečitelný kód) • v rámci IB111 nepoužíváme ON A SCAUE CF 17t) 10, HOW LIKELY 15 fľ TkAT this Ouesno^ IS using Binary? WHflŕTÍS A K ľ ) Binární soustava: počítání na prstech https://www.khanacademy.org/math/vi-hart/v/ binary-hand-dance Príklad: převod na binární zápis Problém: převodník z desítkové na binární soustavu vstup: číslo v desítkové soustavě výstup: číslo v binární soustavě • Jak převedeme „22" na binárni zápis? • Jak převedeme obecné číslo na binárni zápis? 4 □ ► 4 ť5P ► 4 Prevod na binární zápis n = int(input()) output = 11,1 while n > 0: if n °/0 2 == 0: output = "0" + output else: output = "1" + output n = n // 2 # integer div print(output) Převod na binární zápis - průběh výpočtu n = 22 output = n = 11 output = 0 n = 5 output = 10 n = 2 output = 110 n = 1 output = 0110 n = 0 output = 10110 Programy nepíšeme jako jeden dlouhý „štrúdľ\ ale dělíme je do funkcí. Proč? Programy nepíšeme jako jeden dlouhý „štrúdl", ale dělíme je do funkcí. Proč? • opakované provádění stejného (velmi podobného) kódu n různých místech algoritmu • modularita (viz Lego kostky), znovupoužitelnost • snazší uvažování o problému, čitelnost • dělba práce def to_binary(n): output = "" while n > 0: if n °/0 2 == 0: output = "0" + output else: output = "1" + output n = n // 2 return output print(to_binary(22)) vstupy (parametry) return návratová hodnota vedlejší efekty výpisy změny globálních proměnných • vstup: parametry funkce • výstup: návratová hodnota (předána zpět pomocí return) • return neníprint • upozornění: yield - podobné jako return, pokročilý konstrukt, v tomto kurzu nepoužívat • proměnné v rámci funkce: • lokální: dosažitelné pouze v rámci funkce • globální: dosažitelné všude, minimalizovat použití (více později) Vnořené volání funkcí • funkce mohou volat další funkce • po dokončení vnořené funkce se interpret vrací a pokračuje • rekurze: volání sebe sama, cyklické volání funkcí (podrobněji později) 4 [fP ► < -E ► 4 > Vnořené volání: jednoduchý příklad def parity_info(number): print ("Number", number, end=" 11) if number °/0 2 == 0: print("is even") else: print("is odd") def parity_experiment(a, b): print("The first number", a) parity_info(a) print("The second number", b) parity_info(b) print("End") parity_experiment(3, 18) Vnořené volání - ilustrace parity experiment(3, 18) \ def parity_experiment(a, b): print("The first number", parity info (a) t print ("The second number, parity_info(b) print("End") def parity_info(number): print("Number", number, if number % 2 == 0: print("is even") else: print("is odd" ) Rozcvička programem II Experimentální otestování hypotézy o třetí mocnině def table_sum(n): total = 0 for i in ranged, n+1) : for j in range(n): total += i+j return total def check_sums(how_many): for n in ranged, how_many+l) : print(n, n**3, table_sum(n), sep= 4 □ ► 4 fSP ► 4 Druhá posloupnost z úvodní přednášky 011212231223233412232 3 3 4 3 4 ... 4 □ ► 4 [fP ► 4 Druhá posloupnost z úvodní přednášky 011212231223233412232 3 3 4 3 4 ... Počet jedniček v bitovém zápisu. Jak vypsat programem? ruhá posloupnost z úvodní přednášky def count_ones(n): count = 0 while n > 0: if n % 2 == 1: count += 1 n = n // 2 return count def sequence(n): for i in range(n): print (count_ones(i), end=M 11) Funkce: Python speciality def test(x, y=3): print(MX = ", x) print(MY = ", y) o defaultní hodnoty parametrů • volání pomocí jmen parametrů • test můžeme volat např.: • test(2, 8) • test(l) • test(y=5, x=4) • (dále též libovolný počet parametrů a další specia Funkce: rady • specifikace: vstupně-výstupní chování - ujasnit si před psaním samotného kódu • jaké potřebuje funkce vstupy? • co je výstupem funkce o funkce by měly být krátké: • „jedna myšlenka" • max na jednu obrazovku • jen pár úrovní zanoření • příliš dlouhá funkce - rozdělit na menší Programátorská kultura • psát smysluplné komentáře, dokumentační řetězce (vi později) • dávat proměnným a funkcím smysluplná jména • neopakovat se, nepoužívat „copy&paste kód" • doporučení k úpravě kódu v Pythonu - „PEP8": https://www.python.org/dev/peps/pep-0008/ PEP = Python Enhancement Proposals průběžné téma kurzu Proměnné, funkce, komentáře: jazyk • doporučení (užitečný návyk hned od začátku): vše anglicky • české názvy: míchání jazyků (klíčová slova anglicky), nekonzistence s diakritikou, ... • větší projekty - angličtina nutnost • style guide: Python coders from non-English speaking countries: please write your comments in English, unless you are 120% sure that the code will never be read by people who don't speak your language. . ale nezaseknete se na tom KEEP ftf MIHD w rn SBf-WGUi; SOW CODE MAY BE A LITTLE f1E59ii / LM£5£f- / insure , ITS FilC. .JUDU this la like: bong in A HOUSE BUllTBťA CHILP USING NOTHING BUT A HflTCHEf AND A PICTURE OF A HOUSE. rre like asalap recipe URITfEN GťA CDRfWflE UV/ER A PHONE KMEU EXCEL FORMULAS. ITSU^SOťlEJONETÍXXPf TRAN5CR1PT OF A COUPLE ARGUIK/G AT IKEA AND MADE random sat5 ofmur compiled uoholtt errors, asm£(5uwj£. htts://xkcd.com/1513/ viz též htts://xkcd.com/1695/, htts://xkcd.com/1833/ HOW TO \Jfi>\TE GOOD CODE- Ssmf PROJECT GOOD cope: < □ ► < htts://xkcd.com/844/ alšŕ důležité programátorské konstrukce • složitější datové typy (seznamy, řetězce), objekty • vstup/výstup (input/output, 10): • standardní 10 • soubory • dělení projektu do více souborů (packages), použití knihoven viz další přednášky, cvičení, samostudium Příklad: výpis šachovnice • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ • ^£ Řešení funkční, ne úplně vhodné def chessboard(n): for i in range(n): if (i % 2 == 0): even_line(n) else: odd_line(n) def even_line(n): for j in range(n): if (j % 2 == 0): print("#", end=MM) else: print(".", end=IMI) print() def odd_line(n): for j in range(n): if (j % 2 == 1): print ("#", end=IMI) else: print(11.11, end=IMI) print() , Lepsi reseni def chessboard(n): for i in range(n): line(n, i °/0 2) def line(n, parity): for j in range(n): if (j °/0 2 == parity) else: print(".", end print() Jiný zápis def chessboard(n): for i in range(n): for j in range(n): c = "#" if ((i+j) °/o 2 print (c, end=M 11) print() DRY = Don't Repeat Yourself WET • Write Everything Twice • We Enjoy Typing • Waste Everyone's Time Příklad: Hádanka hlavy a nohy Farmář chová prasata a slepice. Celkem je na dvoře 20 hlav a 56 noh. Kolik má slepic a kolik prasat? • jak vyřešit pro konkrétní zadání? • jak vyřešit pro obecné zadání (H hlav a N noh)? • co když farmář chová ještě osminohé pavouky? >0 q,o avy, nohy: řešení dva možné přístupy: O „inteligentně": řešení systému lineárních rovnic Q „hrubou silou": • „vyzkoušej všechny možnosti" • cyklus přes všechny možné počty prasat 4 □ ► 4 [fP ► 4 Hlavy, nohy: program def solve(heads, legs): for pigs in range(0, heads+1): hens = heads - pigs if pigs * 4 + hens * 2 == legs: print ("pigs = ", pigs, "hens = ", hens) solve(20, 56) Jak bych musel program změnit, kdybych řešil úlohu i s pavouky? 4 [fP ► < -E ► 4 > >0 0,0 • základní konstrukce • proměnné • řízení toku výpočtu: if-else, for, while • funkce • programátorská kultura priste: počítam s cisly