为我的自定义迭代器实现iteritems函数?

6 投票
1 回答
4545 浏览
提问于 2025-04-16 06:05

下面这个程序的目的是学习Python中的生成器和迭代器的实现,以便理解Python的魔法方法。

我在实现iteritems()这个函数时遇到了困难。同时,我也想知道我是不是在正确的方向上,或者在理解Python的魔法方法时是不是有概念上的错误。

import random

class Random(object):
    """ generate randomised int of specified length --> [r1, r2, r3....] """

    def __init__(self, length = 1, rand_range = 100):
        self.index = 0
        self.generated_range = []
        self.length = length if str(length).isdigit() else 1
        self.rand_range = rand_range if str(rand_range).isdigit() else 100

    def __iter__(self): return self

    def next(self):
        if self.index < self.length:
            item = random.randrange(0, self.rand_range)
            self.generated_range.append(item)
            self.index += 1
            return item
        raise StopIteration

    def __eq__(self, obj):
        if self.length == obj.length and self.rand_range == obj.rand_range:
            return True
        return False

    def __len__(self):
        return self.length

    def __contains__(self, item):
        if not self.index == self.length:
            while self.next(): continue
        if item in self.generated_range:
            return True
        return False

    def __getitem__(self, key):
        if key in self.generated_range:
            return key * 100
        raise KeyError

    def __setitem__(self, key, value):
        raise NotImplemented

    def __delitem__(self, key):
        raise NotImplemented

    def iteritems(self):
        if not self.index == self.length:
            while self.next(): continue
        for item in self.generated_range:
            yield item

if __name__ == '__main__':
    r1 = Random(10)
    print [ r for r in r1]
    print 10 in r1
    r2 = Random(20)
    print r2.iteritems()

CodePAD链接

1 个回答

4

iteritems 是用来返回字典中 (键, 值) 对的一个序列,所以我觉得它不太适合你的类。如果你创建了一个 UserDict 的子类,那可能就有必要去重写它。

如果你确实要重写 iteritems,应该通过生成 (键, 值) 对来实现。

不太好的重写示例:

def iteritems(self):
    return iter([(x[0], x) for x in "alpha bravo charlie".split()])

撰写回答