Funkcionální programování v Pythonu s využitím knihovny Toolz (3. část)

5. 3. 2024
Doba čtení: 41 minut

Sdílet

Autor: Depositphotos
Zaměříme se na problematiku transformaci funkcí, na takzvaný currying (curifikaci), taktéž na částečné vyhodnocení funkcí atd. Nezapomeneme ani na možnost tvorby takzvané kolony (pipe) složené z více funkcí.

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, filterreduce

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, filterreduce

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:

  1. compose
  2. compose_left
  3. 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ů:

  1. Vytvoření kompozice funkcí (compose_left)
  2. 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:

prace_s_linuxem_tip

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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/map_list_comprehension.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/functool­s/map_list_comprehension.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/functool­s/map_list_comprehension.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/functool­s/map_list_comprehension.py
       
15 filter1.py filtrace dat na základě délky řetězce https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/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/functool­s/filter_list_comprehensi­on1.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/functool­s/filter_list_comprehensi­on2.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/functool­s/filter_list_comprehensi­on3.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/functool­s/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/functool­s/reduce2.py
23 reduce3.py tisk tabulky faktoriálů https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/reduce5.py
       
26 return_function.py funkce jako návratová hodnota jiné funkce https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/partial5.py
38 partial6.py postupná transformace již ztransformovaných funkcí https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/partial8.py
41 partial9.py transformace reduce a pojmenované argumenty původní funkce https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/partial_A.py
       
43 partial_method1.py třída s metodou s parametry https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/lru_cache3.py
50 lru_cache4.py programové vymazání LRU cache https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/lru_cache4.py
       
51 cached_property1.py použití standardního dekorátoru @property https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/cached_property1.py
52 cached_property2.py použití dekorátoru @cached_property https://github.com/tisnik/most-popular-python-libs/blob/master/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/functool­s/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/de­corators1.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/de­corators2.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/ta­ke_while1.py
95 take_while2.py filtrace prvků sekvence funkcí takewhile https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/ta­ke_while2.py
96 drop_while1.py filtrace prvků sekvence funkcí dropwhile https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/drop_whi­le1.py
97 drop_while2.py filtrace prvků sekvence funkcí dropwhile https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/drop_whi­le2.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/grou­p_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/in­terleave_length.py
176 interleave_infinite.py kombinace nekonečných sekvencí https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/in­terleave_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/par­tition_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/pa­rallel_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/in­terpose_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/par­titionby_infinite.py
188 partitionby_infinite2.py rozdělení prvků nekonečné sekvence https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/par­titionby_infinite2.py
189 sliding_window1.py posuvné okno nad sekvencí https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/sli­ding_window1.py
190 sliding_window2.py dtto, ale pro odlišné parametry https://github.com/tisnik/most-popular-python-libs/blob/master/toolz/sli­ding_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/sli­ding_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/par­tition_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/cu­rry_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/cu­rry_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/cu­rried_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/cu­rried_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/com­pose_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/com­pose_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/com­pose_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/com­pose_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

  1. Getting started with functional programming in Python using the toolz library
    https://opensource.com/ar­ticle/18/10/functional-programming-python-toolz
  2. Toolz module in Python
    https://www.geeksforgeeks.org/toolz-module-in-python/
  3. functools — Higher-order functions and operations on callable objects
    https://docs.python.org/3/li­brary/functools.html
  4. Functional Programming HOWTO
    https://docs.python.org/3/how­to/functional.html
  5. Functional Programming in Python: When and How to Use It
    https://realpython.com/python-functional-programming/
  6. Functional Programming With Python
    https://realpython.com/learning-paths/functional-programming/
  7. Awesome Functional Python
    https://github.com/sfermigier/awesome-functional-python
  8. Currying
    https://en.wikipedia.org/wi­ki/Currying
  9. Currying in Python – A Beginner’s Introduction
    https://www.askpython.com/pyt­hon/examples/currying-in-python
  10. Fundamental Concepts in Programming Languages
    https://en.wikipedia.org/wi­ki/Fundamental_Concepts_in_Pro­gramming_Languages
  11. When should I use function currying?
    https://stackoverflow.com/qu­estions/24881604/when-should-i-use-function-currying
  12. Toolz
    https://github.com/pytool­z/toolz/tree/master
  13. Coconut: funkcionální jazyk s pattern matchingem kompatibilní s Pythonem
    https://www.root.cz/clanky/coconut-funkcionalni-jazyk-s-pattern-matchingem-kompatibilni-s-pythonem/
  14. A HITCHHIKER'S GUIDE TO functools
    https://ep2021.europython­.eu/media/conference/slides/a-hitchhikers-guide-to-functools.pdf
  15. Coconut aneb funkcionální nadstavba nad Pythonem (2.část)
    https://www.root.cz/clanky/coconut-aneb-funkcionalni-nadstavba-nad-pythonem-2-cast/
  16. Knihovny pro zpracování posloupností (sekvencí) v Pythonu
    https://www.root.cz/clanky/knihovny-pro-zpracovani-posloupnosti-sekvenci-v-pythonu/
  17. clj – repositář s knihovnou
    https://github.com/bfontaine/clj
  18. clj 0.1.0 – stránka na PyPi
    https://pypi.python.org/py­pi/clj/0.1.0
  19. 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/
  20. 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/
  21. Coconut: Simple, elegant, Pythonic functional programming
    http://coconut-lang.org/
  22. coconut (Python package index)
    https://pypi.python.org/pypi/coconut/
  23. Coconut Tutorial
    http://coconut.readthedoc­s.io/en/master/HELP.html
  24. Coconut FAQ
    http://coconut.readthedoc­s.io/en/master/FAQ.html
  25. Coconut Documentation
    http://coconut.readthedoc­s.io/en/master/DOCS.html
  26. Coconut na Redditu
    https://www.reddit.com/r/Pyt­hon/comments/4owzu7/coconut_fun­ctional_programming_in_pyt­hon/
  27. Repositář na GitHubu
    https://github.com/evhub/coconut
  28. Object-Oriented Programming — The Trillion Dollar Disaster
    https://betterprogramming.pub/object-oriented-programming-the-trillion-dollar-disaster-92a4b666c7c7
  29. Goodbye, Object Oriented Programming
    https://cscalfani.medium.com/goodbye-object-oriented-programming-a59cda4c0e53
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. Why Programmers Need Limits
    https://cscalfani.medium.com/why-programmers-need-limits-3d96e1a0a6db
  37. Infographic showing code complexity vs developer experience
    https://twitter.com/rossi­pedia/status/1580639227313676288
  38. Python's reduce(): From Functional to Pythonic Style
    https://realpython.com/python-reduce-function/
  39. What is the problem with reduce()?
    https://stackoverflow.com/qu­estions/181543/what-is-the-problem-with-reduce
  40. The fate of reduce() in Python 3000
    https://www.artima.com/we­blogs/viewpost.jsp?thread=98196
  41. Reading 16: Map, Filter, Reduce
    http://web.mit.edu/6.031/www/sp22/clas­ses/16-map-filter-reduce/
  42. Currying
    https://sw-samuraj.cz/2011/02/currying/
  43. Používání funkcí v F#
    https://docs.microsoft.com/cs-cz/dotnet/fsharp/tutorials/using-functions
  44. Funkce vyššího řádu
    http://naucte-se.haskell.cz/funkce-vyssiho-radu
  45. Currying (Wikipedia)
    https://en.wikipedia.org/wi­ki/Currying
  46. Currying (Haskell wiki)
    https://wiki.haskell.org/Currying
  47. Haskell Curry
    https://en.wikipedia.org/wi­ki/Haskell_Curry
  48. Moses Schönfinkel
    https://en.wikipedia.org/wi­ki/Moses_Sch%C3%B6nfinkel
  49. ML – funkcionální jazyk s revolučním typovým systémem
    https://www.root.cz/clanky/ml-funkcionalni-jazyk-s-revolucnim-typovym-systemem/
  50. Funkce a typový systém programovacího jazyka ML
    https://www.root.cz/clanky/funkce-a-typovy-system-programovaciho-jazyka-ml/
  51. 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/
  52. Primer on Python Decorators
    https://realpython.com/primer-on-python-decorators/
  53. Python Decorators
    https://www.programiz.com/python-programming/decorator
  54. PythonDecorators (Python Wiki)
    https://wiki.python.org/mo­in/PythonDecorators
  55. Funcy na GitHubu
    https://github.com/suor/funcy/
  56. Welcome to funcy documentation!
    https://funcy.readthedocs­.io/en/stable/
  57. Funcy cheatsheet
    https://funcy.readthedocs­.io/en/stable/cheatsheet.html
  58. PyToolz API Documentation
    https://toolz.readthedocs­.io/en/latest/index.html
  59. Curry v knihovně Toolz
    https://toolz.readthedocs­.io/en/latest/curry.html
  60. Compose v knihovně Toolz
    https://toolz.readthedocs­.io/en/latest/api.html#to­olz.functoolz.compose
  61. Pipe v knihovně Toolz
    ihttps://toolz.readthedoc­s.io/en/latest/api.html#to­olz.functoolz.pipe
  62. Toolz (PyToolz) na GitHubu
    https://github.com/pytoolz/toolz
  63. Fn.py: enjoy FP in Python
    https://github.com/kachayev/fn.py
  64. Funcy na PyPi
    https://pypi.org/project/funcy/
  65. 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/
  66. Funkce vyššího řádu v knihovně Underscore
    https://www.root.cz/clanky/funkce-vyssiho-radu-v-knihovne-underscore/
  67. Awesome functional Python
    https://github.com/sfermigier/awesome-functional-python
  68. lispy
    https://pypi.org/project/lispy/
  69. clojure_py na indexu PyPi
    https://pypi.python.org/py­pi/clojure_py
  70. PyClojure
    https://github.com/eigenhom­bre/PyClojure
  71. Hy na GitHubu
    https://github.com/hylang/hy
  72. Hy: The survival guide
    https://notes.pault.ag/hy-survival-guide/
  73. Hy běžící na monitoru terminálu společnosti Symbolics
    http://try-hy.appspot.com/
  74. Welcome to Hy’s documentation!
    http://docs.hylang.org/en/stable/
  75. Hy na PyPi
    https://pypi.org/project/hy/#des­cription
  76. Getting Hy on Python
    https://lwn.net/Articles/596626/
Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.