我想知道是否有更多的pythonic或替代方法来做到这一点。我想比较累积函数的结果。每个函数都修改了前一个的输出,我希望在每个函数之后看到效果是什么。请注意,为了在运行主函数后获得实际结果,需要最后一个函数来计算某些东西。在代码中,事物看起来像这样(只是一种伪代码):
for textfile in path:
data = doStuff1(textfile)
calculateandPrint()
for textfile in path:
data = doStuff1(textfile)
data = doStuff2(data )
calculateandPrint()
for textfile in path:
data = doStuff1(textfile)
data = doStuff2(data )
data = doStuff3(data )
calculateandPrint()
如您所见,对于n
函数,我需要1/2(n(n+1))
手动创建循环。就像我说的那样,有更多pythonic(例如带有函数的列表吗?)可以清理代码并使其在添加越来越多的函数时更短更易于管理?
实际代码,其中documents
是自定义对象:
for doc in documents:
doc.list_strippedtext = prepareData(doc.text)
bow = createBOW(documents)
for doc in documents:
doc.list_strippedtext = prepareData(doc.text)
doc.list_strippedtext = preprocess(doc.list_strippedtext)
bow = createBOW(documents)
for doc in documents:
doc.list_strippedtext = prepareData(doc.text)
doc.list_strippedtext = preprocess(doc.list_strippedtext)
doc.list_strippedtext = abbreviations(doc.list_strippedtext)
bow = createBOW(documents)
虽然这只是一小部分,但还需要添加更多功能。
答案 0 :(得分:3)
您可以使用functools.reduce()
from functools import reduce
chains = (
(doStuff1,),
(doStuff1, doStuff2),
(doStuff1, doStuff2, doStuff3),
)
for textfile in path:
for chain in chains:
data = reduce(lambda data, func: func(data), chain, textfile)
calculateandPrint(data)
如果reduce()
包含3个函数,则func3(func2(func1(textfile))
调用会有效chain
。
我在这里假设您希望在应用函数链之后在路径中应用calculateandPrint()
每个文本文件。
for chain in chains
循环的每次迭代都代表原始示例中的doStuffx
个循环体之一,但我们只会在之后循环遍历for textfile in path
。
你也可以交换循环;根据你的例子调整:
for chain in chains:
for doc in documents:
doc.list_strippedtext = reduce(lambda data, func: func(data), chain, doc.text)
bow = createBOW(documents)