0

我想知道是否有更 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))手动制作循环的功能。像我说的那样,有没有更 Python 的东西(例如带有函数的列表?)可以清理代码并在添加越来越多的函数时使其更短且易于管理?

实际代码,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)

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

4

1 回答 1

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)

如果包含 3 个函数,则该reduce()调用有效。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)  
于 2013-04-06T08:08:33.017 回答