Python中的迭代器是Python最常用的功能之一,是在Python中访问集合元素的一种方式。
迭代器(Iterator)是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。
迭代器只能往前而不可以后退。
迭代器中有两个基本的方法:iter()和next()。
在Python中,字符串、列表或元组对象都可以用于创建迭代器:
迭代器对象也可以使用常规的for语句进行遍历:
也可以在循环中使用next()遍历迭代器对象:
创建一个类迭代器:
如果要把一个类作为一个迭代器使用,需要在类中实现两个方法__iter__()与__next__()。
__iter__():返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法并通过StopIteration异常来标识迭代的完成。
__next__():返回下一个迭代器对象。
创建一个返回数字的类迭代器,初始值为1,逐步递增1.
class Number():
def __iter__(self):
self.a=1
return self
def __next__(self):
x=self.a
self.a+=1
return x
number=Number()
it=iter(number)
print(type(it))
for _ in range(7):
print(next(it))
StopIteration:
StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()中可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。
class Number():
def __iter__(self):
self.a=1
return self
def __next__(self):
if self.a<=20:
x=self.a
self.a+=1
return x
else:
raise StopIteration
number=Number()
it=iter(number)
print(type(it))
while True:
try:
print(next(it))
except StopIteration as e:
print(e)
print('End')
break
生成器:
在Python中,使用yield的函数被称为生成器(Generator)。
与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作。
在调用生成器函数运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
def Yield_test():
print('Starting.......')
while True:
ret=yield 'Test'
print(f'Return : {ret}')
g=Yield_test()
print(next(g))
print('='*20)
print(next(g))
print(type(g))
# send()函数可以发送一个参数给生成器
print(g.send(17))
使用yield实现斐波那契数列:
def fibonacci(n):
a,b,counter=0,1,0
while True:
if counter<=n:
yield a
a=b
b=a+b
counter+=1
else:
return None
fb=fibonacci(7)
while True:
try:
print(next(fb))
except StopIteration as e:
print(e)
break
Reference:Python3 迭代器与生成器 | 菜鸟教程