網站首頁 編程語言 正文
前言
當我們需要對列表(list)、元組(tuple)、字典(dictionary)和集合(set)的元素進行遍歷時,其實Python內部都是啟動迭代器來完成操作的。
迭代器(Iterator)并非Python獨有的,在C++和Java中也出現了此概念。迭代器可以幫助我們解決面對復雜的數據場景時,快速簡便的獲取數據。
1. 什么是迭代器?
- 迭代器是一個表示數據流的對象,當我們調用next()方法時會返回容器中的下一個值
- 迭代器中包含
__iter__
和__next__()
方法。通過__iter__
方法可以返回迭代器對象本身的方法。__next__()
方法會使cur指針始終指向當前位置,即返回容器中的下一個值,如果容器中沒有更多元素了,則會拋出StopIteration異常。 - 迭代器(iterator)也是可迭代的對象(iterable)
2. 迭代器類型
- Python中支持容器進行迭代,同時也提供迭代器協議支持用戶自定義類進行迭代
-
容器迭代器:
container.__iter__()
方法實現容器對象迭代 -
迭代器協議:
__iter__()
方法和__next__()
方法 -
__iter__()
:返回迭代器本身,容器可以與for...in結合使用 -
__next__()
:返回迭代器返回下一項
3. 迭代器分類
容器迭代器
data = [1,2,3,4] it = iter(data) print(next(it)) print(next(it))
- Python中提供的內置容器有:list、tuple、dictionary 和 set都是可迭代對象
- 調用iter()方法獲取對應的迭代對象
- 調用next()方法獲取迭代對象下一項值。每一次調用next之后,會自動往后移到到一位,獲取后面一位的數據。
遍歷迭代器
for i in it: print(i)
對于可迭代對象,我們也可以使用for...in來進行迭代
自定義迭代器
class Myiter: def __init__(self,times): self.times = times def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.times: result = 3 ** self.n self.n += 1 return result else: raise StopIteration data = Myiter(4) it = iter(data) # 第1次 print(next(it)) # 第2次 print(next(it)) # 第3次 print(next(it)) # 第4次 print(next(it)) # 第5次 print(next(it)) # 第6次,超出范圍觸發StopIteration print(next(it)) ... 1 3 9 27 81 Traceback (most recent call last): File "E:\workspace\uiat\cookbooks\tester.py", line 67, in <module> print(next(it)) File "E:\workspace\uiat\cookbooks\tester.py", line 51, in __next__ raise StopIteration StopIteration ...
- 創建的對象/類需要實現
?__iter__()
?和?__next__()
兩個方法即可作為迭代器 - 迭代器中__iter__()返回迭代器本身方法
- 迭代器中__next__()方法允許進行其他操作,但是必須返回迭代器的下一項
- 為了防止迭代永遠進行下去,Python提供stopIterator語句,終止迭代
總結
本期,我們對Python Iterator迭代器由__iter__()方法和__next__()方法組成。迭代器分為Iterator和iteratable兩種,因此迭代器本身也是可迭代對象的。
迭代器分為容器迭代和自定義迭代。
原文鏈接:https://juejin.cn/post/7102018713028657160
相關推薦
- 2022-11-19 C#字符串與正則表達式的圖文詳解_C#教程
- 2022-07-09 docker 中進程的信號
- 2022-05-06 Docker遠程連接設置的實現示例_docker
- 2022-05-23 Python學習之時間包使用教程詳解_python
- 2023-10-18 如何在linux中安裝ssh服務
- 2023-05-21 numpy.unique()使用方法_python
- 2022-05-21 Nginx實現會話保持的兩種方式_nginx
- 2021-12-15 CentOS下更新SQLite版本_SQLite
- 最近更新
-
- 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同步修改后的遠程分支