Programování v Pythonu

Podobné dokumenty
Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

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ů

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Programování v Pythonu

Funkcionální programování. Kristýna Kaslová

Programování v Pythonu

Programování v Pythonu

Algoritmizace a programování

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

Programování v Pythonu

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

Programování v Pythonu

Jazyk C# (seminář 6)

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Funkční objekty v C++.

Konečný automat. Jan Kybic.

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

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

Funkce, řetězce, moduly

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

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

Programovací í jazyk Haskell

Programování v jazyce JavaScript

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

Úvod do programovacích jazyků (Java)

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

Standardní algoritmy vyhledávací.

Generické programování

Zápis programu v jazyce C#

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

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Programování v Pythonu

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Programovací jazyk Haskell

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

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

Programování v jazyce JavaScript

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

Jazyk C# a platforma.net

KTE / ZPE Informační technologie

Programujeme v softwaru Statistica

Více o konstruktorech a destruktorech

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Iterator & for cyklus

Datové typy a struktury

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

Abstraktní datové typy: zásobník

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.

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Paradigmata programování 1

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

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Programovani v Maplu Procedura

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

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.

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

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

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

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

11. Přehled prog. jazyků

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

typová konverze typová inference

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

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

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Výčtový typ strana 67

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

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

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

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

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

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

IB111 Úvod do programování skrze Python

Objektově orientované programování v jazyce Python

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

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

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

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

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

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji?

Datové struktury. alg12 1

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

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

Chování konstruktorů a destruktorů při dědění

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Přetěžování operátorů

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Transkript:

ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P íprava studijního programu Informatika je podporována projektem nancovaným z Evropského sociálního fondu a rozpo tu hlavního m sta Prahy. Praha & EU: Investujeme do va²í budoucnosti

Python (2011-04-28) : Funkcionální prvky v Python'u 1 of 7 Python Funkcionální prvky v Python'u Úvod Skutečný funkcionální jazyk nemá žádné proměnné jednou přiřazené hodnoty jsou takovými už navždy. Podobně chování funkcí je zcela určeno pouze jejich vstupními parametry a navíc funkce nemění své okolí. Python nesplňuje žádnou z těchto podmínek. Dokonce byste asi měli docela problém napsat program bez použití proměnných. Ale svým protěžováním iterovatelných sekvenčních typů se pojetí funkcinálních jazyků docela blíží. Dokonce pro práci s nimi nabízí kromě generátorové notace i několik speciálních funkcí. V dalším se podíváme na několik základních (nejen čistě) funkcionálních prvků jazyka Python. Generátorová notace Generátorová notace patří mezi jednu z nejtypičtějších pythoních konstrukcí. Umožňuje velmi snadno na místě jednoho řádku za pomoci členů sekvence vyrábět sekvence (seznamy, množiny a slovníky) jiné. Pro seznam má v principu dvě následující podoby (přičemž PRVEK je nejčastěji nějakou funkcí prvků procházené SEKVENCE): [ PRVEK for I in SEKVENCE ] [ PRVEK for I in SEKVENCE if PODMÍNKA ] map() a spol.

Python (2011-04-28) : Funkcionální prvky v Python'u 2 of 7 K typicky funkcionálním operacím patří operace prováděné nad celou sekvenční strukturou najednou. Přitom platí, že je-li možné výsledek operace určit dříve, než je prozkoumána sekvence celá, také se tak stane (takže se nepočítají zbytečné kroky). I. Funkce any(iterable) vrací True, je-li alespoň jeden prvek z iterovatelné struktury vyhodnocen jako pravdivý. Pro prázdnou strukturu vrací False: >>> any('ahoj') True >>> any(['']*5) False II. Funkce all(iterable) vrací True, jsou-li všechny prvky z iterovatelné struktury vyhodnoceny jako pravdivé. Pro prázdnou strukturu vrací také True: >>> all('ahoj') True >>> all(['a', 'h', 0, '']) False III. Funkce min(sekvence) vrací nejmenší prvek ze sekvence: >>> min([5, 2, 4, 3, 6]) 2 IV. Funkce max(sekvence) vrací největší prvek ze sekvence: >>> max([5, 2, 4, 3, 6]) 6 V. Funkce sum(sekvence) vrací součet prvků v sekvenci: >>> sum([5, 2, 4, 3, 6]) 20 VI. Funkce map(funkce, ITERABLE) vrací iterátor, který postupně mapuje funkci na jednotlivé prvky iterovatelné struktury:

Python (2011-04-28) : Funkcionální prvky v Python'u 3 of 7 >>> map(ord, 'ahoj') <map object at 0x01406710> >>> list( map(ord, 'ahoj') ) [97, 104, 111, 106] Často je jednodušší a průhlednější napsat příslušný generátorový výraz [f(x) for x in xs]. VII. Funkce filter(funkce, ITERABLE) vrací iterátor, který postupně vrací ty prvky iterovatelné struktury, pro něž zadaná funkce poskytuje True: >>> filter(lambda x: x % 2, [5, 2, 4, 3, 6]) <filter object at 0x014085F0> >>> list( filter(lambda x: x % 2, [5, 2, 4, 3, 6]) ) [5, 3] Pro funkci různou od None je často je jednodušší a průhlednější napsat příslušný generátorový výraz [x for x in xs if f(x)]. VIII. Funkce zip(*iterables) vrací iterátor, který skládá dohromady do n-tic navzájem si odpovídající prvky z jednotlivých vstupních iterovatelných struktur: >>> zip( 'ahoj', [5, 2, 3, 4] ) <zip object at 0x01400AF8> >>> list( zip( 'ahoj', [5, 2, 3, 4] ) ) [('a', 5), ('h', 2), ('o', 3), ('j', 4)] Asi už nepřekvapí, že: map(f, filter(p, xs)) <=> [f(x) for x in xs if p(x)] Modul functools Další funkcionální prostředky obzvláště pro práci s funkcemi (higher-order functions) poskytuje modul functools. Podívejme se na výběr z nich:

Python (2011-04-28) : Funkcionální prvky v Python'u 4 of 7 I. Funkce reduce(funkce, ITERABLE) destruktivně aplikuje zadanou binární funkci postupně na dvojce prvků z iterovatelné struktury a vrací výsledek. Příklad je názornější: >>> from functools import reduce # Vlastně provede ((((5 + 2) + 4) + 3) + 6): >>> reduce(lambda x, y: x + y, [5, 2, 4, 3, 6]) 20 II. Funkce partial(func, *args, **keywords) vrací novou funkci (resp. callable), kterou vyrobí ze zadané tak, že některé její argumenty zafixuje předanými hodnotami. Příklad bude opět názornější: >>> from functools import partial # Vlastně zafixuje volání funkce 'int()' ve tvaru 'int(argument, b >>> basetwo = partial(int, base=2) >>> basetwo. doc = 'Convert base 2 string to an int.' >>> basetwo('10010') 18 Lambda-funkce Lambda-funkce jsou anonymní (tj. bezejmenné) funkce definované typicky v rámci jednoho řádku a skládající se pouze z jednoho výrazu, který je vyhodnocován ve chvíli volání funkce: lambda [ARGUMENT[Y]]: VÝRAZ Pythonovské lambda-funkce jsou v porovnání s prakticky libovolnou jinou implementací velmi omezené mohou obsahovat pouze jeden výraz, a to ještě bez složitějších, natožpak dokonce víceřádkových konstrukcí. Ve většině případů ale zastanou obdobnou práci obyčejné funkce v Python'u, protože jsou tzv. first-class object/citizen. (Což především znamená, že je možné je předávat jako parametry do jiných funkcí, vracet je jako návratové hodnoty z funkcí a ukládat je v datových strukturách.)

Python (2011-04-28) : Funkcionální prvky v Python'u 5 of 7 Generátory Naprosto typickým prvkem funkcionálního programování je vytváření (potenciálně i nekonečných) struktur, z nichž se vrací pouze ta část, která je aktuálně vyžadována, a nic dalšího se (zatím) nepočítá. I. V Python'u se konstruktorům takových objektů říká generátory. Vyrábějí se z obyčejných funkcí výměnou return za yield. Ukažme si nejdříve příklad: >>> def generátor():... """Tento generátor je možné zavolat celkem dvakrát."""... yield 'první volání'... yield 'druhé volání' >>> for i in generátor():... print(i) první volání druhé volání Vysvětlení: Každé yield zmrazí funkci v aktuálním stavu. Při příštím zavolání generátoru se řízení vrátí přesně do tohoto stavu (narozdíl od funkce, která se spustí znovu od začátku). Ukažme si poněkud lepší příklad: # Generátor.. def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] #..při použití.. for char in reverse('ahoj!'): print(char) #..vrací:! j o h A II. Výhoda generátorů tkví v tom, že mohou být potenciálně i nekonečné, aniž bychom se museli bát o dostupnou paměť počítá (a vrací) se z nich jenom to, co je v danou chvíli skutečně potřeba:

Python (2011-04-28) : Funkcionální prvky v Python'u 6 of 7 >>> def sudá_čísla():... číslo = 0... while True:... číslo += 2... yield číslo >>> g = sudá_čísla() >>> next(g) 2 >>> next(g) 4 >>> next(g) 6 Generátory (poznámky) Mezi použitím globální funkce next() pro vyvolání dalšího yieldu a smyčkou for in pro proiterování generátoru je několik rozdílů: next() očekává na vstupu konkrétní instanci generátoru, nikoli jeho konstruktor => kód next( g() ) bude vracet pokaždé první yield; pro nejspíše zamýšlené fungování tedy budete chtít provést něco takovéhoto: g = generátor() next(g) podobně zavolání next() na ukončený generátor (tj. ten, který už nemá co vrátit) vyvolá výjimku StopIteration Narozdíl od next() si tohle všechno smyčka for in hlídá sama na vstup jí můžete poslat rovnou konstruktor generátoru a uvedená výjimka je logicky interpretována jako ukončení cyklu. Generátorové výrazy Bude-li výstup generátoru vzápětí zlikvidován v nějaké globální sekvenční funkci (jako třeba sum() apod.), může se (zvláště z hlediska paměťových nároků) vyplatit použít místo plného generátoru nebo případné ekvivalentní

Python (2011-04-28) : Funkcionální prvky v Python'u 7 of 7 generátorové notace tzv. generátorový výraz. Generátorové výrazy se podobají generátorové notaci pro seznamy, jen místo [] používají (). Pár příkladů přímo z dokumentace: >>> sum(i*i for i in range(10)) # sum of squares 285 >>> xvec = [10, 20, 30] >>> yvec = [7, 5, 3] >>> sum(x*y for x,y in zip(xvec, yvec)) # dot product 260 >>> from math import pi, sin >>> sine_table = {x: sin(x*pi/180) for x in range(0, 91)} >>> unique_words = set(word for line in page for word in line.sp >>> valedictorian = max((student.gpa, student.name) for student in >>> data = 'golf' >>> list(data[i] for i in range(len(data)-1, -1, -1)) ['f', 'l', 'o', 'g']