Range函数参数引发TypeError:字符串格式化未转换所有参数问题排查
FizzBuzz程序的TypeError问题解析
问题背景
我是编程新手,刚学习Python。我编写FizzBuzz程序(打印1-100,3的倍数输出Fizz,5的倍数输出Buzz,同时是3和5的倍数输出FizzBuzz),当使用my_list = [x for x in range(1,101)]时,程序抛出TypeError: not all arguments converted during string formatting;但将range起始值改为0后程序正常运行,我无法理解原因,希望得到帮助。
报错代码
my_list = [x for x in range(1,101)] for number in my_list: if number%3 ==0 and number%5 ==0: my_list[number] = "FizzBuzz" elif number%3 == 0: my_list[number] = "Fizz" elif number%5 == 0: my_list[number] ="Buzz"
报错信息
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_5324\196912280.py in <module> 7 8 for number in my_list: ----> 9 if number%3 ==0 and number%5 ==0: 10 my_list[number] = "FizzBuzz" 11 elif number%3 == 0: TypeError: not all arguments converted during string formatting
修改后正常运行的代码
my_list = [x for x in range(0,101)] for number in my_list: if number%3 ==0 and number%5 ==0: my_list[number] = "FizzBuzz" elif number%3 == 0: my_list[number] = "Fizz" elif number%5 == 0: my_list[number] ="Buzz" print(my_list)
修改后运行结果
['FizzBuzz', 1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', 31, 32, 'Fizz', 34, 'Buzz', 'Fizz', 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', 43, 44, 'FizzBuzz', 46, 47, 'Fizz', 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', 61, 62, 'Fizz', 64, 'Buzz', 'Fizz', 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', 73, 74, 'FizzBuzz', 76, 77, 'Fizz', 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', 91, 92, 'Fizz', 94, 'Buzz', 'Fizz', 97, 98, 'Fizz', 'Buzz']
核心问题解析
你混淆了列表元素的值与列表的索引,这是导致错误的关键。
代码1报错的原因
用my_list = [x for x in range(1,101)]创建的列表中:
- 元素值是1到100
- 对应索引是0到99
循环中你用number(元素值)作为索引修改my_list[number],会引发两个问题:
- 索引错配:比如
number=3(元素值),你修改的是my_list[3](对应元素值4),把它改成字符串"Fizz"。 - 字符串干扰运算:后续循环遍历到这个被修改的字符串元素时,
number变成字符串"Fizz",此时执行"Fizz"%3,Python会将%识别为字符串格式化操作,但"Fizz"中没有格式化占位符(如%d),无法匹配传入的3,因此抛出TypeError。
修改后代码正常的原因
用my_list = [x for x in range(0,101)]创建的列表中:
- 元素值是0到100
- 对应索引也是0到100
此时number(元素值)和索引完全对应,修改my_list[number]就是修改该数值所在的位置。而且循环遍历的是初始列表的所有整数元素,在循环过程中number始终是整数类型,不会遇到被修改后的字符串,因此不会触发格式化错误。
更简洁的写法
不需要提前创建列表再修改,直接遍历数值输出或用列表推导式生成结果即可:
# 直接输出版本 for number in range(1, 101): if number % 3 == 0 and number % 5 == 0: print("FizzBuzz") elif number % 3 == 0: print("Fizz") elif number % 5 == 0: print("Buzz") else: print(number) # 列表推导式版本 result = [ "FizzBuzz" if x%3==0 and x%5==0 else "Fizz" if x%3==0 else "Buzz" if x%5==0 else x for x in range(1, 101) ] print(result)
内容的提问来源于stack exchange,提问作者Brian Chedrawi
相关产品推荐
相关产品推荐

