Python 3 - 累积函数替代品

时间:2013-04-06 07:46:05

标签: python function loops python-3.x

我想知道是否有更多的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)

虽然这只是一小部分,但还需要添加更多功能。

1 个答案:

答案 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)