成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

弄懂這 5 個問題,拿下 Python 迭代器!

開發 后端
本篇專題寫作思路,由幾個問題,逐步討論迭代器存在的價值、使用的方法、以及如何轉化為自身武器并真正用到日常Python中。

本篇專題寫作思路,由幾個問題,逐步討論迭代器存在的價值、使用的方法、以及如何轉化為自身武器并真正用到日常Python中。

第一個問題:什么是迭代器?

迭代器,英文 Iterator,它首先是個對象,其次它是訪問可迭代序列(Iterable)的一種方式。通常其從序列的第一個元素開始訪問,直到所有的元素都被訪問才結束。

迭代器又是一個特殊的對象,特殊在于它必須實現兩個方法:__iter__和__next__.

第二個問題:為什么要有迭代器?

迭代器存在的一個最重要價值:節省內存,這在小數據量時無足輕重。

但是,當數據量大或者對程序要求性能高時,它的價值凸顯。

第三個問題:迭代器怎么節省內存了?

只知道使用迭代器能節省內存,但卻不知道怎么使用才能節省內存,下面就來回答這個問題。

首先創建一個list:

  1. In [1]: a=[1,3,5,9,10] 

其次,列表內每個元素+1,創建一個新列表

  1. In [2]: a1 = [i+1 for i in a]   

依次打印a1中每個元素:

  1. In [8]: for i in a1:  
  2.    ...:     print(i)  

上面操作等價于:

  1. a1 = [] 
  2. for i in a: 
  3.   a1.append(i+1) 
  4. for i in a1: 
  5.   print(i) 

空間復雜度為 O(n),n為列表a內元素個數。

但是,使用迭代器實現上面的元素+1并打印的空間復雜度是多少呢?

  1. ait = (i+1 for i in a) # 得到生成器,也是一種特殊的迭代器 
  2. for i in ait: 
  3.   print(i) 

上面操作等價于:

  1. for i in a: 
  2.   print(i+1) 

不需要額外空間,所以使用迭代器加1并打印的空間復雜度為O(1).

結論:迭代器更加節省空間!

第四個問題:如何自定義一個迭代器?

上面說過,迭代器對象必須要實現兩個方法,為了更加具體,我們演示如何自定義一個迭代器。

自定義一個迭代器,實現斐波那契數列:

  1. #斐波那契數列 
  2. class Fabs(): 
  3.     def __init__(self,max): 
  4.         self.max=max 
  5.         self.n,self.a,self.b=0,0,1 
  6.      
  7.     #定義__iter__方法 
  8.     def __iter__(self): 
  9.         return self 
  10.          
  11.     #定義__next__方法 
  12.     def __next__(self): 
  13.         if self.n<self.max: 
  14.             tmp=self.b 
  15.             self.a,selfself.b=self.b,self.a+self.b 
  16.             self.n+=1 
  17.             return tmp 
  18.         raise StopIteration 

使用這個迭代器,打印斐波那契數列前10項:

  1. In [13]: for item in Fabs(10):  
  2.     ...:     print(item,end=' ')                                                                     
  3. 1 1 2 3 5 8 13 21 34 55  

第五個問題:迭代器使用有哪些注意事項?

迭代器只能前進不能回退!

也就是說一旦迭代結束,要想再使用此迭代器對象從頭開始遍歷元素,將是不可行的!

  1. In [14]: a=iter([1,4,5])  
  2.  
  3. In [16]: next(a)                                                                 
  4. Out[16]: 1 
  5.  
  6. In [17]: next(a)                                                                 
  7. Out[17]: 4 
  8.  
  9. In [18]: next(a)                                                                 
  10. Out[18]: 5 
  11.  
  12. # 要想再使用此迭代器對象從頭開始遍歷元素,將是不可行的! 
  13. In [19]: next(a)                                            
  14. # 拋出異常:StopIteration:  

使用內置函數iter,可將Iterable序列轉化為迭代器。

最后總結:

  • 第一個問題:什么是迭代器?
  • 第二個問題:為什么要有迭代器?
  • 第三個問題:迭代器怎么節省內存了?
  • 第四個問題:如何自定義一個迭代器?
  • 第五個問題:迭代器使用有哪些注意事項?

 

責任編輯:趙寧寧 來源: Python與算法社區
相關推薦

2020-10-05 21:57:43

Python生成器可迭代對象

2020-05-13 11:19:30

SaaS云計算技術

2016-03-28 10:39:05

Python迭代迭代器

2021-01-10 23:36:52

SQL數據庫技術

2018-08-30 07:03:49

2020-01-09 12:11:02

Python 開發編程語言

2021-10-28 19:21:56

GolangGo變量

2020-07-26 00:40:48

JavaScript開發代碼

2017-06-26 16:26:15

Python迭代對象迭代器

2022-10-26 08:25:06

Python編程迭代器

2021-11-28 08:03:41

Python迭代器對象

2019-11-29 10:03:43

5G技術智能家居

2020-06-09 08:00:52

Python開發代碼

2022-05-16 07:48:54

Python操作類型

2020-07-14 07:12:19

云安全AI無服務器

2021-02-03 13:03:00

編程程序員語言

2015-11-10 12:24:36

創業問題思路

2020-05-28 13:11:37

Python編碼 開發

2024-09-18 13:49:42

2020-07-16 08:04:21

瀏覽器緩存策略
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品影院 | 成人免费视频网站在线观看 | 天天操伊人 | 久久国内精品 | 欧美黄在线观看 | 亚洲国产精品视频 | av中文字幕在线播放 | 亚洲一区免费视频 | av色站| 亚洲久草| 精品毛片 | 亚洲精品日韩一区二区电影 | 国产清纯白嫩初高生在线播放视频 | 亚洲国产精品久久 | 亚洲一区二区三区在线 | 日本精品在线一区 | 涩爱av一区二区三区 | 亚洲精品成人 | 亚洲电影一区 | 夜久久 | 久久一区视频 | 欧美成人a∨高清免费观看 欧美日韩中 | 国产精品久久午夜夜伦鲁鲁 | 九九免费在线视频 | 欧美三级成人理伦 | 成人欧美一区二区 | 夜夜操天天操 | 日本精品视频在线 | 国产一区二区在线播放 | 欧美激情视频一区二区三区在线播放 | 亚洲精品电影网在线观看 | 欧美在线a | 国产亚洲人成a在线v网站 | 999精品在线 | 爽爽免费视频 | 欧美高清免费 | 亚洲国产欧美精品 | 亚洲午夜在线 | 亚洲日本国产 | 夜夜av| 2018国产大陆天天弄 |