美文网首页python开发python从入门到精通python 实战实验室
py编程技巧-2.3-如何进行反向迭代以及如何实现反向迭代

py编程技巧-2.3-如何进行反向迭代以及如何实现反向迭代

作者: 天涯明月笙 | 来源:发表于2017-04-01 16:39 被阅读118次

实际案例:

实现一个连续浮点数发生器FloatRange(和xrange类似),
根据给定范围(start,end)和步长值(step)产生一些连续的浮点数
,如迭代FloatRange(3.0,4.0,0.2)可产生序列:

正向: 3.0 - 3.2 - 3.4 - 3.6 - 3.8 - 4.0
反向: 4.0 - 3.8 - 3.6 - 3.4 - 3.2 - 3.0 

正向的:实现一个可迭代对象实现iter方法即可。

普通做法:


l = [1,2,3,4,5]
l.reverse()
# 此时虽然实现了反向,但是改变了列表本身
print l

# 使用切片操作,依然可以得到列表的反向
print l[::-1]

探究过程:

# 得到列表的一个反向迭代器
reversed(l)
# 得到列表的一个正向迭代器
iter(l)

print l
for x in reversed(l):
    print x

iter(l)
# 等同于调用__iter__
print l.__iter__()

reversed(l)
# 等同于调用__reversed__
print l.__reversed__()

高级实现:
正向的我们在上一节中通过__iter__实现。
那么反向我们将通过__reversed__实现

代码示例:

class FloatRange:
    def __init__(self, start, end, step =0.1):
        self.start = start
        self.end = end
        self.step = step

    def __iter__(self):
        t = self.start
        while t <= self.end:
            yield t
            t += self.step

    def __reversed__(self):
        t = self.end
        while t >= self.start:
            yield t
            t -= self.step      
        
for x in FloatRange(1.0,4.0,0.5):
    print x
print '*'*20
for x in reversed(FloatRange(1.0,4.0,0.5)):
    print x

相关文章

网友评论

    本文标题:py编程技巧-2.3-如何进行反向迭代以及如何实现反向迭代

    本文链接:https://www.haomeiwen.com/subject/umniottx.html