"""需求: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)
该博客介绍了如何创建一个自定义的迭代器类,以允许在Python中使用浮点数作为步长进行迭代。通过`Decimal`类确保数值精度,并在初始化时检查输入参数类型,确保它们是整数或浮点数。`__iter__`和`__next__`方法被用于实现迭代行为,当起始值超过结束值时引发`StopIteration`。博客提供了一个示例,展示如何使用这个自定义迭代器在1到10之间以1.1为步长进行迭代。
1954

被折叠的 条评论
为什么被折叠?



