实际案例:
实现一个连续浮点数发生器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













网友评论