IB111 – cv. 5 Řetězce, seznamy Miroslav Kadlec Obsah ● Znak ● Řetězec znaků ● Seznam, pole ● Obecně je pole základní struktura pro uchování více hodnot stejného typu ● V Pythonu je pro tyto účely seznam (list) – obecnější, má naprogramované určité funkce ● Seznam ● Např. Seznam naměřených teplot, seznam příjmení, ... ● Definujeme do hranatých závorek, oddělujeme čárkami – Temperatures = [20, 22, 28, 19] ● Lze ukládat i různé datové typy – ExampleList = [1, "únor", 3.14] Indexování v seznamu ● Přístup k jednotlivým prvkům ● Čtení, změna hodnoty ● Každý prvek určen celým číslem (=indexem) vyjadřujícím jeho pořadí – Zadáváme za jméno seznamu do hranatých závorek – !!První prvek má index 0 – př.: print(seznam[0]) ● Lze indexovat i od konce zápornými čísly – [-1] vrátí poslední prvek, [-2] předposlední ● Co když zadáme větší číslo, než (počet prvků -1)? Funkce pro práci se seznamy ● Kopírování ● Přiřazením "newList = oldList" se nevytvoří nový seznam, jen máme dvě proměnné, skrz které můžeme k seznamu přistupovat ● "Mělká" kopie a = list(x) – V případě seznamu seznamů se nevytvoří nové "vnitřní" – Ekvivalentní konstrukce a = copy(list) ● Potřeba importovat z modulu "copy" ● "Hluboká" kopie a = deepcopy(x) – Vytvoří se kompletně nová struktura – Třeba importovat z modulu "copy" Funkce pro práci se seznamy ● Funkce pro agregaci: ● len(x) ● sum(x) ● min(x) ● max(x) ● y in x ● Jak se chovají s nečíselnými typy? ● Sum() – Seznam řetězců – Seznam seznamů ● Max/min() – Seznam řetězců – Seznam seznamů Funkce pro práci se seznamy ● Pokročilé indexování – slicing ● Umožňuje vybírat podčásti seznamu ● S pomocí dvojtečky specifikujeme, které indexy se vyberou – seznam[x:y:z] vybere indexy ● Od x včetně ● Do y nevčetně ● S krokem z – Lze hodnotu vynechat – defaultní hodnoty: ● Od začátku (0) ● Do konce ● S krokem 1 (při vynechání kroku není třeba psát 2. dvojtečku) Řetězec (string) ● Poloupnost znaků, se kterými pracujeme jako s celkem – různé funkce, operace ● Setkali jsme se s – Len() – Konkatenace (skládání) řetězců operátorem + – Opakování řetězců operátorem * – Escape sekvence Znak (char) ● Celé číslo reprezentováno jako znak ● Písmeno, číslice, interpunkce, ... ● Zapisujeme jako jednoznakový string např.: "a" ● V Pythonu – UNICODE ● Každý používaný znak má jednoznačně přiřazenou hodnotu ● chr() – Číslo -> znak ● ord() – Znak -> číslo ● Pozn: "a" nemá stejnou hodnotu jako "A" Další práce s řetězci ● Indexování ● Funguje jako u seznamů, např.: "ahoj"[2] ● Slicing ● Opět funguje jako u seznamů ● Procházení jednotlivých znaků cyklem ● for znak in text: ● Změna velikosti písmen ● "AhOj SvEtE".upper() ● "AhOj SvEtE".lower() Příklady ● Prokládání textem ● Výpis pozpátku ● Převod čísla z BIN do DEC soustavy ● Vigenerova šifra ● Uvažujme pouze jednu velikost pismen, bez mezer ● Klíč se opakuje podél plaintextu ● Ke každému znaku plaintextu se přičte znak klíče, který na něj vyšel – Tip: plaintext procházet for-cyklem, klíč indexovat proměnnou -> inkrementovat a hlídat pomocí %