[python] Deferred output
matesfila
matesfila na host.sk
Čtvrtek Únor 11 02:35:01 CET 2010
Zdravím,
mám taký trochu algoritmický problém!
Na adrese
http://code.activestate.com/recipes/576961/ [1] som sa dopátral k pre mňa
dosť záhadnej algoritmickej konštrukcii, ktorú tam autor nazýva zhruba ako
deferred output.
Ide o tento algoritmus:
def fibonacci():
""" Funkcia
na počítanie Fibonachiho čísiel """
def deferred_output():
for i in
output:
yield i
result, c1, c2 = tee(deferred_output(), 3)
paired =
map(add, c1, islice(c2, 1, None))
output = chain([0, 1], paired)
return
result
#príklad použitia funkcie:
print(list(islice(fibonacci(), 50)))
Sú mi jasné metódy ako list, islice, chain a myslím, že aj map, tee a
využitie generátora.
Ale ako je možné, že v generátore sa využíva
premenná, ktoré ešte nebola nikde definovaná? !!! Pravdepodobne sa tam
nejako využíva vlastnosť generátora, ktorý premennnú 'output' využije
vlastne až keď sa vyvolá next() na generátore a v tej dobe vlastne premenná
už asi existuje... ale neviem, jaksik tie myšlienky tam využité neviem
definovať a uchopiť :-)
A vôbec ako je to tam celé prepojené dokopy, z
toho som asi totálny magor...
To ako je to urobené, jedná sa o nejaký
pattern, idióm alebo proste nejakú techniku, ktorá sa bežne používa? Autor
na tej stránke píše, že je to technika, ktorá sa bežne používa v jazyku
Haskell. Čiže je to asi prudko funkcionálne, ale aj tak by ma zaujímalo
viac, čo je za tým, ak s tým teda máte niekto nejaké skúsenosti...
Matúš
PS. Ten algoritmus by mal bežať na Python 2.6 aj 3, akurát pre 2.6 by sa
namiesto map() muselo použiť imap().
Links:
------
[1]
http://code.activestate.com/recipes/576961/
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20100211/abce8e74/attachment.html>
Další informace o konferenci Python