我只是在用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>
答案 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的元组。