Python 如何正确分配函数内部的变量/如何为每个递归循环添加1?
我想知道标题里说了什么。例如,如何计算递归循环并最终返回或打印结果 这是我的代码,但它不能正常工作:Python 如何正确分配函数内部的变量/如何为每个递归循环添加1?,python,function,variables,python-2.7,global-variables,Python,Function,Variables,Python 2.7,Global Variables,我想知道标题里说了什么。例如,如何计算递归循环并最终返回或打印结果 这是我的代码,但它不能正常工作: def lenRecur(aStr): number = 0 print "lenRecur number is ", number ''' aStr: a string returns: int, the length of aStr ''' if aStr == '': return 0 else:
def lenRecur(aStr):
number = 0
print "lenRecur number is ", number
'''
aStr: a string
returns: int, the length of aStr
'''
if aStr == '':
return 0
else:
print aStr
number += 1
print "else number is ", number
return lenRecur(aStr[:-1])
好的,所以当我写的时候,我再次测试了它,如果我使用lenRecur(“word”,0),并且自定义了我的代码,它就可以工作了。问题是,这是不合法的。这是不合法的,我不允许这样做:(
因此,定制代码:
def lenRecur(aStr, number):
print "lenRecur number is ", number
'''
aStr: a string
returns: int, the length of aStr
'''
if aStr == '':
return number
else:
print aStr
number += 1
print "else number is ", number
return lenRecur(aStr[:-1], number)
我相信您的意图是使用
number
作为静态函数变量。这可以通过以下方式实现:
def lenRecur(aStr):
if not hasattr(lenRecur, 'number'):
lenRecur.number = 0
print "lenRecur number is ", lenRecur.number
'''
aStr: a string
returns: int, the length of aStr
'''
if aStr == '':
return 0
else:
print aStr
lenRecur.number += 1
print "else number is ", lenRecur.number
return lenRecur(aStr[:-1])
一种替代方法,每次重置计数器时都会使用两个参数:
def lenRecur(aStr, recurse=False):
if not recurse:
lenRecur.number = 0
print "lenRecur number is ", lenRecur.number
'''
aStr: a string
returns: int, the length of aStr
'''
if aStr == '':
return 0
else:
print aStr
lenRecur.number += 1
print "else number is ", lenRecur.number
return lenRecur(aStr[:-1], True)
我不知道这个练习的实际意义是什么,以及在实现中可以做什么和不能做什么。我认为递归版本的
len
远不是最有效的,但是如果你想这样做,你应该使用helper函数来隐藏第二个参数:
def lenRecur(aStr):
'''
aStr: a string
returns: int, the length of aStr
'''
# place the doc string next to the `def`
# the outside world has no ability to accidentally set the parameter
def lenRecurHelper(aStr, num = 0):
print "lenRecur number is ", number
# empty strings are falsy, so just test for that.
if not aStr:
return num
print aStr
lenRecurHelper(aStr[:-1],num + 1)
return lenRecurHelper(aStr)
如果我理解正确,这将解决您的问题:
def lenR(s,n=0):
if s:
return lenR(s[:-1],n+1)
else:
return n
#testing it:
lenR('this code is not pretty') # output: 23
lenR('egg') # output: 3
lenR('spam') # output: 4
它不漂亮,但是通过递归计算字符串的长度也不漂亮。为什么第二个版本不合法,为什么不能使用迭代循环?这个函数似乎是对
len
的低效模仿。它很好,但还不够好。你看,如果我继续使用这个函数,lenRecur.number会上升,up并且每次都给出不正确的答案,所以我不能使用它=(是的,确实如此。你可以用简单的方法来解决它,使用一个额外的参数来防止函数在它恢复时重置计数器,或者用困难的方法,使用inspect
模块来检查调用方并重置计数器(如果不是我们自己)。