我有一个大小有限的字典类,我想让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)
答案 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的答案要好得多。