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 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ání 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 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