python里面的迭代、可迭代对象、迭代器

迭代(Iteration): 对一组序列进行遍历的过程本身就是迭代,

可迭代对象(Iterable):python中任意对象,只要能返回一个迭代器方法__iter__的对象,或者有下标索引__getitem__方法的对象就是一个可迭代对象。

迭代器(Iterator):python中任意对象,只要拥有__next__方法,就是一个迭代器。

想知道一个对象是否是可迭代对象,是否拥有迭代器,可以使用 collections 包下的 Iterable(可迭代对象)、Iterator(迭代器) 通过isinstance()方法来查看。

class MyList:
    """创建一个向空列表里面添加数据的类"""
    def __init__(self):
        """初始化,创建实例对象"""
        self.mylist = list()

    def add(self, num):
        """向列表里面添加数据"""
        self.mylist.append(num)


nums = MyList()
nums.add(1)
nums.add(2)
nums.add(3)
nums.add(4)for num in nums:
    print(num)

输出结果:

Traceback (most recent call last):
  File "D:/iteration.py", line 18, in <module>
    for num in nums:
TypeError: 'MyList' object is not iterable

为什么会出现这个错误呢?

因为Mylist对象不是一个可迭代对象

怎么让他成为一个可迭代对象呢?如下代码:

class MyList:
    """创建一个向空列表里面添加数据的类"""

    def __init__(self):
        """初始化,创建实例对象"""
        self.mylist = list()

    def add(self, num):
        """向列表里面添加数据"""
        self.mylist.append(num)

    def __iter__(self):
     """
pass

nums = MyList() nums.add(1) nums.add(2) nums.add(3) nums.add(4) for num in nums: print(num)

运行结果:

Traceback (most recent call last):
  File "D:/iteration.py", line 22, in <module>
    for num in nums:
TypeError: iter() returned non-iterator of type 'NoneType'

此时的错误提示为:iter()方法返回一个空类型,并且这个类型没有迭代器

也就是说,可迭代对象里面必须有一个__next__方法

如下代码:

class MyList:
    """创建一个向空列表里面添加数据的类"""

    def __init__(self):
        """初始化,创建实例对象"""
        self.mylist = list()
        self.current = 0

    def add(self, num):
        """向列表里面添加数据"""
        self.mylist.append(num)

    def __iter__(self):
        return self

    def __next__(self):
        # 记录上一个数据
        if self.current < len(self.mylist):
            last = self.mylist[self.current]
            self.current += 1
            return last
        else:
            # 抛出异常
            raise StopIteration


nums = MyList()
nums.add(1)
nums.add(2)
nums.add(3)
nums.add(4)

for num in nums:
    print(num)

运行结果:

1
2
3
4


Process finished with exit code 0

至此,该可迭代对象完成。

猜你喜欢

转载自www.cnblogs.com/zhirou/p/11972759.html