在听写理解中使用屈服

2024-10-03 02:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

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


Tags: innoneforbs表达式asdscs
3条回答

首先,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>

dict理解被转换成生成器,因为您在函数体上下文中使用了yield!这意味着整个东西在传递到list之前不会被计算。

接下来发生了什么:

  1. list调用next(mydict)
  2. Yield返回''.join([item, 's'])list并冻结理解。
  3. list调用next(mydict)
  4. 理解恢复并将字典中yieldNone)的结果赋给item,并开始新的理解迭代。
  5. 回到1。

最后,实际的生成器对象返回主体中的临时对象,即dict。我不知道为什么会发生这种事,也可能没有记录在案的行为。

我找到了!^_^

在正常生活中,表达

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'])的所有值,最后一个将返回dictresultyield表达式的值是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

我认为yield正在把你对词典的理解变成一个生成器表达式。所以,当您在生成器上迭代时,yield是“产生”看起来像asbs…,但语句yield ...返回None的元素。所以,在一天结束时,你会得到一本看起来像{'a': None, 'b': None, ...}的字典。

令我困惑的是,这本词典到底是怎么出的。我猜这种行为实际上并没有被标准很好地定义,但我可能错了。

有趣的是,如果您尝试使用列表理解,python会抱怨:

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

但显然是Ok in a generator

相关问题 更多 >