簡體   English   中英

為什么 python 生成器會產生這樣的結果?

[英]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==Falseres2==False 顯然res1的結果不正確。 當我注釋掉 for 循環打印時, res1==Trueres2==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.

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