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.以下是我尝试过的事情:
lenRecur函数之外它第一次工作正常,但是如果我再试一次而不重新启动python shell,那么计数(显然)不会重启,所以它会不断添加.count += 1行count = 1,但输出(显然)是一个.所以,我的目标是使用递归获取字符串的长度,但我不知道如何跟踪字母数.我搜索了有关全局变量的信息,但我仍然陷入困境.我不知道我还没有理解它,或者我的代码中有问题.
提前致谢!
Mar*_*ers 16
count在lenRecur是不是一个全球性的.它是一个范围变量.
在以这种方式完成工作之前,您需要使用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)
我想你可以把计数作为第二个参数
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)
这应该比从外部范围静音对象更好,例如使用可变对象(list或dict)或猴子修补功能本身.