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

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

Datové typy. IB111 Základy programování Radek Pelánek

Da D to t v o é v ty t py IB111: Datové typy

Základní datové struktury

Programování v Pythonu

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ů

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh

Lineární datové struktury

Dynamické datové struktury I.

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

Datové struktury 1: Základní datové struktury

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

Šablony, kontejnery a iterátory

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Kolekce, cyklus foreach

Šablony, kontejnery a iterátory

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

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

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

Abstraktní datové typy

Lineární datové struktury

Abstraktní datové typy: zásobník

Datové struktury. alg12 1

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

Programování v Pythonu

Lekce 4. Kolekce. Kolekce - seznamy, N-tice a slovníky. C2184 Úvod do programování v Pythonu podzim 2016

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

IB111 Úvod do programování skrze Python

Datové typy a struktury

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

Algoritmizace a programování

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

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

Programování v Pythonu

Spojový seznam. Jan Kybic.

Lineární spojový seznam (úvod do dynamických datových struktur)

Prioritní fronta, halda

ADT/ADS = abstraktní datové typy / struktury

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

Základy algoritmizace 4. Problémy, algoritmy, data

2. Mřížky / Záplavové vyplňování

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

IB111 Úvod do programování skrze Python

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

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

PB přednáška (26. října 2015)

Algoritmizace a programování

ABSTRAKTNÍ DATOVÉ TYPY

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

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

Dynamické datové struktury IV.

Konstruktory a destruktory

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

Jazyk C++ II. STL knihovna kontejnery část 1

Stromy. Jan Kybic.

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Třídění a vyhledávání Searching and sorting

Abstraktní datové typy FRONTA

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

Úvod do programovacích jazyků (Java)

boolean hasnext() Object next() void remove() Kolekce

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

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

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

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

Pole a kolekce. v C#, Javě a C++

IB111 Základy programování Radek Pelánek 1 / 61

Záznam, zásobník a fronta

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Spojová implementace lineárních datových struktur

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Část I Spojové struktury

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

Rekurzivní algoritmy

Programování v Pythonu

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Standardní algoritmy vyhledávací.

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

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

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Operátory ROLLUP a CUBE

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

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

Maturitní téma: Programovací jazyk JAVA

Pointery II. Jan Hnilica Počítačové modelování 17

Úvod do programovacích jazyků (Java)

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

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

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

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

Vestavěné nástroje Pythonu

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

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

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Transkript:

IB111 Úvod do programování skrze Python Přednáška 6 Datové typy Nikola Beneš 26. říjen 2016 IB111 přednáška 6: datové typy 26. říjen 2016 1 / 36

Práce s daty jaká data budu zpracovávat? jaká data budu potřebovat k řešení problému? jaké operace s daty budu chtít provádět? jak rychle budu chtít, aby operace s daty fungovaly? IB111 přednáška 6: datové typy 26. říjen 2016 2 / 36

Pohled na data dva světy sečíst najít vložit obarvit na modro tabulka databáze telefonní seznam s = set() s.add("something") s.add("something else") mul add load store mov 0x1e 0x1f 0x20 0x21...... IB111 přednáška 6: datové typy 26. říjen 2016 3 / 36

Datové typy Datový typ rozsah hodnot, které patří do daného typu operace, které je možno s těmito hodnotami provádět Abstraktní datový typ rozhraní popis operací, které chceme provádět (případně i složitost) Konkrétní datový typ (datová struktura) implementace přesný popis uložení dat v paměti definice funkcí pro práci s těmito daty Poznámka: hranice mezi abstraktním a konkrétním datovým typem není vždy úplně ostrá. IB111 přednáška 6: datové typy 26. říjen 2016 4 / 36

Abstraktní datové typy Nejznámější ADT: seznam zásobník fronta; prioritní fronta množina slovník (asociativní pole) textový řetězec celé číslo a mnohé další IB111 přednáška 6: datové typy 26. říjen 2016 5 / 36

Datový typ seznam Seznam (různé varianty) obsahuje posloupnost prvků stejného typu různého typu přidání prvku na začátek na konec na určené místo odebrání prvku ze začátku z konce konkrétní prvek test prázdnosti a možná i další operace např. přístup pomocí indexu IB111 přednáška 6: datové typy 26. říjen 2016 6 / 36

Implementace seznamu Jednosměrně zřetězený seznam data next data next data next data next Obousměrně zřetězený seznam data next prev data next prev data next prev Dynamické pole data data data IB111 přednáška 6: datové typy 26. říjen 2016 7 / 36

Implementace seznamu Jednosměrně zřetězený seznam data next data next data next data next Obousměrně zřetězený seznam data next prev data next prev data next prev Dynamické pole data data data data data data kopie IB111 přednáška 6: datové typy 26. říjen 2016 7 / 36

Implementace seznamu Jednosměrně zřetězený seznam data next data next data next data next Obousměrně zřetězený seznam data next prev data next prev data next prev Dynamické pole data data data data IB111 přednáška 6: datové typy 26. říjen 2016 7 / 36

Seznamy v Pythonu Opakování hranaté závorky, prvky oddělené čárkami prvky mohou být různých typů přístup skrze indexy indexování od konce pomocí záporných čísel seznamy lze modifikovat a = ['bacon', 'eggs', 'spam', 42] print(a[1:3]) # ['eggs', 'spam'] print(a[-2:-4:-1]) # ['spam', 'eggs'] a[-1] = 17 print(a) # ['bacon', 'eggs', 'spam', 17] print(len(a)) # 4 K zamyšlení: Jakou implementaci seznamu používá Python? IB111 přednáška 6: datové typy 26. říjen 2016 8 / 36

Seznamy v Pythonu (pokr.) Užitečné funkce pro seznamy l.append(x) # přidá prvek x na konec l.extend(s) # přidá všechny prvky s na konec l.insert(i, x) # přidá prvek x před prvek na pozici i l.remove(x) # odstraní první prvek rovný x l.pop(i) # odstraní (a vrátí) prvek na pozici i l.pop() # odstraní (a vrátí) poslední prvek l.index(x) # vrátí index prvního prvku rovného x l.count(x) # vrátí počet výskytů prvků rovných x l.sort() # seřadí seznam l.reverse() # obrátí seznam x in l # test, zda seznam obsahuje x # (lineární průchod seznamem!) IB111 přednáška 6: datové typy 26. říjen 2016 9 / 36

Seznamy v Pythonu (pokr.) Příkaz del smaže prvek nebo část seznamu a = ['spam', 'bacon', 'eggs', 'spam', 42] del a[-1] print(a) # ['spam', 'bacon', 'eggs', 'spam'] del a[1:3] print(a) # ['spam', 'spam'] del a[:] print(a) # [] del umí mazat i jiné věci, např. celé proměnné del a print(a) # NameError: name 'a' is not defined IB111 přednáška 6: datové typy 26. říjen 2016 10 / 36

Použití seznamů Příklad: medián def median(num_list): num_list.sort() l = len(num_list) mid = l // 2 if l % 2!= 0: return num_list[mid] return (num_list[mid] + num_list[mid - 1]) / 2 a = [6, 4, 4, 6, 5, 3, 6, 4, 2, 2] print(median(a)) # 4.0 print(a) # [2, 2, 3, 4, 4, 4, 5, 6, 6, 6] co se stalo a jak to spravit? (vedlejší efekt funkce) Poznámka: medián se dá spočítat i bez seřazení seznamu IB111 přednáška 6: datové typy 26. říjen 2016 11 / 36

Generátorová notace pro seznamy (list comprehension) specialita Pythonu, vyskytuje se v některých jiných jazycích (Haskell) s = [x for x in range(1, 7)] print(s) # [1, 2, 3, 4, 5, 6] s = [2 * x for x in range(1, 7)] print(s) # [2, 4, 6, 8, 10, 12] s = [(a, b) for a in range(1, 5) for b in ["A", "B"]] print(s) # [(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'),... připomíná vám to něco? zápis množin pomocí charakteristické vlastnosti prvků (set comprehension) IB111 přednáška 6: datové typy 26. říjen 2016 12 / 36

Vnořené seznamy prvky seznamů mohou být opět seznamy použití: vícerozměrná data (např. matice) mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(mat[1][2]) # 6 Příklad: nulová matice zadaných rozměrů def null_matrix(m, n): return [[0 for col in range(n)] for row in range(m)] lepší způsob práce s maticemi: knihovna numpy IB111 přednáška 6: datové typy 26. říjen 2016 13 / 36

Vnořené seznamy (pokr.) Příklad: násobení matic def matrix_mult(matl, matr): rows = len(matl) cols = len(matr[0]) common = len(matr) result = null_matrix(rows, cols) for i in range(rows): for j in range(cols): for k in range(common): result[i][j] += matl[i][k] * matr[k][j] return result K zamyšlení: jak ošetříme, že vstup je platný? jsou na vstupu skutečně matice? jsou matice kompatibilní? IB111 přednáška 6: datové typy 26. říjen 2016 14 / 36

Ntice (tuples) v Pythonu podobné seznamům neměnné jako řetězce zápis do kulatých závorek (nepovinné) specialita Pythonu: (7,) je ntice o velikosti 1 t = "The Answer", 42, 6 * 9 print(t) # ('The Answer', 42, 54) print(t[1]) # 42 u = t, (1, 2, 3) print(u) # (('The Answer', 42, 54), (1, 2, 3)) použití při přiřazení x, y, z = t # přiřazení do x, y i z print(z) # 54 x, y = y, x # prohození proměnných IB111 přednáška 6: datové typy 26. říjen 2016 15 / 36

Datový typ zásobník Zásobník obsahuje prvky v pořadí LIFO (Last In First Out) operace push (vložení) push pop (odstranění) top (náhled na horní prvek) empty (test prázdnosti) mnohá použití procházení grafů analýza syntaxe vyhodnocování výrazů rekurze pop IB111 přednáška 6: datové typy 26. říjen 2016 16 / 36

Motivace pro zásobník procházení bludiště bez smyček IB111 přednáška 6: datové typy 26. říjen 2016 17 / 36

Zásobník v Pythonu implementace pomocí seznamu místo push máme append místo top máme [-1] def push(stack, element): stack.append(element) def pop(stack): return stack.pop() def top(stack): return stack[-1] def empty(stack): return stack.empty() IB111 přednáška 6: datové typy 26. říjen 2016 18 / 36

Zásobník v Pythonu (pokr.) Příklad: postfixová notace infixová notace operátory mezi operandy např. 1 + 2, (3 + 7) * 9 je třeba používat závorky prefixová notace (polská notace) operátory před operandy např. + 1 2, * + 3 7 9 není třeba závorky postfixová notace (reverzní polská notace, RPN) operátory za operandy např. 1 2 +, 3 7 + 9 * není třeba závorky snadné vyhodnocení pomocí zásobníku IB111 přednáška 6: datové typy 26. říjen 2016 19 / 36

Zásobník v Pythonu (pokr.) Příklad: postfixová notace def eval_rpn(line): stack = [] for token in line.split(): if token == '*': b = pop(stack) a = pop(stack) push(stack, a * b) elif token == '+': b = pop(stack) a = pop(stack) push(stack, a + b) else: push(stack, float(token) return top(stack) IB111 přednáška 6: datové typy 26. říjen 2016 20 / 36

Zásobník v Pythonu (pokr.) Příklad vyhodnocení postfixové notace: 7 4 7 + * 8 + vstup akce zásobník 7 4 7 + * 8 + push 4 7 + * 8 + push 7 7 + * 8 + push 7 4 + * 8 + + 7 4 7 * 8 + * 7 11 8 + push 77 + + 77 8 85 IB111 přednáška 6: datové typy 26. říjen 2016 21 / 36

Datový typ fronta Fronta obsahuje prvky v pořadí FIFO (First In First Out) operace enqueue (vložení) dequeue (odstranění) front (náhled na přední prvek) empty (test prázdnosti) použití zpracovávání příchozích požadavků IB111 přednáška 6: datové typy 26. říjen 2016 22 / 36

Fronta v Pythonu implementace pomocí seznamů by byla pomalá přidávání a odebírání na začátek seznamu vyžaduje přesun použití knihovny collections datový typ deque (oboustranná fronta) vložení do fronty pomocí append odebrání z fronty pomocí popleft přední prvek fronty je [0] from collections import deque q = deque(["eric", "John", "Michael"]) q.append("terry") # Terry arrives q.append("graham") # Graham arrives q.popleft() # Eric leaves q.popleft() # John leaves print(q) # deque(['michael', 'Terry', 'Graham'] IB111 přednáška 6: datové typy 26. říjen 2016 23 / 36

Datový typ množina Množina neuspořádaná kolekce dat bez vícenásobných prvků operace insert (vložení) find (vyhledání prvku, test přítomnosti) delete (odstranění) použití grafové algoritmy (označení navštívených vrcholů) rychlé vyhledávání výpis unikátních slov IB111 přednáška 6: datové typy 26. říjen 2016 24 / 36

Motivace pro množinu procházení bludiště se smyčkami IB111 přednáška 6: datové typy 26. říjen 2016 25 / 36

Množina v Pythonu speciální datový typ set set(l) # vytvoří množinu ze seznamu len(s) # počet prvků množiny s s.add(x) # přidání prvku do množiny s.remove(x) # odebrání prvku z množiny x in s # test, zda množina obsahuje x s1 <= s2 # test, zda je s1 podmnožinou s2 s1.union(s2) # sjednocení množin s1 a s2 s1 s2 # -- totéž -- s1.intersection(s2) # průnik množin s1 a s2 s1 & s2 # -- totéž -- s1.difference(s2) # rozdíl množin s1 a s1 s1 - s2 # -- totéž -- s1.symmetric_diference(s2) # symetrický rozdíl množin s1 a s2 s1 ^ s2 # -- totéž -- IB111 přednáška 6: datové typy 26. říjen 2016 26 / 36

Množina v Pythonu (pokr.) basket = ['apple', 'orange', 'apple', 'orange', 'banana'] fruit = set(basket) print(fruit) # {'orange', 'apple', 'banana'} print('orange' in fruit) # True print('tomato' in fruit) # False a = set("abracadabra") b = set("engineering") print(a) # {'a', 'r', 'b', 'c', 'd'} print(b) # {'i', 'r', 'e', 'g', 'n'} print(a b) # {'a', 'c', 'b', 'e', 'd', 'g', 'i', 'n', 'r'} print(a & b) # {'r'} print(a - b) # {'a', 'c', 'b', 'd'} print(a ^ b) # {'a', 'c', 'b', 'e', 'd', 'g', 'i', 'n'} IB111 přednáška 6: datové typy 26. říjen 2016 27 / 36

Datový typ slovník Slovník (dictionary, map, asociativní pole) neuspořádaná množina dvojic (klíč, hodnota) klíče jsou unikátní operace jako u množiny (insert, find, delete) navíc přístup k hodnotě pomocí klíče klíče jsou neměnné, ale hodnoty se smí měnit použití překlad UČO na jméno, jméno na tel. číslo apod. počet výskytů slov v textu cache výsledků náročných výpočtů IB111 přednáška 6: datové typy 26. říjen 2016 28 / 36

Slovník v Pythonu zápis do složených závorek {} klíč a hodnotu oddělujeme dvojtečkou záznamy oddělujeme čárkami phone = {"Buffy": 5550101, "Xander": 5550168} phone["dawn"] = 5550193 print(phone) # {'Xander': 5550168, 'Dawn': 5550193, 'Buffy': 5550101} print(phone["xander"]) # 5550168 del phone["buffy"] print(phone) # {'Xander': 5550168, 'Dawn': 5550193} print(phone.keys()) # dict_keys(['xander', 'Dawn']) print("dawn" in phone) # True IB111 přednáška 6: datové typy 26. říjen 2016 29 / 36

Slovník v Pythonu (pokr.) procházení všech položek ve slovníku.items() nepoužívejte pro vyhledávání! for name, num in phone.items(): print(name + "'s number is", num) # Xander's number is 5550168 # Dawn's number is 5550193 užitečné funkce pro slovníky d.items() d.get(key, default) d.get(key) # vrátí seznam záznamů (dvojic) # pokud existuje klíč key, vrátí jeho # hodnotu, jinak vrátí hodnotu default # jako předtím, # jen default je teď None IB111 přednáška 6: datové typy 26. říjen 2016 30 / 36

Slovník v Pythonu příklady použití I Frekvence slov def is_word_char(char): return char not in '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{ }~' def word_freq(text): text = "".join(filter(is_word_char, text)) text = text.lower() word_list = text.split() freq = {} for word in word_list: freq[word] = freq.get(word, 0) + 1 return freq IB111 přednáška 6: datové typy 26. říjen 2016 31 / 36

Slovník v Pythonu příklady použití I (pokr.) Frekvence slov výpis frekvencí def output_word_freq(text): freq = sorted(word_freq(text).items(), key=lambda x: (x[1], x[0]), reverse=true) print("word frequencies, sorted from the most frequent:") for word, count in freq: print(word, "\t", count) IB111 přednáška 6: datové typy 26. říjen 2016 32 / 36

Slovník v Pythonu příklady použití I (pokr.) Frekvence slov laf = """I must not fear. Fear is the mind-killer....""" # etc. output_word_freq(laf) will 5 i 5 fear 5 the 4 to 2 me 2... IB111 přednáška 6: datové typy 26. říjen 2016 33 / 36

Slovník v Pythonu příklady použití II Morseovka morse = {'A': '.-', 'B': '-...', 'C': '-.-.'} # etc. def to_morse(s): result = "" for c in s: if c in morse: result += morse[c] + "/" elif c == " ": result += "/" return result print(to_morse("hello WORLD")) #..././.-../.-../---//.--/---/.-./.-../-../ IB111 přednáška 6: datové typy 26. říjen 2016 34 / 36

Slovník v Pythonu příklady použití III Substituční šifra def encrypt(text, subst): result = "" for c in text: if c in subst: result += subst[c] else: result += c return result my_cipher = {'A': 'Q', 'B': 'W', 'C': 'E'} # etc. print(encrypt("bac", my_cipher)) # WQE IB111 přednáška 6: datové typy 26. říjen 2016 35 / 36

Shrnutí Datové typy Seznam abstraktní (rozhraní) vs. konkrétní (implementace) posloupnost prvků; typicky umožňuje přidávat a odebírat v Pythonu: ntice (tuples) něco jako neměnné seznamy Zásobník/Fronta Množina Slovník LIFO / FIFO udržuje neuspořádané jedinečné prvky umožňuje přidávat, odebírat, vyhledávat množina záznamů (klíč, hodnota) umí všechno co množina a navíc indexovat klíčem IB111 přednáška 6: datové typy 26. říjen 2016 36 / 36