迭代器中魔法函数 __iter__运行原理,链式调用

本文深入解析了迭代器的概念,包括其如何不依赖索引访问数据,以及如何通过__iter__和__next__方法实现自定义迭代器。通过具体代码示例,展示了迭代器在Python中的实现方式和遍历过程。

迭代器:是一种不依赖索引的访问和获取数据的方式,能被for循环遍历。适合遍历数据量巨大甚至无须的序列。

1>>>任意一个可迭代对象,通过调用内置函数 itre(score),可以变成一个迭代器。

2>>>面向对象思想,通过__iter__和__next__两个魔术方法定义一个迭代器的类。

测试代码1:

t = (1, 1.1, "2", "a", "cd")  # 定义一个元组
it1 = iter(t)                 # 通过内置函数iter(score)将可迭代对象元组变成迭代器
for _ in range(len(t)):
    print(it1.__next__())     # 使用迭代器对象下的魔法方法遍历数据obj.__next__()

l = list(t)                   # 定义一个列表
it2 = iter(l)                # 通过内置函数iter(score)将可迭代对象列表变成迭代器
for _ in range(len(l)):
    print(next(it2))         # 使用Python解释器自带的迭代函next(obj)数遍历数据

s = set(l)                    # 定义一个集合
for item in s:
    print(item)              # for循环直接遍历数据

上面3个for遍历结果一致,输出如下:
>>> 1
>>> 1.1
>>> 2
>>> a
>>> bc

测试代码2:

class NumPow(object):     # 定义一个迭代器的类:生成1,2,3,4,5,...的平方
    value = 0

    def __iter__(self):   # 实现了方法__iter__的类实例是可迭代的
        return self       # 链式调用,不断返回"自身对象"同时被不断调用

    def __next__(self):         # 同时实现了方法__next__的类对象是迭代器
        if self.value > 10:        # 设置判断条件,防止无限性循环
            raise StopIteration
        self.value += 1
        return self.value ** 2   # 返回值的平方

if __name__ == '__main__':
    np = NumPow()               # 生成一个迭代器的类对象

    # for i in range(10):
    #     print(np.__next__())
    # for j in range(10):
    #     print(next(np))
    
    for i in np:  # 因为__iter__不断调用自身,对象可迭代的
        print(i)

测试代码3:如何理解__iter__函数返回自身对象

class CallMe(object): 

    def __init__(self):
        self.num = 0

    def call_self(self):   # 类中定义一个返回自己的方法
        self.num += 1
        return self        # 返回自己,自己就是一个对象,可继续调用自己的方法

if __name__ == '__main__':
    callMe = CallMe()

    print(callMe.num)                 >>> 0  起始值为0

    print(callMe)                          >>> <__main__.CallMe object at 0x0000000001E507B8>
    print(callMe.call_self().call_self())  >>> <__main__.CallMe object at 0x0000000001E507B8>
    """ 连续调用2次,返回的还是自身 """
    print(type(callMe.call_self()))        >>> <class '__main__.CallMe'>
    """ 打印类对象 """
    print(callMe.num)                 >>> 3  上面call_self()调用3次

迭代器必不可少的是__iter__()方法,该方法返回的是一个迭代对象,也就是当前的的对像。

Python的for循环就可以不断调用该迭代对象,通过__next__()方法,拿到循环的下一个值。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值