自定义迭代器
由于迭代器是一种类型,需要使用class关键字定义。迭代器需要实现next方法、iter方法以及函数初始化init方法
# -*- coding: utf-8 -*-
from collections.abc import Iterable
from collections.abc import Iterator
""" 反向遍历序列的迭代器"""
class Reverse_list:
# 定义初始化函数,接受一个参数;
def __init__(self, data):
self.data = data
self.index = len(data)
# 定义iter方法,那么它就是一个可迭代对象
def __iter__(self):
return self
# 定义next方法,那么它就是一个迭代器
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
# 新建一个列表,调用自定义的迭代器
listTest = [1, 2, 3, 4, 5]
rev = Reverse_list(listTest)
print(isinstance(rev, Iterable), isinstance(rev, Iterator))
for i in rev:
# for循环在遍历迭代器的时候,实际上同时调用了iter方法和next方法实现遍历。
print(i, end=" ")
# Output: True True 5 4 3 2 1
通过自定义迭代器的方式创建一个迭代器,实现了反向遍历的需求。
生成器实现迭代器
除去自定义迭代器,上一篇讲到关于生成器就是用于创建迭代器的,其形式类似于普通定义的函数,使用yield函数。相比较于自定义迭代器实现来说,生成器创建迭代器降低其复杂性。
# -*- coding: utf-8 -*-
from collections.abc import Iterable
from collections.abc import Iterator
# 使用生成器创建迭代器,只需要像定义普通函数一样,给定参数、写出逻辑、关键字yield;
def generator_Reverse_list(data):
for index in range(len(data) - 1, -1, -1):
# 比较自定义迭代器实现反向遍历的逻辑,显然生成器更简洁。
yield data[index]
rev = generator_Reverse_list([1, 2, 3, 4, 5])
print(isinstance(rev, Iterable), isinstance(rev, Iterator))
for i in rev:
print(i, end=" ")
# Output: True True 5 4 3 2 1
小结:
实现迭代器有两种方式,第一种就是直接自定义迭代器,第二种就是生成器实现迭代器。相比较而言,通过生成器实现迭代器的方式更简洁高效,值得提倡和推荐。
网友评论