2013-11-03 87 views

回答

7

在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,常常浪費上構建,然後迭代之後再次丟棄的中間列表對象存儲器和週期。通過返回一個迭代器,實現列表的選擇取決於程序員。

相關問題