0

在调试代码之前,我想知道为什么调用函数时会出错?它说“NameError:名称'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”)”调用该函数时,定义的错误消失了,但弹出了一个类型错误。嗯..我还在继续尝试。

4

3 回答 3

1

您的代码中有几个问题:

  1. 您最终可能会尝试访问stDigs[len(stDigs)],因为这num < len(stDigs)可能是真的,但是您在将其用作索引之前添加了 1。

  2. 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
于 2013-11-05T23:12:36.880 回答
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)

但是,您可以通过列表理解更轻松、更有效地完成这项工作,并且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 float(sum(digits))/len(digits) if digits else 0.0

float由于 Python 2.x 处理除法的方式,您需要在那里。

于 2013-11-05T23:07:27.327 回答
0

stDigs未分配任何值。

avgUntilLetter([])

stDigs = []
avgUntilLetter(stDigs)

在你的情况下,它是一个字符串,jsutstDigs首先设置为一个字符串。

stDigs = ""
avgUntilLetter(stDigs)
于 2013-11-05T23:07:41.867 回答