这是我写的一个函数:
def conc(i,s,y):
if sheet.cell(i+1,0).value != sheet.cell(2,0).value :
# print s
rtrns = s
# print rtrns
return rtrns
else:
if i==list1[len(list1)-1]:
while i<(sheet.nrows):
# print i
s = s + " " + unicode(sheet.cell(i,y).value).encode('cp1252', 'replace')
i+=1
# print s
rtrns = s
# print rtrns
return rtrns
else:
s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
#return s
conc(i+1,s,y)
在上面的函数中,当我在第一个if块中打印rtrns的值时,它会显示我需要的值。
但是当我调用函数
时c = conc(x,c,2) #where x fetches an integer value as an index from a list
print c
返回None
答案 0 :(得分:4)
代码的else部分缺少return
语句
else:
s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
#return s
conc(i+1,s,y)
因此,有一个代码路径,其中没有从递归函数conc
返回任何内容。
更改代码并添加退货
else:
s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
#return s
return conc(i+1,s,y)
递归调用始终返回给调用者。因此,当您递归调用conc
并且其中一个代码路径发出return语句时,调用将从您调用的地方返回 。另一个重要的事情是,没有显式返回的函数具有无的隐式返回。
以下ASCII艺术应该可以解释可能出现的问题
foo() <------------------------------------------------------------------------
| |
| |
|->def conc(...): |
else: (None)
......... |
conc(i+1,s,y) <-------------------------------------------\ |
return None ----------------------------------------------U--- -|
| |
| |
\----->def conc(...): |
else: (None)
......... |
conc(i+1,s,y) <----------------------\ |
return None ------------------------U--|
| |
| |
| |
\----------->def conc(...): (rtrns)
if ... : |
.......... |
return rtrns----|