簡體   English   中英

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

[英]Use of yield with a dict comprehension

作為一個人為的例子:

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}執行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>

dict理解變成了生成器,因為你在函數體上下文中使用了yield 這意味着整個事物在被傳遞到list之前不會被評估。

所以這是發生的事情:

  1. list調用next(mydict)
  2. Yield返回''.join([item, 's']) list並凍結理解。
  3. list調用next(mydict)
  4. 理解恢復並將yieldNone )的結果分配給字典中的item並開始新的理解迭代。
  5. 回到1。

最后,實際的生成器對象返回正文中的臨時對象,即dict 為什么會發生這種情況對我來說是未知的,也可能沒有記錄在案的行為。

我認為yield正在將你的字典理解轉化為生成器表達式。 因此,當您在生成器上進行迭代時,yield會“生成”看起來as bs ...的元素,但語句yield ...返回None 所以,在一天結束時,你得到一個字典看起來像{'a': None, 'b': None, ...}

令我困惑的部分是為什么字典實際上是在最后產生的。 我猜這個行為實際上並沒有被標准明確定義,但我可能錯了。

有趣的是,如果你嘗試使用列表解析,python會抱怨:

>>> 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'])所有值,最后將返回dict 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'] (並返回'as','cs'等)。yield表達式的值為None,因為它被發送回生成器。然后eval yield item, None ,返回元組('a',None),('b',None)。

所以我有:

>>> list(d(myset))
['as', ('a', None), 'cs', ('c', None), 'bs', ('b', None), 'ds', ('d', None)]

接下來會發生什么,我不明白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM