鱼C论坛

 找回密码
 立即注册
查看: 36|回复: 3

关于第48讲函数(VIII)动动手作业

[复制链接]
发表于 昨天 22:11 | 显示全部楼层 |阅读模式

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

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

x
小鱼老师的代码如下:
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,重置起始值为0.0
        stop = start + 0.0  # 确保stop变成浮点数
        start = 0.0

    while start < stop:
        yield round(start, pre)
        start += inc

这里有个问题:为何当stop为偶数时,函数返回结果的最后一个值打印不出来,比如:
ret = frange(2),最后的值2不输出,只输出到1.9;  或者ret = frange(1,4),最后的值4不输出,只输出到3.9
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 22:13 | 显示全部楼层
您好!关于您提到的frange函数在stop为偶数时不输出最后一个值的问题,我来为您解释一下。

首先,frange函数的设计是基于循环条件 while start < stop 的,这意味着当 start 增加到等于或大于 stop 时,循环就会停止,因此 stop 值本身不会被 yield 输出。这种行为实际上与 Python 内置的 range 函数一致,range(stop) 也不会包括 stop 值。

以您的例子为例:
- 对于 frange(2)
  - stop 被设置为 2.0,start 从 0.0 开始,每次增加 0.1
  - 当 start 为 1.9 时,1.9 < 2.0 为 True,所以 yield 1.9
  - 然后 start += 0.1 变成 2.0
  - 2.0 < 2.0 为 False,循环停止,因此 2.0 不会被输出
- 类似地,对于 frange(1, 4),最后一个输出值是 3.9,而不是 4.0。

您提到“当stop为偶数时”,但实际上这个行为与 stop 是否为偶数无关,而是由循环条件 start < stop 决定的。对于任何 stop 值(无论奇偶),只要 start 在增加后不小于 stop,就不会输出 stop 值。

如果您希望包括 stop 值,可以将循环条件修改为 while start <= stop,但需要注意浮点数精度问题,因为浮点数计算可能有误差,导致意外行为(例如最后一个值略微超过 stop)。

总之,当前代码是故意设计为不包括 stop 值的,以保持与 range 函数的一致性。如果您有特定需求,可以调整代码,但需谨慎处理浮点数精度。

希望这能解答您的疑问!如果还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 22:43 | 显示全部楼层
如果ret = frange(1),最后一个值1.0可以输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 22:45 | 显示全部楼层
laocaiye 发表于 2025-10-13 22:43
如果ret = frange(1),最后一个值1.0可以输出


您好!关于您提到的frange函数在stop为偶数时不输出最后一个值的问题,我来为您解释一下。

首先,frange函数的设计是基于循环条件 `while start < stop` 的,这意味着当 `start` 增加到等于或大于 `stop` 时,循环就会停止,因此 `stop` 值本身通常不会被输出。这种行为与Python内置的 `range` 函数一致。

但是,您观察到 `frange(1)` 输出了 `1.0`,而 `frange(2)` 没有输出 `2.0`,这主要是由于浮点数精度问题导致的。

在代码中,`start` 和 `inc` 是浮点数,而浮点数在计算机中存储时可能存在微小的误差。例如:
- 在 `frange(1)` 中,`start` 从 `0.0` 开始,每次增加 `0.1`。由于浮点误差,当 `start` 累加到接近 `1.0` 时,实际值可能略小于 `1.0`(例如 `0.9999999999999999`),因此循环条件 `start < stop` 仍然为真,会执行 `yield round(start, pre)`。`round(0.9999999999999999, 3)` 四舍五入后得到 `1.0`,所以输出中包含了 `1.0`。
- 在 `frange(2)` 中,`start` 累加到 `2.0` 时,如果实际值等于或大于 `2.0`,循环就会停止,因此 `2.0` 不会被输出。

这种不一致性不是由 `stop` 是否为偶数决定的,而是浮点数计算中的常见问题。如果您需要更可靠的行为,可以考虑使用整数计算后转换,或调整循环条件。

希望这能解答您的疑问!如果还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-14 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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