迭代器
迭代是python访问集合中元素的一种方式,迭代器是一个可以记住遍历的位置的对象。
举例:
使用map()函数,将一个函数作用于一个序列中的所有元素,并返回一个迭代器——对迭代器可以再次转换成list tuple set等等等
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不能后退。
迭代器有两个基本的方法:iter() 和 next()。
s = "HQYJ"
print(type(s))
# iter() 方法 把序列转换成 迭代器
iter1 = iter(s)
print(type(iter1))
# next() 方法 获取迭代器的下一个元素 【只能往前不能后退】
try:
while True:
print(next(iter1))
except StopIteration:
print("迭代已结束")
list1 = [1, 2, 3, 4, 5]
it1 = iter(list1)
print(next(it1))
print(next(it1))
for i in it1:
print(i)
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。
- iter() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
- next() 方法会返回下一个迭代器对象。
# 创建一个返回数字的迭代器,起始值为10,逐步递增10
# 也就是说起始值是10,步长值为10
class MyNum:
def __iter__(self):
self.a = 10
return self
def __next__(self):
x = self.a
self.a += 10
return x
# 实例化对象
my_class = MyNum()
my_iter = iter(my_class)
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
限制迭代到100可以这样:
# 创建一个返回数字的迭代器,起始值为10,逐步递增10
# 也就是说起始值是10,步长值为10
class MyNum:
def __iter__(self):
self.a = 10
return self
def __next__(self):
if self.a <= 100:
x = self.a
self.a += 10
return x
else:
raise StopIteration("迭代已完成")
# 实例化对象
my_class = MyNum()
my_iter = iter(my_class)
try:
while True:
print(next(my_iter))
except Exception as e:
print(e)
生成器
在python中,使用了 yield 的函数就被称为——生成器。
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单的理解【生成器就是一个迭代器】。
每次使用yield语句生产一个值之后,函数都将暂停执行【内存释放出来】,等待再次唤醒。
yield语句和return语句的差别就在于yield语句返回的是可迭代对象,而return返回的是不可迭代对象。
每次调用生成器的next()方法或者使用for或while循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇见yield语句。
def creat1(n):
while n>0:
yield n
n -= 1
create_iter = creat1(5)
print(next(create_iter))
for i in create_iter:
print(i)