作为一个人为的例子:
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
)。
现在,这里是你的答案:
>>> myset = set(['a', 'b', 'c', 'd'])
>>> mydict = {item: (yield ''.join([item, 's'])) for item in myset}
>>> mydict
<generator object <dictcomp> at 0x0222BB20>
该字典的理解变成一台发电机,因为你使用的yield
在函数体范围内! 这意味着,整个事情是不求值,直到它传递到list
。
因此,这里是发生了什么:
-
list
称next(mydict)
- 产量返回
''.join([item, 's'])
以list
并冻结的理解。 -
list
称next(mydict)
- 修真恢复和分配的结果
yield
( None
)到item
的字典,并开始了新的理解迭代。 - 回到1。
而在最后的实际发电机对象返回的身体,这是临时dict
。 为什么出现这种情况是未知的我,它可能不是记录的行为无论是。
我认为, yield
是把你漂亮的字典解析到一个生成器表达式。 所以,当你遍历发生器,产量“屈服”,看起来元素as
, bs
...,但声明yield ...
返回None
。 所以,在这一天结束时,你会得到一本字典看起来像{'a': None, 'b': None, ...}
这让我困惑的部分就是为什么字典是在最后居然产生。 我猜测,这种行为实际上是没有很好定义的标准,但我可能是错了。
有趣的是,如果你试图用这个列表解析,蟒蛇抱怨:
>>> a = [(yield i) for i in myset]
File "<stdin>", line 1
SyntaxError: 'yield' outside function
但它是在发电机好的 (显然)。
我发现! ^ _ ^
在正常的生活,表达
print {item: (yield ''.join([item, 's'])) for item in myset}
评价是这样的:
def d(myset):
result = {}
for item in myset:
result[item] = (''.join([item, 's']))
yield result
print d(myset).next()
为什么yield result
,而不是return result
? 我认为有必要支持嵌套列表理解*是这样的:
print {i: f.lower() for i in nums for f in fruit} # yes, it's works
所以,看起来像这样的代码?
def d(myset):
result = {}
for item in myset:
result[item] = (yield ''.join([item, 's']))
yield result
和
>>> print list(d(myset))
['as', 'cs', 'bs', 'ds', {'a': None, 'b': None, 'c': None, 'd': None}]
首先将返回的所有值''.join([item, 's'])
最后将返回字典result
。 的值yield
表达为None
,所以在值result
是None
太。
*评估嵌套列表内涵更正确的解释:
print {i: f.lower() for i in nums for f in fruit}
# eval like this:
result = {}
for i, f in product(nums, fruit): # product from itertools
key, value = (i, f.lower())
result[key] = value
print result
我认为,你的代码必须执行的这种相似性:
def d(myset):
for item in myset:
yield item, (yield ''.join([item, 's']))
d(myset)
首先,评价yield ''.join([item, 's']
和返回“作为”,“CS”等)。产率表达的值是无,因为被发送回发生器。然后EVAL yield item, None
,该返回的元组( '一个',无),( 'b',无)。
所以我有:
>>> list(d(myset))
['as', ('a', None), 'cs', ('c', None), 'bs', ('b', None), 'ds', ('d', None)]
接下来会发生什么,我不明白。