Python: 延迟遍历类似目录的结构
Python: lazy iterating through directory-like structure
我想通过类似目录的结构来应用函数。由于 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
接受路径和 returns 文件信息列表。
假设顺序不重要,我认为通常会这样写:
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.chain
和 itertools.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)
)
)
我想通过类似目录的结构来应用函数。由于 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
接受路径和 returns 文件信息列表。
假设顺序不重要,我认为通常会这样写:
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.chain
和 itertools.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)
)
)