python迭代器
概念
迭代器是访问集合元素的一种方式
关于迭代器的使用
迭代器是一个可以记住遍历位置的对象,它可以从集合的第一个元素开始访问,知道所有元素都被访问结束,但它只能向前,不能后退
字符串,列表,元组对象都可用于创建迭代器
两个重要方法
-
iter() 创建迭代器对象
-
next() 将指针移动到下一个元素
list = [1,2,3] it = iter(list) print(next(it))
在访问第一个元素时,也要使用 next() 方法
遍历方法
for 循环遍历
list = [1,2,3]
it = iter(list)
for x in it:
print(x,end=',')
使用 next() 方法
import sys
list = [1,2,3]
it = iter(list)
while True :
try:
print( next(it) )
except StopIteration
sys.exit() # 退出程序
创建一个迭代器
要先了解关于 面向对象 相关知识
在把一个类作为迭代器使用时,需要在类中实现两个方法
__iter__(self)
和__next__(self)
关于这两个方法
__iter__(self)
方法返回一个特殊的迭代器对象,该对象实现了__next__(self)
方法并通过StopIteration
异常表示迭代的完成
__next__(self)
方法会返回下一个迭代器对象
class MyNumber:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumber()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
StopIteration
StopIteration
异常用于标识迭代器的完成,防止出现无限循环,通过捕获该异常,判断是否已经结束遍历
在创建迭代器时,我们可以在__next__(self)
方法中设置条件,触发StopIteration
异常来结束迭代
class MyNumber:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 10
x = self.a
self.a += 1
return x
else
raise StopIteration
myclass = MyNumber()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
生成器
在python中,使用了 yield 的函数被称为 生成器
和普通函数不同,生成器是一个返回迭代器的函数,只用于迭代器操作,本质上,生成器就是一个迭代器。
在调用生成器时,每次遇到 yield ,函数都会暂停执行,并保存当前所有的运行信息,返回 yield 的值,并在下一次执行 next() 方法时从当前位置继续执行
import sys
def function(n): #生成器函数
a,b,counter = 0,1,0
while True:
if counter<=10 :
return
yield a
a,b = b,a+b
counter += 1
f = function(10)
while True:
try:
print(next(f),end=" ")
except StopIteration
sys.exit()
0 1 1 2 3 5 8 13 21 34 55
以官方示例为例,在初始化完成后,在next() 执行时,执行到 yield ,方法暂停执行,并返回 a,当再一次调用时,方法从上一次执行到的 yield 处下一行继续执行,直到再次遇到 yield,并返回 a 的值。