迭代器与可迭代对象

# 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值