例如:
myset = set(['a', 'b', 'c', 'd'])
mydict = {item: (yield ''.join([item, 's'])) for item in myset}
并且list(mydict)
给出:
['as', 'cs', 'bs', 'ds', {'a': None, 'b': None, 'c': None, 'd': None}]
这里发生了什么?yield
做什么?无论yield
后面是什么表达式,这种行为是否一致?
注意:我知道做mydict = {item: ''.join([item, 's']) for item in myset}
会给字典{'a': 'as', 'b': 'bs', 'c': 'cs', 'd': 'ds'}
,这似乎是我在这里要做的。
首先,
yield
返回什么?本例中的答案是None
,因为yield
返回传递给next()
的参数,这在本例中是没有的(list
没有传递给next
)。现在你的答案是:
dict理解被转换成生成器,因为您在函数体上下文中使用了
yield
!这意味着整个东西在传递到list
之前不会被计算。接下来发生了什么:
list
调用next(mydict)
。''.join([item, 's'])
到list
并冻结理解。list
调用next(mydict)
。yield
(None
)的结果赋给item
,并开始新的理解迭代。最后,实际的生成器对象返回主体中的临时对象,即
dict
。我不知道为什么会发生这种事,也可能没有记录在案的行为。我找到了!^_^
在正常生活中,表达
评估如下:
为什么
yield result
而不是return result
?我认为有必要支持嵌套列表理解*如下所示:那么,看起来像这个代码吗?
以及
第一个将返回
''.join([item, 's'])
的所有值,最后一个将返回dictresult
。yield
表达式的值是None
,因此result
中的值也是None
。*评估嵌套列表理解的更正确解释:
我认为
yield
正在把你对词典的理解变成一个生成器表达式。所以,当您在生成器上迭代时,yield是“产生”看起来像as
,bs
…,但语句yield ...
返回None
的元素。所以,在一天结束时,你会得到一本看起来像{'a': None, 'b': None, ...}
的字典。令我困惑的是,这本词典到底是怎么出的。我猜这种行为实际上并没有被标准很好地定义,但我可能错了。
有趣的是,如果您尝试使用列表理解,python会抱怨:
但显然是Ok in a generator。
相关问题 更多 >
编程相关推荐