平时我们都是正向迭代数组,当我们需要反向迭代数组的时候就只能倒着for 循环,例如:
... def printrange():
... x = [1,2,3,4,5]
... for i in range(len(x)):
... print(x[len(x)-i-1])
printrange()
5
4
3
2
1
有了reversed()
函数就可以反向迭代序列中的元素,例如
... def printrange():
... x = [1,2,3,4,5]
... for i in reversed(x):
... print(x)
printrange()
5
4
3
2
1
Ps:反向迭代只有在待处理的对象拥有可确定的大小,或者对象实现了__reversed__()
特殊方法时才能奏效。
将可迭代对象转换为列表会消耗大量的内存。
__reversed__()
方法在自定义类中用上__reversed__()
方法可以实现反向迭代。
class countdown:
def __init__(self, start) -> None:
self.start = start
# 正向迭代
def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1
# 反向迭代
def __reversed__(self):
n = 0
while n <= self.start:
yield n
n += 1
cd = countdown(3)
it = iter(cd)
print("正向迭代")
print(next(it))
print(next(it))
print("反向迭代")
rsd = reversed(cd)
print(next(rsd))
print(next(rsd))
Reference:
《python cookbook》