python中什么是迭代器,python生成器和迭代器的区别
python迭代器的用途:使用next函数获取下一个元素,只能向前取,不能向后取。python生成器的用途:动态提供数据,调用return生成StopIteration异常,通知next(it)函数不再提供数据。
一、迭代器
什么是迭代器
Iterator是指iter(迭代对象)函数返回的对象(实例)。
迭代器可以使用next(it)函数来获取可迭代对象的数据。
迭代器函数:
Iter(iterable)从迭代器返回迭代器,iterable必须是迭代器。
Next(迭代器)从迭代器中获取下一条记录。如果不能获得下一条记录,将触发StopIteration异常。
说明:
迭代器是访问可迭代对象的一种方式。
迭代器只能向前取值,不能向后取值。
Iter函数可以用来返回一个iterable对象的迭代器。
示例:
L=[2,3,4]或L=range(2,5)
It=iter(L)#使用iter函数将其绑定到迭代器对象。
Next(it)#返回2
Next(it)#返回3
Next(it)#返回4
Next(it)#触发StopIteration异常的迭代器的用途:
迭代器对象可以用next函数获取下一个元素。
示例:
#这个例子说明了如何使用迭代器来访问可迭代对象。
#用for语句访问可迭代对象L
L=[2,3,5,7]
forxinL:
打印(x)
#使用while语句访问可迭代对象l。
it=iter(L)
whileTrue:
尝试:
x=下一个(L)
打印(x)
exceptStopIteration:
Print(终止迭代,迭代器不能提供任何数据)
打破二、生成器Generator(python2.5之后)
什么是生成器:
生成器是一个可以动态提供数据的对象(不是一次生成,这样就不占用内存空间),生成器对象也是一个迭代对象(实例)。
有两种发电机:
信号发生器
生成器表达式
发电机功能定义:
包含yield语句的函数是一个生成器函数,调用时将返回一个生成器对象。
收益表
语法:yield表达式
注意:yield用于def函数中,以将该函数用作生成器函数。
Yield用于为iterator next(it)函数生成数据。
示例:
#此示例说明了生成器函数的定义和说明。
defmyyield():
此函数是一个生成器函数
Yield2#生成2
Yield3#生成3
Yield5#生成5
#使用for语句访问myyield函数
forxinmyyield():
打印(x)
#用迭代器访问
gen=myyield()
it=iter(gen)
下一个是生成器函数说明:
(1)生成器函数的调用会返回一个生成器对象,这个对象是一个迭代对象。
(2)生成器函数调用return时,会生成一个StopIteratio。
n异常来通知next(it)函数不再能提供数据
示例:
#写一个myinteger(n)函数生成器表达式:defmyinteger(n):
forxinrange(n):
yieldx
#for循环访问生成器
forxinmyinteger(int(input('请输入整数:')))
print(x)
#用迭代器访问
it=iter(myinteger(10))
whileTrue:
print(next(it))#到10时发生StopIteration错误
语法:(表达式 for 变量 in 可迭代对象 [if 真值表达式])
作用:用推导式的形式生成一个新的生成器
示例:
gen=(x**2forxinrange(1,4))#并没有生成数据列表推导式和生成表达式的区别:#gen=[x**2forxinrange(1,4)]#先在内存中生成数据
it=iter(gen)
next(it)#1
next(it)#4
next(it)#9
next(it)#StopIteration
生成器是动态生成的,现用现生成,列表表达式是静态的。
示例:
L=[1,2,3,4]迭代工具函数:gen=(xforxinL)#gen绑定生成器
lst=[xforxinL]#lst绑定列表
L[1]=222#改变原列表的第二个元素
forxinlst:
print(x)#1234不变
forxingen:
print(x)#122234,第二个数是222
迭代工具函数的作用是生成一个个性化的可迭代对象
函数:
zip( iter1 [,iter2,iter3,…])返回一个zip对象,此对象用于生成一个元组,此元组的个数由最小的可迭代对象决定
enumerate(iterable[,start])生成带索引的枚举类型,返回迭代类型为索引-值队(index,value)对,默认索引从零开始,也可以使用start绑定
示例1:
numbers=[10086,10000,10010,95588]示例2:names=['中国移动','中国电信','中国联通']
forxinzip(numbers,names):
print(x)
#生成元组:
#(10086,'中国移动')
#(10000,'中国电信')
#(10010,'中国移动')
#forn,ainzip(numbers,names):
#print(n,a)
#d=dict(zip(names,number))生成字典
#forxinzip(range(10),numbers,names):
#print(x)x为三个对象组成的一个元组
#实现机制defmyzip(iter1,iter2):
it1=iter(iter1)
it2=iter(iter2)
whileTrue:
x=next(it1)
y=next(it2)
yield(x,y)
forxinmyzip(range(100),range(50))
#示例3:
names=list('string')
forxinenumerate(names,start=100):
print(x)#指定start会使索引从start开始
#(1000,'s')(101,'t')..返回元组的索引-值对,默认索引从0开始
#index=element=x
#print('索引是',index,'对应的元素是',element)
推荐课程:python基础语法全讲解视频(马哥教育2014版)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。