【发布时间】:2018-12-31 12:45:38
【问题描述】:
有人可以向我解释__iter__() 和__next__() 函数如何处理索引吗?它们是基础0 还是基础1?
我一直在玩它,但我想知道 Python 在后端实际上做了什么。我尝试了下面的示例类:
>>> class my_class:
def __init__(self, *stuff):
self.__stuff = stuff
def __iter__(self):
self.__n = 0
return iter(self.__stuff)
def __next__(self):
if self.__n <= len(self.__stuff):
self.__n += 1
return self.__stuff(self.__n)
else:
raise StopIteration
>>> x = my_class(1, 2, 3, 4)
>>> for each in x:
print(each)
1
2
3
4
除非我弄错了,__next__() 使用的第一个 self.__n 值应该是 1,应该产生,这是:
>>> for each in x:
print(each)
2
3
4
我错过了什么?它怎么知道从self.__stuff[0]开始?
【问题讨论】:
-
这里有一些混淆。首先,您通常希望可迭代类型返回另一个专用迭代器类型的实例。所以,
iter([1,2,3])返回一个list_iterator对象。其次,您对__iter__的实现只是委托给self.__stuff,在这种情况下它始终是一个元组,因此您的__next__方法永远不会出现。最后,不要使用双下划线名称修饰,除非您想要 双下划线名称修饰。按照惯例,私有变量是单下划线。 -
抱歉,我应该提供更多背景信息。这是因为我正在处理一个项目,其中我的类有很多相互依赖的计算属性值,因此,我尝试使用大量封装。
标签: python list iterator iteration next