Python函数中已定义len_num却触发NameError,求问题排查方法
问题分析与解决
错误根源:缩进错误
你遇到的NameError完全是因为两个for循环没有缩进,跑到了函数is_armstrong_number的外部。len_num是函数内部定义的局部变量,函数外部的代码根本访问不到它,所以直接触发未定义错误。
你的代码还有其他问题,一起修正:
num_list没有初始化,直接调用insert会触发新的报错int(num_list)是无效操作,不能直接把列表转成整数,需要逐个转换元素- 循环范围
range(1, len_num)会跳过字符串的第一个字符(Python索引从0开始) - 阿姆斯特朗数的判断逻辑错误:应该是所有数字的
len_num次幂之和等于原数,不是单个数字的幂等于原数
修正后的完整代码
def is_armstrong_number(num): # 转换为字符串获取位数 num_str = str(num) len_num = len(num_str) # 初始化列表存储每个数字的整数形式 num_list = [] # 遍历字符串转成整数存入列表 for x in range(len_num): num_list.append(int(num_str[x])) # 计算所有数字的len_num次幂之和 total = sum(digit ** len_num for digit in num_list) # 判断并输出结果 if total == num: print("It is an armstrong number") else: print("It is not an armstrong number") # 测试示例 is_armstrong_number(153) # 输出:It is an armstrong number is_armstrong_number(123) # 输出:It is not an armstrong number
更简洁的Pythonic写法
其实可以省略列表,直接遍历字符串计算:
def is_armstrong_number(num): num_str = str(num) len_num = len(num_str) total = sum(int(digit) ** len_num for digit in num_str) print("It is an armstrong number" if total == num else "It is not an armstrong number")
内容的提问来源于stack exchange,提问作者harrshaw
相关产品推荐
相关产品推荐

