python 迭代器

本文介绍了Python中迭代器的基本概念及其实现方式。首先探讨了迭代器的关键行为——__next__方法,接着介绍了如何使用生成器简化迭代器的实现,并通过示例展示了如何手动创建迭代器类来支持__len__和__getitem__的方法。
  • 集合的迭代器(iterator)提供了一个关键的行为:它支持一个名为 __next__ 的特殊方法,如果集合有下一个元素,该方法返回该元素,否则产生一个 StopIteration 异常来表明没有下一个元素。
  • 幸运的是,很少需要直接实现迭代器类。我们的首选方法是使用生成器(generator)语法,它自动产生一个已生成值的迭代器。
  • python 也为实现 __len____getitem__ 的类提供了一个自动的迭代器。为了提供一个低级迭代器的例子,代码演示了这种迭代器类可用于支持 __len____getitem__ 的集合的处理。该类可被实例化为 SequenceIterator(data)。它通过保存在内部的数据序列引用来操作该序列以及当前的索引。每次调用 __next__ 时,索引递增,直到序列结束。
例1
class SequenceIterator:
    """An iterator for any of Python's sequence types."""

    def __init__(self, sequence):
        """Create an iterator for the given sequence."""
        self._seq = sequence        # keep a reference to the underlying data
        self._k = -1                # will increment to 0 on first call to next

    def __next__(self):
        """Return the next element, or else raise StopIteration error."""
        self._k += 1                        # advance to next index
        if self._k < len(self._seq):
            return self._seq[self._k]       # return the data element
        else:
            raise StopIteration()           # there are no more element

    def __iter__(self):
        """By convention, an iterator must return itself as an iterator"""
        return self


for i in SequenceIterator('123456'):
    print(i)

输出

1
2
3
4
5
6
例2
class Seq:
    def __init__(self, seq):
        self._seq = seq
        self._length = len(seq)

    def __len__(self):
        self._length

    def __getitem__(self, k):
        if k < self._length:
            return list(self._seq.values())[k]
        else:
            raise StopIteration()			# 需要在没有的时候抛出 StopIteration 否则无法结束			


dic = {1: 'a', 2: 'b', 4: 'c', 5: 'd'}

for i in Seq(dic):
    print(i)

输出

a
b
c
d

只要类支持 __len____getitem__ ,该类就自动支持迭代,既可以用 for 循环进行遍历

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值