python迭代器什么时候用_python迭代器与生成器用途是什么
python迭代器的用途:用next函數(shù)獲取下一個(gè)元素,只能向前取值,不會(huì)后退。python生成器的用途:動(dòng)態(tài)提供數(shù)據(jù),調(diào)用return生成一個(gè)StopIteration異常,通知next(it)函數(shù)不再提供數(shù)據(jù)。
一、迭代器
什么是迭代器
迭代器是指用iter(可迭代對(duì)象)函數(shù)返回的對(duì)象(實(shí)例)
迭代器可以用next(it)函數(shù)獲取可迭代對(duì)象的數(shù)據(jù)
迭代器函數(shù):
iter(iterable)從可迭代對(duì)象中返回一個(gè)迭代器,iterable必須是一個(gè)能提供迭代器的可迭代對(duì)象
next(iterator)從迭代器iterator中獲取下一條記錄,如果無(wú)法獲取下一條記錄,則觸發(fā)StopIteration異常
說(shuō)明:
迭代器是訪問(wèn)可迭代對(duì)象的一種方式
迭代器只能向前取值,不會(huì)后退
用iter函數(shù)可以返回一個(gè)可迭代對(duì)象的迭代器
示例:L?=?[2,3,4]或者?L?=?range(2,5)
it?=?iter(L)#使用iter函數(shù)使it綁定一個(gè)迭代器對(duì)象
next(it)#返回2
next(it)#返回3
next(it)#返回4
next(it)#觸發(fā)StopIteration異常
迭代器的用途:
迭代器對(duì)象能用next函數(shù)獲取下一個(gè)元素
示例:#此示例示意用迭代器來(lái)訪問(wèn)可迭代對(duì)象
#用for語(yǔ)句訪問(wèn)可迭代對(duì)象L
L?=?[2,3,5,7]
for?x?in?L:
print(x)
#用while語(yǔ)句訪問(wèn)可迭代對(duì)象L
it?=?iter(L)
while?True:
try:
x?=?next(L)
print(x)
except?StopIteration:
print('終止迭代,迭代器不能提供任何數(shù)據(jù)')
break
二、生成器Generator(python2.5之后)
什么是生成器:
生成器是能夠動(dòng)態(tài)提供數(shù)據(jù)的對(duì)象(不是一次性生成從而不占據(jù)內(nèi)存空間),生成器對(duì)象也是可迭代對(duì)象(實(shí)例)
生成器有兩種:
生成器函數(shù)
生成器表達(dá)式
生成器函數(shù)定義:
含有yield語(yǔ)句的函數(shù)是生成器函數(shù),此函數(shù)被調(diào)用時(shí)將返回一個(gè)生成器對(duì)象
yield語(yǔ)句
語(yǔ)法:yield 表達(dá)式
說(shuō)明:yield用于def函數(shù)中,目的是將此函數(shù)作為生成器函數(shù)使用
yield用來(lái)生成數(shù)據(jù),供迭代器next(it)函數(shù)使用
實(shí)例:#此示例示意生成器函數(shù)的定義及示意
def?myyield():
'''此函數(shù)為生成器函數(shù)'''
yield?2#生成2
yield?3#生成3
yield?5#生成5
#用for語(yǔ)句訪問(wèn)myyield函數(shù)
for?x?in?myyield():
print(x)
#用迭代器訪問(wèn)
gen?=?myyield()
it?=?iter(gen)
next(it)
生成器函數(shù)說(shuō)明:
(1)生成器函數(shù)的調(diào)用將返回一個(gè)生成器對(duì)象,生成器對(duì)象是一個(gè)可迭代對(duì)象
(2)在生成器函數(shù)調(diào)用return時(shí)會(huì)生成一個(gè)StopIteration異常來(lái)通知next(it)函數(shù)不再能提供數(shù)據(jù)
示例:#寫(xiě)一個(gè)myinteger(n)函數(shù)
def?myinteger(n):
for?x?in?range(n):
yield?x
#for循環(huán)訪問(wèn)生成器
for?x?in?myinteger(int(input('請(qǐng)輸入整數(shù):')))
print(x)
#用迭代器訪問(wèn)
it?=?iter(myinteger(10))
while?True:
print(next(it))#到10時(shí)發(fā)生StopIteration錯(cuò)誤
生成器表達(dá)式:
語(yǔ)法:(表達(dá)式 for 變量 in 可迭代對(duì)象 [if 真值表達(dá)式])
作用:用推導(dǎo)式的形式生成一個(gè)新的生成器
示例:gen?=?(x**2?for?x?in?range(1,4))#并沒(méi)有生成數(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)式和生成表達(dá)式的區(qū)別:
生成器是動(dòng)態(tài)生成的,現(xiàn)用現(xiàn)生成,列表表達(dá)式是靜態(tài)的。
示例:
L?=?[1,2,3,4]
gen?=?(x?for?x?in?L)#gen綁定生成器
lst?=?[x?for?x?in?L]#lst綁定列表
L[1]?=?222#改變?cè)斜淼牡诙€(gè)元素
for?x?in?lst:
print(x)#1?2?3?4不變
for?x?in?gen:
print(x)#1?222?3?4?,第二個(gè)數(shù)是222
迭代工具函數(shù):
迭代工具函數(shù)的作用是生成一個(gè)個(gè)性化的可迭代對(duì)象
函數(shù):
zip( iter1 [,iter2,iter3,…])返回一個(gè)zip對(duì)象,此對(duì)象用于生成一個(gè)元組,此元組的個(gè)數(shù)由最小的可迭代對(duì)象決定
enumerate(iterable[,start])生成帶索引的枚舉類(lèi)型,返回迭代類(lèi)型為索引-值隊(duì)(index,value)對(duì),默認(rèn)索引從零開(kāi)始,也可以使用start綁定
示例1:numbers?=?[10086,10000,10010,95588]
names?=?['中國(guó)移動(dòng)','中國(guó)電信','中國(guó)聯(lián)通']
for?x?in?zip(numbers,names):
print(x)
#生成元組:
#(10086,'中國(guó)移動(dòng)')
#(10000,'中國(guó)電信')
#(10010,'中國(guó)移動(dòng)')
#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為三個(gè)對(duì)象組成的一個(gè)元組
示例2:#實(shí)現(xiàn)機(jī)制
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會(huì)使索引從start開(kāi)始
#(1000,'s')?(101,'t')..返回元組的索引-值對(duì),默認(rèn)索引從0開(kāi)始
#index?=?element?=?x
#print('索引是',index,'對(duì)應(yīng)的元素是',element)推薦課程:python基礎(chǔ)語(yǔ)法全講解視頻(馬哥教育2014版)
總結(jié)
以上是生活随笔為你收集整理的python迭代器什么时候用_python迭代器与生成器用途是什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mac开发,实现移动鼠标到指定区域显示提
- 下一篇: 重庆市江津区行政边界地图JSON文件精确