欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python中迭代器的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了Python中迭代器的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司成立與2013年,先為紅橋等服務建站,紅橋等地企業(yè),進行企業(yè)商務咨詢服務。為紅橋企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

先貼上一張Iterable、Iterator與Generator之間的關系圖:

Python中迭代器的示例分析 

1. Iterator VS Iterable

迭代器(Iterator)

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

可迭代對象(Iterable)

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

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

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

a_set = {1, 2, 3}#定義set數(shù)據(jù)類型,set是可迭代類型
b_iterator = iter(a_set)#得到set的迭代器
#Output: 1
print(next(b_iterator))
#Output: <class 'set'>
print(type(a_set))
#Output: <class 'set_iterator'>
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異常結束迭代,那么在某些循環(huán)語句中(例如:for loop),將會形成死循環(huán),所以在__next__中必需要在合適位置添加退出語句(拋出StopIterator異常)。

2.Itertools 模塊

Itertools是Python的內(nèi)置模塊,其中包含了能夠創(chuàng)建迭代器的函數(shù)。簡而言之,它提供了許多能夠與迭代器交互的方法。

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

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

輸出:

Itertools中的cycle函數(shù)可以創(chuàng)建無限迭代器,例如:

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)

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

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

例如:

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

輸出:

開始調(diào)用test
結束調(diào)用test
第一次next(res)
進入test函數(shù)
yield number 0
第二次next(res)
yield number  1

從結果可以看出,只有使用next調(diào)用迭代器時(使用for,while循環(huán)也可以),才會去執(zhí)行迭代器函數(shù)中的內(nèi)容。

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

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

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

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

輸出:

<class 'generator'>
[1, 4, 9, 16, 25, 36, 49, 64, 81]

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python中迭代器的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設計公司,關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道,更多相關知識等著你來學習!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網(wǎng)站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

當前標題:Python中迭代器的示例分析-創(chuàng)新互聯(lián)
鏈接URL:http://chinadenli.net/article46/cdjphg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、搜索引擎優(yōu)化、網(wǎng)站維護、品牌網(wǎng)站設計、做網(wǎng)站、App設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司