Python TypeError: float()参数必须是字符串或数字,而非'NoneType'错误排查求助
排查 TypeError: float() argument must be a string or a number, not 'NoneType'
嘿,我来帮你搞定这个错误!这个问题的核心原因很明确:你的fact函数没有返回值,导致调用fact(i)时得到的是None,而float()没办法把None转换成浮点数,自然就触发了这个类型错误。
第一步:修复fact函数的返回值问题
你当前的fact函数只完成了阶乘的计算,但没有用return语句把计算结果返回出去。Python里如果函数没有显式的return,默认会返回None。我们只需要给函数加上返回语句就行:
def fact(calc): fact = 1 for z in range(2, calc + 1): fact = fact * z return fact # 新增这一行,返回计算好的阶乘结果
这样再调用fact(i)时,就能得到正确的阶乘数值,float(fact(i))也就不会报错了。
第二步:梳理你的循环逻辑(潜在问题)
除了这个直接的错误,你的代码还有一些逻辑上的混乱点,可能会导致后续运行不符合预期:
while rep < epsilon:初始rep是输入的x,如果x大于等于epsilon(也就是10^6),这个循环根本不会执行。看起来你应该是想在rep的绝对值大于epsilon时继续迭代?可以改成while abs(rep) > epsilon:for j in range(1,2):这个循环只会执行一次(j=1),完全可以去掉这个循环,直接写对应的逻辑代码,没必要多一层嵌套。for i in range(1,999999999,2):这个循环的范围太大了,不仅会拖慢运行速度,而且你内部的break条件可能也没办法及时触发。建议设定一个合理的循环次数上限,比如到i=20就足够泰勒级数收敛了。
这里给你一个调整后的代码示例,假设你是想计算类似余弦函数的泰勒展开(根据你的符号交替逻辑推测):
def fact(calc): fact = 1 for z in range(2, calc + 1): fact = fact * z return fact # 修复返回值问题 epsilon = 1e-6 # 这里应该是10的负6次方?如果是1e6的话收敛条件太严格了,可能永远达不到 x = float(input()) rep = 1.0 # 余弦泰勒展开的初始项是1 sign = -1 # 用来控制符号交替 for i in range(2, 20, 2): # 取到i=18足够收敛 term = (x ** i) / fact(i) rep += sign * term if abs(term) < epsilon: break sign *= -1 print(rep)
内容的提问来源于stack exchange,提问作者Philippe gauthier
相关产品推荐
相关产品推荐

