鱼C论坛

 找回密码
 立即注册
查看: 70|回复: 1

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

[复制链接]
发表于 2024-11-13 10:28:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
利用生成器定义一个支持浮点数的 frange() 函数,其功能与 range() 函数相仿。

代码清单:来自:https://fishc.com.cn

def frange(start, stop=None, inc=0.1):
     s = str(inc)
     pre = len(s[s.find('.')+1:])
     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[s.find('.')+1:])哲觉有点看不懂求解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表