我是春鸡 发表于 2024-11-13 10:28:06

关于生成器作业的一点疑问

利用生成器定义一个支持浮点数的 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)哲觉有点看不懂求解

FishC 发表于 2024-11-13 10:28:15

是的,你理解得没错,`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]
查看完整版本: 关于生成器作业的一点疑问