2012-03-22 75 views
1
>>> reversed(xrange(100)) 
<rangeiterator object at 0xb72aab78> 
>>> it = reversed(xrange(100)).__iter__() 
>>> it 
<rangeiterator object at 0xb72aa4d0> 
>>> next(it) 
99 

我該如何在Python中實現這樣的東西?爲了更具體,我該如何創建一個迭代器,這個迭代器可以被顛倒過來,而不會在它被顛倒之前在內存中創建一個列表?在Python中如何實現rangeiterator?

+1

你問如何創建一個迭代器是可逆的使用reverse()而不會太昂貴,我得到你的權利? – Alfe 2012-03-22 10:04:58

回答

3

基本上,您在集合上實現了__reversed__ magic method

xrange的邏輯是這樣的:

def __reversed__(self): 
    return iter(xrange(stop - 1, start - 1, step * -1)) 

沒有招 - 你需要知道如何製作一個反向迭代。 Python不會爲你做。

1

如果你的迭代器實現了方法__reversed__(),這將由內建的reversed()使用。 xrange()返回這樣做的迭代器。

0

reversed將兩種類型的對象的工作:

  • 序列(如list
  • __reversed__魔術方法

如果你有一個自定義序列的迭代器,你可以拿這個序列的len(),你很好走 - 否則,你需要添加__len__魔法;如果你不能(例如,因爲長度未知),那麼你不能懶惰地扭轉它。

如果你有一個自定義的迭代器,那麼確保它有__reversed__神奇的方法:__reversed__必須返回一個新的迭代器向後;再次,如果你不能提供一個(例如,因爲長度未知),那麼你不能懶惰地扭轉它。

注意:有關創建自定義迭代的更多信息,請參見this answer