2024-09-28 01:23:08 发布
网友
如果我理解正确,我们在Python中有:
__iter__()
__next__()
yield
问题:上述类别是否总是/从不可消费
我所说的消耗品,是指迭代它们“破坏”了iterable;比如zip()(耗材)和range()(非耗材)
消耗所有迭代器;您可能不这么认为的原因是,当您将iterable与以下内容一起使用时
for x in [1,2,3]:
for循环正在幕后为您创建一个新的迭代器。事实上,list不是迭代器iter([1,2,3])返回类型为list_iterator的内容,而不是列表本身
for
list
iter([1,2,3])
list_iterator
关于您在评论中链接到的示例,而不是
class PowTwo: def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration
它的副作用是在返回迭代器时修改迭代器,我会这样做
class PowTwoIterator: def __init__(self, max=0): self.max = max self._restart() def _restart(self): self._n = 0 def __iter__(self): return self def __next__(self): if self._n <= self.max: result = 2 ** self._n self._n += 1 return result else: raise StopIteration
现在,修改对象状态的唯一方法是显式修改(即使这样做也不应轻率,因为_n和_restart都被标记为不属于公共接口)
_n
_restart
名称的更改提醒您,这首先是一个迭代器,而不是一个可以从中提供独立迭代器的iterable
消耗所有迭代器;您可能不这么认为的原因是,当您将iterable与以下内容一起使用时
for
循环正在幕后为您创建一个新的迭代器。事实上,list
不是迭代器iter([1,2,3])
返回类型为list_iterator
的内容,而不是列表本身关于您在评论中链接到的示例,而不是
它的副作用是在返回迭代器时修改迭代器,我会这样做
现在,修改对象状态的唯一方法是显式修改(即使这样做也不应轻率,因为
_n
和_restart
都被标记为不属于公共接口)名称的更改提醒您,这首先是一个迭代器,而不是一个可以从中提供独立迭代器的iterable
相关问题 更多 >
编程相关推荐