能被 next 指針調(diào)用,并不斷返回下一個值的對象,叫做迭代器。表示為Iterator,迭代器是一個對象類型數(shù)據(jù)。
都勻網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,都勻網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為都勻千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的都勻做網(wǎng)站的公司定做!
迭代器指的是迭代取值的工具,迭代是一個重復(fù)的過程,每次重復(fù)都是基于上一次的結(jié)果而繼續(xù)的,單純的重復(fù)并不是迭代。
迭代器并不依賴索引,而通過 next 指針迭代所有數(shù)據(jù),一次只取一個值,大大節(jié)省空間。
惰性序列是指沒有一次性的把所有數(shù)據(jù)都放在序列中,而是遍歷一個放一個這樣的序列,range對象和迭代器能夠產(chǎn)生惰性序列。
for循環(huán)的用于遍歷可迭代對象,簡單粗暴的來說,可以被for循環(huán)遍歷的元素都是可迭代對象。for 循環(huán)能夠遍歷一切可迭代性數(shù)據(jù)的原因在于,底層調(diào)用了迭代器,通過next方法中的指針實現(xiàn)數(shù)據(jù)的獲取。所以普通的非迭代器可迭代對象和迭代器之間的區(qū)別就是,一個不能直接使用next調(diào)用,一個可以被next指針調(diào)用。
再次重復(fù)一遍,可迭代對象不一定是迭代器,迭代器一定是一個可迭代對象。
使用dir()
函數(shù)可以查看一個數(shù)據(jù)中的所有的對象成員,如果包含有__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__方法
# 存在__iter__方法,說明確實是一個可迭代對象
res = '__iter__' in res_lst
print(res) # True
迭代器的表示方式是iterator
。
使用 iter
函數(shù)將一個普通的可迭代對象轉(zhuǎn)成迭代器。
lst = [1, 2, 3]
print(type(lst)) # <class 'list'>
it = iter(lst)
print(type(it)) # <class 'list_iterator'>
使用 __iter__
內(nèi)置方法實現(xiàn)可迭代對象轉(zhuǎn)成迭代器。
lst = [1, 2, 3]
print(type(lst)) # <class 'list'>
it = lst.__iter__()
print(type(it)) # <class 'list_iterator'>
見 生成器
詳細(xì)說明。
存在__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是一個迭代器')
'''
結(jié)果:
lst_it是一個可迭代對象
lst_it是一個迭代器
'''
導(dǎo)入collections模塊中的Iterator
和Iterable
類型可以判斷是否是可迭代對象或者是迭代器。Iterator
是迭代器類型數(shù)據(jù)。Iterable
是可迭代對象類型數(shù)據(jù)。利用導(dǎo)入的數(shù)據(jù)類型配合isinstance
函數(shù)就可以判斷數(shù)據(jù)的類型。
lst = list()
lst_it = iter(lst)
# 判斷是否是迭代器
res = isinstance(lst_it, Iterator)
print(res) # True
# 判斷是否是可迭代對象
res = isinstance(lst_it, Iterable)
print(res) # True
調(diào)用迭代器的幾種方法
next
函數(shù)或者是__next__
內(nèi)置方法一個一個、一遍一遍的獲取其中的數(shù)據(jù);next
函數(shù)或者是__next__
內(nèi)置方法;調(diào)用迭代器使用next
函數(shù)才可以取出其中的內(nèi)容,next 在調(diào)用迭代器中的數(shù)據(jù)時單向不可逆的,是一條路走到黑的過程,如果調(diào)用超出迭代器中的元素個數(shù),會報錯StopIteration
,意為停止迭代。
# 因為lst本沒有數(shù)據(jù),所以無法取出數(shù)據(jù)
lst = list()
lst_it = iter(lst)
res = next(lst_it) # StopIteration
print(res)
取出迭代器中的數(shù)據(jù),如果數(shù)據(jù)全部取出要重置迭代器才能再次取出。
lst = [1, 2, 3]
lst_it = iter(lst)
# 迭代器中一次只會取出一個數(shù)據(jù)
print(next(lst_it)) # 1
print(next(lst_it)) # 2
print(next(lst_it)) # 3
# 超出迭代器中的元素個數(shù),就會報錯
print(next(lst_it)) # StopIteration
# 迭代器中的數(shù)據(jù)是一次性的,不能重復(fù)使用
# 如果需要重復(fù)使用迭代器,可以重置迭代器(重新定義一遍迭代器)
lst_it = lst.__iter__() # 使用內(nèi)置方法__iter__()也可以
# 然后再次取出數(shù)據(jù),也可以使用內(nèi)置方法__next__()取值
print(lst_it.__next__()) # 1
print(lst_it.__next__()) # 2
print(lst_it.__next__()) # 3
網(wǎng)站名稱:Python 函數(shù)進(jìn)階-迭代器
URL標(biāo)題:http://chinadenli.net/article28/dsogpjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、用戶體驗、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)