[英]Why does python generator result like this?
這是代碼:
def is_subsequence(a, b):
b = iter(b)
gen = ((i in b) for i in a)
print(gen)
for i in gen:
print(i)
return all(((i in b) for i in a))
res1 = is_subsequence([1, 3, 5], [1, 2, 3, 4, 5])
res2 = is_subsequence([1, 4, 3], [1, 2, 3, 4, 5])
結果是res1==False
和res2==False
。 顯然res1
的結果不正確。 當我注釋掉 for 循環打印時, res1==True
和res2==False
是正確的。 我很困惑。 有人可以解釋為什么嗎?
當b
是迭代器時,您遇到的主要問題是i in b
。 檢查迭代器中的成員資格會迭代這些值。 如果找到值,則返回True
(使用迭代器中的值直到並包括找到的值),如果迭代器首先用完,則返回False
。 不幸的是,如果您要求迭代器以錯誤順序產生的值,您很容易錯過其中的一些。 這是一個更簡單的例子:
b = iter([1,2,3])
print(1 in b) # prints True
print(3 in b) # prints True, but skipped over 2 to get there
print(2 in b) # prints False, since the iterator is exhausted after seeing 3
生成器是惰性迭代器。 您可以像列表一樣遍歷它們,但是一旦這樣做,它們就會耗盡,即什么都沒有。 使用以下行,
gen = ((i in b) for i in a)
print(gen)
您創建一個生成器 object 然后使用以下循環,
for i in gen:
print(i)
你用盡它。 順便說一句,您在耗盡gen
的同時也耗盡了b
。 所以到最后一行的時候, b
是空的,所以你的 function 將總是返回 False。
IIUC,您想評估a
是否是b
的子序列(不是子集)。 所以順序很重要。 您可以將 function 更改為:
def is_subsequence(a, b):
b = iter(b)
return all(((i in b) for i in a))
它會按預期工作。
Output:
res1 = is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]) # True
res2 = is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]) # False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.