递归中的全局变量.蟒蛇

Car*_*ans 7 python variables recursion global

好的,我正在使用Python 2.7.3,这是我的代码:

def lenRecur(s): 

    count = 0

    def isChar(c):
        c = c.lower()
        ans=''
        for s in c:
            if s in 'abcdefghijklmnopqrstuvwxyz':
                ans += s
        return ans

    def leng(s):
        global count
        if len(s)==0:
            return count
        else:
            count += 1
            return leng(s[1:])

    return leng(isChar(s))
Run Code Online (Sandbox Code Playgroud)

我正在尝试修改函数count内部的变量leng.以下是我尝试过的事情:

  1. 如果我把变量count放在lenRecur函数之外它第一次工作正常,但是如果我再试一次而不重新启动python shell,那么计数(显然)不会重启,所以它会不断添加.
  2. 如果我改变它也count += 1count = 1,但输出(显然)是一个.

所以,我的目标是使用递归获取字符串的长度,但我不知道如何跟踪字母数.我搜索了有关全局变量的信息,但我仍然陷入困境.我不知道我还没有理解它,或者我的代码中有问题.

提前致谢!

Mar*_*ers 16

countlenRecur不是一个全球性的.它是一个范围变量.

在以这种方式完成工作之前,您需要使用Python 3; 您正在寻找添加到Python 3 的nonlocal声明.

在Python 2中,您可以通过使用mutable(例如列表)来解决此限制count:

def lenRecur(s): 

    count = [0]

    # ...

    def leng(s):
        if len(s)==0:
            return count[0]
        else:
            count[0] += 1
            return lenIter(s[1:])
Run Code Online (Sandbox Code Playgroud)

现在你不再改变这个count名字了; 它保持不变,它一直指的是同一个列表.所有你正在做的是改变的第一个元素包含count列表中.

另一种"拼写"是制作count一个函数属性:

def lenRecur(s): 

    # ...

    def leng(s):
        if len(s)==0:
            return leng.count
        else:
            leng.count += 1
            return lenIter(s[1:])

    leng.count = 0
Run Code Online (Sandbox Code Playgroud)

现在count不再是本地的lenRecur(); 它已成为不变lenRecur()功能的一个属性.

对于你的具体问题,你实际上是在思考问题.只需让递归进行求和:

def lenRecur(s):
    def characters_only(s):
        return ''.join([c for c in s if c.isalpha()])

    def len_recursive(s):
        if not s:
            return 0
        return 1 + len_recursive(s[1:])

    return len_recursive(characters_only(s))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> def lenRecur(s):
...     def characters_only(s):
...         return ''.join([c for c in s if c.isalpha()])
...     def len_recursive(s):
...         if not s:
...             return 0
...         return 1 + len_recursive(s[1:])
...     return len_recursive(characters_only(s))
... 
>>> lenRecur('The Quick Brown Fox')
16
Run Code Online (Sandbox Code Playgroud)


ole*_*leg 6

我想你可以把计数作为第二个参数

def anything(s):
    def leng(s, count):
        if not s:
            return count
        return leng(s[1:], count + 1)

    return leng(isChar(s), 0)
Run Code Online (Sandbox Code Playgroud)

这应该比从外部范围静音对象更好,例如使用可变对象(listdict)或猴子修补功能本身.

  • 你最好投票给我的解决方案,而不是评论它;) (2认同)