当前位置: 首页 > 图灵资讯 > 行业资讯> python迭代器与生成器用途是什么

python迭代器与生成器用途是什么

来源:图灵python
时间: 2025-01-22 15:30:11

python迭代器的用途:用next函数获取下一个元素,只能向前取值,不会后退。python生成器的用途:动态提供数据,调用return生成stopiteration异常,通知nexthon(it)函数不再提供数据。

一、迭代器

迭代器是什么?

迭代器是指使用iter(可迭代对象)函数返回的对象(实例)

nexttt可用于迭代器(it)可迭代对象的数据获取函数

迭代函数:

iter(iterable)从可迭代对象中返回迭代器,iterable必须是可迭代对象,可以提供迭代器

next(iterator)从迭代器iterator中获取下一个记录,如果不能获得下一个记录,则触发Stopiteration异常

说明:

迭代器是访问可迭代对象的一种方式

迭代器只能向前取值,不会后退

一个可迭代对象的迭代器可以通过iter函数返回

示例:

L=[2,3,4]或L=range(2,5)
it=iter(L)#使用iter函数使it绑定一个迭代对象
next(it)#返回2
next(it)#返回3
next(it)#返回4
next(it)#触发Stopiteration异常

迭代器的用途:

迭代器对象可以通过next函数获得下一个元素

示例:

#这个示例表示使用迭代器访问可迭代对象
#用for语句访问可迭代对象LL
L=[2,3,5,7]
forxinL:
print(x)
#用while语句访问可迭代对象LL
it=iter(L)
whileTrue:
try:
x=next(L)
print(x)
exceptStopIteration:
print('迭代器无法提供任何数据')
break

二、生成器Generator(python2).5之后)

什么是生成器:

生成器是能够动态提供数据的对象(不是一次性生成,不占用内存空间),生成器对象也是可迭代对象(实例)

有两种生成器:

生成器函数

生成器表达式

生成器函数定义:

包含yield语句的函数是生成器函数,当该函数被调用时,它将返回到生成器对象

yield语句

语法:yield 表达式

说明:def函数中使用yield的目的是使用此函数作为生成器函数

yield用于生成迭代器nexttt的数据(it)函数使用

实例:

#本示例示意了生成器函数的定义和示意
defmyyield():
'''该函数为生成器函数'''
yield2#生成2#
yield3#生成3#
yield5#生成5
#用for语句访问myield函数
forxinmyyield():
print(x)
#访问迭代器
gen=myyield()
it=iter(gen)
next(it)

生成器函数说明:

(1)生成器函数的调用将返回生成器对象,生成器对象是可迭代对象

(2)生成器函数调用return时,会产生stopiteration异常通知nextion(it)函数不再能提供数据

示例:

#写myinteger(n)函数
defmyinteger(n):
forxinrange(n):
yieldx
#循环访问生成器
forxinmyinteger(int(input('请输入整数,')))
print(x)
#访问迭代器
it=iter(myinteger(10))
whileTrue:
print(next(it))#Stopiteration错误发生在10点

生成器表达式:

语法:(表达式 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)#第二个数字是2222234

迭代工具函数:

迭代工具函数的作用是生成个性化的可迭代对象

函数:

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版)