Programovaní: základní konstrukce IB113 Radek Pelánek 2019 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ů • komentáře - symbol # 4 □ ► 4 [3P ► < 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) • 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 • 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 # modulo y = y + i y += i a = (x==3) and (y==2) b = a or not a s = "petr" t = "klič" 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 [3P ► < 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 • 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 razení 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 [3P ► < • 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) 4 □ ► 4 [3P ► < 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 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) 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=" ") Zanořovani řídicí struktury můžeme zanořovat, např. • 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 (nejvnitřně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 IB113 nepoužíváme 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 Funkce pro výpočet faktoriálu def factorial(n): f = 1 for i in range(l, n+1): f = f * i return f print(factorial(5)) 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) 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 [3P ► < 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 • 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 a 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ší a čisté funkce jsou super • čistá funkce (pure function) = funkce bez vedlejších efektů 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 Burn mrcHEf and ň PICTURE OF A HOUSE. rre like ňSALňP recipe: URITfEN BY ft CDRfWflE UV/ER a phone KMEU EXCEL FORMULAS. ITSU^SOťlEJONETÍXXPf "IKflN5CR1fT OF A COUPLE AROIIK/G PÍT IKEA AND MADE random EPtr5 iwri/r 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 Kontrolní otázky • Jak v Pythonu deklarujeme proměnné? Jak se určuje proměnné? • Jaký je rozdíl mezi x = 3 a x == 3? • Co znamená x += 1? • Jak zapisujeme operaci „umocňování"? • Jaký je rozdíl mezi cykly for a while? • Jak do zdrojového kódu zapisujeme komentáře? • Proč při programování používáme funkce? • Co znamená „PEP8"? • Jaké jsou příklady konvencí, které nejsou „povinné", je velmi vhodné je dodržovat? https://www.umimeprogramovat.cz/rozhodovacka • Proměnné a číselné výrazy • Logické výrazy • Podmíněný příkaz • Cykly • základní konstrukce • proměnné • řízení toku výpočtu: if-else, for, while • funkce • programátorská kultura priste: počítam s cisly