python中什么是迭代器,python生成器和迭代器的区别

  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]

  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为三个对象组成的一个元组

示例2:

  

#实现机制

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: