Python reversed()函数

时间:2020-02-23 14:43:15  来源:igfitidea点击:

Python reversed()函数从指定的sequence参数返回一个反向迭代器。

python reversed()

Python reversed()函数语法为:

reversed(seq)
  • 输入参数必须是一个序列,例如元组,列表,字符串等。

  • 返回的对象是" reversed"类型,它是一个迭代器。

  • 如果自定义对象具有__reversed __()方法或者支持序列协议,则可以将其作为reversed()函数参数提供。

  • 我们需要使用从0开始的整数参数来实现__len __()方法和__getitem __()方法,以支持序列协议。

带序列的reversed()

让我们看一下带有标准序列对象(例如字符串,字节,元组,列表等)的reversed()函数示例。

def print_iterator(it):
  for x in it:
      print(x, end=' ')
  print('\n')

# reversed string
r = reversed('abc')
print(type(r))
print(r)
print_iterator(r)

# reversed list
r = reversed([1, 2, 3])
print_iterator(r)

# reversed tuple
r = reversed((1, 2, 3))
print_iterator(r)

# reversed bytes
r = reversed(bytes('abc', 'utf-8'))
print_iterator(r)

# reversed bytearray
r = reversed(bytearray('abc', 'utf-8'))
print_iterator(r)

输出:

<class 'reversed'>
<reversed object at 0x109d1f208>
c b a 

3 2 1 

3 2 1 

99 98 97 

99 98 97

请注意,在控制台上打印时,字节和字节数组元素将转换为整数。

具有具有__reversed__方法的对象的reversed()

# object with __reversed__ method
class Data:
  name = ''

  def __init__(self, n):
      self.name = n

  def __reversed__(self):
      return reversed(self.name)

d = Data('ABC')

r = reversed(d)

print_iterator(r)

输出:C B A

具有对象支持序列协议的reversed()

# object supporting sequence protocol i.e.
# implementing __len__() and __getitem__ method
class MyTupleWrapper:
  t = ()

  def __init__(self, tu):
      if not isinstance(tu, tuple):
          return ValueError('Only accepts tuple')
      self.t = tu

  def __len__(self):
      return len(self.t)

  def __getitem__(self, index):
      return self.t[index]

mt = MyTupleWrapper((1, 2, 3, 4))
r = reversed(mt)
print_iterator(r)

输出:4 3 2 1