为什么我的参数没有在python中定义?

时间:2013-11-05 23:03:29

标签: python defined

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

3 个答案:

答案 0 :(得分:1)

您的代码中存在几个问题:

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

  2. sum(digits)无效,因为digits是一个字符串。

  3. 直接循环遍历字符串而不是使用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 comprehensionitertools.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)