Python:懒惰地遍历类似目录的结构

时间:2016-03-07 09:59:58

标签: python python-3.x functional-programming generator

我想通过类似目录的结构来应用函数。由于Python 3支持延迟生成器,我考虑使用它们来延迟评估结果列表。这是我的方法:

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接受路径并返回文件信息列表。

1 个答案:

答案 0 :(得分: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)
        )
    )