Python 如何反方向迭代一个序列

作者:看云 时间:2022-12-07 09:44:19 

问题

你想反方向迭代一个序列

解决方案

使用内置的 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)

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

来源:https://www.kancloud.cn/kancloud/python3-cookbook/47196

标签:Python,反向,迭代,序列
0
投稿

猜你喜欢

  • Python数据库的连接实现方法与注意事项

    2024-01-14 10:51:54
  • opencv+python识别七段数码显示器的数字(数字识别)

    2022-03-03 00:01:51
  • Elasticsearches打分机制讲解

    2023-05-31 10:41:03
  • JavaScript基础知识篇-你真的了解JavaScript吗?

    2009-09-17 13:00:00
  • Python实现的凯撒密码算法示例

    2022-10-14 08:47:28
  • 详解如何在cmd命令窗口中搭建简单的python开发环境

    2021-08-21 08:03:08
  • php将12小时制转换成24小时制的方法

    2023-11-21 15:56:08
  • pytorch加载预训练模型与自己模型不匹配的解决方案

    2023-06-17 14:22:24
  • 黑科技 Python脚本帮你找出微信上删除你好友的人

    2021-09-04 04:07:08
  • MySQL每天自动增加分区的实现

    2024-01-23 16:18:37
  • Python列表常见操作详解(获取,增加,删除,修改,排序等)

    2021-02-04 10:10:19
  • Python二次规划和线性规划使用实例

    2023-08-28 05:37:10
  • pycharm激活码快速激活及使用步骤

    2022-05-09 01:31:29
  • JS将滑动门改为选项卡(需鼠标点击)的实现方法

    2024-05-22 10:36:17
  • MySQL事件与触发器专题精炼

    2024-01-22 09:08:21
  • PHP _construct()函数讲解

    2023-06-14 16:56:43
  • YUI3.3.0 中 transition 事件的变化

    2011-06-16 20:51:45
  • python中类变量与成员变量的使用注意点总结

    2022-01-08 03:39:51
  • Oracle数据库索引的维护

    2010-07-26 13:29:00
  • 导入tensorflow:ImportError: libcublas.so.9.0 报错

    2023-07-07 11:44:46
  • asp之家 网络编程 m.aspxhome.com