为什么我不能撤消Python 3中的所有迭代器?

时间:2019-10-16 06:00:41

标签: python python-3.x itertools python-3.8

  • 我可以在列表上呼叫reversed
  • 我可以在range_iterator上致电reversed
  • 我无法在list_iterator上致电reversed
  • 我无法通过itertools.accumulate致电reversed

为什么我可以在列表和range_iterator上而不是在list_iterator或itertools迭代器上调用reversed

>>> reversed(itertools.accumulate(reversed(x), lambda x, y: x + y))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'itertools.accumulate' object is not reversible

1 个答案:

答案 0 :(得分:1)

如果您read the docs,您会看到reversed适用于具有以下特征的任何对象:

  

具有__reversed__()方法或支持序列协议(   __len__()方法和带有整数的__getitem__()方法   以0开头的参数)

请注意,这意味着不能在range_iterator上使用reversed,但可以在常规range对象上使用。

>>> reversed(iter(range(10)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'range_iterator' object is not reversible
>>> reversed(range(10))
<range_iterator object at 0x105bcac90>

还请注意,您通常根本无法反转迭代器,它是类似序列的可迭代对象,通常是可逆的。或通过魔术方法钩子__reversed__()支持它的任何东西,并且迭代器通常都没有(通常仅支持__iter____next__