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
模块来检查调用方并重置计数器(如果不是我们自己)。