欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

深入淺析Python中的迭代器

系統 2407 0

目錄結構:

contents structure [-]

在開始文章之前,先貼上一張Iterable、Iterator與Generator之間的關系圖:

深入淺析Python中的迭代器_第1張圖片 ?

1. Iterator VS Iterable

迭代器(Iterator)

迭代器是實現了迭代器協議的類對象,迭代器協議規定了迭代器類必需定義__next()__方法。當對迭代器對象調用next()方法時,對象會去調用__next()__計算迭代器的返回值。

可迭代對象(Iterable)

可迭代對象可以是任何對象,不一定是能返回迭代器的數據結構。一個可迭代對象會直接或間接性的調用這兩個方法__iter()__和__next()__;其中__iter()__方法只能返回迭代器對象,__next()__則供給迭代器進行調用。

通常情況下,可迭代類都會實現__iter()__和__next()__,并且__iter()__返回它自己,換句話說,該類即是迭代器又是可迭代類。

下面的代碼展示了迭代器和可迭代器對象之間的差別:

            
a_set = {1, 2, 3}#定義set數據類型,set是可迭代類型
b_iterator = iter(a_set)#得到set的迭代器
#Output: 1
print(next(b_iterator))
#Output: 
            
              
print(type(a_set))
#Output: 
              
                
print(type(b_iterator))
              
            
          

從結果可以看出a_set是一個可迭代類型(set類型),b_iterator是一個迭代器(set_iterator),它們兩個是完全不一同的類型。

下面的自定義了一個迭代器:

            
class Series(object):
 def __init__(self, low, high):
  self.current = low
  self.high = high
 def __iter__(self):
  return self
 def __next__(self):
  if self.current > self.high:
   raise StopIteration
  else:
   self.current += 1
   return self.current - 1
n_list = Series(1,10) 
print(list(n_list))
          

從上面的代碼可以看出,__iter__返回了迭代器本身。__next__返回迭代器的下一個值,如果沒有下一個返回值那么會拋出StopIteration異常。如果沒有在合適的位置拋出StopIteration異常結束迭代,那么在某些循環語句中(例如:for loop),將會形成死循環,所以在__next__中必需要在合適位置添加退出語句(拋出StopIterator異常)。

2.Itertools 模塊

Itertools是Python的內置模塊,其中包含了能夠創建迭代器的函數。簡而言之,它提供了許多能夠與迭代器交互的方法。

下面是我們使用Itertools模塊中count函數的案例:

            
from itertools import count
sequence = count(start=0, step=1)
while(next(sequence) <= 10):
 print(next(sequence),end=" ")
          

輸出:

Itertools中的cycle函數可以創建無限迭代器,例如:

            
from itertools import cycle
dessert = cycle(['Icecream','Cake'])
count = 0
while(count != 4):
 print('Q. What do we have for dessert? A: ' + next(dessert))
 count+=1
          

輸出:

Q. What do we have for dessert? A: Icecream
Q. What do we have for dessert? A: Cake
Q. What do we have for dessert? A: Icecream
Q. What do we have for dessert? A: Cake

關于更多itertools模塊的使用, 可以參見python文檔 。

3.生成器(Generator)

生成器可以說是迭代器的親兄弟,生成器允許我們像上面那樣寫迭代器而不用額外定義__iter__()和__next__()方法。

看下面的案例:

            
def series_generator(low, high):
 while low <= high:
  yield low
  low += 1
n_list = []
for num in series_generator(1,10):
 n_list.append(num)
print(n_list)
          

如果一個方法中出現了yield關鍵字,那么該方法就是一個生成器。生成器中沒有return語句,函數的返回值實際上是一個generator。當循環開始執行到yield語句后,low的值會被擴展到要返回的generator中。當下一次循環到達yield語句時,generator會從上一次停止的地方恢復執行,并且將最新的low值添加到generator中。循環一直運行下去,直到low>high退出循環。

生成器支持延遲計算,只有當去取生成器中的值時才會計算。

例如:

            
def test():
 print("進入test函數")
 for i in range(2):
  print("yield number ",i)
  yield i
if "__main__" == __name__:
 print("開始調用test")
 res = test()
 print("結束調用test")
 next(res)
 next(res)
          

輸出:

開始調用test
結束調用test
第一次next(res)
進入test函數
yield number 0
第二次next(res)
yield number? 1

從結果可以看出,只有使用next調用迭代器時(使用for,while循環也可以),才會去執行迭代器函數中的內容。

python中生成器可以分為生成器函數和生成器表達式,生成器函數和生成器表達式是兩種不同的類型。

生成器函數是一個函數體中有yield關鍵字的,我們上面定義的test就是生成器函數。

生成器表達式的使用比較受限制,一個生成器表達式返回一個生成器。下面是一個使用生成器表達式的案例:

            
squares = (x * x for x in range(1,10))
print(type(squares))
print(list(squares))
          

輸出:


[1, 4, 9, 16, 25, 36, 49, 64, 81]

生成器的效率是非常高的,生成器可以更好的利用內存和CPU的使用效率,并且通常生成器的代碼都比較少,這使用生成器的代碼非常好容易理解。應此應該盡量多的在代碼中使用生成器

參考文檔

https://www.datacamp.com/community/tutorials/python-iterator-tutorial

總結

以上所述是小編給大家介紹的Python中的迭代器,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩精品在线一区 | 日韩性freexxxx在线观看 | 久草资源 | 爱爱视频在线观看 | 欧美视频网站免费看 | 男女配种超爽免费视频 | 日日日日干 | 小明看看在线视频 | 福利片在线| theporn国产在线精品 | 亚洲精品免费观看 | 色多多视频导航 | www午夜| 成人亚洲国产精品久久 | 精品久久国产 | 国精品午夜dy8888狼人 | 九九九久久国产免费 | 97日日摸天天碰免费视频 | 一级视频在线免费观看 | 国产精品乱码一区二三区小蝌蚪 | 欧美激情高清 | 婷婷尹人香蕉久久天堂 | 国产精品视频在线播放 | 色妞色视频一区二区三区四区 | 国产高清视频在线 | 日韩在线看片 | 九九热国产视频 | 乱码中文字幕人成在线 | 久久久久久久久久综合情日本 | 人人天天操 | 国产99999| 天天干天天爱天天操 | 97天堂| 日韩美女一区二区三区 | 久久久久久免费一区二区三区 | 青娱乐精品视频在线观看 | 国偷自产av一区二区三区 | 亚洲免费小视频 | www久久av | 久久久久无码国产精品一区 | 国产午夜亚洲精品国产 |