Python內置數據結構之迭代器知多少?
迭代器
迭代器
今天給大家說說迭代器是什麼東東。
什麼是迭代器
先說一些概念性的東西:
可迭代對象:列表、元組、集合、字元串、bytes、bytearray、字典和生成器。
有的對象叫可迭代對象;有方法的可迭代對象叫迭代器。
可迭代對象可以用在語句中;可以使用成員運算符(,)。
函數把一個可迭代對象封裝成迭代器。
我們驗證一下上面所說的概念是否正確?那我們就以列表為例:
# 驗證列表是否有__iter__屬性
In[1]:lst=[1,2,3]
In[2]:lst.__iter__
Out[2]:
# 驗證列表是否有__next__屬性
In[4]:lst.__next__
---------------------------------------------------------------------------
AttributeErrorTraceback(mostrecentcalllast)
in()
---->1lst.__next__AttributeError: list objecthasnoattribute __next__
我們使用函數把列錶轉換成迭代器:
In[5]:iter01=iter(lst)
In[6]:iter01.__next__
Out[6]:
In[7]:iter01.__next__()
Out[7]:1
In[8]:iter01.__next__()
Out[8]:2
In[9]:iter01.__next__()
Out[9]:3
In[10]:iter01.__next__()
---------------------------------------------------------------------------
StopIterationTraceback(mostrecentcalllast)
in()
---->1iter01.__next__()
StopIteration:
迭代器是一種封裝。迭代器並非惰性求值,那迭代器有何用途呢?
對於上面的例子,我們完全可以使用遍歷列表也可以實現,但是使用列表遍歷會佔用更多的內存。
可迭代對象
迭代器
以菲波那切數列為例,以類的方式實現:
fromitertoolsimportisliceIn[74]:classFib:...:def__init__(self):...:self.prev=...:self.curr=1...:def__iter__(self):...:returnself...:def__next__(self):...:value=self.curr...:self.curr+=self.prev...:self.prev=value...:returnvalue...:In[75]:f=Fib()
In[76]:list(islice(f,,10))
Out[76]:[1,1,2,3,5,8,13,21,34,55]
迭代器小結
函數把可迭代對象轉化為迭代器,函數從迭代器取出下一個元素。迭代器會保存一個指針,指向可迭代對象的當前元素。調用函數的時候,會返回當前元素,並且把指針指向下一個元素。當沒有下一個元素的時候,會拋出異常。循環對於可迭代對象:首先調用方法轉化為迭代器,然後不斷的調用方法,直到拋出異常。
今天的內容比較簡單,從後面開始我們就要進行函數的學習了。請大家做好準備哦。
※Day 5 Python數據運用的初級水準,你達到了嗎?
※學Python語言到底好不好?
※Python還能用來做這個?只要你想,就有這種操作!
※退伍兵想年薪十萬,學Python,是首選
※編程老司機的筆記,帶你系統學Python
TAG:Python |