偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

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

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

迭代器存在的一個最重要價值:節(jié)省內(nèi)存,這在小數(shù)據(jù)量時無足輕重。

但是,當(dāng)數(shù)據(jù)量大或者對程序要求性能高時,它的價值凸顯。

第三個問題:迭代器怎么節(jié)省內(nèi)存了?

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

首先創(chuàng)建一個list:

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

其次,列表內(nèi)每個元素+1,創(chuàng)建一個新列表

  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) 

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

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

  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并打印的空間復(fù)雜度為O(1).

結(jié)論:迭代器更加節(jié)省空間!

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

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

自定義一個迭代器,實現(xiàn)斐波那契數(shù)列:

  1. #斐波那契數(shù)列 
  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 

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

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

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

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

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

  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:  

使用內(nèi)置函數(shù)iter,可將Iterable序列轉(zhuǎn)化為迭代器。

最后總結(jié):

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

 

責(zé)任編輯:趙寧寧 來源: Python與算法社區(qū)
相關(guān)推薦

2020-10-05 21:57:43

Python生成器可迭代對象

2020-05-13 11:19:30

SaaS云計算技術(shù)

2016-03-28 10:39:05

Python迭代迭代器

2021-01-10 23:36:52

SQL數(shù)據(jù)庫技術(shù)

2018-08-30 07:03:49

2020-01-09 12:11:02

Python 開發(fā)編程語言

2022-10-26 08:25:06

Python編程迭代器

2017-06-26 16:26:15

Python迭代對象迭代器

2021-11-28 08:03:41

Python迭代器對象

2021-10-28 19:21:56

GolangGo變量

2020-07-26 00:40:48

JavaScript開發(fā)代碼

2019-11-29 10:03:43

5G技術(shù)智能家居

2022-05-16 07:48:54

Python操作類型

2020-06-09 08:00:52

Python開發(fā)代碼

2021-02-03 13:03:00

編程程序員語言

2020-07-14 07:12:19

云安全AI無服務(wù)器

2024-09-18 13:49:42

2015-11-10 12:24:36

創(chuàng)業(yè)問題思路

2020-05-28 13:11:37

Python編碼 開發(fā)

2020-07-16 08:04:21

瀏覽器緩存策略
點贊
收藏

51CTO技術(shù)棧公眾號