[英](list|set|dict) comprehension containing a yield expression does not return a (list|set|dict)
[英]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
之前不會被評估。
所以這是發生的事情:
list
調用next(mydict)
。 ''.join([item, 's'])
list
並凍結理解。 list
調用next(mydict)
。 yield
( None
)的結果分配給字典中的item
並開始新的理解迭代。 最后,實際的生成器對象返回正文中的臨時對象,即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.