usu*_* me 6 python reverse iterator python-2.7
所以我可以在列表上创建一个反向迭代器:
list(reversed([0,1,2,3]))
[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
我以为这只是简单地调用getitem从指数len(...)-1到0.但是我不能这样做:
list(reversed(xrange(4)))
[3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
现在我有点困惑.这会创建列表xrange(4)然后反转它吗?如果没有,它如何知道最后一个元素是什么以及如何倒退?我阅读了文档,但没有用.
reversed()在对象上查找__reversed__特殊方法.List对象提供了这个功能,因此xrange():
>>> xrange(4).__reversed__()
<rangeiterator object at 0x106e2fa50>
Run Code Online (Sandbox Code Playgroud)
迭代器对象只是反向生成值,不生成列表对象.
对于未实现的对象__reversed__,该reversed()函数使用长度和__getitem__方法; 例如reversed(),基本上相当于:
def reversed(seq):
try:
return seq.__reversed__()
except AttributeError:
return (seq[i] for i in xrange(len(seq) - 1, -1 , -1))
Run Code Online (Sandbox Code Playgroud)
其中第二部分是生成器表达式,懒惰地进行评估.然后,生成器依次从索引(长度-1)开始依次访问每个项目到索引0.
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |