为什么返回发电机清单?

时间:2018-12-03 08:30:18

标签: python python-3.x list generator

我是Python初学者。 我正在尝试通过平均多个邻居的分量来定义“平滑”浮点列表的函数。

这是我的代码:

import random

random.seed(1)

def moving_window_average(x, n_neighbors=1):
    width = n_neighbors*2 + 1
    y = list()
    for i in range(n):
        y.append(sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors))
    return y


x=[0,10,5,3,1,5]
avg=moving_window_average(x, 1)
print(avg)

在输出中,我得到的似乎是“发电机”列表,这是我不知道广告所期望的。 特别是:

[<generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aba0>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992ab48>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a728>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa98>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa40>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a9e8>]

有人可以指出我在这里发生的事情吗?

非常感谢

3 个答案:

答案 0 :(得分:0)

生成器是可迭代的,在迭代时会耗尽。这是使用语句null创建的。如果您要的是列表列表,则正确的语句应为sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors),这是列表理解。可以说是列表的内联生成。

可以在here上找到我在该主题上找到的一篇文章。阅读。

答案 1 :(得分:0)

问题在于您用于“平滑”数据的表达式编写不正确-因此它的计算结果为generator expression。我认为以下代码是表达它的正确方法:

import random

random.seed(1)
n = 3

def moving_window_average(x, n_neighbors=1):
    width = n_neighbors*2 + 1
    y = list()
    for i in range(n):
        y.append(sum(x[i+t] for t in range(-n_neighbors,n_neighbors)) / width)
    return y


x=[0,10,5,3,1,5]
avg=moving_window_average(x, 1)
print(avg)

答案 2 :(得分:0)

您遇到过generator expressions,该语言已集成到理解列表语法中,但会导致许多错误。

例如:

x=[0,10,5,3,1,5]

 (y for y in x) 
Out[19]: <generator object <genexpr> at 0x000000000C02FEB8>

 [y for y in x]
Out[20]: [0, 10, 5, 3, 1, 5]

 print(y for y in x)
<generator object <genexpr> at 0x000000000C02FE60>

 print((y for y in x))
<generator object <genexpr> at 0x000000000BFA1938>

 print(*(y for y in x))
0 10 5 3 1 5

 [(y for y in x)]
Out[24]: [<generator object <genexpr> at 0x000000000BFA1D58>]

 list(y for y in x)
Out[25]: [0, 10, 5, 3, 1, 5]

对于您而言,我认为您可以通过在表达式中添加[]来解决您的问题:

y.append([sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)])

[]将强制生成器评估值。生成器是强大的对象,用于节省内存和延迟执行。我不是这里的目标。