網站首頁 編程語言 正文
什么是迭代器
能被 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函數
使用?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模塊中的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__
內置方法一個一個、一遍一遍的獲取其中的數據; - 使用for循環遍歷出來;
- 使用while循環配合
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函數配合循環遍歷
原文鏈接:https://www.cnblogs.com/msr20666/p/16172929.html
相關推薦
- 2022-11-30 Python?Django教程之實現天氣應用程序_python
- 2022-07-11 pandas的排序、分組groupby及cumsum累計求和方式_python
- 2022-07-15 Android?Flutter繪制扇形圖詳解_Android
- 2022-05-06 golang mongo-driver 模糊查詢
- 2022-05-15 一起來學習Python的元組和列表_python
- 2022-05-01 sql時間段切分實現每隔x分鐘出一份高速門架車流量_MsSql
- 2022-05-21 Python實現歸一化算法詳情_python
- 2024-01-31 nginx配置文件中最后一個 include servers/*;作用是什么?
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支