0
  • 我可以打电话reversed给名单。
  • 我可以调用reversedrange_iterator。
  • 我不能调用reversedlist_iterator。
  • 我不能调用reverseditertools.accumulate。

为什么我可以调用reversedlist 和 range_iterator,但不能调用 list_iterator 或 itertools 迭代器?

>>> 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
4

1 回答 1

1

如果您阅读文档,您会发现它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__and __next__

于 2019-10-16T06:15:32.400 回答