使用具有词典理解的收益率

sky*_*ork 21 python yield generator

作为一个人为的例子:

myset = set(['a', 'b', 'c', 'd'])
mydict = {item: (yield ''.join([item, 's'])) for item in myset}
Run Code Online (Sandbox Code Playgroud)

list(mydict)给出:

['as', 'cs', 'bs', 'ds', {'a': None, 'b': None, 'c': None, 'd': None}]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?怎么yield办?无论表达式yield如何,这种行为是否一致?

注意:我知道做的mydict = {item: ''.join([item, 's']) for item in myset}会给字典{'a': 'as', 'b': 'bs', 'c': 'cs', 'd': 'ds'},这似乎是我想在这里做的.

orl*_*rlp 12

首先,yield返回什么?在这种情况下的答案是None,因为yield返回传递给的参数next(),在这种情况下什么都不是(list不传递任何东西next).

现在这是你的答案:

>>> myset = set(['a', 'b', 'c', 'd'])
>>> mydict = {item: (yield ''.join([item, 's'])) for item in myset}
>>> mydict
<generator object <dictcomp> at 0x0222BB20>
Run Code Online (Sandbox Code Playgroud)

dict理解变成了一个生成器,因为你yield在函数体上下文中使用了!这意味着整个事情在被传递之前不会被评估list.

所以这是发生的事情:

  1. list电话next(mydict).
  2. 产量恢复''.join([item, 's'])list和冻结的理解.
  3. list电话next(mydict).
  4. 理解恢复并将yield(None)的结果分配到item字典中并开始新的理解迭代.
  5. 回到1.

最后,实际的生成器对象返回正文中的临时对象dict.为什么会发生这种情况对我来说是未知的,也可能没有记录在案的行为.