<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
能被 next 指標呼叫,並不斷返回下一個值的物件,叫做迭代器。表示為Iterator,迭代器是一個物件型別資料。
迭代器指的是迭代取值的工具,迭代是一個重複的過程,每次重複都是基於上一次的結果而繼續的,單純的重複並不是迭代。
迭代器並不依賴索引,而通過 next 指標迭代所有資料,一次只取一個值,大大節省空間。
惰性序列是指沒有一次性的把所有資料都放在序列中,而是遍歷一個放一個這樣的序列,range物件和迭代器能夠產生惰性序列。
for迴圈的用於遍歷可迭代物件,簡單粗暴的來說,可以被for迴圈遍歷的元素都是可迭代物件。for 迴圈能夠遍歷一切可迭代性資料的原因在於,底層呼叫了迭代器,通過next方法中的指標實現資料的獲取。所以普通的非迭代器可迭代物件和迭代器之間的區別就是,一個不能直接使用next呼叫,一個可以被next指標呼叫。
再次重複一遍,可迭代物件不一定是迭代器,迭代器一定是一個可迭代物件。
使用dir()
函數可以檢視一個資料中的所有的物件成員,如果包含有__iter__
方法,說明就是一個可迭代物件。換句話說,__iter__
方法的作用就是返回一個可迭代物件。
# 定義一個列表,列表是可迭代物件 lst = [1, 2, 3, 4, 5] # 獲取列表的所有成員 res_lst = dir(lst) print(res_lst) ''' ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] ''' # 檢視是否存在__iter__方法 res = '__iter__' in res_lst print(res) # True # 存在__iter__方法,說明確實是一個可迭代物件
迭代器的表示方式是iterator
。
使用 iter
函數將一個普通的可迭代物件轉成迭代器。
lst = [1, 2, 3] print(type(lst)) # <class 'list'> it = iter(lst) print(type(it)) # <class 'list_iterator'>
使用 __iter__
內建方法實現可迭代物件轉成迭代器。
lst = [1, 2, 3] print(type(lst)) # <class 'list'> it = lst.__iter__() print(type(it)) # <class 'list_iterator'>
存在__iter__
方法說明是可迭代物件。存在 __next__
方法說明是迭代器,因為迭代器可以使用next
指標獲取元素。
迭代器中,__iter__
和__next__
都存在。
產卡是可迭代物件。
# 列表 lst = list() # 迭代器 lst_it = iter(lst) # 迭代器中的所有成員 res_lst = dir(lst_it) # 判斷 if '__iter__' in res_lst: print('lst_it是一個可迭代物件') if '__next__' in res_lst: print('lst_it是一個迭代器') ''' 結果: lst_it是一個可迭代物件 lst_it是一個迭代器 '''
匯入collections模組中的Iterator
和Iterable
型別可以判斷是否是可迭代物件或者是迭代器。Iterator
是迭代器型別資料。Iterable
是可迭代物件型別資料。利用匯入的資料型別配合isinstance
函數就可以判斷資料的型別。
lst = list() lst_it = iter(lst) # 判斷是否是迭代器 res = isinstance(lst_it, Iterator) print(res) # True # 判斷是否是可迭代物件 res = isinstance(lst_it, Iterable) print(res) # True
呼叫迭代器的幾種方法
next
函數或者是__next__
內建方法一個一個、一遍一遍的獲取其中的資料;next
函數或者是__next__
內建方法;呼叫迭代器使用next
函數才可以取出其中的內容,next 在呼叫迭代器中的資料時單向不可逆的,是一條路走到黑的過程,如果呼叫超出迭代器中的元素個數,會報錯StopIteration
,意為停止迭代。
# 因為lst本沒有資料,所以無法取出資料 lst = list() lst_it = iter(lst) res = next(lst_it) # StopIteration print(res)
取出迭代器中的資料,如果資料全部取出要重置迭代器才能再次取出。
lst = [1, 2, 3] lst_it = iter(lst) # 迭代器中一次只會取出一個資料 print(next(lst_it)) # 1 print(next(lst_it)) # 2 print(next(lst_it)) # 3 # 超出迭代器中的元素個數,就會報錯 print(next(lst_it)) # StopIteration # 如果要重新取出資料,就重置迭代器,重新定義一邊迭代器就是重置迭代器 lst_it = iter(lst) # 再次取出資料,使用__next__方法 print(lst_it.__iter__()) # 1 print(lst_it.__iter__()) # 2 print(lst_it.__iter__()) # 3
總結
使用next函數呼叫
使用for迴圈遍歷
強轉成為其它的資料型別(實測容器都可以轉成迭代器,但是迭代器只有轉成列表才會有內容)
next函數配合迴圈遍歷
到此這篇關於Python函數進階之迭代器的原理與使用詳解的文章就介紹到這了,更多相關Python迭代器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45