使用收益的有快译通理解(Use of yield with a dict comprehension

2019-07-31 11:45发布

作为一个人为的例子:

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'} ,这似乎是什么,我想在这里做。

Answer 1:

首先,是什么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

因此,这里是发生了什么:

  1. listnext(mydict)
  2. 产量返回''.join([item, 's'])list并冻结的理解。
  3. listnext(mydict)
  4. 修真恢复和分配的结果yieldNone )到item的字典,并开始了新的理解迭代。
  5. 回到1。

而在最后的实际发电机对象返回的身体,这是临时dict 。 为什么出现这种情况是未知的我,它可能不是记录的行为无论是。



Answer 2:

我认为, yield是把你漂亮的字典解析到一个生成器表达式。 所以,当你遍历发生器,产量“屈服”,看起来元素asbs ...,但声明yield ...返回None 。 所以,在这一天结束时,你会得到一本字典看起来像{'a': None, 'b': None, ...}

这让我困惑的部分就是为什么字典是在最后居然产生。 我猜测,这种行为实际上是没有很好定义的标准,但我可能是错了。

有趣的是,如果你试图用这个列表解析,蟒蛇抱怨:

>>> a = [(yield i) for i in myset]
  File "<stdin>", line 1
SyntaxError: 'yield' outside function

但它是在发电机好的 (显然)。



Answer 3:

我发现! ^ _ ^

在正常的生活,表达

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 ,所以在值resultNone太。

*评估嵌套列表内涵更正确的解释:

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


Answer 4:

我认为,你的代码必须执行的这种相似性:

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)]

接下来会发生什么,我不明白。



文章来源: Use of yield with a dict comprehension