Python 函數進階-迭代器

迭代器

什么是迭代器

能被 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__方法
# 存在__iter__方法,說明確實是一個可迭代對象
res = '__iter__' in res_lst
print(res)  # True

定義迭代器

迭代器的表示方式是iterator

使用iter函數

使用 iter 函數將一個普通的可迭代對象轉成迭代器。

lst = [1, 2, 3]

print(type(lst))    # <class 'list'>

it = iter(lst)

print(type(it))     # <class 'list_iterator'>

使用__iter__方法

使用 __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模塊

導入collections模塊中的IteratorIterable類型可以判斷是否是可迭代對象或者是迭代器。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

調用迭代器

調用迭代器的幾種方法

  1. 使用next函數或者是__next__內置方法一個一個、一遍一遍的獲取其中的數據;
  2. 使用for循環遍歷出來;
  3. 使用while循環配合next函數或者是__next__內置方法;
  4. 強轉成為其它的數據類型;

使用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 = lst.__iter__()  # 使用內置方法__iter__()也可以


# 然后再次取出數據,也可以使用內置方法__next__()取值
print(lst_it.__next__())  # 1
print(lst_it.__next__())  # 2
print(lst_it.__next__())  # 3

總結

  1. 使用next函數調用
  2. 使用for循環遍歷
  3. 強轉成為其它的數據類型(實測容器都可以轉成迭代器,但是迭代器只有轉成列表才會有內容)
  4. next函數配合循環遍歷

網站名稱:Python 函數進階-迭代器
URL標題:http://m.kartarina.com/article28/dsogpjp.html

成都網站建設公司_創新互聯,為您提供網站建設全網營銷推廣服務器托管手機網站建設用戶體驗App開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 在线精品自拍无码| 亚洲AV无码专区亚洲AV伊甸园| 99热门精品一区二区三区无码| 亚洲最大av资源站无码av网址| 无码精品国产va在线观看dvd| 日韩精品无码一区二区视频| 免费无码VA一区二区三区 | 日韩人妻无码精品系列| 无码人妻一区二区三区在线视频| 精品久久久久久久无码久中文字幕| 亚洲午夜国产精品无码| 内射无码专区久久亚洲| 无码人妻丝袜在线视频| 国产精品亚韩精品无码a在线| 永久免费AV无码网站在线观看| 国产aⅴ无码专区亚洲av| 亚洲中文字幕无码专区| 成人无码区免费视频观看| 久久久久亚洲AV无码网站| 亚洲色中文字幕无码AV| 亚洲精品一级无码鲁丝片| 日韩av无码中文字幕| 国产精品无码素人福利| 无码国产精成人午夜视频不卡| 亚洲av无码无在线观看红杏| 久久精品无码一区二区三区日韩| 免费看无码自慰一区二区| 亚洲精品无码你懂的| AV大片在线无码永久免费| 无码137片内射在线影院| 亚洲AV无码久久精品蜜桃| 亚洲第一极品精品无码久久| 亚洲AV无码乱码国产麻豆穿越| 精品人妻少妇嫩草AV无码专区 | 免费无码AV电影在线观看| 无码人妻精品一区二区三| 亚洲AV无码不卡在线播放| 色综合久久久久无码专区| 无码专区中文字幕无码| 色综合久久久久无码专区| 国产成人无码AV麻豆|