为什么 return self 在自定义迭代器中?
Why return self in a custom iterator?
我是 python 的新手(不是编码),我正在使用该语言使用迭代器。当我们构建迭代器时,我了解如何它们工作以及如何构建自定义迭代器,但我不理解为什么我们return self
在 __iter__(self)
函数中。
这是一个例子:
class Cube_Pow:
def __init__(self, max = 0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
cube = self.n ** 3
self.n += 1
return cube
else:
raise StopIteration
如果我执行以下操作:
cubes = Cube_Pow(10)
cube_iter = iter(cubes)
print(cube_iter) #output: <__main__.Cube_Pow object at 0x1084e8cd0>
我的问题是类型不应该是某个迭代器(例如列表有 list_iterator
)。是否必须扩展其他一些 class?
__iter__
使某些东西可迭代。它 return 是一个迭代器,但它不是迭代器本身。有两种迭代方法。一个对象可以是它自己的迭代器
>>> fileobj = open("test.txt")
>>> iter(fileobj) == fileobj
True
>>> print(type(fileobj), type(iter(fileobj)))
<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>
或者它可以return一个不同的对象来处理迭代
>>> listobj = []
>>> iter(listobj) == listobj
False
>>> print(type(listobj), type(iter(listobj)))
<class 'list'> <class 'list_iterator'>
你returnself
如果你想让对象的所有迭代器迭代同一个东西。这就是您想要的一个在幕后进行顺序访问的文件。但是对于列表,您希望每个迭代器再次从顶部开始,因此每次都会创建一个新的 list_iterator
对象来做到这一点。
迭代器通常 returns self
所以再次调用 iter()
是安全的(直接或间接由于 for
循环或列表理解或其他东西)。
尽管您的情况可能有特定原因,但重置自身 (self.n = 0
) 的迭代器并不是您想要的。一旦你得到一个迭代器,再次调用 iter()
不应该改变它。
我是 python 的新手(不是编码),我正在使用该语言使用迭代器。当我们构建迭代器时,我了解如何它们工作以及如何构建自定义迭代器,但我不理解为什么我们return self
在 __iter__(self)
函数中。
这是一个例子:
class Cube_Pow:
def __init__(self, max = 0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
cube = self.n ** 3
self.n += 1
return cube
else:
raise StopIteration
如果我执行以下操作:
cubes = Cube_Pow(10)
cube_iter = iter(cubes)
print(cube_iter) #output: <__main__.Cube_Pow object at 0x1084e8cd0>
我的问题是类型不应该是某个迭代器(例如列表有 list_iterator
)。是否必须扩展其他一些 class?
__iter__
使某些东西可迭代。它 return 是一个迭代器,但它不是迭代器本身。有两种迭代方法。一个对象可以是它自己的迭代器
>>> fileobj = open("test.txt")
>>> iter(fileobj) == fileobj
True
>>> print(type(fileobj), type(iter(fileobj)))
<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>
或者它可以return一个不同的对象来处理迭代
>>> listobj = []
>>> iter(listobj) == listobj
False
>>> print(type(listobj), type(iter(listobj)))
<class 'list'> <class 'list_iterator'>
你returnself
如果你想让对象的所有迭代器迭代同一个东西。这就是您想要的一个在幕后进行顺序访问的文件。但是对于列表,您希望每个迭代器再次从顶部开始,因此每次都会创建一个新的 list_iterator
对象来做到这一点。
迭代器通常 returns self
所以再次调用 iter()
是安全的(直接或间接由于 for
循环或列表理解或其他东西)。
尽管您的情况可能有特定原因,但重置自身 (self.n = 0
) 的迭代器并不是您想要的。一旦你得到一个迭代器,再次调用 iter()
不应该改变它。