在我调试代码之前,我想知道为什么在调用函数时出现错误? 它说“NameError:name'stDigs'未定义”。我尝试过使用“avgUntilLetter(0123a)”和“avgUntilLetter(”0123a“)”,但它们都不起作用。帮帮我吧!
此函数接收一个包含数字或字母的字符串作为输入。 该函数应返回一个浮点数,其中包含从第一个位置开始的字符串中的所有数字计算的平均值,并考虑所有数字,直到找到一个字母或直到到达字符串的末尾。
一个例子: avgUntilLetter('0123a456')应返回1.5
def avgUntilLetter (stDigs):
num = 0
each_char = stDigs[num]
while each_char.isdigit() == True and num < len(stDigs):
num = num + 1
each_char = stDigs[num]
digits = stDigs[0:num]
avg = sum(digits)/len(digits)
return avg
avgUntilLetter(stDigs)
是的,我知道有很多错误需要解决。我只需要一次解决一个问题。当我使用“avgUntilLetter(”0123a“)”调用该函数时,定义的错误消失但突然出现类型错误。嗯..我还在继续尝试。
答案 0 :(得分:1)
您的代码中存在几个问题:
您最终可能会尝试访问stDigs[len(stDigs)]
,因为num < len(stDigs)
可能属实,但在将其用作索引之前添加1。
sum(digits)
无效,因为digits
是一个字符串。
直接循环遍历字符串而不是使用while
循环,将循环中的数字相加:
def avgUntilLetter(stDigs):
total = i = 0
for i, each_char in enumerate(stDigs):
if not each_char.isdigit():
break
total += float(each_char)
if i:
return total / i
return 0.0
这也处理边缘情况:
>>> avgUntilLetter('0123a456')
1.5
>>> avgUntilLetter('')
0.0
>>> avgUntilLetter('abc')
0.0
答案 1 :(得分:0)
TypeError
来自这一行:
avg = sum(digits)/len(digits)
因为它之前的那个使digits
成为一个字符串。并且,您不能在字符串上使用sum
。
您可以通过将以上行更改为:
来修复代码# `avg = float(sum(map(int, digits)))/len(digits)` if you are on Python 2.x
avg = sum(map(int, digits))/len(digits)
但是,使用list comprehension和itertools.takewhile
可以更轻松,更高效地完成这项工作:
>>> from itertools import takewhile
>>> def avgUntilLetter(stDigs):
... digits = [int(x) for x in takewhile(str.isdigit, stDigs)]
... return sum(digits)/len(digits) if digits else 0.0
...
>>> avgUntilLetter('0123a456')
1.5
>>> avgUntilLetter('123456789')
5
>>> avgUntilLetter('a1')
0.0
>>> avgUntilLetter('')
0.0
>>>
请注意,上面的代码适用于Python 3.x.要将其转换为Python 2.x.,请将return语句更改为:
return float(sum(digits))/len(digits) if digits else 0.0
由于Python 2.x处理分区的原因,你需要float
。
答案 2 :(得分:0)
stDigs
未分配给任何值。
avgUntilLetter([])
stDigs = []
avgUntilLetter(stDigs)
在你的情况下,它是一个字符串,jsut首先将stDigs
设置为一个字符串。
stDigs = ""
avgUntilLetter(stDigs)