在我的if语句中使用NaN时,我得到一个UnboundLocalError。如果我将 NaN 设置为 0,那么代码工作正常。但是,代码需要使用 NaN 而不是 0。
我已经阅读了有关UnboundLocalError的大部分主题:但是我没有找到我要找的东西。
import math
from math import nan as NaN
def interest(A, P, R, N):
if R == NaN:
val = (A/P)**(1/float(N))-1
elif P == NaN:
val = A/(1+R)**N
elif A == NaN:
val = P * (1 + R)**N
elif N == NaN:
val = (math.log(A)- math.log(P))/ math.log(1+R)
return val
print(interest(1000, 200, NaN, 5))
正如注释中提到的其他人,您的代码缺少处理没有任何条件计算结果为True
的情况的逻辑。
此外,math.nan == math.nan
计算结果为 False
,因此您的函数调用永远不会导致任何if
语句被True
因此val
永远不会初始化,这就是您获得UnboundLocalError
的原因。
有一个 else
子句,它应该返回一些适当的值或只返回 None
。
最后,将nan
与nan
进行比较对我来说似乎是多余的,因为在您的函数调用中传递的第三个参数是NaN
。
这只是对代码的轻微修改,它可以工作。
import math
from math import nan
def interest(A, P, R, N):
if R is nan:
val = (A / P) ** (1 / float(N)) - 1
elif P is nan:
val = A / (1 + R) ** N
elif A is nan:
val = P * (1 + R) ** N
elif N is nan:
val = (math.log(A) - math.log(P)) / math.log(1 + R)
else:
val = None
return val
print(interest(1000, 200, 'test', 5))
首先,由于缩进错误,代码中的 print 语句永远不会打印任何内容,但我想您已经意识到了这一点。
其次,你会得到UnboundLocalError
,因为val
在返回之前没有被分配。有趣的问题是,为什么。这里的问题出在R == NaN
(及以下)上,因为根据定义,NaN == NaN
是False
.因此,永远不会分配val
。当你想检查时,如果某个变量是NaN
,你可以使用R is NaN
或R in [NaN]
(参见为什么在numpy中'nan == nan'是假的,而[nan]中的nan是真的?)。
请注意,使用else
(这通常是很好的方式)可以给你一个提示,这里发生了什么。