反向迭代

问题

你想反方向迭代一个序列

解决方案

使用内置的 reversed() 函数,比如:

>>> a = [1, 2, 3, 4]
>>> for x in reversed(a):
... 	print(x)
...
4
3
2
1

反向迭代仅仅当对象的大小可预先确定或者对象实现了 reversed () 的特殊方
法时才能生效。如果两者都不符合,那你必须先将对象转换为一个列表才行,比如:

# Print a file backwards
f = open('somefile')
for line in reversed(list(f)):
	print(line, end='')

要注意的是如果可迭代对象元素很多的话,将其预先转换为一个列表要消耗大量的内存。

讨论

很多程序员并不知道可以通过在自定义类上实现 reversed () 方法来实现反向
迭代。比如:

class Countdown:
	def __init__(self, start):
		self.start = start
		
	# Forward iterator
	def __iter__(self):
		n = self.start
		while n > 0:
			yield n
			n -= 1
			
	# Reverse iterator
	def __reversed__(self):
		n = 1
		while n <= self.start:
			yield n
			n += 1
for rr in reversed(Countdown(30)):
	print(rr)
for rr in Countdown(30):
	print(rr)

定义一个反向迭代器可以使得代码非常的高效,因为它不再需要将数据填充到一个列表中然后再去反向迭代这个列表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector反向迭代器是一种用于反向遍历vector容器的迭代器。根据引用中的内容,vector反向迭代器的实现包括rbegin()和rend()两个函数。其中,rbegin()函数返回的是正向迭代器的end()适配得到的反向迭代器,它指向vector的最后一个元素;而rend()函数返回的是正向迭代器的begin()适配得到的反向迭代器,它指向vector的第一个元素的前一个位置。 为了更好地理解反向迭代器的使用,可以参考引用中提供的示例代码。在这个示例代码中,首先创建了一个vector容器v,并向其中添加了一些元素。然后通过使用迭代器vit遍历vector容器的元素,将元素依次输出。需要注意的是,迭代器vit在遍历时是从v的begin()开始,直到v的end()之前的位置。因此,输出的结果是按照元素的正序输出。 通过引用中提供的示例代码,可以了解到如何使用反向迭代器来遍历vector容器的元素。在这个示例代码中,首先创建了一个vector容器v1,并向其中添加了一些元素。然后,定义了一个迭代器对象v1_Iter和一个常量反向迭代器v1_rIter。其中,v1_Iter用于正向遍历vector容器的元素,v1_rIter用于反向遍历vector容器的元素。 通过以上的解释和示例代码,可以得出结论:vector反向迭代器是一种用于反向遍历vector容器的迭代器,它可以让我们从最后一个元素开始遍历vector容器的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【C++之容器适配器】反向迭代器的实现](https://blog.csdn.net/m0_63019745/article/details/129051964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [vector的反向迭代器(reverse_iterator)](https://blog.csdn.net/weixin_43621608/article/details/103750076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值