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

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

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

Psaní jednoduchých programů (2. přednáška) F F U K. Jonathan L. Verner. Department of Logic

Konečný automat. Jan Kybic.

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

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

Úvod do programovacích jazyků (Java)

Zápis programu v jazyce C#

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

Více o konstruktorech a destruktorech

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

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

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

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

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

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 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

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

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

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

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

Regulární výrazy. Vzory

Scrapping stránek prakticky: Dívka dne na TN.cz

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

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

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

Struktura programu v době běhu

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

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

Algoritmus. Algoritmus je posloupnost kroků, které jsou potřeba k vyřešení problému.

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

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

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

Objektově orientované programování

3. Řízení běhu programu

Datové struktury. alg12 1

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

Textové soubory. alg9 1

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

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

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

Řídicí struktury. alg3 1

Základy programování (IZP)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

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

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

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

Generické programování

Algoritmizace a programování

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Algoritmizace a programování

Programování v Pythonu

typová konverze typová inference

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

konstruktory a destruktory (o)

První kapitola úvod do problematiky

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

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

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

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 -

7. Datové typy v Javě

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

Soubor jako posloupnost bytů

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

Algoritmizace a programování

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

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.

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

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

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

Kámen-nůžky-papír. Tomáš Svoboda Centrum strojového vnímání, Katedra kybernetiky Fakulta elektrotechnická, České vysoké učení technické

Jazyk C# a platforma.net

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

Programování v Javě I. Leden 2008

Programování v Pythonu

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

Programování v Pythonu

9. přednáška - třídy, objekty

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

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

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

Programovací jazyk Pascal

VISUAL BASIC. Práce se soubory

6. Příkazy a řídící struktury v Javě

Dědění, polymorfismus

Úvod do programovacích jazyků (Java)

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Skripty základy VB, vestavěné objekty, příklady

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

Jazyk C# (seminář 6)

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Basic256 - úvod do programování Příklady. ing. petr polách

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Konstruktory a destruktory

Vector datový kontejner v C++.

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Seminář Java II p.1/43

Transkript:

IB111 Úvod do programování skrze Python Přednáška 7 Správa paměti (proměnné podrobněji) Práce se soubory Nikola Beneš 2. listopad 2016 IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 1 / 28

Proměnné a paměť 0x1e 0x1f 0x20 0x21...... IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 2 / 28

Proměnné Proměnné něco, co drží hodnotu jejich hodnota se může během výpočtu měnit Názvy proměnných (v Pythonu) posloupnost písmen, číslic a znaků '_' bez mezer, více slov pomocí: podtržítek: dlouhy_nazev_promenne střídání velikosti písmen: dlouhynazevpromenne nelze používat rezervovaná klíčová slova jazyka False class finally is return None continue for lambda try True def from nonlocal while and del global not with as elif if or yield assert else import pass break except in raise IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 3 / 28

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 Obecněji: proměnné jsou viditelné v rámci svého bloku blokem můžou být: moduly (soubory se zdrojovým kódem) funkce třídy (o těch se dozvíme později) a jiné (závisí na konkrétním jazyce) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 4 / 28

Globální a lokální proměnné v Pythonu Příklad 1 a = "This is global." def example1(): b = "This is local." print(a) print(b) example1() print(a) print(b) # This is global. # This is local. # This is global. # CHYBA! # NameError: name 'b' is not defined IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 5 / 28

Globální a lokální proměnné v Pythonu Příklad 2 a = "Think global." def example2(): a = "Eat local." print(a) print(a) example2() print(a) # Think global. # Eat local. # Think global. vytváříme novou lokální proměnnou, neměníme tu globální IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 6 / 28

Globální a lokální proměnné v Pythonu Příklad 3 jak měnit globální proměnné? a = "Think global." def example3(): global a a = "Eat local." print(a) print(a) example3() print(a) # Think global. # Eat local. # Eat local. IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 7 / 28

Globální a lokální proměnné v Pythonu Příklad 4 lokální proměnná vzniká přiřazením kdekoli uvnitř funkce a = "Think global." def example4(change_opinion=false): print(a) if change_opinion: a = "Eat local." print("changed opinion:", a) print(a) example4() # Think global. # CHYBA! # UnboundLocalError: local variable 'a' referenced before # assignment IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 8 / 28

Globální a lokální proměnné Doporučení Proč? pokud možno nepoužívat globální proměnné globální konstanty jsou v pořádku porušují lokalitu kódu potenciální chyby nečitelnost Alternativy předávání parametrů funkcím a vracení hodnot z funkcí objekty (o těch si něco málo řekneme později) a další (nad rámec předmětu) statické proměnné (C, C++, Java, ) návrhový vzor Singleton IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 9 / 28

Proměnné podrobněji 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 IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 10 / 28

Proměnné podrobněji Ilustrace přiřazení int a, b; a = 1; a 1 a = 1; a 1 b a = 2; a 2 a = 2; a 1 b 2 b = a; a 2 b = a; a 1 b 2 b 2 Jazyk C Proměnné jako hodnoty Jazyk Python Proměnné jako odkazy IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 11 / 28

Proměnné podrobněji Příklad 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)) [další ukázky, použití http://pythontutor.com] IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 12 / 28

Předávání parametrů funkcím Způsoby předávání parametrů 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 referencí podobně funguje např. Java někdy nazýváno call by object sharing IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 13 / 28

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é IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 14 / 28

Příklad předávání v C++ #include <iostream> void fun(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"; fun(a, b); } std::cout << "a: " << a << ", b: " << b << "\n"; IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 15 / 28

Předávání parametrů funkcím 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ěnné 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 ale pozor! přiřazení znamená změnu odkazu def fun(s): s.append(3) s = [42, 17] s.append(9) print(s) t = [1, 2] fun(t) print(t) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 16 / 28

Předávání parametrů funkcím 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 = 2015 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)) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 17 / 28

Předávání parametrů funkcím 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) # výsledek je [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) # jaký je výsledek? IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 18 / 28

Správa paměti Různé přístupy ke správě paměti manuální funkce pro přidělení/uvolnění paměti automatická paměť je uvolněna na konci života proměnné automatická počítání referencí kolik částí programu ještě s danou pamětí pracuje pokud už nikdo, paměť je uvolněna automatická garbage collection jednou za čas se uklidí nepoužívaná paměť Správa paměti v Pythonu automatická počítání referencí + někdy i větší úklid počet referencí sys.getrefcount(object) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 19 / 28

Správa paměti v Pythonu Zvýšení počtu odkazů vytvoření a = "Hello!" vytvoření aliasu b = a předání funkci fun(a) vložení do složeného prvku s = [42, a, -7] Snížení počtu odkazů ukončení platnosti lokální proměnné konec funkce smazání proměnné del a přiřazení jiné hodnoty aliasu b = "Aloha!" odstranění ze složeného prvku s.remove(a) odstranění složeného prvku del s IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 20 / 28

Správa paměti v Pythonu Pamatování některých hodnot některé hodnoty si Python automaticky udržuje v paměti a nevytváří je znovu kvůli vyšší rychlosti / výkonu často používané hodnoty čísla mezi -5 a 256 prázdný řetězec, jednotlivé znaky krátké řetězce se vytváří jen jednou import sys a = 1 print(sys.getrefcount(a)) a = "" print(sys.getrefcount(a)) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 21 / 28

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 jak? obecné řešení (opět knihovna copy) b = copy.deepcopy(a) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 22 / 28

Práce se soubory IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 23 / 28

Práce se soubory v Pythonu Způsob práce otevření souboru práce se souborem (čtení / zápis) zavření souboru >>> my_file = open("/tmp/my_file", "w") >>> print(my_file) <_io.textiowrapper name='/tmp/my_file' mode='w' encoding='utf- >>> my_file.write("hasta la vista!\n") >>> my_file.close() IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 24 / 28

Práce se soubory v Pythonu Otevření souboru open(jmeno, zpusob) jméno souboru: řetězec (pozor na Windows a '\\') způsob otevření: čtení ("r") zápis ("w") přepíše soubor, pokud není, vytvoří jej přidání na konec ("a") čtení i zápis ("r+", "w+" nebo "a+") binární režim (přidat "b" k některému způsobu) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 25 / 28

Práce se soubory v Pythonu Čtení ze souboru read(pocet) přečte daný počet znaků read() přečte celý soubor, vrací řetězec readline() přečte celý jeden řádek readlines() přečte všechny řádky, vrací seznam řádků Zápis do souboru Jiné write(text) zapíše řetězec do souboru neukončuje řádky, je třeba explicitně použít '\n' tell() aktuální pozice v souboru seek(pozice) přesun pozice v souboru IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 26 / 28

Práce se soubory v Pythonu Iterace po řádcích for line in my_file: print(line) Speciální blok with při jeho použití není třeba soubor zavírat zavře se sám při ukončení bloku with open("/tmp/my_file", "r") as my_file: lines = my_file.readlines() print(lines) IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 27 / 28

Shrnutí Proměnné lokální vs. globální (používejte jen jako konstanty) v Pythonu: drží odkaz na hodnotu Předávání parametrů v Pythonu: něco mezi hodnotou a odkazem (call by sharing) Správa paměti v Pythonu: počítání referencí, automatický úklid Kopírování objektů mělká vs. hluboká kopie užitečná knihovna copy Práce se soubory otevření / zavření souboru; užitečný blok with zápis, čtení IB111 přednáška 7: správa paměti, práce se soubory 2. listopad 2016 28 / 28