自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

弄懂這 5 個(gè)問(wèn)題,拿下 Python 迭代器!

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

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

第一個(gè)問(wèn)題:什么是迭代器?

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

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

第二個(gè)問(wèn)題:為什么要有迭代器?

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

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

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

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

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

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

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

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

依次打印a1中每個(gè)元素:

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

上面操作等價(jià)于:

  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)元素個(gè)數(shù)。

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

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

上面操作等價(jià)于:

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

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

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

第四個(gè)問(wèn)題:如何自定義一個(gè)迭代器?

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

自定義一個(gè)迭代器,實(shí)現(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 

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

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

第五個(gè)問(wèn)題:迭代器使用有哪些注意事項(xiàng)?

迭代器只能前進(jìn)不能回退!

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

  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. # 要想再使用此迭代器對(duì)象從頭開(kāi)始遍歷元素,將是不可行的! 
  13. In [19]: next(a)                                            
  14. # 拋出異常:StopIteration:  

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

最后總結(jié):

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

 

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

2020-10-05 21:57:43

Python生成器可迭代對(duì)象

2016-03-28 10:39:05

Python迭代迭代器

2020-05-13 11:19:30

SaaS云計(jì)算技術(shù)

2021-01-10 23:36:52

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

2020-01-09 12:11:02

Python 開(kāi)發(fā)編程語(yǔ)言

2018-08-30 07:03:49

2017-06-26 16:26:15

Python迭代對(duì)象迭代器

2022-10-26 08:25:06

Python編程迭代器

2021-11-28 08:03:41

Python迭代器對(duì)象

2020-07-26 00:40:48

JavaScript開(kāi)發(fā)代碼

2021-10-28 19:21:56

GolangGo變量

2022-05-16 07:48:54

Python操作類型

2019-11-29 10:03:43

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

2020-06-09 08:00:52

Python開(kāi)發(fā)代碼

2024-09-18 13:49:42

2024-11-11 06:10:00

Python生成器迭代器

2020-05-28 13:11:37

Python編碼 開(kāi)發(fā)

2021-02-03 13:03:00

編程程序員語(yǔ)言

2020-07-14 07:12:19

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

2020-07-16 08:04:21

瀏覽器緩存策略
點(diǎn)贊
收藏

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