Python统计回文子串求和时报TypeError:int对象不可迭代错误
报错根因
触发TypeError: 'int' object is not iterable是三个问题叠加导致的:
- 变量作用域不匹配:
palindrome3是定义在repetition()函数内部for循环的局部变量,函数外部无法访问该变量 sum()函数用法错误:sum()要求传入可迭代对象(列表、元组等),len(palindrome3)返回值是单个整数,整数本身不可迭代,直接传入sum()必然报错- 函数无返回值:原
repetition()函数仅执行打印操作,没有把每轮的回文统计结果对外输出,无法做跨轮次累加
修复方案
调整函数逻辑,在函数内部完成20轮实验的计数累加,最终返回三类回文的总计数,再基于总计数计算出现概率即可,不需要在函数外部访问内部局部变量。
修复后的可运行代码如下:
import random import re def repetition(run_times=20): total_p3 = 0 total_p4 = 0 total_p5 = 0 print('轮次','长度3回文数','长度4回文数','长度5回文数') for e in range(run_times): # 生成长度为36的随机序列 seq = ''.join(random.choice('abcdg') for i in range(36)) secuencia = seq # 统计长度3回文 num3 = r'(?=(.{%d}))' % 3 length3 = re.findall(num3, secuencia) palindrome3 = list(filter(lambda x: x == x[::-1], length3)) cnt3 = len(palindrome3) total_p3 += cnt3 # 统计长度4回文 num4 = r'(?=(.{%d}))' % 4 length4 = re.findall(num4, secuencia) palindrome4 = list(filter(lambda x: x == x[::-1], length4)) cnt4 = len(palindrome4) total_p4 += cnt4 # 统计长度5回文 num5 = r'(?=(.{%d}))' % 5 length5 = re.findall(num5, secuencia) palindrome5 = list(filter(lambda x: x == x[::-1], length5)) cnt5 = len(palindrome5) total_p5 += cnt5 print(e+1, cnt3, cnt4, cnt5) return total_p3, total_p4, total_p5 # 运行20次实验拿到累加结果 sum_p3, sum_p4, sum_p5 = repetition(20) # 计算各长度子串总样本量,求概率 total_sub3 = 20 * (36 - 3 + 1) total_sub4 = 20 * (36 - 4 + 1) total_sub5 = 20 * (36 - 5 + 1) print("\n=== 20次实验统计结果 ===") print(f"长度3回文累计出现{sum_p3}次,出现概率{sum_p3 / total_sub3:.4f}") print(f"长度4回文累计出现{sum_p4}次,出现概率{sum_p4 / total_sub4:.4f}") print(f"长度5回文累计出现{sum_p5}次,出现概率{sum_p5 / total_sub5:.4f}")
代码改动说明
- 移除了函数外部无效的
sum()调用,直接在循环内完成计数累加,从根源避免整数不可迭代的报错 - 给函数增加返回值,对外输出20轮实验的累计回文数,解决局部变量外部无法访问的问题
- 用字符串切片
x[::-1]替换原有的反转写法,回文判断执行效率更高 - 补充了概率计算逻辑,运行后可直接得到需要的统计结果
内容的提问来源于stack exchange,提问作者user19272398
相关产品推荐
相关产品推荐

