IB111 Základy programování Radek Pelánek

Podobné dokumenty
IB111 Základy programování Radek Pelánek

IB111 Úvod do programování skrze Python Přednáška 7

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Algoritmizace a programování

Programování v Pythonu

PB161 Programování v jazyce C++ Přednáška 9

Algoritmizace a programování

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 4

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do programovacích jazyků (Java)

Zápis programu v jazyce C#

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

8 Třídy, objekty, metody, předávání argumentů metod

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

První kapitola úvod do problematiky

typová konverze typová inference

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

PROGRAMOVÁNÍ V C++ CVIČENÍ

Základy algoritmizace 2. Proměnné, datové typy

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Algoritmizace a programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Dědění, polymorfismus

Konečný automat. Jan Kybic.

Programování v C++ 1, 5. cvičení

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

PB161 Programování v jazyce C++ Přednáška 7

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyk Pascal

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

PB161 Programování v jazyce C++ Přednáška 7

Úvod do programování - Java. Cvičení č.4

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

JAVA. Další jazyky kompilovatelné do Java byte-code

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Řídicí struktury. alg3 1

Programování v Javě I. Leden 2008

Objektově orientované programování

Sada 1 - PHP. 03. Proměnné, konstanty

Programování v Pythonu

5 Přehled operátorů, příkazy, přetypování

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

7. Datové typy v Javě

Paměť počítače. alg2 1

Vstupní požadavky, doporučení a metodické pokyny

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Generické programování

Operační systémy. Cvičení 4: Programování v C pod Unixem

Programování v Pythonu

MQL4 COURSE. By Coders guru -8- Proměnné

Programování v Javě I. Únor 2009

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Soubor jako posloupnost bytů

IUJCE 07/08 Přednáška č. 6

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

přetížení operátorů (o)

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Programování v C++ 1, 1. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Programy a algoritmy pracující s čísly. IB111 Úvod do programování skrze Python

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Jazyk C# a platforma.net

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Programování v C++, 2. cvičení

PB161 Programování v jazyce C++ Přednáška 9

2 Datové typy v jazyce C

Python profesionálně: dynamické parametry, generátory, lambda funkce... with. Dynamické parametry

PB161 Programování v jazyce C++ Přednáška 9

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy programování (IZP)

PŘETĚŽOVÁNÍ OPERÁTORŮ

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Úvod do programovacích jazyků (Java)

PB161 Programování v jazyce C++ Přednáška 3

Programování v jazyce JavaScript

Transkript:

Proměnné, pamět, typy IB111 Základy programování Radek Pelánek 2018 1 / 63

Rozcvička I a = [3, 1, 7] print(sorted(a)) print(a) b = [4, 3, 1] print(b.sort()) print(b) 2 / 63

Rozcvička II a = ["magic"] a.append(a) print(a[1][1][1][1][1][0][1][0][0][0]) 3 / 63

Dnes důležité technické detaily globální a lokální proměnné reprezentace dat v paměti, kopírování předávání parametrů funkcím typy základní témata obecně důležitá detaily specifické pro Python 4 / 63

Dnešní programy Varování: Dnešní programy jsou vesměs úchylné. minimalistické ukázky důležitých jevů nikoliv pěkný, prakticky používaný kód 5 / 63

Python Tutor vizualizace Vizualizace použité ve slidech: http://www.pythontutor.com Odkazy na dnešní ukázky: https://www.fi.muni.cz/~xpelanek/ib111/tutor-codes.html Doporučeno projít si interaktivně. 6 / 63

Názvy proměnných konvence konstanty velkými písmeny běžné proměnné: smysluplná slova víceslovné názvy: lower case with underscores krátké (jednopísmenné) názvy: indexy souřadnice: x, y pomocné proměnné s velmi lokálním využitím 7 / 63

Globální a lokální proměnné Globální proměnné definovány globálně (tj. ne uvnitř funkce) jsou viditelné kdekoli v programu Lokální proměnné definovány uvnitř funkce jsou viditelné jen ve své funkci 8 / 63

Rozsah proměnných obecněji proměnné jsou viditelné v rámci svého rozsahu rozsahem mohou být: funkce moduly (soubory se zdrojovým kódem) třídy (o těch se dozvíme později) a jiné (závisí na konkrétním jazyce) relevantní terminologie: namespace, scope 9 / 63

Globální a lokální proměnné a = "This is global." def example1(): b = "This is local." print(a) print(b) example1() # This is global. # This is local. print(a) # This is global. print(b) # ERROR! # NameError: name b is not defined 10 / 63

Globální a lokální proměnné 11 / 63

Globální a lokální proměnné vytváříme novou lokální proměnnou, neměníme tu globální a = "Think global." def example2(): a = "Act local." print(a) print(a) example2() print(a) # Think global. # Act local. # Think global. 12 / 63

Globální a lokální proměnné 13 / 63

Globální a lokální proměnné Jak měnit globální proměnné? a = "Think global." def example3(): global a a = "Act local." print(a) print(a) example3() print(a) # Think global. # Act local. # Act local. 14 / 63

Lokální proměnné: deklarace lokální proměnná vzniká, pokud je přiřazení kdekoli uvnitř funkce a = "Think global." def example4(change_opinion=false): print(a) if change_opinion: a = "Act local." print("changed opinion:", a) print(a) example4() # Think global. # ERROR! # UnboundLocalError: local variable a referenced bef # assignment 15 / 63

Globální a lokální proměnné: příklad a = 5 def test1(): print(a) def test2(): print(a) a = 8 test1() # 5 test2() # UnboundLocalError 16 / 63

Rozsah proměnných: for cyklus rozsah proměnné v Pythonu není pro dílčí blok kódu, ale pro celou funkci (resp. globální kód) častá chyba (záludný překlep): proměnná for cyklu použita po ukončení cyklu n = 9 for i in range(n): print(i) if i % 2 == 0: print("i like even length lists") 17 / 63

Globální a lokální proměnné proměnné interně uloženy ve slovníku výpis: globals(), locals() def function(): x = 100 s = "dog" print(locals()) a = [1, 2, 3] x = 200 function() print(globals()) 18 / 63

Globální a lokální proměnné Doporučení: vyhýbat se globálním proměnným pouze ve specifických případech, např. globální konstanty Proč? horší čitelnost kódu náročnější testování zdroj chyb obecně: lokalita kódu je užitečná 19 / 63

Globální proměnné: alternativy předávání parametrů funkcím a vracení hodnot z funkcí objekty (probereme později) a další (nad rámec předmětu): statické proměnné (C, C++, Java,...), návrhový vzor Singleton,... příklad: herní plán 20 / 63

Funkce Připomenutí z dřívější přednášky vstupy (parametry) funkce return vedlejší efekty výpisy změny globálních proměnných návratová hodnota 21 / 63

Funkce bez vedlejších efektů funkce = funkce bez vedlejších efektů čistá Reklama Čisté funkce jsou vaši přátelé! ladění modularita přemýšlení o problému čitelnost kódu 22 / 63

Funkce: vedlejší efekty změna měnitelných parametrů OK, ale nemíchat s návratovou hodnotou, vhodně pojmenovat, dokumentovat změna globálních proměnných (které nejsou parametry) většinou cesta do pekla změna stavu systému (libovolné výpisy, zápis do souboru, databáze, odeslání na tiskárnu,... ) nutnost, ale nemíchat chaoticky s výpočty 23 / 63

Proměnné a pamět Proměnné v různých jazycích pojmenované místo v paměti odkaz na místo v paměti (Python) kombinace obou možností Přiřazení proměnné ve stylu C: změna obsahu paměti proměnné ve stylu Pythonu: změna odkazu na jiné místo v paměti 24 / 63

Proměnné a pamět 25 / 63

Proměnné a pamět funkce id() vrací identitu objektu (± adresa v paměti) a = 1000 b = a print(a, b) print(id(a), id(b)) b += 1 print(a, b) print(id(a), id(b)) a = [1] b = a print(a, b) print(id(a), id(b)) b.append(2) print(a, b) print(id(a), id(b)) 26 / 63

Rovnost vs. stejná identita a = [1, 2, 3] b = [1, 2, 3] print(a == b) print(id(a) == id(b)) operátor is stejná identita # True # False 27 / 63

Předávání parametrů funkcím hodnotou (call by value) předá se hodnota proměnné (kopie) standardní v C, C++, apod. odkazem (call by reference) předá se odkaz na proměnnou lze použít v C++ jiné možnosti (jménem, hodnotou-výsledkem,... ) jazyk Python: něco mezi voláním hodnotou a odkazem podobně funguje např. Java někdy nazýváno call by object sharing 28 / 63

Předávání parametrů funkcím Předávání parametrů hodnotou parametr je vlastně lokální proměnná funkce má svou vlastní lokální kopii předané hodnoty funkce nemůže změnit hodnotu předané proměnné Předávání parametrů odkazem nepředává se hodnota, ale odkaz na proměnnou změny parametru jsou ve skutečnosti změny předané proměnné 29 / 63

Předávání parametrů: příklad v C++ #include <iostream> void test(int a, int& b) { a = a + 1; b = b + 1; } int main() { int a = 1; int b = 1; std::cout << "a: " << a << ", b: " << b << "\n"; test(a, b); std::cout << "a: " << a << ", b: " << b << "\n"; } 30 / 63

Předávání parametrů v Pythonu Předávání parametrů v Pythonu paramater drží odkaz na předanou proměnnou změna parametru změní i předanou proměnnou pro neměnitelné typy tedy v podstatě funguje jako předávání hodnotou čísla, řetězce, ntice (tuples) pro měnitelné typy jako předávání odkazem pozor: přiřazení znamená změnu odkazu Připomenutí: neměnitelné typy: int, str, tuple,... měnitelné typy: list, dict,... 31 / 63

Předávání parametrů: ukázky číselný parametr je neměnitelný, toto nic neprovede def update_param_int(x): x = x + 1 a = 1 print(a) # 1 update_param_int(a) print(a) # 1 32 / 63

Předávání parametrů: ukázky seznam je měnitelný, změna se projeví i mimo funkci def update_param_list(x): x.append(3) a = [1, 2] print(a) # [1, 2] update_param_list(a) print(a) # [1, 2, 3] 33 / 63

Předávání parametrů: ukázky odkaz se změní na nový seznam, původní je nezměněn změna se neprojeví mimo funkci def change_param_list(x): x = [1, 2, 3] a = [1, 2] print(a) # [1, 2] change_param_list(a) print(a) # [1, 2] 34 / 63

Předávání parametrů: kvíz def test(s): s.append(3) s = [42, 17] s.append(9) print(s) t = [1, 2] test(t) print(t) 35 / 63

Předávání parametrů: vizualizace 36 / 63

Práce s parametry: příklad def change_list(alist, value): alist.append(value) def return_new_list(alist, value): newlist = alist[:] newlist.append(value) return newlist 37 / 63

Předávání parametrů: příklad += Operátor += různé chování pro neměnné typy a pro seznamy def increment(x): print(x, id(x)) x += 1 print(x, id(x)) p = 42 increment(p) print(p, id(p)) def add_to_list(s): print(s, id(s)) s += [1] print(s, id(s)) t = [1, 2, 3] add_to_list(t) print(t, id(t)) 38 / 63

Předávání parametrů: += a = Pozor na rozdíl mezi = a += u seznamů def add_to_list1(s): print(s, id(s)) s += [1] print(s, id(s)) t = [1, 2, 3] add_to_list1(t) print(t) # [1, 2, 3, 1] def add_to_list2(s): print(s, id(s)) s = s + [1] print(s, id(s)) t = [1, 2, 3] add_to_list2(t) print(t) #??? 39 / 63

Předávání parametrů: vizualizace 40 / 63

Kahoot 41 / 63

Kahoot: Program A a = 1 b = [1, 2, 3] def test(): a = 5 b[0] = 5 test() print(a, b[0]) 42 / 63

Kahoot: Program B def test(b): b.append(3) b = [4, 5] b.append(6) a = [1, 2] test(a) print(a) 43 / 63

Předávání výsledků funkcí funkce mají: libovolný počet parametrů právě jeden výstup (return x) Co když chceme z funkce vrátit více hodnot? Elementární příklad: dělení se zbytkem 44 / 63

Předávání více výsledků Jak předat více výsledků? n-tice (možno zapisovat i bez závorek) def division_with_remainder(a, b): return a // b, a % b div, mod = division_with_remainder(23, 4) 45 / 63

Předávání více výsledků Jak předat více výsledků? slovník ( pojmenované výstupy) def division_with_remainder(a, b): return {"div": a // b, "mod": a % b} result = division_with_remainder(23, 4) print(result["div"], result["mod"]) 46 / 63

Kopírování objektů Vytvoření aliasu b = a odkaz na stejnou věc Mělká kopie b = a[:] nebo b = list(a) vytváříme nový seznam, ale prvky tohoto seznamu jsou aliasy obecně i pro jiné typy než seznamy (knihovna copy) b = copy.copy(a) Hluboká kopie kompletní kopie všech dat obecné řešení (opět knihovna copy) b = copy.deepcopy(a) 47 / 63

Kopírování objektů mělká kopie lista [3, 5] [2, 9] [1, 7] listb hluboká kopie lista [3, 5] [2, 9] [1, 7] listb [3, 5] [2, 9] [1, 7] 48 / 63

Příklad import copy a = [[3, 5], [2, 9], [1, 7]] b = a c = a[:] d = copy.deepcopy(a) a[0][0] = 100 print(b[0][0], c[0][0], d[0][0]) a[0] = [200, 200] print(b[0][0], c[0][0], d[0][0]) 49 / 63

Datové typy Datové typy určují: význam dat operace, které lze s daty provádět hodnoty, kterých mohou data nabývat 50 / 63

Typy v Pythonu bool int, float, complex číselné typy str řetězec list seznam tuple n-tice dict slovník set množina (výběr nejdůležitějších) 51 / 63

Typy: kvíz print(type(3)) print(type(3.0)) print(type(3==0)) print(type("3")) print(type([3])) print(type((3,0))) print(type({3:0})) print(type({3})) 52 / 63

Typy: kvíz type(3) type(3.0) type(3==0) type("3") type([3]) type((3,0)) type({3:0}) type({3}) # <class int > # <class float > # <class bool > # <class str > # <class list > # <class tuple > # <class dict > # <class set > 53 / 63

Typy: měnitelnost neměnitelné (immutable): bool, int, float, str, tuple měnitelné (mutable): list, dict, set Příklady, kde důležité: změna indexováním předávání parametrů funkcím indexování slovníku 54 / 63

None None jedinečná hodnota typu NoneType význam: prázdné, žádná hodnota využití: např. defaultní hodnota parametrů funkcí implicitní návratová hodnota z funkcí (pokud nepoužijeme return) 55 / 63

Pravdivostní hodnota if value: print("foo") Pro které z těchto hodnot value se vypíše foo? True, False, 3, 0, 3.0, -3, [3], [], "3", "", None 56 / 63

Pravdivostní hodnota test je úspěšný ( true ) vždy, kromě následujících případů: konstanty: None, False nulové hodnoty u numerických typů: 0, 0.0, 0j prázdné sekvence (nulová délka měřená pomocí len):, [], (), (mírně zjednodušeno, např. u objektů může být komplikovanější) 57 / 63

Dynamická kontrola typů type(x) zjištění typu isinstance(x, t) test, zda je proměnná určitého typu values = [3, 8, "deset", 4, "dva", "sedm", 6] s = 0 for value in values: if isinstance(value, int): s += value else: print("not int:", value) print("sum of ints:", s) 58 / 63

Typová anotace Python používá dynamické typování výhody: stručný, flexibilní kód nevýhody: náročnější ladění, uvažování o problémech, čitelnost typové anotace (type hints): volitelné, neovlivňují běh programu možnost statické kontroly (např. mypy) integrace v některých IDE def greeting(name: str) -> str: return "Hello " + name 59 / 63

Načítání vstupu od uživatele: input x = input("give me a large number:") x = int(x) print("my number is larger:", x+1) input vrací řetězec typicky nutno přetypovat Python2: odlišné chování (input, raw input) 60 / 63

Výjimky Co když uživatel zadá místo čísla "deset"? častý přístup: doufat, že se to nestane základní přístup: důsledně před každou operací kontrolovat vstupy u složitějších programů nepřehledné sofistikovanější přístup: výjimky 61 / 63

Výjimky try: x = input("give me a large number:") x = int(x) print("my number is larger:", x+1) except ValueError: print("sorry, that is not a valid number") Nad rámec tohoto kurzu. 62 / 63

Shrnutí představa o reprezentaci v paměti je potřeba globální, lokální proměnné předávání parametrů funkcím mělká vs. hluboká kopie typy, měnitelné, neměnitelné 63 / 63