[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