|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- def frange(start,stop,step=0.1):#问题在这里,我是否更改这里,只能吧start改成start=0,才有可能符合题意,可是位置参数要在后面,显然语法错误,那么如果把stop=None,后面的代码就是错的,无法施行,所以这段代码是注定终结是吗?{:5_100:}
- i=round(start,1)
- while i<=round(stop,1)+1e-9:
- yield i
- i+=step
- i=round(i,1)
-
- for i in frange(1):
- print(i)
复制代码
#灵魂拷问:如何选择继续修改代码还是放弃重新写?怎么判断嘞?
在编程中,遇到参数设计不合理或功能不完善的情况时,通常有两种选择:**修改现有代码**或**重写函数**。针对你的 `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)`
代码实现:
- def frange(*args):
- # 根据参数数量设置 start, stop, step
- if len(args) == 1:
- start, stop, step = 0.0, args[0], 0.1
- elif len(args) == 2:
- start, stop, step = args[0], args[1], 0.1
- elif len(args) == 3:
- start, stop, step = args
- else:
- raise TypeError("需传入 1~3 个参数")
- if step == 0:
- raise ValueError("步长不能为 0")
- n = 0
- while True:
- current = start + n * step # 直接计算避免累积误差
- # 正步长:current >= stop 时终止
- # 负步长:current <= stop 时终止
- if (step > 0 and current >= stop) or (step < 0 and current <= stop):
- break
- yield current
- n += 1
复制代码
---
### 关键改进点
1. *args 解决参数冲突问题
2. 用 start + n * step 替代累加,减少浮点误差
3. 明确终止条件:
- 步长为正时: current >= stop
- 步长为负时: current <= stop
---
### 使用示例
- # 生成 0~0.4(步长 0.1)
- print(list(frange(0.4)))
- # 输出:[0.0, 0.1, 0.2, 0.3]
- # 生成 1~3(步长 0.5)
- print(list(frange(1, 3, 0.5)))
- # 输出:[1.0, 1.5, 2.0, 2.5]
复制代码
---
### 何时选择重写?
满足以下任一条件时,建议重写:
1. 现有代码存在结构性缺陷(如参数设计冲突)
2. 修改成本 > 重写成本
3. 需引入新逻辑(如浮点数误差处理)
> 你的场景符合第 1 点,因此重写是更清晰的选择。原函数因语法限制无法通过微调修复,终止重构是合理决策。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|