这是一个简单的有界生成器。
def bounded_naturals(limit):
num = 1
while num <= limit:
yield num
num += 1
如果我写
bn_gen = bounded_naturals(3)
bn_gen
将是预期的生成器对象。
但是如果我写
(a, b, c) = bounded_naturals(3)
a
,,b
和c
分别为1、2和3。令我感到奇怪的是,因为代码中似乎没有任何内容要求生成器产生值。Python规范中是否有需要这种解释的地方?
如果我写得更惊人
bn_gen = (a, b, c) = bounded_naturals(3)
我得到两个结果!bn_gen
将一台发电机的对象,和a
,b
和c
为1,2和3。我应该如何理解这是怎么回事?
最后,如果我写
(a, b) = bounded_naturals(3)
我得到: ValueError: too many values to unpack (expected 2).
如果编译器足够聪明,可以执行这些其他技巧,那么为什么在这种情况下仅向生成器询问所需的元素数量又不够聪明呢?
Python文档中是否有一节可以解释所有这些内容?
谢谢。
解压缩对任意可迭代对象(而不是序列)进行操作,并且它是通过迭代进行的。当你做
(a, b, c) = bounded_naturals(3)
你问的Python遍历bounded_naturals(3)
和结果分配到a
,b
和c
。
多项作业,例如
bn_gen = (a, b, c) = bounded_naturals(3)
通过从左到右(不是像其他语言从右到左)为每个分配目标分配RHS来工作。首先将生成器分配给bn_gen
,然后分配给(a, b, c)
。请注意,拆箱会耗尽发电机的电量,因此反复进行操作bn_gen
将一无所获。
当你做
(a, b) = bounded_naturals(3)
失败与Python不够聪明无关。Python不会默默地丢弃额外的值,因为那只会隐藏错误。可迭代对象必须提供与拆包请求一样多的元素。
请记住,仅仅因为某些代码可能具有非错误的含义,并不意味着就应该这样做。
所有这些都记录在赋值语句docs中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句