实际案例
实现一个连续浮点数发生器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__()返回一个迭代器对象,这样我们不就可以实现正向迭代吗?
代码如下:
def __iter__(self):
t = self.start
while round(t, 2) <= round(self.end, 2):
yield t
t += self.step
由于实际案例中是对浮点数进行处理,因此我们在此处使用round()实现对浮点数的四舍五入。
反向
在列表中,如果我们要将列表反向迭代通常使用reverse()。但这个方法有个缺陷就是会改变列表。因此,我们推荐使用reversed(),它会返回一个迭代器。这里,我们可以实现__reversed__()解决反向迭代问题。
代码如下:
def __reversed__(self):
t = self.end
while round(t, 2) >= round(self.start, 2):
yield t
t -= self.step
该程序的最终代码如下:
# -*- coding: utf-8 -*-
class FloatRange:
def __init__(self, start, end, step):
self.start = start
self.end = end
self.step = step
# 正向迭代
def __iter__(self):
t = self.start
while round(t, 2) <= round(self.end, 2):
yield t
t += self.step
# 反向迭代
def __reversed__(self):
t = self.end
while round(t, 2) >= round(self.start, 2):
yield t
t -= self.step
if __name__ == "__main__":
for x in FloatRange(3.0, 4.0, 0.2):
print x
print ""
for x in reversed(FloatRange(3.0, 4.0, 0.2)):
print x
运行结果为:
3.0
3.2
3.4
3.6
3.8
4.0
4.0
3.8
3.6
3.4
3.2
3.0