Python:多个参数/不带/ functools的函数组合

时间:2013-12-30 22:14:16

标签: python function composition functools

致力于编写一个看似简单的函数,找到事物的积累。它非常抽象,它的标志是:

def accumulate(combiner, start, n, term):
    """Return the result of combining the first n terms in a sequence."""
    "*** YOUR CODE HERE ***"

有关此问题的更多信息:

“Accumulate将相同的参数term和n作为参数作为求和和乘积,以及组合函数(两个参数),它指定当前术语如何与前面术语的积累和起始值相结合它指定了用于开始积累的基础值。“ - 来自加州大学伯克利分校CS61A 2013秋季,John DeNero

“组合器”指的是从“开始”到“n”的术语将被累积的方式(可以是add,sub,mul等)。 Combiner最多需要2个参数

“术语”是指应用于以“start”开头并以“n”结尾的每个术语的函数。这可能意味着取每个术语的平方,sqrt,n%// 2。

我想在不必使用functools.reduce的情况下解决这个问题。

我知道我必须创建一个函数组合循环,但这是让我困惑的部分。然后,我必须让每个函数都有两个参数:旧的积累和当前的术语。

我已经为此工作了2天,并且把我自己搞得一团糟,所以我的代码搞砸了。有什么建议吗?

def accumulate(combiner, start, n, term):
    """Return the result of combining the first n terms in a sequence."""
    now=0
    while start+now+1<=n:
        def combiner(x,y):
                old=combiner(start+now,start+now+1)
                old=combiner(old,start)
                now+=1
    return old

“start + now + 1”指的是在我至少有n个项之前,我无法在term(n)上开始执行组合器函数。但后来我感到困惑,因为我必须在存储旧的总和并更新它时保持最后2个值的组合。

1 个答案:

答案 0 :(得分:4)

您不需要在函数中使用函数。做这样的事情:

def accumulate(combiner, start, n, term):
    """Return the result of combining the first n terms in a sequence."""
    total = term(start)
    current = start
    while current < n:
        total = combiner(total, term(current))
        current += 1
    return total