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

使用字典实现的FizzBuzz程序为何将0判定为FizzBuzz?

哈哈,这个坑我刚学Python的时候也踩过!咱们一步步来拆解问题,解决你的困扰~

为什么开头会输出FizzBuzz?

核心原因在你调用range(145)的地方:Python的range()函数如果只传一个参数,默认是从0开始生成序列,到参数值的前一个数结束(也就是0到144)。而数学上,0除以任何非零整数的余数都是0,所以循环的第一个值i=0会同时满足i%3==0和i%5==0的条件,直接把字典里的Fizz和Buzz拼接起来,就出现了开头的FizzBuzz。

另外还有个隐性问题:你定义字典时写的{3:Fizz,5:Buzz}里,Fizz和Buzz没加引号,这会被Python当成未定义的变量,运行时会直接报错,得改成字符串字面量'Fizz'和'Buzz'才行。

修复后的代码

我把问题点都修正了,还优化了遍历字典的方式,可读性更强:

def fizzbuzz(multiples, *args):
    for i in range(*args):
        output = ''
        # 直接遍历字典的键值对,比单独取key再拿value更直观
        for num, word in multiples.items():
            if i % num == 0:
                output += word
        # 如果output为空,就用数值本身替代
        if not output:
            output = i
        print(output)

# 修复字符串引号问题
multiples = {3: 'Fizz', 5: 'Buzz'}
# 传递两个参数给range:起始值1,结束值145,这样就从1开始循环到144
fizzbuzz(multiples, 1, 145)
stall = input("")
额外小优化

如果想让代码更简洁,可以用生成器表达式来拼接字符串,再利用or的特性简化判断:

def fizzbuzz(multiples, *args):
    for i in range(*args):
        output = ''.join(word for num, word in multiples.items() if i % num == 0)
        print(output or i)

multiples = {3: 'Fizz', 5: 'Buzz'}
fizzbuzz(multiples, 1, 145)
stall = input("")

内容的提问来源于stack exchange,提问作者DopaZilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:16