Python TypeError报错排查:FizzBuzz程序空列表初始化异常
FizzBuzz程序异常原因解析
需求
- 当数字能被3整除时,打印"Fizz"而非数字;
- 当数字能被5整除时,打印"Buzz"而非数字;
- 当数字同时能被3和5整除(如15)时,打印"FizzBuzz"而非数字。
编写的代码
lista = [] for numero in range(1,101): lista.append(numero) for numero2 in lista: if numero2 % 3 == 0 and numero2 % 5 ==0: lista[numero2] = "FizzBuzz" elif numero2 % 3 ==0: lista[numero2] = "Fizz" elif numero2 % 5 == 0: lista[numero2] = "Buzz" for final in lista: print(final)
问题
初始化lista = []时会报错TypeError: Not all arguments converted during string formatting;但初始化lista = [0]时程序可以正常运行,这是为什么?
原因说明
核心问题是列表索引越界,但报错信息看起来像是字符串格式化问题,这是Python旧版本的特殊错误提示逻辑导致的误导。
当
lista = []时,循环range(1,101)会向列表添加1到100,此时列表长度为100,合法索引范围是0~99。但第二个循环里你用numero2(即1~100的数字)作为索引修改列表:- 比如
numero2=100时,lista[100]超出了列表的最大索引99,Python本应抛出IndexError,但旧版本中会把这个错误错误解析成字符串格式化错误(因为%既是取模运算符也是字符串格式化符号),所以显示TypeError。
- 比如
当
lista = [0]时,添加1到100后列表长度变为101,合法索引范围是0~100。此时numero2的最大值100刚好对应列表的最后一个索引,不会触发索引越界,因此程序能正常执行。
优化方案
没必要先存列表再修改,直接循环判断打印更简洁:
for numero in range(1, 101): if numero % 3 == 0 and numero % 5 == 0: print("FizzBuzz") elif numero % 3 == 0: print("Fizz") elif numero % 5 == 0: print("Buzz") else: print(numero)
如果一定要用列表存储结果,应该通过索引遍历,而非遍历列表元素:
lista = list(range(1, 101)) for i in range(len(lista)): numero = lista[i] if numero % 3 == 0 and numero % 5 == 0: lista[i] = "FizzBuzz" elif numero % 3 == 0: lista[i] = "Fizz" elif numero % 5 == 0: lista[i] = "Buzz" for final in lista: print(final)
内容的提问来源于stack exchange,提问作者karla aguirre
相关产品推荐
相关产品推荐

