我正在尝试在两个表之间进行此查找。带递归调用。但是它总是返回None。可能是什么原因?
def checkExchangerate(yearEc,monthEc,dayEc,currCode):
currCodes = {
'gbp' : 'GBP/EUR',
'usd' : 'USD/EUR'
}
retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
print(retVal)
if retVal.empty:
dayEc = dayEc-1
checkExchangerate(yearEc,monthEc,dayEc,currCode)
else:
return min(retVal)
checkExchangerate(1999,1,17,'usd') 返回无。
table exch_rate is pd.DataFrame:
DAGS USD/EUR GRP/EUR
1999-1-15 0,66 0,4
1999-1-18 0,65 0,4
预期输出为0.66
答案 0 :(得分:0)
请在您的问题中添加一些示例数据。
在您的代码中:
if retVal.empty:
dayEc = dayEc-1
checkExchangerate(yearEc,monthEc,dayEc,currCode)
else:
return min(retVal)
如果retVal为空,它将递归调用自己。但是,当它来自递归时,它对返回值不执行任何操作,因此它返回None。
要解决此问题,您应该return
递归返回的值:
if retVal.empty:
dayEc = dayEc-1
return checkExchangerate(yearEc,monthEc,dayEc,currCode)
else:
return min(retVal)
此外,您可以替换:
dayEc = dayEc-1
return checkExchangerate(yearEc,monthEc,dayEc,currCode)
使用
return checkExchangerate(yearEc,monthEc,dayEc-1,currCode)
但是,我建议使用循环:
def checkExchangerate(yearEc,monthEc,dayEc,currCode):
currCodes = {...}
retVal = False
while not retVal or retVal.empty:
retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
dayEc -= 1
print(retVal)
return min(retVal)
这可能会导致无限循环(就像您的代码可能导致无限递归一样),所以这是一个带有for循环的版本:
def checkExchangerate(yearEc,monthEc,dayEc,currCode):
currCodes = {...}
retVal = False
for day in range(dayEc, dayEc-20, -1):
retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,day)]
if not retVal.empty:
break;
print(retVal)
if retVal.empty:
return some_error_code
else:
return min(retVal)
您可以将20
更改为其他数字。或使用range(dayEc, 1, -1)
-因为我怀疑这一天绝对不能少于1