您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)python迭代器與生成器作用是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
python迭代器的用途:用next函數(shù)獲取下一個元素,只能向前取值,不會后退。python生成器的用途:動態(tài)提供數(shù)據(jù),調(diào)用return生成一個StopIteration異常,通知next(it)函數(shù)不再提供數(shù)據(jù)。
一、迭代器
什么是迭代器
迭代器是指用iter(可迭代對象)函數(shù)返回的對象(實例)
迭代器可以用next(it)函數(shù)獲取可迭代對象的數(shù)據(jù)
迭代器函數(shù):
iter(iterable)從可迭代對象中返回一個迭代器,iterable必須是一個能提供迭代器的可迭代對象
next(iterator)從迭代器iterator中獲取下一條記錄,如果無法獲取下一條記錄,則觸發(fā)StopIteration異常
說明:
迭代器是訪問可迭代對象的一種方式
迭代器只能向前取值,不會后退
用iter函數(shù)可以返回一個可迭代對象的迭代器
示例:
L = [2,3,4]或者 L = range(2,5) it = iter(L)#使用iter函數(shù)使it綁定一個迭代器對象 next(it)#返回2 next(it)#返回3 next(it)#返回4 next(it)#觸發(fā)StopIteration異常
迭代器的用途:
迭代器對象能用next函數(shù)獲取下一個元素
示例:
#此示例示意用迭代器來訪問可迭代對象 #用for語句訪問可迭代對象L L = [2,3,5,7] for x in L: print(x) #用while語句訪問可迭代對象L it = iter(L) while True: try: x = next(L) print(x) except StopIteration: print('終止迭代,迭代器不能提供任何數(shù)據(jù)') break
二、生成器Generator(python2.5之后)
什么是生成器:
生成器是能夠動態(tài)提供數(shù)據(jù)的對象(不是一次性生成從而不占據(jù)內(nèi)存空間),生成器對象也是可迭代對象(實例)
生成器有兩種:
生成器函數(shù)
生成器表達式
生成器函數(shù)定義:
含有yield語句的函數(shù)是生成器函數(shù),此函數(shù)被調(diào)用時將返回一個生成器對象
yield語句
語法:yield 表達式
說明:yield用于def函數(shù)中,目的是將此函數(shù)作為生成器函數(shù)使用
yield用來生成數(shù)據(jù),供迭代器next(it)函數(shù)使用
實例:
#此示例示意生成器函數(shù)的定義及示意 def myyield(): '''此函數(shù)為生成器函數(shù)''' yield 2#生成2 yield 3#生成3 yield 5#生成5 #用for語句訪問myyield函數(shù) for x in myyield(): print(x) #用迭代器訪問 gen = myyield() it = iter(gen) next(it)
生成器函數(shù)說明:
(1)生成器函數(shù)的調(diào)用將返回一個生成器對象,生成器對象是一個可迭代對象
(2)在生成器函數(shù)調(diào)用return時會生成一個StopIteration異常來通知next(it)函數(shù)不再能提供數(shù)據(jù)
示例:
#寫一個myinteger(n)函數(shù) def myinteger(n): for x in range(n): yield x #for循環(huán)訪問生成器 for x in myinteger(int(input('請輸入整數(shù):'))) print(x) #用迭代器訪問 it = iter(myinteger(10)) while True: print(next(it))#到10時發(fā)生StopIteration錯誤
生成器表達式:
語法:(表達式 for 變量 in 可迭代對象 [if 真值表達式])
作用:用推導(dǎo)式的形式生成一個新的生成器
示例:
gen = (x**2 for x in range(1,4))#并沒有生成數(shù)據(jù) #gen = [x**2 for x in range(1,4)]#先在內(nèi)存中生成數(shù)據(jù) it = iter(gen) next(it)#1 next(it)#4 next(it)#9 next(it)#StopIteration
列表推導(dǎo)式和生成表達式的區(qū)別:
生成器是動態(tài)生成的,現(xiàn)用現(xiàn)生成,列表表達式是靜態(tài)的。
示例:
L = [1,2,3,4] gen = (x for x in L)#gen綁定生成器 lst = [x for x in L]#lst綁定列表 L[1] = 222#改變原列表的第二個元素 for x in lst: print(x)#1 2 3 4不變 for x in gen: print(x)#1 222 3 4 ,第二個數(shù)是222
迭代工具函數(shù):
迭代工具函數(shù)的作用是生成一個個性化的可迭代對象
函數(shù):
zip( iter1 [,iter2,iter3,…])返回一個zip對象,此對象用于生成一個元組,此元組的個數(shù)由最小的可迭代對象決定
enumerate(iterable[,start])生成帶索引的枚舉類型,返回迭代類型為索引-值隊(index,value)對,默認(rèn)索引從零開始,也可以使用start綁定
示例1:
numbers = [10086,10000,10010,95588] names = ['中國移動','中國電信','中國聯(lián)通'] for x in zip(numbers,names): print(x) #生成元組: #(10086,'中國移動') #(10000,'中國電信') #(10010,'中國移動') #for n,a in zip(numbers,names): #print(n,a) #d = dict(zip(names,number))生成字典 #for x in zip(range(10),numbers,names): # print(x)x為三個對象組成的一個元組
示例2:
#實現(xiàn)機制 def myzip(iter1,iter2): it1 = iter(iter1) it2 = iter(iter2) while True: x = next(it1) y = next(it2) yield (x,y) for x in myzip(range(100),range(50)) #示例3: names = list('string') for x in enumerate(names,start = 100): print(x)#指定start會使索引從start開始 #(1000,'s') (101,'t')..返回元組的索引-值對,默認(rèn)索引從0開始 #index = element = x #print('索引是',index,'對應(yīng)的元素是',element)
關(guān)于python迭代器與生成器作用是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。