关于生成器作业的一点疑问
利用生成器定义一个支持浮点数的 frange() 函数,其功能与 range() 函数相仿。代码清单:来自:https://fishc.com.cn
def frange(start, stop=None, inc=0.1):
s = str(inc)
pre = len(s)
start += 0.0 # 确保start变成浮点数
if stop == None:
stop = start + 0.0# 确保stop变成浮点数
start = 0.0
while start < stop:
yield round(start, pre)
start += inc
第三行pre处应该是为了确认最后第二行yield生成数的精确度对吗?
pre = len(s)哲觉有点看不懂求解 是的,你理解得没错,`pre = len(s)`的确是为了确定最后一行`yield`生成数的精确度。
但是这行代码看起来没有达到预期的效果。我们来分析一下整段代码的逻辑:
1. 函数参数:
- `start`:起始值。
- `stop`:终止值,如为`None`,则需要将`start`赋值为0.0,`stop`为输入的`start`值。
- `inc`:增量。
2. 为了确保`start`和`stop`为浮点数,分别加了`0.0`。
3. 使用`while`循环,生成符合条件的范围数(从`start`到`stop`,每次增加`inc`)。
现在,关键在于:
- `s = str(inc)`:将增量`inc`转换为字符串。
- `pre = len(s)`:计算字符串的长度。
计算字符串长度的方法在这里并不准确,因为字符串的长度并不能直接反映浮点数的精度。
推荐按下面的方式重新定义一个更合理的计算精度的方法:
def frange(start, stop=None, inc=0.1):
# 确保start变成浮点数
start = float(start)
if stop is None:
stop = start
start = 0.0
else:
stop = float(stop)
while start < stop:
yield round(start, len(str(inc).split('.')[-1]))
start += inc
这里调整的地方是:
- 使用`len(str(inc).split('.')[-1])`来获取增量`inc`的小数位数,从而确定生成数的精度。这能更准确地确定浮点数的精度。
这样,生成器`frange()`将更准确地处理浮点数范围。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]