我在Python中使用過濾函數(3.3)。我試圖將過濾器對象轉換爲列表。這就是我發現的:列出過濾器對象兩次將返回一個空白列表?
>>> a=['1', '2', '3', None]
>>> b=filter(None,a)
>>> list(b)
['1', '2', '3']
>>> list(b)
[]
這對我來說很奇怪。任何人都可以解釋嗎?
我在Python中使用過濾函數(3.3)。我試圖將過濾器對象轉換爲列表。這就是我發現的:列出過濾器對象兩次將返回一個空白列表?
>>> a=['1', '2', '3', None]
>>> b=filter(None,a)
>>> list(b)
['1', '2', '3']
>>> list(b)
[]
這對我來說很奇怪。任何人都可以解釋嗎?
在Python 3中,filter()
返回iterator type,和所有迭代器一樣,只能迭代一次。 filter()
迭代器按需過濾值,它不會在內存中保存任何過濾值。
你可以做的列表迭代器一樣,通過iter()
返回:
>>> a = [1, 2, 3]
>>> b = iter(a)
>>> list(b)
[1, 2, 3]
>>> list(b)
[]
這是因爲迭代器的.__next__()
method有望提高StopIteration
一旦累死了,這時必須總是提高StopIteration
從那裏out:
一旦迭代器的
__next__()
方法產生了StopIteration
,它必須繼續這樣做sub後續呼叫。不遵守這一財產的實施被視爲破產。
filter()
這是否正確:
>>> a = [1, 2, 3, None]
>>> b = filter(None, a)
>>> list(b)
[1, 2, 3]
>>> next(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
這裏next()
function調用.__next__()
迭代方法,並且傳播引發的異常;另一方面,list()
迭代到StopIteration
,捕獲該異常並返回它設法接收的任何元素的列表。
爲了完整起見,在Python 2,filter()
(以及許多其他的內置函數和方法)返回一個list
,常常浪費上構建,然後迭代之後再次丟棄的中間列表對象存儲器和週期。通過返回一個迭代器,實現列表的選擇取決於程序員。