Python:提前__iter__行为

时间:2014-07-02 14:18:07

标签: python iterator

我有一个大小有限的字典类,我想让iter方法像这样工作:

如果值不是None,则生成。否则,跳过它。 你知道怎么实现吗?

class myclass(object):
    def __init__(self):
        self.data = {1:'a', 2:None, 3:'c'}

    def __iter__(self):
        return iter(self.data.values())

    def __next__(self): ## <== I THINK THIS IS A WRONG EXAMPLE
        if iter(self): ## BUT I DON"T KNOW HOW TO FIX IT
            return iter(self)

mc = myclass()
for i in mc:
    print(i)

2 个答案:

答案 0 :(得分:3)

如果您的__iter__方法直接返回迭代器,那么<​​em>不需要实现__next__;在这种情况下不会被查询(它是返回的迭代器的__next__方法,而不是使用它。)

返回生成器表达式:

class myclass(object):
    def __init__(self):
        self.data = {1:'a', 2:None, 3:'c'}

    def __iter__(self):
        return (v for v in self.data.values() if v is not None)

演示:

>>> class myclass(object):
...     def __init__(self):
...         self.data = {1:'a', 2:None, 3:'c'}
...     def __iter__(self):
...         return (v for v in self.data.values() if v is not None)
... 
>>> list(myclass())
['a', 'c']

如果您希望该类成为自己的迭代器,则必须从self返回__iter__;这意味着您需要跟踪__next__次呼叫之间的状态,以了解每次呼叫返回的值。对于您的用例,您很可能想要那样。

答案 1 :(得分:0)

创建一次性迭代器:

class myclass(object):
    def __init__(self):
        self.data = {1:'a', 2:None, 3:'c'}
        self.keys = self.data.keys()
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        index = self.index
        while 'searching for value':
            if index >= len(self.keys):
                raise StopIteration
            key = self.keys[index]
            value = self.data[key]
            index += 1
            if value is not None:
                self.index = index
                return value

如您所见,使用Martjin的答案要好得多。