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.
所以这是发生的事情:
list电话next(mydict).''.join([item, 's'])到list和冻结的理解.list电话next(mydict).yield(None)的结果分配到item字典中并开始新的理解迭代.最后,实际的生成器对象返回正文中的临时对象dict.为什么会发生这种情况对我来说是未知的,也可能没有记录在案的行为.
| 归档时间: |
|
| 查看次数: |
7719 次 |
| 最近记录: |