鱼C论坛

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

[已解决]如何选择继续修改代码还是放弃重新写?

[复制链接]
发表于 2025-8-17 11:34:06 | 显示全部楼层 |阅读模式

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

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

x
  1. def frange(start,stop,step=0.1):#问题在这里,我是否更改这里,只能吧start改成start=0,才有可能符合题意,可是位置参数要在后面,显然语法错误,那么如果把stop=None,后面的代码就是错的,无法施行,所以这段代码是注定终结是吗?{:5_100:}
  2.     i=round(start,1)
  3.     while i<=round(stop,1)+1e-9:
  4.         yield i
  5.         i+=step
  6.         i=round(i,1)

  7.         
  8. for i in frange(1):
  9.     print(i)
复制代码

#灵魂拷问:如何选择继续修改代码还是放弃重新写?怎么判断嘞?
最佳答案
2025-8-17 11:40:38
在编程中,遇到参数设计不合理或功能不完善的情况时,通常有两种选择:**修改现有代码**或**重写函数**。针对你的 `frange` 函数问题(参数设计冲突),分析如下:

---

### 问题核心
- 你希望函数支持单参数调用(如 `frange(5)` 表示 `0~5`),但参数语法要求 **默认参数必须在非默认参数之后**。
- 若强行修改为 `def frange(start=0, stop, step=0.1)` 会触发语法错误。
- 因此,**必须重构参数逻辑**。

---

### 解决方案:重写函数(推荐)
使用 `*args` 接收可变参数,手动处理三种调用方式:
1. `frange(stop)` → 从 `0` 开始,步长 `0.1`
2. `frange(start, stop)` → 步长 `0.1`
3. `frange(start, stop, step)`

代码实现:

  1. def frange(*args):
  2.     # 根据参数数量设置 start, stop, step
  3.     if len(args) == 1:
  4.         start, stop, step = 0.0, args[0], 0.1
  5.     elif len(args) == 2:
  6.         start, stop, step = args[0], args[1], 0.1
  7.     elif len(args) == 3:
  8.         start, stop, step = args
  9.     else:
  10.         raise TypeError("需传入 1~3 个参数")

  11.     if step == 0:
  12.         raise ValueError("步长不能为 0")

  13.     n = 0
  14.     while True:
  15.         current = start + n * step  # 直接计算避免累积误差
  16.         # 正步长:current >= stop 时终止
  17.         # 负步长:current <= stop 时终止
  18.         if (step > 0 and current >= stop) or (step < 0 and current <= stop):
  19.             break
  20.         yield current
  21.         n += 1
复制代码


---

### 关键改进点
1. *args 解决参数冲突问题
2. 用 start + n * step 替代累加,减少浮点误差
3. 明确终止条件:
   - 步长为正时:current >= stop
   - 步长为负时:current <= stop

---

### 使用示例

  1. # 生成 0~0.4(步长 0.1)
  2. print(list(frange(0.4)))
  3. # 输出:[0.0, 0.1, 0.2, 0.3]

  4. # 生成 1~3(步长 0.5)
  5. print(list(frange(1, 3, 0.5)))
  6. # 输出:[1.0, 1.5, 2.0, 2.5]
复制代码


---

### 何时选择重写?
满足以下任一条件时,建议重写:
1. 现有代码存在结构性缺陷(如参数设计冲突)
2. 修改成本 > 重写成本
3. 需引入新逻辑(如浮点数误差处理)

> 你的场景符合第 1 点,因此重写是更清晰的选择。原函数因语法限制无法通过微调修复,终止重构是合理决策。

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

使用道具 举报

发表于 2025-8-17 11:40:38 | 显示全部楼层    本楼为最佳答案   
在编程中,遇到参数设计不合理或功能不完善的情况时,通常有两种选择:**修改现有代码**或**重写函数**。针对你的 `frange` 函数问题(参数设计冲突),分析如下:

---

### 问题核心
- 你希望函数支持单参数调用(如 `frange(5)` 表示 `0~5`),但参数语法要求 **默认参数必须在非默认参数之后**。
- 若强行修改为 `def frange(start=0, stop, step=0.1)` 会触发语法错误。
- 因此,**必须重构参数逻辑**。

---

### 解决方案:重写函数(推荐)
使用 `*args` 接收可变参数,手动处理三种调用方式:
1. `frange(stop)` → 从 `0` 开始,步长 `0.1`
2. `frange(start, stop)` → 步长 `0.1`
3. `frange(start, stop, step)`

代码实现:

  1. def frange(*args):
  2.     # 根据参数数量设置 start, stop, step
  3.     if len(args) == 1:
  4.         start, stop, step = 0.0, args[0], 0.1
  5.     elif len(args) == 2:
  6.         start, stop, step = args[0], args[1], 0.1
  7.     elif len(args) == 3:
  8.         start, stop, step = args
  9.     else:
  10.         raise TypeError("需传入 1~3 个参数")

  11.     if step == 0:
  12.         raise ValueError("步长不能为 0")

  13.     n = 0
  14.     while True:
  15.         current = start + n * step  # 直接计算避免累积误差
  16.         # 正步长:current >= stop 时终止
  17.         # 负步长:current <= stop 时终止
  18.         if (step > 0 and current >= stop) or (step < 0 and current <= stop):
  19.             break
  20.         yield current
  21.         n += 1
复制代码


---

### 关键改进点
1. *args 解决参数冲突问题
2. 用 start + n * step 替代累加,减少浮点误差
3. 明确终止条件:
   - 步长为正时:current >= stop
   - 步长为负时:current <= stop

---

### 使用示例

  1. # 生成 0~0.4(步长 0.1)
  2. print(list(frange(0.4)))
  3. # 输出:[0.0, 0.1, 0.2, 0.3]

  4. # 生成 1~3(步长 0.5)
  5. print(list(frange(1, 3, 0.5)))
  6. # 输出:[1.0, 1.5, 2.0, 2.5]
复制代码


---

### 何时选择重写?
满足以下任一条件时,建议重写:
1. 现有代码存在结构性缺陷(如参数设计冲突)
2. 修改成本 > 重写成本
3. 需引入新逻辑(如浮点数误差处理)

> 你的场景符合第 1 点,因此重写是更清晰的选择。原函数因语法限制无法通过微调修复,终止重构是合理决策。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-30 22:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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