Práce s nekonečnými sekvencemi v knihovně funcy

12. 9. 2023
Doba čtení: 35 minut

Sdílet

Autor: Depositphotos
Zaměříme se na popis práce s nekonečnými sekvencemi s využitím generátorů a funkcí poskytovaných knihovnou funcy. Nekonečné sekvence jsou zajímavé například proto, že se u nich stírá rozdíl mezi daty a dynamickým kódem.

Obsah

1. Práce s nekonečnými sekvencemi v knihovně funcy

2. Konečná sekvence se stejnými hodnotami vytvořená pomocí repeat

3. Nekonečná sekvence se stejnými hodnotami vytvořená pomocí repeat

4. Dá se vůbec reálně pracovat s nekonečnými sekvencemi?

5. Aritmetická řada generovaná pomocí count

6. Specifikace počáteční hodnoty a kroku

7. Čím se vlastně odlišuje count od range?

8. Příklady použití aritmetické řady

9. Sekvence s opakujícími se cykly hodnot generovaná pomocí cycle

10. Nekonečná sekvence sudých a lichých čísel

11. Sekvence obsahující označení všech hracích karet

12. Nekonečná sekvence s hodnotami vytvářenými s využitím uživatelské funkce

13. Číselné řady a další sekvence generované s využitím iterate

14. Vygenerování Fibonacciho posloupnosti s využitím iterate

15. Další užitečné funkce používané při zpracování sekvencí

16. Rozdělení prvků sekvence do skupin funkcí group_by

17. Rozdělení slov podle jejich délky

18. Kombinace většího množství sekvencí s využitím funkce interleave

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Práce s nekonečnými sekvencemi v knihovně funcy

V dnešním článku se zaměříme na popis práce s nekonečnými sekvencemi s využitím generátorů a funkcí poskytovaných knihovnou funcy. Nekonečné sekvence jsou zajímavé v mnoha ohledech, například proto, že se u nich do značné míry stírá rozdíl mezi daty (klasicky chápanými jako množina statických hodnot) a dynamickým kódem. Ovšem zajímavé je i to, že při práci s nekonečnými sekvencemi je nutné využívat funkcionální paradigma, tedy například funkce vyššího řádu, referenčně transparentní funkce, uzávěry, memoizaci atd. Nositelem hodnot jsou zde skutečně funkce a nikoli statická sekvence dat (n-tice, seznamy atd.).

V navazujících kapitolách si popíšeme následující generátory nekonečných sekvencí:

Funkce/generátor Stručný popis Kapitola
repeat sekvence stejných hodnot 2
count řada numerických hodnot (aritmetická řada) 5
cycle sekvence tvořená několika opakujícími se hodnotami 9
iterate sekvence, u níž je následující prvek vytvořen transformací hodnoty předchozího prvku 13

2. Konečná sekvence se stejnými hodnotami vytvořená pomocí repeat

První funkcí, která slouží jako generátor konečné nebo nekonečné sekvence, je funkce nazvaná příznačně repeat. Této funkci se předává jeden povinný parametr – hodnota, která se bude v sekvenci opakovat. Druhý parametr je nepovinný a určuje počet prvků sekvence. V případě, že počet prvků není explicitně stanoven, vznikne nekonečná sekvence.

Podívejme se nyní na způsob vygenerování konečné sekvence, konkrétně sekvence deseti celočíselných hodnot 42:

from funcy import repeat
 
values = repeat(42, 10)
 
print(values)

Výsledkem (který se zobrazí na terminálu) je generátor sekvence, nikoli přímo hodnoty v sekvenci:

repeat(42, 10)
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat1.py.

Pro získání hodnot (nebo obecně prvků) uložených v sekvenci musíme sekvenci materializovat (což je nepřesný překlad termínu realize), například jejím explicitním převodem na seznam:

from funcy import repeat
 
values = repeat(42, 10)
 
print(list(values))

Výsledkem nyní skutečně bude seznam s deseti celočíselnými hodnotami 42:

[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat2.py.

3. Nekonečná sekvence se stejnými hodnotami vytvořená pomocí repeat

V případě, že se funkce repeat zavolá jen s jediným parametrem, bude tento parametr chápaný jako hodnota prvků, která se bude v sekvenci opakovat do nekonečna. V případě, že se nepokusíme celou sekvenci materializovat, je možné s takovou sekvencí bez problémů pracovat, protože k výpočtu (všech) prvků nedochází. Ostatně si to můžeme snadno vyzkoušet na následujícím příkladu:

from funcy import repeat
 
values = repeat(42)
 
print(values)

Výsledkem činnosti tohoto skriptu bude objekt, který dokáže produkovat prvky nekonečné sekvence:

repeat(42)
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat3.py.

Ovšem samotná materializace celé nekonečné sekvence nemůže (podle očekávání) dopadnout dobře:

from funcy import repeat
 
values = repeat(42)
 
print(list(values))

Tento příklad se pokusí o převod všech prvků nekonečné sekvence na seznam, což po jisté době skončí s chybou – nelze alokovat dostatek paměti.

Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat4.py.

4. Dá se vůbec reálně pracovat s nekonečnými sekvencemi?

Na tomto místě je vhodné se ptát, jak a zda je vůbec možné pracovat s nekonečnými sekvencemi, které pochopitelně není možné celé materializovat. Ve skutečnosti je práce s takovými sekvencemi v některých případech poměrně elegantní. Nejprve se ale podívejme na poněkud umělý příklad, v němž nejdříve vytvoříme nekonečnou sekvenci a následně z této sekvence získáme prvních dvacet prvků. Tuto – nyní již konečnou – sekvenci je již možné bez problému převést na seznam a tak ji materializovat:

from funcy import repeat, take
 
values = repeat(42)
 
slice = take(20, values)
 
print(list(slice))

Výsledek by měl vypadat následovně:

[42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

K samotnému výpočtu prvků může ve skutečnosti dojít až při převodu na seznam, tedy v posledním příkazu.

Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat5.py.

Zkusme si nyní vytvořit nepatrně složitější příklad, v němž dochází ke kombinaci konečné sekvence vygenerované standardní funkcí range a nekonečné sekvence vytvořené funkcí repeat z knihovny Funcy. Tyto dvě sekvence „zazipujeme“ s využitím standardní funkce zip, přičemž výsledkem bude sekvence dvojic – a to konečná sekvence, protože počet prvků určuje kratší vstup; tedy v tomto případě sekvence vytvořená pomocí range (druhým vstupem je nekonečná sekvence):

from funcy import repeat
 
values1 = range(10)
values2 = repeat(42)
 
zipped = zip(values1, values2)
 
print(list(zipped))

Výsledek je konečný a můžeme ho tedy bez problémů vypsat na terminál:

[(0, 42), (1, 42), (2, 42), (3, 42), (4, 42), (5, 42), (6, 42), (7, 42), (8, 42), (9, 42)]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/repeat6.py.

5. Aritmetická řada generovaná pomocí count

Další typ nekonečné sekvence je generován s využitím funkce nazvané count. Jak již název této funkce naznačuje, slouží k vytvoření sekvence s postupně rostoucími či klesajícími hodnotami čítače, přičemž s využitím nepovinných parametrů je možné specifikovat jak počáteční hodnotu čítače (start, výchozí hodnotou je nula), tak i krok (step, výchozí hodnota je rovna jedné).

Nekonečná sekvence 0, 1, 2, 3, … je vytvořena následovně:

from funcy import count
 
values = count()
 
print(values)

Výsledkem je podle očekávání „jen“ generátor sekvence, nikoli samotné hodnoty:

count(0)
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count1.py.

V dalším demonstračním příkladu získáme prvních dvacet hodnot čítače z původně nekonečné sekvence:

from funcy import count, take
 
values = count()
 
slice = take(20, values)
 
print(list(slice))

Nyní je sekvence materializována a má obsah:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count2.py.

6. Specifikace počáteční hodnoty a kroku

Při definici nekonečné sekvence generované funkcí count je možné specifikovat hodnotu prvního prvku této sekvence, a to s využitím nepovinného parametru start:

from funcy import count, take
 
values = count(start=10)
 
slice = take(20, values)
 
print(list(slice))

Nyní bude prvních dvacet prvků sekvence vypadat takto:

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count5.py.

Zadat lze i krok, tj. numerický rozdíl mezi dvěma po sobě jdoucími prvky. Implicitní hodnota kroku je rovna jedné, ovšem lze ji snadno modifikovat:

from funcy import count, take
 
values = count(start=10, step=2)
 
slice = take(20, values)
 
print(list(slice))

Opět se podívejme na prvních dvacet prvků této nekonečné sekvence:

[10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count6.py.

Krok ovšem může být i záporný:

from funcy import count, take
 
values = count(start=0, step=-2)
 
slice = take(20, values)
 
print(list(slice))

Výsledky, tedy v tomto případě prvních dvacet prvků nekonečné sekvence:

[0, -2, -4, -6, -8, -10, -12, -14, -16, -18, -20, -22, -24, -26, -28, -30, -32, -34, -36, -38]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count7.py.

7. Čím se vlastně odlišuje count od range?

Až doposud by se mohlo zdát, že se generátor nekonečné sekvence count vlastně do značné míry podobá standardnímu generátoru range. Je zde ovšem několik důležitých rozdílů, například fakt, že count dokáže pracovat i s čísly s plovoucí řádovou čárkou a podobá se tak více spíše funkci arange z knihovny Numpy (ta ovšem generuje striktně konečnou sekvenci). Ostatně sami si můžeme vyzkoušet, že jak počáteční hodnota číselné sekvence, tak i krok mezi sousedními prvky nemusí být celočíselnými hodnotami:

from funcy import count, take
 
values = count(start=0.5, step=1.5)
 
slice = take(20, values)
 
print(list(slice))

Nyní bude prvních dvacet prvků takto vygenerované nekonečné sekvence vypadat následovně:

[0.5, 2.0, 3.5, 5.0, 6.5, 8.0, 9.5, 11.0, 12.5, 14.0, 15.5, 17.0, 18.5, 20.0, 21.5, 23.0, 24.5, 26.0, 27.5, 29.0]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count8.py.

8. Příklady použití aritmetické řady

Již v předchozím textu jsme si ukázali kombinaci dvou konečných či nekonečných sekvencí s využitím standardní funkce zip, která vždy spojí dvojici prvků, z nichž první je vybrán z první sekvence a další ze sekvence druhé. Totéž pochopitelně můžeme udělat i v případě aritmetické řady generované funkcí count a sekvencí stejných prvků generovaných funkcí repeat. Druhá ze sekvencí má konečný počet prvků, takže i výsledkem aplikace zip bude konečná sekvence (dvojic):

from funcy import count, repeat
 
values1 = count()
values2 = repeat(42, 10)
 
zipped = zip(values1, values2)
 
print(list(zipped))

Výsledky:

[(0, 42), (1, 42), (2, 42), (3, 42), (4, 42), (5, 42), (6, 42), (7, 42), (8, 42), (9, 42)]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count3.py.

Zazipovat ovšem můžeme i nekonečné sekvence! Před tiskem takové sekvence je pochopitelně nutné omezit počet prvků, například s využitím take:

from funcy import count, repeat, take
 
values1 = count()
values2 = repeat(42)
zipped = zip(values1, values2)
 
slice = take(10, zipped)
 
print(list(slice))

Výsledek:

[(0, 42), (1, 42), (2, 42), (3, 42), (4, 42), (5, 42), (6, 42), (7, 42), (8, 42), (9, 42)]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/count4.py.

V případě potřeby lze získat ty prvky ze sekvence, které stojí před „zarážedlem“ (prvkem s nějakou vlastností testovanou predikátem):

from funcy import count, takewhile
 
values = count()
 
filtered = takewhile(lambda x:x<10, values)
 
print(filtered)
print(list(filtered))

Výsledky:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

9. Sekvence s opakujícími se cykly hodnot generovaná pomocí cycle

Dalším typem nekonečné sekvence, kterou je možné s využitím knihovny Funcy vytvořit, je sekvence, v níž se stále opakují stejné hodnoty. Taková sekvence se vytváří funkcí cycle, které se, například formou n-tice, seznamu nebo jiné sekvence, předají hodnoty, které se budou ve výsledné nekonečné sekvenci neustále opakovat. Vytvořme si tedy sekvenci, v níž se budou neustále opakovat hodnoty „foo“ a „bar“:

from funcy import cycle
 
values = cycle(["foo", "bar"])
 
print(values)

Výsledkem bude tento objekt, který je generátorem sekvence:

<itertools.cycle object at 0x7fe288af42c0>
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle1.py.

Samozřejmě můžeme z takové sekvence získat několik prvních hodnot a přesvědčit se o tom, jak taková sekvence vypadá v praxi. Pro přečtení prvních několika hodnot použijeme nám již velmi dobře známou funkci take:

from funcy import cycle, take
 
values = cycle(["foo", "bar"])
 
slice = take(10, values)
print(slice)

A takto vypadají výsledky:

['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar']
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle2.py.

10. Nekonečná sekvence sudých a lichých čísel

V dalším demonstračním příkladu zkombinujeme čtyři funkce, které již známe. Jedná se o generátory sekvencí count, cycle, zip a take. Necháme si vygenerovat sekvenci celých čísel a u každé hodnoty určíme, jestli se jedná o sudou nebo o lichou hodnotu. Bez jakýchkoli výpočtů (výpočet zbytku po dělení dvěma atd.) je možné celý algoritmus realizovat následujícím způsobem:

from funcy import count, cycle, take
 
values1 = count(start=1)
values2 = cycle(["odd", "even"])
zipped = zip(values1, values2)
 
slice = take(10, zipped)
 
for key, val in slice:
    print(key, val)

Po spuštění tohoto skriptu by se na terminálu mělo zobrazit deset celočíselných hodnot a taktéž informace o tom, zda se jedná o sudou nebo naopak o lichou hodnotu:

1 odd
2 even
3 odd
4 even
5 odd
6 even
7 odd
8 even
9 odd
10 even
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle3.py.

11. Sekvence obsahující označení všech hracích karet

Podívejme se ještě na jeden (poněkud umělý) příklad založený na funkci cycle, resp. přesněji řečeno na dvojici funkcí cycle. Vygenerujeme si sekvenci obsahující označení všech 52 francouzských karet. V imperativním kódu by bylo možné použít dvojici vnořených smyček, v klasickém Pythonním kódu pak generátorovou notaci. Realizace podobného algoritmu založeného na nekonečných sekvencích může vypadat takto:

from funcy import count, cycle, take
 
suits = ["♠", "♥", "♦", "♣"]
values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
 
seq1 = cycle(suits)
seq2 = cycle(values)
 
zipped = zip(seq1, seq2)
 
slice = take(len(suits)*len(values), zipped)
 
for key, val in slice:
    print(f"{key}{val}")

Výsledek:

♠2
♥3
♦4
♣5
...
...
...
♣10
♠J
♥Q
♦K
♣A

Otázky k zamyšlení? Skutečně se vygeneruje všech 52 unikátních kombinací, nebo budou mít některé karty stejnou hodnotu? A za jakých podmínek bude tento algoritmus fungovat korektně (počet barev atd.)?

Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/cycle4.py.

12. Nekonečná sekvence s hodnotami vytvářenými s využitím uživatelské funkce

Nekonečné sekvence generované funkcemi repeat, count a cycle jsou sice užitečné, ale zdaleka nepokrývají všechny možné varianty. Poměrně často se setkáme s tím, že další prvek sekvence je možné odvodit (pouze) z prvku předchozího na základě nějakého výrazu či složitějšího výpočtu. Příkladem mohou být geometrické a další řady. V takovém případě lze pro vytvoření nekonečné sekvence použít funkci nazvanou příznačně iterate. Této funkci se zadává hodnota počátečního prvku v sekvenci a taktéž funkce, které se předá hodnota n-tého prvku a výsledkem bude hodnota prvku n+1. Výpočet prováděný v této funkci může být zcela obecný (a kromě běžné funkce můžeme samozřejmě použít i uzávěr).

13. Číselné řady a další sekvence generované s využitím iterate

Podívejme se na nejjednodušší možný příklad – generátor nekonečné aritmetické řady s krokem 1 a počátečním prvkem s nulovou hodnotou:

from funcy import iterate, take
 
 
def inc(x):
    return x+1
 
 
sequence = iterate(inc, 0)
 
slice = take(10, sequence)
print(slice)

Výsledky:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate1.py.

Můžeme použít i alternativní způsob zápisu založeného na anonymní funkci:

from funcy import iterate, take
 
 
sequence = iterate(lambda x: x+1, 0)
 
slice = take(10, sequence)
print(slice)

Výsledky by měly být totožné:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate2.py.

Ve třetím příkladu je ukázána řada numerických hodnot obsahujících celočíselné mocniny dvojky:

from funcy import iterate, take
 
 
def double(x):
    return x*2
 
 
sequence = iterate(double, 1)
 
slice = take(10, sequence)
print(slice)

Výsledky:

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

Taktéž si můžeme vygenerovat sekvenci seznamů, v nichž postupně roste počet prvků (i jejich hodnoty):

Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate3.py.
from funcy import iterate, take
 
 
def nextval(x):
    return x + [x[-1]+1]
 
 
sequence = iterate(nextval, [1])
 
slice = take(10, sequence)
print(slice)

Výsledky:

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7, 8],
[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate6.py.

14. Vygenerování Fibonacciho posloupnosti s využitím iterate

Poněkud komplikovanější je výpočet Fibonacciho posloupnosti s využitím funkce iterate. Nyní totiž musíme pracovat s dvojicí prvků s indexy n-1 a n pro výpočet prvku s indexem n+1. To sice iterate přímo neumožňuje, ale lze zde aplikovat trik – budeme předávat dvojici hodnot v jediném parametru typu n-tice:

from funcy import iterate, take
 
 
def one_step(p):
    return (p[1], p[0]+p[1])
 
 
sequence = iterate(one_step, (0, 1))
 
slice = take(10, sequence)
print(slice)

Výsledky ukazují, že sekvence bude obsahovat dvojice a první prvky tvoří jednu Fibonacciho řadu a druhé prvky řadu druhou (posunutou o jeden prvek):

[(0, 1), (1, 1), (1, 2), (2, 3), (3, 5), (5, 8), (8, 13), (13, 21), (21, 34), (34, 55)]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate4.py.

Nyní tedy máme k dispozici dvojice s hodnotami dvou Fibonacciho posloupností. Získání první posloupnosti je již snadné – aplikujeme funkci first na všechny prvky posloupnosti dvojic:

from funcy import first, iterate, take
 
 
def one_step(p):
    return (p[1], p[0]+p[1])
 
 
sequence = iterate(one_step, (0, 1))
 
slice = take(20, sequence)
print(list(map(first, slice)))

Výsledkem již bude stará dobrá Fibonacciho posloupnost:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/iterate5.py.

15. Další užitečné funkce používané při zpracování sekvencí

V knihovně Funcy nalezneme i další zajímavé a mnohdy i velmi užitečné funkce, které lze využít při práci s konečnými i nekonečnými sekvencemi. V navazujících kapitolách si popíšeme dvě takové funkce. První z nich se jmenuje group_by a druhá interleave. S využitím group_by je možné rozdělit prvky vstupní sekvence do několika (obecně mnoha) skupin na základě nějaké jejich vlastnosti (hodnoty atd.). A funkce interleave nám umožňuje zkombinovat prvky z několika sekvencí do sekvence jediné (což je operace, kterou lze provést i pro nekonečné sekvence, jak ostatně uvidíme dále).

16. Rozdělení prvků sekvence do skupin funkcí group_by

Funkce nazvaná group_by dokáže rozdělit původní sekvenci prvků do několika dalších sekvencí, přičemž rozdělení je prováděno na základě nějaké hodnoty vypočtené z každého prvku (na rozdíl od funkce filter či remove se zde tedy nejedná o predikát vracející pouze pravdivostní hodnotu). Příkladem může být rozdělení sekvence s celočíselnými hodnotami 0..99 do deseti sekvencí na základě poslední (nejnižší) cifry hodnoty. V jedné výsledné sekvenci tedy budou hodnoty končící na nulu, v další hodnoty končící na jedničku atd. (výsledkem je mapa, jak ostatně uvidíme dále):

from funcy import group_by
 
values = range(100)
 
grouped = group_by(lambda x:x % 10, values)
 
for key, values in grouped.items():
    print(key, values)

Výsledek by měl vypadat následovně:

0 [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
1 [1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
2 [2, 12, 22, 32, 42, 52, 62, 72, 82, 92]
3 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
4 [4, 14, 24, 34, 44, 54, 64, 74, 84, 94]
5 [5, 15, 25, 35, 45, 55, 65, 75, 85, 95]
6 [6, 16, 26, 36, 46, 56, 66, 76, 86, 96]
7 [7, 17, 27, 37, 47, 57, 67, 77, 87, 97]
8 [8, 18, 28, 38, 48, 58, 68, 78, 88, 98]
9 [9, 19, 29, 39, 49, 59, 69, 79, 89, 99]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by1.py.

17. Rozdělení slov podle jejich délky

Funkci group_by můžeme použít například i pro seskupení slov v textu podle jejich délky. Text nejdříve rozdělíme na jednotlivá slova (resp. přesněji řečeno na sekvenci slov) a následně použijeme group_by, přičemž seskupení vstupních prvků bude vázáno na hodnotu vypočtenou výrazem len(prvek):

from funcy import group_by
 
message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
words = message.split()
 
grouped = group_by(lambda x:len(x), words)
 
for key, values in grouped.items():
    print(key, values)

Výsledkem získaným po spuštění tohoto skriptu bude mapa obsahující jako klíče hodnoty len(prvek) a jako hodnoty sekvenci slov s touto délkou:

5 ['Lorem', 'ipsum', 'dolor', 'amet,', 'elit,', 'magna']
3 ['sit', 'sed']
11 ['consectetur']
10 ['adipiscing', 'incididunt']
2 ['do', 'ut', 'et']
7 ['eiusmod']
6 ['tempor', 'labore', 'dolore', 'aliqua']
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by2.py.

Praktičtější však bude mapu při jejím výpisu setřídit, takže se nejdříve vypíšou nejkratší slova, potom delší slova atd.:

from funcy import group_by
 
message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
words = message.split()
 
grouped = group_by(lambda x:len(x), words)
 
for key in sorted(grouped.keys()):
    print(key, grouped[key])

Nyní bude získaný výsledek (mapa sekvencí) vypadat následovně:

2 ['do', 'ut', 'et']
3 ['sit', 'sed']
5 ['Lorem', 'ipsum', 'dolor', 'amet,', 'elit,', 'magna']
6 ['tempor', 'labore', 'dolore', 'aliqua']
7 ['eiusmod']
10 ['adipiscing', 'incididunt']
11 ['consectetur']
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/group_by3.py.

18. Kombinace většího množství sekvencí s využitím funkce interleave

Poslední funkcí, se kterou se v dnešním článku seznámíme, je funkce s názvem interleave. Jak již název této funkce naznačuje, provádí se zde operace proložení prvků z několika vstupních sekvencí do sekvence jediné. Přitom vstupem mohou být nekonečné sekvence, jak je to ostatně ukázáno na dnešním posledním demonstračním příkladu:

from funcy import count, cycle, interleave, take
 
values1 = count(start=1)
values2 = cycle(["odd", "even"])
interleaved = interleave(values1, values2)
 
slice = take(20, interleaved)
 
print(slice)

V tomto demonstračním příkladu jsou proloženy prvky tvořící (nekonečnou) aritmetickou řadu s prvky získanými z nekonečné řady opakujících se hodnot „odd“ a „even“. Výsledkem je nová nekonečná řada, ze které si vybereme prvních dvacet prvků, které jsou následně vypsány na terminál:

[1, 'odd', 2, 'even', 3, 'odd', 4, 'even', 5, 'odd', 6, 'even', 7, 'odd', 8, 'even', 9, 'odd', 10, 'even']

Výsledek je tedy odlišný od použití zip namísto interleave:

from funcy import count, cycle, take
 
values1 = count(start=1)
values2 = cycle(["odd", "even"])
zipped = zip(values1, values2)
 
slice = take(10, zipped)
print(slice)

Kde výsledkem je sekvence dvojic:

[(1, 'odd'), (2, 'even'), (3, 'odd'), (4, 'even'), (5, 'odd'), (6, 'even'), (7, 'odd'), (8, 'even'), (9, 'odd'), (10, 'even')]
Poznámka: úplný zdrojový kód tohoto demonstračního příkladu naleznete na adrese https://github.com/tisnik/most-popular-python-libs/blob/master/funcy/interleave.py.

19. 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

20. Odkazy na Internetu

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

Autor článku

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