为什么next()有时会在生成器上被隐含地称为?

时间:2018-04-12 06:20:38

标签: python generator

我只是在用Python学习生成器。似乎如果你将生成器分配给一个元组,那么在幕后默默地调用next() - 好像解包是强制该调用一样。但是,如果您使用单个值分配给元组,那么您将获得生成器对象本身。我做对了吗? 琐碎的代码如下:

def generator(n):
    x = 0
    while x < n:
        yield x
        x = x + 1

(x,*foo) = generator(1)
print(x, foo)    
(x,*foo) = generator(3)
print(x, foo)
(x) = generator(1)
print(x)    

输出是:

0 []
0 [1, 2]
<generator object generator at 0x05F06900>

2 个答案:

答案 0 :(得分:3)

语法

(x) = generator(1)

一个项目的元组。你想要:

(x,) = generator(1)

x, = generator(1)

然后你会发现生成器被调用,就像在其他例子中一样,由于“解包”。

请注意,在表达式(x, y)中,()不是使它成为元组的,而是逗号。括号只是绑定表达式x, y

答案 1 :(得分:1)

前两行使用tuple packing/unpacking:它们从生成器中生成所有值,然后将它们设置为x和foo。这是因为(x, foo)是元组(一对项)的语法。

但是,(x)是变量的语法。如果你写(x,),你会得到你所期望的,这就是如何创建大小为1的元组。