Python list() 方法原理,以及自己动手实现迭代类

Python list() 方法原理,以及自己动手实现迭代类,重点在于 __iter__和__next__方法

代码1:自己实现迭代类

import time
from collections import Iterable

class ClassMate(object):
    def __init__(self):
        self.names = list()

    def add(self, name):
        self.names.append(name)

    # 添加__iter__方法,实现对象支持迭代功能
    def __iter__(self):
        return ClassIterator(self)


class ClassIterator(object):

    def __init__(self, obj):
        self.obj = obj
        self.__c = 0
    def __iter__(self):
        pass

    def __next__(self):
        if self.__c<len(self.obj.names):
            data = self.obj.names[self.__c]
            self.__c+=1
            return data
        else:
            # exit(0)
            raise StopIteration  # 抛出该异常后for循环迭代自动停止

classmate = ClassMate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")

print("判断classmate对象是否可以迭代:", isinstance(classmate, Iterable))

for name  in classmate:
    print(name)
    time.sleep(0.2)
for name  in classmate:
    print(name)
    time.sleep(0.2)

代码2:自己实现改进的迭代类并测试list()方法使用:

import time
from collections import Iterable,Iterator

class ClassMate(object):
    def __init__(self):
        self.names = list()
        # self.__c = 0  将这句话移动到__iter__方法内,实现每次for循环迭代都初始化self.__c,否则fou循环只能使用一次

    def add(self, name):
        self.names.append(name)

    # 添加__iter__方法,实现对象支持迭代功能
    def __iter__(self):
        self.__c = 0
        # return ClassIterator(self)
        return self

    def __next__(self):
        if self.__c < len(self.names):
            data = self.names[self.__c]
            self.__c+=1
            return data
        else:
            # exit(0)
            raise StopIteration  # 抛出该异常后for循环迭代自动停止


# class ClassIterator(object):
#
#     def __init__(self, obj):
#         self.obj = obj
#         self.__c = 0
#     def __iter__(self):
#         pass
#
#     def __next__(self):
#         if self.__c<len(self.obj.names):
#             data = self.obj.names[self.__c]
#             self.__c+=1
#             return data
#         else:
#             # exit(0)
#             raise StopIteration  # 抛出该异常后for循环迭代自动停止

classmate = ClassMate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")

print("判断classmate对象是否可以迭代:", isinstance(classmate, Iterable))
classmate_iterator = iter(classmate)
print("判断classmate对象是否为迭代容器:", isinstance(classmate_iterator, Iterator))

for name  in classmate:
    print(name)
    time.sleep(0.5)
for name  in classmate:
    print(name)
    time.sleep(0.5)



"""
list()方法实际上是通过调用参数对象里的迭代器,通过一步一步的next(classmate),
完成从对象到列表的转换的。如下代码所示:classmate是自定义迭代类生成的一个对象,
可使用list()方法实现列表转换就是因为其是可迭代的。
"""
a = list(classmate)
print(a)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值