元素引用内部累加方法

2024-05-19 19:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮我理解下面代码中的s[1]和s[0]指的是什么吗?此代码将生成斐波那契级数。我还在努力理解accumulate()是如何工作的。它是否按原样返回第一个值(0,1),然后将lambda函数的第一个应用程序的结果用作s[1],并将repeat()生成的列表中的另一个元组(0,1)用作s[0]?或者s[0]和s[1]分别被指定为0和1

谢谢

import itertools as it
def second_order(p, q, r, initial_values):
    """Return sequence defined by s(n) = p * s(n-1) + q * s(n-2) + r."""
    intermediate = it.accumulate(
        it.repeat(initial_values),
        lambda s, i: (s[1], p*s[1] + q*s[0] + r)
    )
    return intermediate
fibs = second_order(p=1, q=1, r=0, initial_values=(0, 1))
list(next(fibs) for n in range(8))

Tags: lambda函数代码应用程序列表orderitinitial
2条回答

indexable[n]是获取indexable的索引n中的值的方法。由于元组是可索引的集合(它们定义了__getitem__),因此将得到该元组的零索引和一个索引(分别是第一个和第二个值)

在不再有效的语法中可以更好地理解这一点:

lambda (s1, s2), i: (s2, p*s2 + q*s1 + r)

正如您正确的直觉所示,accumulate([x1, x2, x3], fn)返回无穷级数[x1, fn(x1, x2), fn(x2, fn(x1, x2)), ...]fn在本例中是一个具有签名的函数:

def fn(last_last_value, last_value)

The docs可能用operator.add(又称+)最清楚地显示了这一点

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5])  > 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul)  > 1 2 6 24 120
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    yield total
    for element in it:
        total = func(total, element)
        yield total

因为p=1q=1r=0,我们可以完全忽略它们,最终归结为:

it.accumulate( 
    [(0,1),(0,1),(0,1),(0,1),(0,1), ...], 
    lambda prev, current: (prev[1], prev[1] + prev[0])
)

你可以这样想象:

0th:                             -> result0= (0,1)
1th: prev=(0,1)    current=(0,1) -> result1= (1, 0+1)= (1,1)
2nd: prev=result1  current=(0,1) -> result2= (0+1, 0+1+1)= (1,2)
3rd: prev=result2  current=(0,1) -> result3= (0+1+1, 0+1+1+0+1)= (2,3)
4th: prev=result3  current=(0,1) -> result4= (0+1+1+0+1, 0+1+1+0+1+0+1+1)= (3,5)
...

如你所见current从未被使用过
在您的代码中,icurrentsprev,所以s[0] == prev[0]是元组中的第一个元素,s[1]是第二个元素

相关问题 更多 >