实际案例
实现一个连续浮点数发生器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__()返回一个迭代器对象,这样我们不就可以实现正向迭代吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
In [53]: l Out[53]: [1, 2, 3, 4, 5] In [54]: iter(l) # 这就是正向迭代 它的实现原理其实就是__iter__() 函数 In [56]: for x in iter(l): ...: print(x) ...: 1 2 3 4 5 |
那么如何实现反向迭代呢?
其实 python 有个内置函数reversed 可以解决反向迭代的问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
In [57]: reversed? Init signature: reversed(self, /, *args, **kwargs) Docstring: reversed(sequence) -> reverse iterator over values of the sequence Return a reverse iterator Type: type In [58]: for x in reversed(l): ...: print(x) ...: 5 4 3 2 1 由此可见,如果想实现反向迭代可以使用 reversed函数就可以了 [code] 所以这个正向迭代和方向迭代,可以这么写: # -*- coding: utf-8 -*- __author__ = 'songhao' class FloatRange(object): def __init__(self, start, end, step): self.start = start self.end = end self.step = step def __iter__(self): """ 实现正向迭代 :return: """ while self.start <= self.end: yield self.start self.start += self.step def __reversed__(self): """ 实现反向迭代 :return: """ while self.end >= self.start: yield self.end self.end -= self.step if __name__ == '__main__': for x in FloatRange(1, 4, 1): print(x, "这是正向迭代") print("*" * 22) for x in reversed(FloatRange(1, 4, 1)): print(x, "这是反向迭代") |
显示结果是:

