A nejlepší na tom je, že generátory a iterátory, tedy základní kameny pro podobné "nekonečné sekvence" byly do Pythonu přidány v roce 2001, 6 let před vznikem Clojure. Tyhle předpřipravené funkcičky se každopádně hodí, i když se dají implementovat skutečně snadno.
12. 9. 2023, 10:40 editováno autorem komentáře
Otázka je možná jak často jsou v běžném Pythonu - v porovnání s Clojure - používány. Třeba v Common Lispu jsou series - potenciálně nekonečné sekvence - přes čtyřicet let (sice "jen" knihovna, ale kdysi příloha standardu), a prostě to skoro nikdo nepoužívá.
I když možná to bylo příliš ambiciózní - pokud to šlo tak se to pokoušelo automaticky transformovat kód typu generátor-mapování-collector na smyčku, a snažilo se to tlačit uživatele k psaní funkcí které to podporovaly, což bylo nepohodlné.
Ano, samozřejmě. Já tohle (generátory apod.) ale používám v kódu skoro hned od zavedení. Pro jiné účely než zde naznačené, ale princip je stejný. Myslím, že spousta programátorů v Pythonu ani nemá představu, jaké nástroje jsou k dispozici (nemyslím jenom tooly, ale knihovní záležitosti, třeba collections.Counter).
Pretože Python nie je vnímaný ako funkcionálny jazyk. Podľa mňa všetci, ktorí sa zaujímajú o funcy už majú skúsenosti s inými funkcionálnymi jazykmi. Bežný Python programátor vôbec netuší o čo tu vlastne ide. Určite tiež nepomáha fakt, že je to strčené do nič nehovoriacich modulov ako itertools, moreitertools atď.
V protiklade s tým, napr. jazyk Groovy, tam to hneď bije do očí. Základná syntax pre prácu s zoznamami.
def vals = [1, 2, 3, 4, 5, 6, 7]
def isEven = { it % 2 == 0 }
def square = { it * it }
def res = vals
.findAll(isEven)
.collect(square)
.sum(0)
println res
Novší Groovy GINQ:
record Customer(Integer id, String name) {}
record Reservation(Integer id, Integer customerId, String date) {}
def customers = [
new Customer(1, 'Paul Novak'), new Customer(2, 'John Doe'),
new Customer(3, 'Jack Fonda'), new Customer(4, 'Roger Roe')
]
def reservations = [
new Reservation(1, 1, '2019-11-22'), new Reservation(2, 2, '2019-11-28'),
new Reservation(2, 1, '2019-11-28'), new Reservation(4, 1, '2019-11-29'),
new Reservation(5, 3, '2019-12-02'), new Reservation(6, 2, '2020-02-20')
]
def res = GQ {
from c in customers
join r in reservations on c.id == r.customerId
select c.Name as customers, r.Date as reservations
}
println res
Hneď od začiatku sa študent stretne s closures, pokročilou prácou s funkciami. Pritom je Groovy syntaxou dosť podobný Pythonu.
13. 9. 2023, 21:20 editováno autorem komentáře
To bych musel vědět, co máš konkrétně na mysli. Některé věci třeba standardní knihovna Pythonu "tak nějak" umí, ale není to dostatečné - např. pro práci s časem používám Pendulum, Python nemá dostatečnou podporu pro šifrování atd. Určitě jsem ale osobně spíš pro standardní prostředky tam, kde dostačují.