"""需求:range不可以使用小数做步长,实现一个可迭代对象,可以实现小数步长分析:
range() 报错 range(10) 0-9 传入的是结束值 range(1,10) 1-9 第一个值是起始值,第二个是结束值 range(1,10,2) 1 3 5 7 9 第一个值是起始值,第二个是结束值,第三个值是步长值 for i in range(10) 可以实现小数步长 校验-操作: 要求:传入的数据应该是int类型或者是float类型
"""from decimal import Decimal
class Range:
def __init__(self,x,y=None,z=1): if not isinstance(x,(int,float)) or not isinstance(z,(int,float)): raise TypeError # 抛出异常,告知程序员不能这样调用,类型有问题 elif y != None and not isinstance(y,(int,float)): raise TypeError else: if y == None: # 只传了一个值 self.start = Decimal('0') self.end = x else: # 传了两个或三个值 self.start = Decimal(str(x)) self.end = y self.step = Decimal(str(z)) # 无论如何都记录z的值 def __iter__(self): return self def __next__(self): # 返回起始值,修改起始值 res = self.start # 保存操作之前的起始值,因为要包含开头 if self.start >= self.end: raise StopIteration self.start += self.step # 修改起始值 return float(res) def __repr__(self): if self.step == 1: return 'range(%s, %s)' % (self.start,self.end) else: return 'range(%s, %s, %s)' % (self.start,self.end,self.step)
for i in Range(1,10,1.1):
print(i)