實際案例
實現(xiàn)一個連續(xù)浮點數(shù)發(fā)生器FloatRange(和xrange類似),根據(jù)給定范圍(start秃殉,end)和步進值(step)產(chǎn)生一系列連續(xù)浮點數(shù)宛瞄,如迭代FloatRange(3.0, 4.0. 0.2)可產(chǎn)生序列:
- 正向:3.0 -> 3.2 -> 3.4 -> 3.6 -> 3.8 -> 4.0
- 反向:4.0 -> 3.8 -> 3.6 -> 3.4 -> 3.2 -> 3.0
正向
我們首先思考如何實現(xiàn)正向迭代。回想一下之前的知識點妓羊,我們可以實現(xiàn)__iter__()返回一個迭代器對象,這樣我們不就可以實現(xiàn)正向迭代嗎稍计?
代碼如下:
def __iter__(self):
t = self.start
while round(t, 2) <= round(self.end, 2):
yield t
t += self.step
由于實際案例中是對浮點數(shù)進行處理侍瑟,因此我們在此處使用round()實現(xiàn)對浮點數(shù)的四舍五入。
反向
在列表中丙猬,如果我們要將列表反向迭代通常使用reverse()涨颜。但這個方法有個缺陷就是會改變列表。因此茧球,我們推薦使用reversed()庭瑰,它會返回一個迭代器。這里抢埋,我們可以實現(xiàn)__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
運行結(jié)果為:
3.0
3.2
3.4
3.6
3.8
4.0
4.0
3.8
3.6
3.4
3.2
3.0