【问题标题】:Python 3 - cumulative functions alternativesPython 3 - 累积函数替代品
【发布时间】:2013-03-28 17:18:51
【问题描述】:

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

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

【问题讨论】:

  • 在每个循环中,您都对循环变量进行处理,将其放入data,然后丢弃除最后一个循环结果之外的所有结果。 calculateandPrint() 调用是否应该缩进?
  • 确实你是对的,为了更清楚:在每个循环中,我编辑一个对象内的变量,每个文本文件都有一个不同的对象。因此,calculateandPrint() 函数使用所有对象,因此使用所有 data,即使从我的示例中可能不清楚。但重点更多的是函数调用的迭代。

标签: python function loops python-3.x


【解决方案1】:

你可以定义一组链,应用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)

如果chain 包含3 个函数,则reduce() 调用有效地执行func3(func2(func1(textfile))

我在这里假设您想在应用函数链后在路径中应用 calculateandPrint()per 文本文件。

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)  

【讨论】:

  • 我认为这接近我正在寻找的答案。我添加了实际代码,以便更好地了解需要做什么。是否可以将链与我的代码一起使用?那么是否可以修改链中对象的内容呢?
  • 当然;只需在我的答案中交换两个循环;将链循环移出,将每个链应用于文档,在内部 for 循环之后调用 createBOW() 函数,每个链一次。
猜你喜欢
  • 1970-01-01
  • 2018-05-13
  • 2013-04-14
  • 2012-02-18
  • 1970-01-01
  • 2023-04-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多