基本整数到字符串映射函数中的“函数对象不可下标”

1 投票
2 回答
5254 浏览
提问于 2025-04-15 23:55

我正在尝试写一个函数,目的是把任何小于1000的数字转换成文字形式。

每次在交互式提示符下运行我的代码时,它似乎都没有问题,但当我尝试导入wordify并用一个大于20的测试数字运行时,它就失败了,报错信息是“TypeError: 'function' object is unsubscriptable”(类型错误:'function'对象不可下标)。

根据这个错误信息,问题似乎出在它尝试从numString中提取数字时(比如从n = 24这个测试案例中提取数字4),编译器把numString当成了一个函数,而不是一个字符串。因为我在函数的第一行把numString定义为变量n的字符串,所以我不太明白为什么会这样。

如果能帮我解决这个错误,或者解释一下我为什么会遇到这个问题,那就太好了。

def wordify(n):
    # Convert n to a string to parse out ones, tens and hundreds later. 
    numString = str(n)

    # N less than 20 is hard-coded.
    if n < 21:
        return numToWordMap(n)
    # N between 21 and 99 parses ones and tens then concatenates.
    elif n < 100:
        onesNum = numString[-1]
        ones = numToWordMap(int(onesNum))
        tensNum = numString[-2]
        tens = numToWordMap(int(tensNum)*10)
        return tens+ones
    else:
        # TODO
        pass

def numToWordMap(num):
    mapping = {
    0:"",
    1:"one",
    2:"two",
    3:"three",
    4:"four",
    5:"five",
    6:"six",
    7:"seven",
    8:"eight",
    9:"nine",
    10:"ten",
    11:"eleven",
    12:"twelve",
    13:"thirteen",
    14:"fourteen",
    15:"fifteen",
    16:"sixteen",
    17:"seventeen",
    18:"eighteen",
    19:"nineteen",
    20:"twenty",
    30:"thirty",
    40:"fourty",
    50:"fifty",
    60:"sixty",
    70:"seventy",
    80:"eighty",
    90:"ninety",
    100:"onehundred",
    200:"twohundred",
    300:"threehundred",
    400:"fourhundred",
    500:"fivehundred",
    600:"sixhundred",
    700:"sevenhundred",
    800:"eighthundred",
    900:"ninehundred",
    }

    return mapping[num]


if __name__ == '__main__':
    pass

2 个回答

1

如果有人看到这里并遇到和我一样的问题,你可以得到一个指向函数对象的指针,如果返回了错误的变量名。例如,如果你有这样的函数:

 def foo():
   my_return_val = 0
   return return_val

 my_val = foo()

那么 my_val 将会是指向一个函数对象的指针。如果把 my_val 当成列表或数组来用,就会出现“TypeError: 'function' object is unsubscriptable”的错误,因为它其实是一个函数对象,而不是列表。

解决办法?很简单!只需要修正 foo 函数中返回给 my_return_val 的变量名就可以了。

2

这个错误的意思是,你在应该用列表的地方用了一个函数,像这样:

def foo(): pass
foo[3]

你肯定改了什么代码。

顺便说一下,wordify(40) 返回了 "fourty",我写成 "forty"。还有,你没有处理零的情况。

撰写回答