使用字典实现的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
相关产品推荐
相关产品推荐

