2016-03-07 59 views
3

我想通過類似目錄的結構來應用函數。由於Python 3支持懶惰的生成器,我想過用這些來懶惰地評估結果列表。這是我的做法:Python:懶惰迭代通過類似目錄的結構

iterate = lambda func, d: (func(f) for f in listDir(d) if not f.isDir) + sum((iterate(func, d + f.name) for f in listDir(d) if f.isDir.), []) 

這導致unsupported operand type(s) for +: 'generator' and 'list'。有懶惰的發電機來表達這種習慣用法嗎?

listDir接受一個路徑並返回一個文件信息列表。

回答

2

假設的順序並不重要,我認爲這將通常這樣寫:

def iterate(func, d): 
    for f in listDir(d): 
     if f.isDir: 
      yield from iterate(func, d + f.name) 
     else: 
      yield func(f) 

yield from只有在Python 3.3存在,在此之前,你可以這樣做:

for x in iterate(func, d + f.name): 
    yield x 

如果您需要將發生器串聯在一起,然後itertools.chainitertools.chain.from_iterator是作業的標準工具:

def iterate(func, d): 
    return itertools.chain(
     (func(f) for f in listDir(d) if not f.isDir), 
     itertools.chain.from_iterable(
      iterate(func, d + f.name) for f in listDir(d) if f.isDir) 
     ) 
    )