Python报错'str' object is not callable:likes函数问题排查
问题分析与修复
让我们一步步拆解你代码里的问题:
1. 字符串被当作函数调用(触发'str' object is not callable的核心原因)
你的字典里,键0对应的是直接的字符串值:"no one likes this",但其他键对应的是lambda函数。当len(names) == 0时,你的return语句会执行:
dictionary_of_sizes[0](names)
这相当于把字符串当作函数去调用,自然会抛出'str' object is not callable错误。
2. 变量名拼写错误
在键3对应的lambda里,你写了name[0](少了末尾的s),正确应该是names[0],否则会触发NameError: name 'name' is not defined。
3. return语句的逻辑漏洞
当len(names) >=4时,你直接返回了dictionary_of_sizes[4]这个lambda函数对象,而没有调用它并传入names参数,这会导致返回的是函数本身而不是预期的字符串。
修复后的代码
我们可以把字典里所有值都统一为lambda函数(包括键0的情况),同时修正拼写错误和return逻辑:
def likes(names): dictionary_of_sizes = { 0: lambda names: "no one likes this", 1: lambda names: "{} likes this".format(names[0]), 2: lambda names: "{} and {} like this".format(names[0], names[1]), 3: lambda names: "{}, {} and {} like this".format(names[0], names[1], names[2]), 4: lambda names: "{}, {} and {} others like this".format(names[0], names[1], len(names)-2) } # 根据长度选择对应的函数,长度>=4时用键4的函数 size_key = min(len(names), 4) return dictionary_of_sizes[size_key](names)
为什么这样改?
- 所有字典值都是lambda函数,保证了无论长度是多少,我们都是调用函数来获取结果,避免了字符串被当作函数调用的问题。
- 用
min(len(names), 4)来统一处理长度>=4的情况,不需要单独写else分支,逻辑更简洁。 - 修正了
name[0]的拼写错误,改为names[0]。
测试几个案例验证:
print(likes([])) # 输出: no one likes this print(likes(["Alice"])) # 输出: Alice likes this print(likes(["Alice", "Bob"])) # 输出: Alice and Bob like this print(likes(["Alice", "Bob", "Charlie"])) # 输出: Alice, Bob and Charlie like this print(likes(["Alice", "Bob", "Charlie", "David"])) # 输出: Alice, Bob and 2 others like this
内容的提问来源于stack exchange,提问作者Vinícius Oliveira Barros
相关产品推荐
相关产品推荐

