鉴于 range
对象已可订阅,为什么 itertools.repeat
对象不可订阅?
In [10]: range(3, 10)[3]
Out[10]: 6
In [11]: import itertools as it
In [12]: it.repeat(5)[3]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-1ef74480e0a7> in <module>()
----> 1 it.repeat(5)[3]
TypeError: 'itertools.repeat' object is not subscriptable
请注意,range 对象和 itertools.repeat 对象是 Python 3 的一部分。
我更喜欢:
class repeat_(itertools.repeat):
def __init__(self, object_, times=None):
super().__init__(object_, times)
self.object_ = object_
self.times = times
def __reversed__(self):
return self
def __getitem__(self, key):
return self.object_
def __contains__(self, key):
return key == self.object_
def __len__(self):
if self.times is None:
raise ValueError
return self.times
最佳答案
repeat
只是一遍又一遍地产生相同的对象。我不太确定下标实际上会为您做什么...您也可以调用 next(repeat_object)
。也许您正在考虑cycle
(就像我最初阅读您的问题时所做的那样)?
itertools 的神奇之处在于它尝试尽可能地延迟操作。鉴于此,如果将生成器表达式传递给 itertools.cycle,您预计会发生什么? cycle
无法知道您传递的对象的长度,除非将整个对象转换为元组并进行查询。这样做可能会在许多其他地方破坏 API(现在,当您为重复对象添加下标时,您会消耗可迭代对象),或者会通过不必要的 itertools.tee
占用更多的中间存储空间 - - 这是 itertools 试图避免的。正如目前实现的那样,在一个巨大的生成器表达式上循环,您不能希望将其保存在内存中(只要您实际上不迭代所有元素),但这不会如果您尝试在大索引处对其进行下标,则情况并非如此。
最后,顾名思义,itertools 是一个用于创建可迭代对象的库。因此,没有理由期望这些对象是可订阅的。 (它毕竟不叫 subscripttools
:)。
顺便说一句,您也许可以使用 itertools.islice
执行您想要的操作。
关于python - 下标 itertools.repeat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532671/