Obsah
1. Funkcionální programování v Pythonu s využitím knihovny Toolz (3. část)
2. Curryfikace (currying)
3. Operace curry zapisovaná formou konstrukce objektu
4. Curryfikace funkce bez parametrů a funkce s jedním parametrem
5. Operace curry zapisovaná formou dekorátoru
6. Curryfikace funkcí definovaných přímo v knihovně Toolz
7. Import již curryfikovaných funkcí z knihovny Toolz
8. Curryfikované varianty standardních funkcí map, filter a reduce
9. Kompozice funkcí
10. Operace compose
11. Operace compose_left
12. Vytvoření kolony (pipe) funkcí pipe
13. Obsah závěrečného článku o knihovně Toolz
14. Repositář s demonstračními příklady
15. Odkazy na Internetu
1. Funkcionální programování v Pythonu s využitím knihovny Toolz (3. část)
V pořadí již třetím článku o funkcionální knihovně Toolz opustíme funkce, které jsou určené pro zpracování sekvencí (ať již sekvencí konečných nebo nekonečných). Namísto toho se zaměříme na mnohem zajímavější oblast, konkrétně na problematiku transformaci funkcí, na takzvaný currying (curifikaci), taktéž na částečné vyhodnocení funkcí atd. Jedná se o programovací techniky, které jsme mohli vidět (i když v poněkud odlišné podobě) i v knihovně funcy. Knihovna Toolz ovšem nabízí ucelenější a dobře propojené API k těmto funkcionálním technikám. Navíc je některé dále popsané operace možné zapsat formou dekorátoru, což je ve výsledku velmi čitelné řešení (jak ostatně uvidíme v demonstračních příkladech). A nesmíme zapomenout ani na to, že prakticky všechny funkce z knihovny Toolz jsou dostupné již ve své curryfikované podobě (pouze je nutné je naimportovat z jiného balíčku, konkrétně z balíčku toolz.curried, jak to ostatně uvidíme v demonstračních příkladech).
2. Curryfikace (currying)
S curryfikací jsme se již ve stručnosti seznámili v předchozích článcích, takže si v této kapitole jen shrneme základní pojmy. Pod termínem curryfikace (currying) se v teorii programovacích jazyků (ovšem i obecně v matematice) označuje proces, jímž se transformuje funkce, která má více než jeden parametr, do řady vložených funkcí, přičemž každá z nich má jen jediný parametr (jen na okraj – čistou funkci bez parametrů lze nahradit konstantou, takže do této skupiny nespadá). Curryfikaci si můžeme představit jako postupnou transformaci funkce s n parametry na jinak zkonstruovanou funkci s n-1 parametry atd. až rekurzivně dojdeme k funkci s jediným parametrem:
x = f(a,b,c) →
h = g(a)
i = h(b)
x = i(c)
Nebo lze prakticky totéž zapsat na jediném programovém řádku:
x = f(a,b,c) → g(a)(b)(c)
Poznámka: povšimněte si, že funkce g a h musí v tomto případě vracet jinou funkci. Dále si povšimněte, že se nevolá funkce g se třemi parametry, ale s parametrem jediným; výsledkem je opět funkce s jediným parametrem atd. atd.
To zní sice, alespoň na první pohled, poměrně složitě, ale v praxi je (například v programovacím jazyku ML, ale i v některých dalších funkcionálních programovacích jazycích) proces curryfikace realizován z pohledu programátora automaticky již samotným zápisem funkce s větším množstvím parametrů. To nám mj. umožňuje realizovat částečné vyhodnocení funkce (partial application), konkrétně zavoláním nějaké funkce (například funkce akceptující dva parametry) ve skutečnosti pouze s jediným parametrem.
Jenže otázkou je, co má být výsledkem volání takové funkce? Určitě ne výsledek implementované operace, protože nám chybí minimálně jeden argument pro to, aby byl výsledek vypočten a vrácen volajícím kódu. Ovšem můžeme provést částečný výpočet dosazením (jediného) předaného parametru a výsledek – tento částečný výpočet – vrátit. Výsledkem je tedy obecně částečně aplikovaná funkce (tedy například funkce, které byly v předchozím příkladu označeny symboly g a h). Jedná se o jeden ze způsobů, jak programově (tedy přímo za běhu aplikace) vytvářet nové funkce.
Poznámka: curryfikace/currying se tedy ve skutečnosti poněkud liší od tvorby částečně aplikovaných funkcí (i když se mnohdy oba termíny zaměňují, nebo používají současně).
Poznámka2: název currying je odvozen od jména známého matematika Haskella Curryho, po kterém je ostatně pojmenován i další programovací jazyk Haskell (ten se s výše zmíněným jazykem ML v mnoha ohledech podobá, právě i v kontextu curryingu a s ním souvisejícím faktem, že funkce akceptují jeden parametr). Ve skutečnosti však Haskell tento proces nevymyslel. Za původní myšlenkou tohoto procesu stojí Moses Schönfinkel, takže se uvažovalo, že se tento proces bude nazývat „Schönfinkelisation“. To by bylo asi férovější, ovšem uznejte sami, že se nejedná o tak snadno zapamatovatelný název, jakým je currying.
3. Operace curry zapisovaná formou konstrukce objektu
Curryfikace nějaké uživatelské či knihovní funkce se v knihovně Toolz provádí konstruktorem nazvaným curry. Podívejme se nyní na velmi jednoduchý demonstrační příklad, ve kterém z funkce add se dvěma parametry x a y vytvoříme novou funkci s jediným parametrem x. Po dosazení tohoto parametru do nové funkce se vrátí další funkce akceptující opět jediný parametr y. A zavoláním této funkce (po dosazení y) již získáme kýžený výsledek:
from toolz import curry
def add(x, y):
return x + y
curried = curry(add)
print(curried)
print(curried(1))
print(curried(1)(2)) # pozor na umístění závorek!
Po spuštění tohoto příkladu zjistíme, že curried je funkce a výsledek curried(1) je taktéž funkce. Až dosazení dvojky do této nové funkce získáme součet, tedy hodnotu 3:
<function add at 0x7f58fe917920>
<function add at 0x7f58fe917920>
3
Curryfikaci lze pochopitelně provést i s funkcí s vyšším počtem parametrů. Příkladem může být curryfikace funkce se třemi parametry x, y a z:
from toolz import curry
def add3(x, y, z):
return x + y + z
curried = curry(add3)
print(curried)
print(curried(1))
print(curried(1)(2)) # pozor na umístění závorek!
print(curried(1)(2)(3)) # pozor na umístění závorek!
Výsledkem curryfikace je funkce s jedním parametrem. Po jeho dosazení získáme další funkce akceptující jeden argument. Po dosazení tohoto argumentu získáme další funkci akceptující jeden argument. A konečně po jeho dosazení do této nové funkce se vrátí výsledek součtu:
<function add3 at 0x7fc8530f7920>
<function add3 at 0x7fc8530f7920>
<function add3 at 0x7fc8530f7920>
6
Příklad (i když opět poněkud umělý) na odvození funkce even z obecnější funkce divisible_by. Nová funkce bude použita pro získání sudých prvků z nekonečné sekvence:
from toolz import curry, take, iterate
def inc(x):
return x+1
def divisible_by(y, x):
return x % y == 0
curried = curry(divisible_by)
even = curried(2)
sequence = iterate(inc, 0)
evens = filter(even, sequence)
sequence = take(10, evens)
print(list(sequence))
Výsledek – prvních deset sudých prvků (pokud mezi sudé prvky budeme počítat nulu :-):
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
4. Curryfikace funkce bez parametrů a funkce s jedním parametrem
Curryfikace se typicky provádí u funkcí s větším počtem parametrů, Ovšem knihovna toolz podporuje i curryfikaci funkce bez parametrů nebo funkce s jedním parametrem (i když to z teoretického pohledu postrádá smysl).
Vyzkoušejme se nejprve curryfikaci funkce bez parametrů:
from toolz import curry
def hello():
print("Hello, world!")
curried = curry(hello)
print(hello)
print(curried)
curried()
Po spuštění tohoto demonstračního příkladu se postupně zobrazí reference na původní funkci, reference na curryfikovanou funkci a konečně výsledek volání curryfikované funkce. Povšimněte si, že původní funkce a curryfikovaná funkce mají zcela shodnou adresu, tudíž se jedná o tutéž funkci (hodnotu):
<function hello at 0x7f7bbbd63d30>
<function hello at 0x7f7bbbd63d30>
Hello, world!
Curryfikovat lze i funkci s jediným parametrem:
from toolz import curry
def inc(x):
return x+1
curried = curry(inc)
print(inc)
print(curried)
print(curried())
print(curried(1))
Nyní budou výsledky vypadat následovně:
<function inc at 0x7f4e8a972d30>
<function inc at 0x7f4e8a972d30>
<function inc at 0x7f4e8a972d30>
2
5. Operace curry zapisovaná formou dekorátoru
Výše popsané volání konstruktoru curry se využívá především ve chvíli, kdy potřebujeme pracovat jak s původní funkcí, tak i s její curryfikovanou variantou. Ovšem pokud původní funkci nebudeme nikdy volat, lze curryfikaci zapsat jednodušším způsobem, a to konkrétně s využitím dekorátoru @curry (jedná se stále o stejný symbol).
Příklad použití pro funkci se dvěma parametry:
from toolz import curry
@curry
def add(x, y):
return x + y
print(add)
print(add(1))
print(add(1)(2)) # pozor na umístění závorek!
Tentýž dekorátor, nyní ovšem použitý pro curryfikaci funkce se třemi parametry:
from toolz import curry
@curry
def add3(x, y, z):
return x + y + z
print(add3)
print(add3(1))
print(add3(1)(2)) # pozor na umístění závorek!
print(add3(1)(2)(3)) # pozor na umístění závorek!
A jak již víme z předchozí kapitoly, je možné curryfikovat i funkce bez parametrů či funkce s jediným parametrem (i když je to vlastně zbytečná operace):
from toolz import curry
@curry
def hello():
print("Hello, world!")
print(hello)
hello()
Výsledky:
<function hello at 0x7f0045162d30>
Hello, world!
Curryfikace funkce s jedním parametrem:
from toolz import curry
@curry
def inc(x):
return x+1
print(inc)
print(inc())
print(inc(1))
Výsledky:
<function inc at 0x7f8e74af3d30>
<function inc at 0x7f8e74af3d30>
2
Přepis demonstračního příkladu, který získává prvních deset sudých prvků z nekonečné sekvence:
from toolz import curry, take, iterate
def inc(x):
return x+1
@curry
def divisible_by(y, x):
return x % y == 0
even = divisible_by(2)
sequence = iterate(inc, 0)
evens = filter(even, sequence)
sequence = take(10, evens)
print(list(sequence))
6. Curryfikace funkcí definovaných přímo v knihovně Toolz
Samozřejmě nám nic nebrání v curryfikaci těch funkcí, které jsou definovány přímo v knihovně Toolz. Vzhledem k tomu, že se mnohdy jedná o funkce určené pro zpracování sekvencí, jejichž první parametr (nebo parametry) modifikují prováděnou operaci, se jedná o poměrně užitečnou vlastnost.
Pokud například budeme chtít získat prvních deset prvků z konečné či nekonečné sekvence, lze postupovat takto:
from toolz.itertoolz import take
sequence = range(1, 1000)
first10 = take(10, sequence)
print(list(first10))
Výsledkem bude seznam prvních deseti prvků z delší sekvence:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Taktéž si pochopitelně můžeme zadefinovat vlastní funkci nazvanou například head, která s využitím take vrátí prvních deset prvků předané sekvence:
from toolz.itertoolz import take
sequence = range(1, 1000)
def head(s):
return take(10, s)
first10 = head(sequence)
print(list(first10))
Podobnou operaci lze ovšem funkcionálně realizovat i tak, že použijeme curryfikaci s následným dosazením hodnoty 10 do curryfikované varianty funkce take:
from toolz import curry
from toolz.itertoolz import take
sequence = range(1, 1000)
curried = curry(take)
head = curried(10)
first10 = head(sequence)
print(list(first10))
Zkontrolujeme, zda dostaneme shodný výsledek, jako v předchozích dvou příkladech:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
7. Import již curryfikovaných funkcí z knihovny Toolz
Jak jsme si již řekli v předchozí kapitole, může být v praxi výhodné použít funkce z knihovny Toolz v jejich curryfikované podobě. Ovšem to vyžaduje stále opakování stejného kódu:
curried = curry(take)
Aby se tento programový kód nemusel stále znovu a znovu opisovat pro všechny existující funkce, je přímo v knihovně Toolz nabízen podbalíček nazvaný toolz.curried, v němž jsou všechny původní funkce dostupné v curryfikované podobě (a pod stejným jménem – jména lze odlišit specifikací jmenného prostoru). Podívejme se na jednoduchý příklad:
from toolz.curried import take
sequence = range(1, 1000)
head = take(10)
first10 = head(sequence)
print(list(first10))
Výsledek bude totožný, jako tomu bylo u příkladů z předchozí kapitoly:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
8. Curryfikované varianty standardních funkcí map, filter a reduce
V knihovně Toolz, konkrétně v podbalíčku toolz.curried, nalezneme i curryfikovanou podobu standardních funkcí map, filter a reduce. Použití těchto funkcí je jednoduché. Můžeme si například nechat vytvořit funkci vracející délky všech slov v předané sekvenci (například v seznamu):
from toolz.curried import map
message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
words = message.split()
lengths = map(len)
print(list(lengths(words)))
S výsledkem:
[5, 5, 5, 3, 5, 11, 10, 5, 3, 2, 7, 6, 10, 2, 6, 2, 6, 5, 6]
S původní funkcí map tuto operaci provést nelze:
from toolz.curried import map
message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
words = message.split()
lengths = map(len)
print(list(lengths(words)))
Tento skript nebude možné spustit:
Traceback (most recent call last):
File "un_curried_map.py", line 4, in <module>
lengths = map(len)
TypeError: map() must have at least two arguments.
9. Kompozice funkcí
V několika funkcionálních jazycích (a taktéž v jazycích typu FORTH, Factor nebo Joy) je umožněno vytvářet takzvané kompozice funkcí, tj. nové funkce, které vzniknou vzájemným voláním funkcí existujících, ovšem s tím, že se při konstrukci kompozice neřeší takové „maličkosti“, jako jsou názvy či počty předávaných parametrů. Ovšem s kompozicí funkcí se setkáme i v dalších jazycích, i když zde se celá technika může nazývat jinak (pipeline) atd. Tato možnost je dostupná i v knihovně Toolz, kde nalezneme trojici funkcí vyššího řádu:
- compose
- compose_left
- pipe
Tyto funkce si ukážeme v navazujících kapitolách na několika praktických příkladech.
10. Operace compose
Podívejme se na velmi jednoduchý příklad, který provede kompozici standardních funkcí len a str, a to konkrétně tak, že se vstupní parametr nejprve převede na řetězec funkcí str a následně se vypočte a vrátí délka tohoto řetězce funkcí len. Kompozice je tedy len(str(vstup)):
from toolz import compose
composed = compose(len, str)
print(composed)
print(composed(0))
print(composed(42))
print(composed(1000))
Výsledek by měl vypadat následovně – nejprve se vypíše typ hodnoty composed a následně se vypíšou délky řetězců „0“, „42“ a „1000“:
Compose(<built-in function len>, <class 'str'>)
1
2
4
Poznámka: povšimněte si toho, jak se zobrazí výsledek kompozice – jsou zde stále dostupné informace o tom, z jakých funkcí byla komponovaná funkce vytvořena (což například „konkurenční“ knihovna Funcy nedělá).
Ovšem můžeme použít i funkce s větším množstvím parametrů. Například lze vytvořit kompozici z funkce pro součet dvou hodnot s následným vynásobením mezivýsledku dvojkou:
from toolz import compose
def add(x, y):
return x+y
def double(x):
return 2*x
composed = compose(double, add)
print(composed(2, 3))
print(composed(-2, -3))
Tento příklad by měl po svém spuštění vypsat následující výsledky:
10
-10
A pro úplnost si ukažme ještě kompozici získanou ze třech funkcí, konkrétně abs(double(add(x,y))):
from toolz import compose
def add(x, y):
return x+y
def double(x):
return 2*x
def abs(x):
if x < 0:
return -x
return x
composed = compose(abs, double, add)
print(composed(2, 3))
print(composed(-2, -3))
Nyní budou výsledky vypadat takto:
10
10
Můžeme ovšem namísto pojmenovaných funkcí použít i anonymní funkce a celou kompozici zapsat jediným výrazem:
from toolz import compose
composed = compose(
lambda x: -x if x<0 else x,
lambda x: x*2,
lambda x, y: x+y)
print(composed(2, 3))
print(composed(-2, -3))
11. Operace compose_left
Při tvorbě kompozice z funkcí je pro většinu programátorů přirozenější číst kompozici zleva doprava. V tomto případě je výhodnější namísto compose použít funkci vyššího řádu nazvanou compose_left (pozor na zmatení – ve Funcy se tato operace jmenovala rcompose!).
Zkusme si předchozí trojici demonstračních příkladů přepsat tak, aby se namísto compose použila funkce compose_left. Pochopitelně musíme prohodit i pořadí funkcí, které se do compose_(left) předávají.
První příklad, který nejprve převede hodnotu na řetězec a posléze vypočte délku tohoto řetězce:
from toolz import compose_left
composed = compose_left(str, len)
print(composed)
print(composed(0))
print(composed(42))
print(composed(1000))
Druhý příklad, který sečte předané hodnoty a následně se výsledek součtu vynásobí dvěma:
from toolz import compose_left
def add(x, y):
return x+y
def double(x):
return 2*x
composed = compose_left(add, double)
print(composed(2, 3))
print(composed(-2, -3))
A konečně si přepišme příklad třetí, který z výsledku součtu následovaného vynásobením dvěma vypočte absolutní hodnotu:
from toolz import compose_left
def add(x, y):
return x+y
def double(x):
return 2*x
def abs(x):
if x < 0:
return -x
return x
composed = compose_left(add, double, abs)
print(composed(2, 3))
print(composed(-2, -3))
12. Vytvoření kolony (pipe) funkcí pipe
Od operací compose a compose_left je to již jen malý krůček k velmi užitečné operaci – konstrukci kolony s předáním hodnot do této kolony. Kolonou je v tomto případě myšlena sekvence funkcí. Vstupní hodnoty jsou předány první funkci, výsledek této funkce je předán druhé funkci atd. až výsledek poslední funkce je hodnotou, která je z kolony vrácena volajícímu kódu. Kolona je tedy vlastně vytvořena kombinací dvou kroků:
- Vytvoření kompozice funkcí (compose_left)
- Zavolání výsledné funkce s předáním parametrů
Celý koncept si můžeme jednoduše otestovat:
from toolz import pipe
print(pipe(1, str, len))
print(pipe(42, str, len))
print(pipe(1000, str, len))
Výsledky:
1
2
4
Kolona se třemi funkcemi, které se postupně volají:
from toolz import pipe
def double(x):
return x*2
print(pipe(1, abs, double))
print(pipe(42, abs, double))
print(pipe(1000, abs, double))
Výsledky:
2
84
2000
Samozřejmě můžeme použít i anonymní funkce a nikoli pouze funkce pojmenované:
from toolz import pipe
print(pipe(1, abs, lambda x: x*2))
print(pipe(42, abs, lambda x: x*2))
print(pipe(1000, abs, lambda x: x*2))
Výsledky budou v tomto případě pochopitelně totožné s předchozím demonstračním příkladem:
2
84
2000
13. Obsah závěrečného článku o knihovně Toolz
V posledním článku o knihovně Toolz si popíšeme podbalíček nazvaný dicttoolz. Funkce v něm definované připomínají práci se slovníky v programovacím jazyce Clojure – jedná se tedy o funkcionální přístup, kdy výsledkem nějaké operace je nový slovník a nikoli modifikace existujícího slovníku.
14. Repositář s demonstračními příklady
Všechny Pythonovské skripty, které jsme si prozatím v tomto seriálu ukázali, naleznete na adrese https://github.com/tisnik/most-popular-python-libs. Následují odkazy na jednotlivé příklady (pro jejich spuštění je nutné mít nainstalovánu některou z podporovaných verzí Pythonu 3, a pro dnešní příklady i výše zmíněnou knihovnu funcy):
# |
Příklad |
Stručný popis |
Adresa |
1 |
binary_operator.py |
ukázka funkce vyššího řádu, která jako parametr akceptuje jinou funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/binary_operator.py |
2 |
get_operator1.py |
ukázka funkce vyššího řádu, která vrací jinou funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/get_operator1.py |
3 |
get_operator2.py |
ukázka funkce vyššího řádu, která vrací jinou funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/get_operator2.py |
4 |
standard_operators.py |
použití standardních operátorů přepsaných do formy funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/standard_operators.py |
|
|
|
|
5 |
binary_operator_types.py |
varianta příkladu binary_operator.py s plnými typovými deklaracemi |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/binary_operator_types.py |
6 |
get_operator_types.py |
varianta příkladu get_operator2.py s plnými typovými deklaracemi |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/get_operator_types.py |
|
|
|
|
7 |
map1.py |
příklad použití funkce map: výpočet délky všech slov v textu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map1.py |
8 |
map2.py |
příklad použití funkce map: výpočet absolutní hodnoty všech členů posloupnosti |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map2.py |
9 |
map3.py |
příklad použití funkce map: aplikace vlastní pojmenované funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map3.py |
10 |
map4.py |
příklad použití funkce map: aplikace vlastního lambda výrazu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map4.py |
|
|
|
|
11 |
map_list_comprehension1.py |
přepis skriptu map1.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map_list_comprehension1.py |
12 |
map_list_comprehension2.py |
přepis skriptu map2.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map_list_comprehension2.py |
13 |
map_list_comprehension3.py |
přepis skriptu map3.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map_list_comprehension3.py |
14 |
map_list_comprehension4.py |
přepis skriptu map4.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/map_list_comprehension4.py |
|
|
|
|
15 |
filter1.py |
filtrace dat na základě délky řetězce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter1.py |
16 |
filter2.py |
filtrace numerických dat podle toho, zda se jedná o sudá či lichá čísla |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter2.py |
17 |
filter3.py |
přepis předchozího příkladu s využitím lambda výrazu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter3.py |
|
|
|
|
18 |
filter_list_comprehension1.py |
přepis skriptu filter_list_comprehension1.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter_list_comprehension1.py |
19 |
filter_list_comprehension2.py |
přepis skriptu filter_list_comprehension2.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter_list_comprehension2.py |
20 |
filter_list_comprehension3.py |
přepis skriptu filter_list_comprehension3.py tak, aby se použila generátorová notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/filter_list_comprehension3.py |
|
|
|
|
21 |
reduce1.py |
výpočet faktoriálu s využitím funkce vyššího řádu reduce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/reduce1.py |
22 |
reduce2.py |
přepis předchozího příkladu s využitím lambda výrazu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/reduce2.py |
23 |
reduce3.py |
tisk tabulky faktoriálů |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/reduce3.py |
24 |
reduce4.py |
přepis předchozího příkladu s využitím lambda výrazu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/reduce4.py |
25 |
reduce5.py |
přepis předchozího příkladu s využitím generátorové notace |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/reduce5.py |
|
|
|
|
26 |
return_function.py |
funkce jako návratová hodnota jiné funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/return_function.py |
27 |
closure_adder1.py |
příklad použití uzávěru – konstrukce funkce typu adder |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/closure_adder1.py |
28 |
counter_closure1.py |
nekorektní implementace čítače s využitím uzávěrů |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/counter_closure1.py |
29 |
counter_closure2.py |
přístup k nelokálnímu symbolu (Python 2.x i Python 3.x) |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/counter_closure2.py |
30 |
counter_closure3.py |
přístup k nelokálnímu symbolu (pouze Python 3.x) |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/counter_closure3.py |
|
|
|
|
31 |
access_nonlocal_symbol.py |
přístup k nelokálnímu symbolu v uzávěru |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/access_nonlocal_symbol.py |
32 |
functions_and_closures.py |
funkce a uzávěry (umělý příklad) |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/functions_and_closures.py |
|
|
|
|
33 |
partial1.py |
funkce doubler odvozená (redukcí) z univerzálnější funkce mul |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial1.py |
34 |
partial2.py |
transformace funkce se třemi parametry s využitím partial (nekorektní řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial2.py |
35 |
partial3.py |
transformace funkce se třemi parametry s využitím partial (korektní řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial3.py |
36 |
partial4.py |
transformace funkce s dosazením většího množství parametrů s využitím partial |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial4.py |
37 |
partial5.py |
několikanásobná transformace původní funkce na několik nových funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial5.py |
38 |
partial6.py |
postupná transformace již ztransformovaných funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial6.py |
39 |
partial7.py |
typ originální funkce i funkcí získaných s využitím transformace pomocí partial |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial7.py |
40 |
partial8.py |
jméno funkce, poziční argumenty funkce a pojmenované argumenty funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial8.py |
41 |
partial9.py |
transformace reduce a pojmenované argumenty původní funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial9.py |
42 |
partial_A.py |
získání informací o redukované funkci s pojmenovanými argumenty |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial_A.py |
|
|
|
|
43 |
partial_method1.py |
třída s metodou s parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial_method1.py |
44 |
partial_method2.py |
třída s metodou s parametry – vliv volání setteru na stav objektu |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial_method2.py |
45 |
partial_method3.py |
metody enable a disable vzniklé transformací set_enabled |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial_method3.py |
46 |
partial_method4.py |
další příklad použití funkce partialmethod – doplnění většího množství parametrů při transformaci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/partial_method4.py |
|
|
|
|
47 |
lru_cache1.py |
klasický výpočet Fibonacciho posloupnosti rekurzivní funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/lru_cache1.py |
48 |
lru_cache2.py |
LRU cache pro výsledky Fibonacciho posloupnosti pro nejčastěji použité vstupy |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/lru_cache2.py |
49 |
lru_cache3.py |
přečtení informací o využití LRU cache |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/lru_cache3.py |
50 |
lru_cache4.py |
programové vymazání LRU cache |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/lru_cache4.py |
|
|
|
|
51 |
cached_property1.py |
použití standardního dekorátoru @property |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/cached_property1.py |
52 |
cached_property2.py |
použití dekorátoru @cached_property |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/cached_property2.py |
53 |
cached_property3.py |
úprava předchozího příkladu tak, aby se využila LRU cache |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/cached_property3.py |
|
|
|
|
54 |
total_ordering.py |
příklad implementace relačních operátorů založených na dekorátoru @total_ordering |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/total_ordering.py |
|
|
|
|
55 |
decorators2.py |
příklad použití jednoho dekorátoru aplikovaného na funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/decorators2.py |
56 |
decorators3.py |
příklad použití dvou dekorátorů aplikovaných na funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/decorators3.py |
57 |
measure_time.py |
praktické použití dekorátoru – měření doby trvání funkce označené dekorátorem |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/measure_time.py |
|
|
|
|
58 |
decorators4.py |
atributy transformované funkce vytvořené s využitím dekorátoru |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/decorators4.py |
59 |
decorators5.py |
využití dekorátoru @wraps pro automatickou úpravu atributů „obalované“ funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/decorators5.py |
60 |
decorators6.py |
dekorátor @wraps a několikanásobná aplikace dekorátorů na „obalovanou“ funkci |
https://github.com/tisnik/most-popular-python-libs/blob/master/functools/decorators6.py |
|
|
|
|
61 |
decorators1.py |
zkrácená deklarace dekorátoru s využitím dekorátoru @decorator |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/decorators1.py |
62 |
decorators2.py |
několikanásobná aplikace dekorátorů, dekorátor je vytvořen přes @decorator |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/decorators2.py |
63 |
measure_time.py |
měření doby trvání funkce označené dekorátorem, dekorátor je vytvořen přes @decorator |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/measure_time.py |
|
|
|
|
64 |
curry1.py |
curryfikace funkce se dvěma parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/curry1.py |
65 |
curry2.py |
curryfikace funkce se třemi parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/curry2.py |
66 |
rcurry1.py |
curryfikace funkce div funkcí curry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcurry1.py |
67 |
rcurry2.py |
curryfikace funkce div funkcí rcurry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcurry2.py |
68 |
rcurry3.py |
curryfikace funkce n_pow funkcí rcurry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcurry3.py |
|
|
|
|
69 |
autocurry.py |
curryfikace funkce n_pow funkcí autocurry (s odlišným výsledkem) |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/autocurry.py |
|
|
|
|
70 |
compose1.py |
kompozice funkcí s využitím funkce vyššího řádu compose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/compose1.py |
71 |
compose2.py |
kompozice funkcí s využitím funkce vyššího řádu compose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/compose2.py |
72 |
compose3.py |
kompozice funkcí s využitím funkce vyššího řádu compose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/compose3.py |
73 |
rcompose1.py |
kompozice funkcí s využitím funkce vyššího řádu rcompose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcompose1.py |
74 |
rcompose2.py |
kompozice funkcí s využitím funkce vyššího řádu rcompose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcompose2.py |
75 |
rcompose3.py |
kompozice funkcí s využitím funkce vyššího řádu rcompose |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/rcompose3.py |
|
|
|
|
76 |
filter1.py |
použití standardní funkce filter (opakování) |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter1.py |
77 |
filter2.py |
použití funkce filter z knihovny funcy |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter2.py |
78 |
filter3.py |
funkce vyššího řádu lfilter |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter3.py |
79 |
filter4.py |
předání lambda výrazu do funkcí vyššího řádu filter a lfilter |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter4.py |
80 |
filter5.py |
regulární výraz ve funkci predikátu |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter5.py |
81 |
filter6.py |
množina ve funkci predikátu |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter6.py |
82 |
filter7.py |
množina ve funkci predikátu |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/filter7.py |
|
|
|
|
83 |
remove1.py |
použití funkce vyššího řádu remove |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/remove1.py |
84 |
remove2.py |
použití funkce vyššího řádu lremove |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/remove2.py |
85 |
remove3.py |
kombinace regulárního výrazu a funkce vyššího řádku lremove |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/remove3.py |
86 |
remove4.py |
kombinace množin a funkce vyššího řádku lremove |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/remove4.py |
|
|
|
|
87 |
map1.py |
použití standardní funkce map (opakování) |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/map1.py |
88 |
map2.py |
použití funkce map z knihovny funcy |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/map2.py |
89 |
map3.py |
funkce vyššího řádu lmap |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/map3.py |
90 |
map4.py |
použití regulárního výrazu namísto transformační funkce v lmap |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/map4.py |
91 |
map5.py |
použití regulárního výrazu namísto transformační funkce v lmap |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/map5.py |
|
|
|
|
92 |
distinct1.py |
získání unikátních prvků ze vstupní sekvence funkcí distinct |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/distinct1.py |
93 |
distinct2.py |
získání unikátních prvků ze vstupní sekvence funkcí distinct |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/distinct2.py |
|
|
|
|
94 |
take_while1.py |
filtrace prvků sekvence funkcí takewhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/take_while1.py |
95 |
take_while2.py |
filtrace prvků sekvence funkcí takewhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/take_while2.py |
96 |
drop_while1.py |
filtrace prvků sekvence funkcí dropwhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/drop_while1.py |
97 |
drop_while2.py |
filtrace prvků sekvence funkcí dropwhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/drop_while2.py |
|
|
|
|
98 |
split1.py |
rozdělení sekvence na prvky odpovídající predikátu a na prvky, které predikátu neodpovídají |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split1.py |
99 |
split2.py |
rozdělení sekvence na prvky odpovídající predikátu a na prvky, které predikátu neodpovídají |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split2.py |
100 |
split3.py |
rozdělení sekvence na prvky odpovídající predikátu a na prvky, které predikátu neodpovídají |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split3.py |
101 |
split4.py |
rozdělení sekvence na prvky odpovídající predikátu a na prvky, které predikátu neodpovídají |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split4.py |
|
|
|
|
102 |
split_by1.py |
kombinace funkcí vyššího řádu takewhile a dropwhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split_by1.py |
103 |
split_by2.py |
kombinace funkcí vyššího řádu takewhile a dropwhile |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/split_by2.py |
|
|
|
|
104 |
partition_by.py |
rozdělení sekvence na větší množství sekvencí funkcí partition_by |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/partition_by.py |
|
|
|
|
105 |
count1.py |
nekonečná sekvence čítačů s hodnotami 0, 1, 2, … |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count1.py |
106 |
count2.py |
získání prvních dvaceti hodnot čítačů z původně nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count2.py |
107 |
count3.py |
kombinace konečné a nekonečné sekvence s využitím standardní funkce zip |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count3.py |
108 |
count4.py |
kombinace dvou nekonečných sekvencí s využitím standardní funkce zip |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count4.py |
109 |
count5.py |
specifikace počáteční hodnoty nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count5.py |
110 |
count6.py |
specifikace počáteční hodnoty a kroku nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count6.py |
111 |
count7.py |
specifikace záporného kroku nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count7.py |
112 |
count8.py |
neceločíselný krok i hodnota prvního prvku |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count8.py |
|
|
|
|
112 |
cycle1.py |
opakující se nekonečná sekvence dvou hodnot |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle1.py |
113 |
cycle2.py |
opakující se nekonečná sekvence dvou hodnot |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle2.py |
114 |
cycle3.py |
kombinace dvou opakujících se nekonečných sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle3.py |
115 |
cycle4.py |
sekvence obsahující označení všech hracích karet |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle4.py |
|
|
|
|
116 |
group_by1.py |
rozdělení numerických hodnot do deseti skupin |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by1.py |
117 |
group_by2.py |
rozdělení slov do skupin podle délky |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by2.py |
118 |
group_by3.py |
rozdělení slov do skupin podle délky, výsledek je seřazen |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by3.py |
|
|
|
|
119 |
iterate1.py |
sekvence tvořená aritmetickou řadou |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate1.py |
120 |
iterate2.py |
sekvence tvořená aritmetickou řadou |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate2.py |
121 |
iterate3.py |
sekvence s celočíselnými mocninami dvojky |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate3.py |
122 |
iterate4.py |
vygenerování Fibonacciho posloupnosti (neúplné řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate4.py |
123 |
iterate5.py |
vygenerování Fibonacciho posloupnosti (úplné řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate5.py |
|
|
|
|
124 |
repeat1.py |
vygenerování konečné sekvence s deseti prvky |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat1.py |
125 |
repeat2.py |
vygenerování konečné sekvence s deseti prvky, převod sekvence na seznam |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat2.py |
126 |
repeat3.py |
vygenerování nekonečné sekvence bez její materializace |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat3.py |
127 |
repeat4.py |
vygenerování nekonečné sekvence s pokusem o její materializaci |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat4.py |
128 |
repeat5.py |
získání několika prvků z původně nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat5.py |
129 |
repeat6.py |
kombinace konečné a nekonečné sekvence s využitím standardní funkce zip |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat6.py |
|
|
|
|
130 |
interleave.py |
kombinace prvků dvou nekonečných sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/interleave.py |
|
|
|
|
131 |
silent1.py |
výpočet podílu, funkce může vyhodit výjimku |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent1.py |
132 |
silent2.py |
výpočet podílu, výjimka je zachycena přes @silent |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent2.py |
133 |
silent3.py |
čtení ze souboru, funkce může vyhodit výjimku |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent3.py |
134 |
silent4.py |
čtení ze souboru, výjimka je zachycena přes @silent |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent4.py |
135 |
silent5.py |
explicitní vyhození výjimky s využitím raise |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent5.py |
136 |
silent6.py |
explicitní vyhození výjimky s využitím raise, zachycení přes @silent |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent6.py |
137 |
silent7.py |
explicitní vyhození výjimky ve volané funkci, opět zachycení přes @silent |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/silent7.py |
|
|
|
|
138 |
ignore1.py |
zachycení výjimky typu Exception a od ní odvozených výjimek |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore1.py |
139 |
ignore2.py |
pokus o zachycení odlišné výjimky, než je ZeroDivisionError |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore2.py |
140 |
ignore3.py |
zachycení pouze jediné výjimky, která nás při výpočtu zajímá, tedy výjimky vyhození při dělení nulou |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore3.py |
141 |
ignore4.py |
vrácení zvolené hodnoty v případě, že je výjimka zachycena |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore4.py |
142 |
ignore5.py |
zachycení výjimky ZeroDivisionError, ignorace výjimky TypeError |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore5.py |
143 |
ignore6.py |
zachycení výjimky ZeroDivisionError a/nebo TypeError |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore6.py |
144 |
ignore7.py |
vrácení odlišných hodnot pro různé typy výjimek |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ignore7.py |
|
|
|
|
145 |
reraise1.py |
základní způsob použití dekorátoru @reraise |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/reraise1.py |
146 |
reraise2.py |
reakce na odlišný typ výjimky |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/reraise2.py |
147 |
reraise3.py |
reakce na větší množství typů výjimek |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/reraise3.py |
148 |
reraise4.py |
použití @reraise, ovšem s prázdným parametrem errors |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/reraise4.py |
149 |
reraise5.py |
využití informací z původní výjimky v nové výjimce |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/reraise5.py |
|
|
|
|
150 |
retry1.py |
základní způsob použití dekorátoru @retry |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/retry1.py |
151 |
retry2.py |
specifikace parametru timeout |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/retry2.py |
152 |
retry3.py |
specifikace typu zachytávaných výjimek |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/retry3.py |
153 |
retry4.py |
specifikace typu zachytávaných výjimek |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/retry4.py |
154 |
retry5.py |
exponenciálně vzrůstající hodnota timeout |
https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/retry5.py |
|
|
|
|
|
|
|
|
155 |
seq_first.py |
test operace first pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_first.py |
156 |
seq_last.py |
test operace last pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_last.py |
157 |
seq_take.py |
test operace take pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_take.py |
158 |
seq_drop.py |
test operace drop pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_drop.py |
159 |
seq_nth.py |
test operace nth pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_nth.py |
160 |
seq_get.py |
test operace get pro vstupní konečnou sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/seq_get.py |
|
|
|
|
161 |
iterate1.py |
sekvence tvořená aritmetickou řadou, použití pojmenované funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate1.py |
162 |
iterate2.py |
sekvence tvořená aritmetickou řadou, použití anonymní funkce |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate2.py |
163 |
iterate3.py |
sekvence s celočíselnými mocninami dvojky |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate3.py |
164 |
iterate4.py |
vygenerování Fibonacciho posloupnosti (neúplné řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate4.py |
165 |
iterate5.py |
vygenerování Fibonacciho posloupnosti (úplné řešení) |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate5.py |
166 |
iterate6.py |
vygenerování seznamů s aritmetickými řadami |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/iterate6.py |
167 |
accumulate.py |
postupná redukce vstupu s akumulací mezivýsledků |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/accumulate.py |
168 |
diff1.py |
výpočet rozdílu mezi dvěma sekvencemi |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/diff1.py |
169 |
diff2.py |
výpočet rozdílu mezi třemi sekvencemi |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/diff2.py |
170 |
group_by1.py |
operace groupby: rozdělení numerických hodnot do deseti skupin |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/group_by1.py |
171 |
group_by2.py |
rozdělení slov do skupin podle délky |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/group_by2.py |
172 |
group_by3.py |
rozdělení slov do skupin podle délky, výsledek je navíc seřazen |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/group_by3.py |
173 |
group_by_infinite.py |
operace groupby nad nekonečnou sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/group_by_infinite.py |
174 |
interleave.py |
kombinace většího množství sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/interleave.py |
175 |
interleave_length.py |
délka výsledné sekvence získaná po spojení sekvencí různé délky |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/interleave_length.py |
176 |
interleave_infinite.py |
kombinace nekonečných sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/interleave_infinite.py |
177 |
interpose.py |
proložení prvků sekvence další hodnotou |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/interpose.py |
178 |
partition.py |
rozdělení prvků sekvence do většího množství sekvencí pomocí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partition.py |
179 |
partition_infinite.py |
rozdělení nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partition_infinite.py |
180 |
reduce.py |
varianta funkce reduce |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/reduce.py |
181 |
parallel_fold.py |
paralelní varianta funkce reduce |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/parallel_fold.py |
|
|
|
|
182 |
frequencies.py |
získání četnosti prvků v sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/frequencies.py |
183 |
interpose_infinite.py |
operace interpose a nekonečná sekvence na vstupu |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/interpose_infinite.py |
184 |
isdistinct.py |
test, zda sekvence obsahuje unikátní prvky |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/isdistinct.py |
185 |
partitionby1.py |
rozdělení prvků sekvence na základě výsledků funkce pro každý prvek |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partitionby1.py |
186 |
partitionby2.py |
dtto, ale s odlišnou funkcí a vstupem |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partitionby2.py |
187 |
partitionby_infinite.py |
rozdělení prvků nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partitionby_infinite.py |
188 |
partitionby_infinite2.py |
rozdělení prvků nekonečné sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partitionby_infinite2.py |
189 |
sliding_window1.py |
posuvné okno nad sekvencí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/sliding_window1.py |
190 |
sliding_window2.py |
dtto, ale pro odlišné parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/sliding_window2.py |
191 |
sliding_window_infinite.py |
posuvné okno a nekonečná vstupní sekvence |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/sliding_window_infinite.py |
192 |
unique1.py |
nalezení unikátních prvků v sekvenci |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/unique1.py |
193 |
unique2.py |
dtto, ale pro odlišné parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/unique2.py |
194 |
partition_all.py |
operace partition_all |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/partition_all.py |
195 |
get.py |
operace get |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/get.py |
196 |
pluck.py |
operace pluck |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/pluck.py |
197 |
join1.py |
operace join, základní způsob použití |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/join1.py |
198 |
join2.py |
operace join, výběr ze spojených prvků |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/join2.py |
199 |
join3.py |
operace inner join |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/join3.py |
200 |
join4.py |
operace outer join |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/join4.py |
201 |
join5.py |
operace outer join |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/join5.py |
|
|
|
|
202 |
curry1.py |
curryfikace funkce se dvěma parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry1.py |
203 |
curry2.py |
curryfikace funkce se třemi parametry |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry2.py |
204 |
curry3.py |
curryfikace realizovaná formou dekorátoru |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry3.py |
205 |
curry4.py |
curryfikace realizovaná formou dekorátoru |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry4.py |
206 |
curry_no_params.py |
curryfikace funkce bez parametrů |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry_no_params.py |
207 |
curry_one_param.py |
curryfikace funkce s jediným parametrem |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curry_one_param.py |
208 |
curried_no_params.py |
curryfikace funkce bez parametrů realizovaná formou dekorátoru |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curried_no_params.py |
209 |
curried_one_param.py |
curryfikace funkce s jedním parametrem realizovaná formou dekorátoru |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/curried_one_param.py |
|
|
|
|
210 |
head1.py |
operace typu head realizovaná explicitním kódem |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/head1.py |
211 |
head2.py |
operace typu head realizovaná uživatelskou funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/head2.py |
212 |
head3.py |
operace typu head realizovaná curryfikací |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/head3.py |
213 |
head4.py |
operace typu head založená na již curryfikované funkci take |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/head4.py |
|
|
|
|
214 |
compose1.py |
kompozice funkcí zprava doleva, příklad číslo 1 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose1.py |
215 |
compose2.py |
kompozice funkcí zprava doleva, příklad číslo 2 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose2.py |
216 |
compose3.py |
kompozice funkcí zprava doleva, příklad číslo 3 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose3.py |
217 |
compose4.py |
kompozice funkcí zprava doleva, využití anonymních funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose4.py |
218 |
compose_left1.py |
kompozice funkcí zleva doprava, příklad číslo 1 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose_left1.py |
219 |
compose_left2.py |
kompozice funkcí zleva doprava, příklad číslo 2 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose_left2.py |
220 |
compose_left3.py |
kompozice funkcí zleva doprava, příklad číslo 3 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose_left3.py |
221 |
compose_left4.py |
kompozice funkcí zleva doprava, využití anonymních funkcí |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/compose_left4.py |
222 |
pipe1.py |
vytvoření kolony funkcí, příklad číslo 1 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/pipe1.py |
223 |
pipe2.py |
vytvoření kolony funkcí, příklad číslo 2 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/pipe2.py |
224 |
pipe3.py |
vytvoření kolony funkcí, příklad číslo 3 |
https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/pipe3.py |
15. Odkazy na Internetu
- Getting started with functional programming in Python using the toolz library
https://opensource.com/article/18/10/functional-programming-python-toolz
- Toolz module in Python
https://www.geeksforgeeks.org/toolz-module-in-python/
- functools — Higher-order functions and operations on callable objects
https://docs.python.org/3/library/functools.html
- Functional Programming HOWTO
https://docs.python.org/3/howto/functional.html
- Functional Programming in Python: When and How to Use It
https://realpython.com/python-functional-programming/
- Functional Programming With Python
https://realpython.com/learning-paths/functional-programming/
- Awesome Functional Python
https://github.com/sfermigier/awesome-functional-python
- Currying
https://en.wikipedia.org/wiki/Currying
- Currying in Python – A Beginner’s Introduction
https://www.askpython.com/python/examples/currying-in-python
- Fundamental Concepts in Programming Languages
https://en.wikipedia.org/wiki/Fundamental_Concepts_in_Programming_Languages
- When should I use function currying?
https://stackoverflow.com/questions/24881604/when-should-i-use-function-currying
- Toolz
https://github.com/pytoolz/toolz/tree/master
- Coconut: funkcionální jazyk s pattern matchingem kompatibilní s Pythonem
https://www.root.cz/clanky/coconut-funkcionalni-jazyk-s-pattern-matchingem-kompatibilni-s-pythonem/
- A HITCHHIKER'S GUIDE TO functools
https://ep2021.europython.eu/media/conference/slides/a-hitchhikers-guide-to-functools.pdf
- Coconut aneb funkcionální nadstavba nad Pythonem (2.část)
https://www.root.cz/clanky/coconut-aneb-funkcionalni-nadstavba-nad-pythonem-2-cast/
- Knihovny pro zpracování posloupností (sekvencí) v Pythonu
https://www.root.cz/clanky/knihovny-pro-zpracovani-posloupnosti-sekvenci-v-pythonu/
- clj – repositář s knihovnou
https://github.com/bfontaine/clj
- clj 0.1.0 – stránka na PyPi
https://pypi.python.org/pypi/clj/0.1.0
- Clojure aneb jazyk umožňující tvorbu bezpečných vícevláknových aplikací pro JVM (4.část – kolekce, sekvence a lazy sekvence)
https://www.root.cz/clanky/clojure-aneb-jazyk-umoznujici-tvorbu-bezpecnych-vicevlaknovych-aplikaci-pro-jvm-4-cast-kolekce-sekvence-a-lazy-sekvence/
- Clojure a bezpečné aplikace pro JVM: sekvence, lazy sekvence a paralelní programy
https://www.root.cz/clanky/clojure-a-bezpecne-aplikace-pro-jvm-sekvence-lazy-sekvence-a-paralelni-programy/
- Coconut: Simple, elegant, Pythonic functional programming
http://coconut-lang.org/
- coconut (Python package index)
https://pypi.python.org/pypi/coconut/
- Coconut Tutorial
http://coconut.readthedocs.io/en/master/HELP.html
- Coconut FAQ
http://coconut.readthedocs.io/en/master/FAQ.html
- Coconut Documentation
http://coconut.readthedocs.io/en/master/DOCS.html
- Coconut na Redditu
https://www.reddit.com/r/Python/comments/4owzu7/coconut_functional_programming_in_python/
- Repositář na GitHubu
https://github.com/evhub/coconut
- Object-Oriented Programming — The Trillion Dollar Disaster
https://betterprogramming.pub/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7
- Goodbye, Object Oriented Programming
https://cscalfani.medium.com/goodbye-object-oriented-programming-a59cda4c0e53
- So You Want to be a Functional Programmer (Part 1)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-1–1f15e387e536
- So You Want to be a Functional Programmer (Part 2)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-2–7005682cec4a
- So You Want to be a Functional Programmer (Part 3)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-3–1b0fd14eb1a7
- So You Want to be a Functional Programmer (Part 4)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-4–18fbe3ea9e49
- So You Want to be a Functional Programmer (Part 5)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-5-c70adc9cf56a
- So You Want to be a Functional Programmer (Part 6)
https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-6-db502830403
- Why Programmers Need Limits
https://cscalfani.medium.com/why-programmers-need-limits-3d96e1a0a6db
- Infographic showing code complexity vs developer experience
https://twitter.com/rossipedia/status/1580639227313676288
- Python's reduce(): From Functional to Pythonic Style
https://realpython.com/python-reduce-function/
- What is the problem with reduce()?
https://stackoverflow.com/questions/181543/what-is-the-problem-with-reduce
- The fate of reduce() in Python 3000
https://www.artima.com/weblogs/viewpost.jsp?thread=98196
- Reading 16: Map, Filter, Reduce
http://web.mit.edu/6.031/www/sp22/classes/16-map-filter-reduce/
- Currying
https://sw-samuraj.cz/2011/02/currying/
- Používání funkcí v F#
https://docs.microsoft.com/cs-cz/dotnet/fsharp/tutorials/using-functions
- Funkce vyššího řádu
http://naucte-se.haskell.cz/funkce-vyssiho-radu
- Currying (Wikipedia)
https://en.wikipedia.org/wiki/Currying
- Currying (Haskell wiki)
https://wiki.haskell.org/Currying
- Haskell Curry
https://en.wikipedia.org/wiki/Haskell_Curry
- Moses Schönfinkel
https://en.wikipedia.org/wiki/Moses_Sch%C3%B6nfinkel
- ML – funkcionální jazyk s revolučním typovým systémem
https://www.root.cz/clanky/ml-funkcionalni-jazyk-s-revolucnim-typovym-systemem/
- Funkce a typový systém programovacího jazyka ML
https://www.root.cz/clanky/funkce-a-typovy-system-programovaciho-jazyka-ml/
- Curryfikace (currying), výjimky a vlastní operátory v jazyku ML
https://www.root.cz/clanky/curryfikace-currying-vyjimky-a-vlastni-operatory-v-jazyku-ml/
- Primer on Python Decorators
https://realpython.com/primer-on-python-decorators/
- Python Decorators
https://www.programiz.com/python-programming/decorator
- PythonDecorators (Python Wiki)
https://wiki.python.org/moin/PythonDecorators
- Funcy na GitHubu
https://github.com/suor/funcy/
- Welcome to funcy documentation!
https://funcy.readthedocs.io/en/stable/
- Funcy cheatsheet
https://funcy.readthedocs.io/en/stable/cheatsheet.html
- PyToolz API Documentation
https://toolz.readthedocs.io/en/latest/index.html
- Curry v knihovně Toolz
https://toolz.readthedocs.io/en/latest/curry.html
- Compose v knihovně Toolz
https://toolz.readthedocs.io/en/latest/api.html#toolz.functoolz.compose
- Pipe v knihovně Toolz
ihttps://toolz.readthedocs.io/en/latest/api.html#toolz.functoolz.pipe
- Toolz (PyToolz) na GitHubu
https://github.com/pytoolz/toolz
- Fn.py: enjoy FP in Python
https://github.com/kachayev/fn.py
- Funcy na PyPi
https://pypi.org/project/funcy/
- Underscore aneb další knihovna pro funkcionální programování v JavaScriptu
https://www.root.cz/clanky/underscore-aneb-dalsi-knihovna-pro-funkcionalni-programovani-v-javascriptu/
- Funkce vyššího řádu v knihovně Underscore
https://www.root.cz/clanky/funkce-vyssiho-radu-v-knihovne-underscore/
- Awesome functional Python
https://github.com/sfermigier/awesome-functional-python
- lispy
https://pypi.org/project/lispy/
- clojure_py na indexu PyPi
https://pypi.python.org/pypi/clojure_py
- PyClojure
https://github.com/eigenhombre/PyClojure
- Hy na GitHubu
https://github.com/hylang/hy
- Hy: The survival guide
https://notes.pault.ag/hy-survival-guide/
- Hy běžící na monitoru terminálu společnosti Symbolics
http://try-hy.appspot.com/
- Welcome to Hy’s documentation!
http://docs.hylang.org/en/stable/
- Hy na PyPi
https://pypi.org/project/hy/#description
- Getting Hy on Python
https://lwn.net/Articles/596626/