# for loop 中 即for i in iterable
# iterator:迭代器 拥有__next__()和__iter__()方法 迭代器由于拥有__iter__()方法,所以他也一定是可迭代对象
# iterable:可迭代对象 拥有__iter__()方法就是可迭代对象
my_list = [1, 2, 3]
it = iter(my_list)
for i in it:
print(i)
""" Iterator :迭代器类型的定义
# 1 类中定义了__iter__()和__next__()两个方法
# 2 __iter__()方法需要返回对象本身即self
# 3 __next__()方法,返回下一个数值,如果没有数据了,则需要抛出一个StopIteration的异常""
# 4 迭代器由于拥有了__iter__()所以他也是可迭代对象
"""
"""Iterable(可迭代对象):可以使用for循环遍历出所有元素的都可以称为可迭代对象,列表、元组、字符串、字典等都是可迭代对象,迭代器一定是可迭代对象,反之不一定成立,如字符串;
内部实现了__iter__方法的对象;
可迭代对象不一定实现__next__方法,它可以不遵循迭代器协议,至于为啥可有for循环,是因为for循环内部调用了他的__iter__方法,变成了迭代器,返回的结果是遵循了
迭代器协议的迭代器对象(自然就有了__next__方法)
迭代器协议:一个对象要想成为迭代器对象必须遵循的规则“对象内部同时实现了__iter__和__next__方法,执行__next__方法返回迭代器中的下一项,最后一个元素返回后再调用
raise一个StopIteration异常,结束迭代”
迭代器对象(Iterator):遵循迭代器协议规则的对象,迭代器必须实现__iter__方法和__next__方法,像文件句柄,本身就有__next__方法
"""
# case1 创建一个迭代器类型
# 满足迭代器的1,2,3的定义
class IT(object):
def __init__(self): # 初始化
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration() # 结束后会抛出stopieteration异常
return self.counter
"""迭代器对象"""
# case2 实例化一个迭代器对象
# 类名加括号,是要执行类中的__init__方法
obj1 = IT() # obj迭代器对象,也可被称为可迭代对象
# v1 = obj1.__next__() # 调用类中的__next__方法
# v2 = obj1.__next__()
# v3 = obj1.__next__()
# print(v1)
v1 = next(obj1) # next()方法是内置方法 相当于obj1.__next__()
print(v1)
obj2 = IT() # 再次创建一个迭代器对象
for item in obj2: # for循环内部 首先会执行迭代器对象的__iter__方法并获取返回值(自己本身self),一直反复执行next(迭代器对象)
print(item)
"""可迭代对象定义:一个类中含有__iter__方法且返回一个迭代器(生成器)对象,则我们称这个类对象为可迭代对象
可迭代对象可使用"""
# case3 可迭代对象
class Foo(object):
def __iter__(self):
return IT() # 一般与迭代器对象联合使用
obj3 = Foo() # 可迭代对象可for循环 首先会执行的__iter__功能,一直反复执行next
"""常见的数据类型如list,tuple,dir都是可迭代对象 可迭代对象的__iter__()返回的都是一个迭代器"""
# case4 常见数据类型
my_list1 = [1, 2]
print(dir(my_list1)) # 存在__iter__()没有__next__()说明是个可迭代对象
print(dir(my_list1.__iter__())) # 返回值 存在__iter__()和__next__()说明是个返回值是迭代器
# case5 单链表的例子
class NodeIter:
def __init__(self, node):
self.curr_node = node
def __next__(self):
if self.curr_node is None:
raise StopIteration
node, self.curr_node = self.curr_node, self.curr_node.next
return node
def __iter__(self):
return self
class Node:
def __init__(self, name):
self.name = name
self.next = None
def __iter__(self):
return NodeIter(self)
node1 = Node("node1")
node2 = Node("2")
node3 = Node("3")
node1.next = node2
node2.next = node3
# for in 循环会执行里面的__iter__方法 相当于 iter(node1) iter() 函数用来生成迭代器 很重要
for node in node1:
print(node.name)
迭代器与可迭代对象
最新推荐文章于 2024-05-13 14:54:22 发布