IB111 Práce se soubory Správa paměti Práce se soubory v Pythonu •Soubor musíme „otevřít“ •Poté s ním pracujeme –Čteme a/nebo zapisujeme •Nakonec musíme soubor „zavřít“ Otevírání souboru •Příkaz open(soubor, způsob) –Jméno souboru –Způsob otevření •Čtení (r) •Zápis (w) •Čtení i zápis (r+) •Přidání dat nakonec (a) •Binární režim (b) Práce se souborem •Čtení: read() •Čtení jednoho řádku: readline() •Čtení pro vytvoření seznamu řádků: readlines() •Zápis: write(string) •Zjištění aktuální pozice (offsetu) v souboru: tell() •Přesun aktuální pozice souboru: seek() Práce se soubory: příklad Zkratka přes with •Při použití „with“ není třeba soubor explicitně zavírat • IB111 Jak se pracuje s proměnnými a pamětí v jazyce Python Globální a lokální proměnné Příklad 1: Rozdíl mezi lokální a globální proměnnou •gl_a = 'neco' •def priklad1(): • lc_a = ‘jineho' • print gl_a • print lc_a • •priklad1() •print gl_a •print lc_a Příklad 2: Jak nelze nastavit globální proměnnnou… •a = ' neco' •def priklad2(): • a = 'jineho' • print 'Uvnitr funkce je hodnota a: ', a • •priklad2() •print 'Mimo funkci je hodnota a:', a • Příklad 3: Jak správně změnit globální proměnnou… •a = ' neco' •def priklad3(): • global a • a = 'jineho' • print 'Uvnitr funkce je hodnota a: ', a • •priklad3() •print 'Mimo funkci je hodnota a:', a Příklad 4: Vnořené funkce •def priklad4(): • vnejsi_a = 'neco' • def priklad4_vnitrni(): • vnitrni_a = 'jineho' • print vnejsi_a • print vnitrni_a • priklad4_vnitrni() • print vnejsi_a • print vnitrni_a • •priklad4() Příklad 5: Vnořené funkce – jak nezměníte vnější proměnnou… •def priklad5(): • a = 'neco' • def priklad5_vnitrni(): • a = 'jineho' • print a • priklad5_vnitrni() • print a • •priklad5() • Příklad 6: Vnořené funkce •def priklad6(): • priklad6.a = 'neco' • def priklad6_vnitrni(): • priklad6.a = 'jineho' • print priklad6.a • priklad6_vnitrni() • print priklad6.a • •priklad6() •#takto vlastně vzniká globální proměnná… Viditelnost proměnných •Proměnné jsou viditelné v rámci bloku •Blokem jsou: –Moduly –Funkce –Třídy –Interaktivní příkaz •Každé využití jména (proměnné) se odkazuje na nejvnitřnější blok, který jméno obsahuje – Příklad využití globálních proměnných Přiřazování proměnných Názvy proměnných •Posloupnost písmen, číslic a znaků ‘_’ •Nelze použít rezervovaná klíčová slova jazyka: • • • • •Názvy nesmí obsahovat mezery –v praxi se místo mezer používá podtržítko nebo střídání velikosti písmen, např. •dlouhy_nazev_promenne •DlouhyNazevPromenne Přiřazování hodnot proměnným • Obrázek1 Jazyky C/C++ Jazyk Python Příklad (intuitivní) Příklad (méně intuitivní) Předávání parametrů funkci •Způsoby předávání parametrů –Hodnotou (call-by-value) •Používáno standardně například v C/C++ a Pascalu –Odkazem (call-by-reference) •popř. jménem (call-by-name) – Algol/Cobol •Používáno standardně v Perlu •Možné použít i v C/C++ a Pascalu –Něco mezitím :-) •A to je případ jazyka Python Předávání parametrů hodnotou •Při volání funkce se předávaný výraz vyhodnotí a ve volané funkci pak „žije vlastním životem“ •Parametr je tak vlastně lokální proměnná inicializovaná na hodnotu předanou volajícím •Funkce tak pracuje nad svou lokální kopií hodnoty •Funkce nemůže změnit hodnotu proměnné, předávané jako parametr, tak aby změna byla viditelná ve volající funkci Předávání parametrů odkazem •Při volání se nepředává aktuální hodnota proměnné, ale pouze odkaz (ukazatel, pointer) na proměnnou •Jakékoliv změny této proměnné uvnitř volané funkce se projeví i ve funkci volající •Nevzniká lokální kopie proměnné, pracuje se rovnou s původní proměnnou Příklad v jazyce C++ Předávání parametrů v jazyce Python •U proměnných, které jsou nezměnitelné, se používá předávání parametrů hodnotou –resp. zdá se, že je použito volání odkazem, jakmile ale dojde ke změně hodnoty, jedná se o volání hodnotou –Řetězce, čísla, n-tice (tuples) •V jiných případech se používá předávání odkazem –Funkce může měnit hodnotu parametrů a změna se tyká i volající funkce Příklad v Pythonu – nezměnitelné typy „Volání hodnotou“ Příklad v Pythonu – měnitelné typy Správa paměti •Automatická správa paměti –Garbage collection •Python si sám sleduje využívání paměťových míst –Jakmile se něco přestane používat, paměť je automaticky uvolněna •Programátor se o správu paměti nemusí moc starat –Přesto je dobré vědět, jak to funguje •Python si sleduje počet odkazů/referencí/využití –Jakmile klesne na nulu, paměť uvolní Počet odkazů •Zvýšení –Vytvoření a = ‘Ahoj’ –Vytvoření aliasu b = a –Předání funkci zpracuj(a) –Stane se součástí složeného prvku x = [a, ‘B’, ‘C’] •Snížení –Ukončení „scope“ proměnné konec funkce –Smazání proměnné del a –Aliasu je přiřazena jiná hodnota b = ‘Nazdar’ –Odstranění ze složeného prvku x.remove(a) –Odstranění složeného prvku del x Příklad Často používané hodnoty •Často používané hodnoty Python vytváří automaticky a udržuje je stále v paměti –Čísla mezi -5 a +256 –Jednotlivé znaky –Prázdný řetězec •Důvodem je vyšší rychlost/výkon Kopírování objektů 1.Vytvoření aliasu •Přímo odkazujeme na původní proměnnou •Příklad: b = a 2.Mělká kopie •Vytvoříme novou proměnou, ale odkazujeme původní prvky jako aliasy •Příklad: b=a[:] •Hluboká kopie •Vytváříme kompletní kopii dat •Příklad: b=copy.deepcopy(a) – Kopírování objektů – příklad Kopírování objektů – příklad druhý Python Tutor PythonTutor •www.pythontutor.com •Vizualizace běhu programu v pythonu •Krokování •Vhodné pro: –Pochopení práce s proměnnými/pamětí –Ladění programu PythonTutor - ukázka