You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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],会引发两个问题:

  1. 索引错配:比如number=3(元素值),你修改的是my_list[3](对应元素值4),把它改成字符串"Fizz"。
  2. 字符串干扰运算:后续循环遍历到这个被修改的字符串元素时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:10:32