Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么生成器生成4个元素而不是6个元素_Python_Python 2.7_Generator - Fatal编程技术网

Python 为什么生成器生成4个元素而不是6个元素

Python 为什么生成器生成4个元素而不是6个元素,python,python-2.7,generator,Python,Python 2.7,Generator,为什么函数移动平均会生成4个元素[40.0,42.0,45.0,43.0],而不是6个元素[36.66666 7,33.33333333,40.0,42.0,45.0,43.0] 我希望代码能够做到这一点: 首先,d是deque([40,30]),然后d.appendleft(0)makedeque([0,40,30]),因此s是70 在for循环中,第一个元素是40,因此s=s+elem-d.popleft()是s=70+40-0=110 然后d.append(elem)是deque([40

为什么函数移动平均会生成4个元素
[40.0,42.0,45.0,43.0]
,而不是6个元素
[36.66666 7,33.33333333,40.0,42.0,45.0,43.0]

我希望代码能够做到这一点:

  • 首先,d是
    deque([40,30])
    ,然后
    d.appendleft(0)
    make
    deque([0,40,30])
    ,因此
    s
    是70
  • for
    循环中,第一个元素是
    40
    ,因此
    s=s+elem-d.popleft()
    s=70+40-0=110
  • 然后
    d.append(elem)
    deque([40,30,40])
    s/float(3)=110/3.0=36.66666 7

依此类推。

输入中只有4个三元组用于计算平均值:

  • 40,30,50==40.0
  • 30,50,46==42.0
  • 50,46,39==45.0
  • 46,39,44==43.0
  • 当您将
    n
    保留为默认值时,它只会为每3个值生成一个平均值,而不会为部分窗口生成一个平均值

    这些数字中的3个组合不会产生您的预期输出:

    from collections import deque 
    def moving_average(iterable, n=3):
    # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
        it = iter(iterable)
        d = deque(itertools.islice(it, n-1))
        d.appendleft(0)
        s = sum(d)
        for elem in it:
            s += elem - d.popleft()
            d.append(elem)
            yield s / float(n)
    
    a = [40, 30, 50, 46, 39, 44]
    list(moving_average(a))
    

    您似乎错过了
    itertools.islice(it,n-1)
    iter(iterable)
    迭代器中删除了前两个元素。前两个元素
    40
    30
    不属于
    中元素的一部分:
    用于循环,第一个
    elem
    值为
    50
    输入中只有4个三元组用于计算平均值:

  • 40,30,50==40.0
  • 30,50,46==42.0
  • 50,46,39==45.0
  • 46,39,44==43.0
  • 当您将
    n
    保留为默认值时,它只会为每3个值生成一个平均值,而不会为部分窗口生成一个平均值

    这些数字中的3个组合不会产生您的预期输出:

    from collections import deque 
    def moving_average(iterable, n=3):
    # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
        it = iter(iterable)
        d = deque(itertools.islice(it, n-1))
        d.appendleft(0)
        s = sum(d)
        for elem in it:
            s += elem - d.popleft()
            d.append(elem)
            yield s / float(n)
    
    a = [40, 30, 50, 46, 39, 44]
    list(moving_average(a))
    

    您似乎错过了
    itertools.islice(it,n-1)
    iter(iterable)
    迭代器中删除了前两个元素。前两个元素
    40
    30
    不是
    中元素
    的一部分:
    用于循环,第一个
    elem
    值是
    50

    那么什么值,当和除以3时,产生36.6666666667和33.33333?首先,d是deque([40,30]),然后d.appendleft(0)是deque([0,40,30]),s是70,在for循环中,第一个元素是40,然后s=s+elem-d。popleft()是s=70+40-0=110,然后d.append(elem)是deque([40,30,40]),s/float(3)=110/3.0=36.666667。如此类推不,第一个
    元素是
    50
    ,而不是
    40
    <代码>40
    30
    从输入表中删除
    itertools.islice()
    it
    上迭代。因此得到
    s=70+50-0=120
    ,并且
    d.append(elem)
    生成
    deque([40,30,50])
    。下一个
    elem
    46
    。那么,当求和并除以3时,什么值会产生36.66666667和33.33333333?首先,d是deque([40,30]),然后d.appendleft(0)是deque([0,40,30]),s是70,在for循环中,第一个elem是40,然后s=s+elem-d.popleft()是s=70+40-0=110,然后d.appendleft(elem)是deque([40,30]),40,40]),浮点数(3)=110/3.0=36.6667。如此类推不,第一个
    元素是
    50
    ,而不是
    40
    <代码>40
    30
    从输入表中删除
    itertools.islice()
    it
    上迭代。因此得到
    s=70+50-0=120
    ,并且
    d.append(elem)
    生成
    deque([40,30,50])
    。下一个
    elem
    46
    why@littlely:因为它使用队列?它将前2个元素和0存储到队列中,创建一个和。然后在循环中,将下一个值(第3个)添加到总和中,减去队列中的第一个值(从
    0
    开始,但在下一步中将是
    40
    ,以此类推),以使3个值的总和保持最新。这个队列只包含3个元素。但是这个函数实际上生成了一个滚动窗口,但我不知道why@littlely:因为它使用队列?它将前2个元素和0存储到队列中,创建一个和。然后在循环中,将下一个值(第3个)添加到总和中,减去队列中的第一个值(从
    0
    开始,但在下一步中将是
    40
    ,以此类推),以使3个值的总和保持最新。队列仅包含3个元素。