【问题标题】:Python FizzBuzz [closed]Python FizzBu​​zz [关闭]
【发布时间】:2014-03-30 12:11:17
【问题描述】:

我在 Python 中得到了这个问题:

从用户那里获取一个数字列表并在该列表上运行 FizzBu​​zz。

当你遍历列表时,记住规则:

1) 如果数字可以被 3 和 5 整除,则打印 FizzBuzz

2) 如果它只能被 3 整除,则打印Fizz

3) 如果它只能被 5 整除,则打印 Buzz

4) 否则只打印数字

还要记住 elif!

我创建了以下脚本,但如果 n%3=True 出现错误

n=input()
    if n%3=True:
        print("Fizz")
    else if n%5=True:
        print ("Buzz")
    elif print n

有人可以帮忙吗?非常感谢!

【问题讨论】:

标签: python python-2.7 fizzbuzz


【解决方案1】:

您的代码存在一些问题。第一个问题是,为了比较,您应该使用==,而不是=,后者用于assignment

第二个问题是您要检查除法的其余部分(取模运算符计算的结果)是否为 ,而不是 true,即真的没有意义。

您应该使用elif 表示“否则如果...”,使用else 表示“否则”。并且您需要修复 else 子句的格式。

你想要:

n=input()
if n%3 == 0:
    print("Fizz")
elif n%5 == 0:
    print ("Buzz")
else:
    print n

最后,你的代码不符合规范:

1) 如果数字可以被 3 和 5 整除,则打印“FizzBu​​zz”

上面不会这样做。这部分我将留给你,因为我不是来为你解决任务的:)

【讨论】:

  • OP 在else 语句中忘记了:。 ;)
  • @SukritKalra 还有!
  • 另外,由于 OP 使用的是 print n,我假设他在 2.x 上,其中 True == 1False == 0。编写代码的方式不是很好,但没有任何问题。
  • @SukritKalra 在这种情况下,他还是搞错了。
【解决方案2】:

基于this

FizzBu​​zz:对于不超过 100 的整数,如果整数可以被 3 和 5 (15) 整除,则打印 FizzBu​​zz;如果它可以被 3(而不是 5)整除,则发出嘶嘶声;嗡嗡声,如果它可以被 5(而不是 3)整除;否则为整数。

def FizzBuzz():
    for i in range(1,101):
        print {
            3 : "Fizz",
            5 : "Buzz",
            15 : "FizzBuzz"}.get(15*(not i%15) or
                                 5*(not i%5 ) or
                                 3*(not i%3 ), '{}'.format(i))

.get() 方法在这里创造了奇迹。

如下操作

对于从 1 到 100 的所有整数(不包括 101),
根据这些规则打印我们通过 get 调用的字典键的值。

"获取get 调用中的第一个非 False 项,或将整数作为字符串返回。"

在检查 True 值时,即我们可以查找的值时,Python 将 0 计算为 False。如果 i mod 15 = 0,则为 False,我们将转到下一个。

因此我们NOT 每个'mods'(又名余数),所以如果mod == 0,which == False,我们得到一个True 语句。我们将True 乘以返回字典键的字典键(即3*True == 3

当整数不能被 3、5 或 15 整除时,我们会使用默认子句打印 int '{}'.format(i) 只是将 i 作为字符串插入到该字符串中。

部分输出

嘶嘶声
79
嗡嗡声
嘶嘶声
82
83
嘶嘶声
嗡嗡声
86
嘶嘶声
88
89
FizzBu​​zz
91
92
嘶嘶声
94
嗡嗡声
嘶嘶声
97
98
嘶嘶声
嗡嗡声

【讨论】:

    【解决方案3】:

    n % 3(或n % 任何数字)不会计算为TrueFalse,它不是布尔表达式。另一方面,n % 3 == 0 确实如此。

    顺便说一句,当n % 3 == 0n % 5 == 0 都评估为True 时会发生什么?

    【讨论】:

    • @geoffspear 是对的,它们是int 的子类(可以用isinstance(True, int) 检查)。在 Python 中,True+34False*50。因此,n%3 == 0n%3 == False 可以检查被 3 整除,即使后者不直观。
    【解决方案4】:

    我找到的最短答案之一是

    c=1
    while c<101:print((c%3<1)*'Fizz'+(c%5<1)*'Buzz'or c);c+=1
    

    61 个字符

    【讨论】:

      【解决方案5】:

      这是我使用生成器的方法。 解释被添加为 cmets。

      # the factors to check for, along with its
      # associated text data.
      FACTORS = {
          3 : "Fizz",
          5 : "Buzz",
      }
      
      
      def fizzbuzz(start, stop):
          """FizzBuzz printer"""
          for i in range(start, stop+1):
              string = ""  # build string
      
              # iterate through all factors
              for j, dat in FACTORS.items():
                  # test for divisibility
                  if i % j == 0:
                      # add data to string if divisible
                      string += dat
      
              if not string:
                  # if string's length is 0, it means,
                  # all the factors returned non-zero
                  # modulus, so return only the number
                  yield str(i)
              else:
                  # factor had returned modulo as 0,
                  # return the string
                  yield string
      
      
      if __name__ == "__main__":
          for each in fizzbuzz(1, 100):
              print(each)
      

      此版本的优点是不依赖任何额外的因素检查。

      【讨论】:

        【解决方案6】:

        使其适用于任何整数,无论​​是正数还是负数。 通过创建关键字字典,还可以轻松地将其扩展到任何整数的其他关键字。

        def checkdict(divdict, i):
            out = ""
            for key in divdict:
                if key != 0:
                    if i%key==0:
                        out+=divdict[key]
                if key == 0 and i == 0:
                        out+=divdict[key]
            if out == "":
                out = i
            print(out)
        
        if __name__ == "__main__":
            mydict = {3:"Fizz",5:"Buzz"}
            for i in range(-50,50):
                checkdict(mydict, i)
        

        【讨论】:

        • 实际上这段代码的输出没有明确定义:迭代 a 没有可预测的顺序(因此对于 15 可能会创建 'FizzBu​​zz' 或 'FuzzBizz'),我认为这是一个很好的例子对于过度工程:它比要求的更通用,并且增加了很多复杂性;另一方面,命名也不是很好。
        【解决方案7】:
        def check(num):
            finalWord = ''
            for k,v in numWordDict.items():
                if num % k == 0:
                    finalWord += v
        
            if not finalWord:
                return num
            else: 
                return finalWord
        
        def FizzLoop(start=0, stop=10, step=1):
            for i in range(start, stop, step):
                print(check(i))
        
        
        numWordDict = {3:'fizz', 6:'buzz', 5:'fiver'}
        
        FizzLoop(0, 10)
        print("----------")
        FizzLoop(0, 50, 5)
        

        【讨论】:

        • 您好 user12616353!欢迎来到堆栈溢出!下次您要添加答案时,请尝试添加一些解释:)
        【解决方案8】:
        Numbers = [3, 5]
        Labels = ["Fizz", "Buzz"] 
        
        for i in range(1, 101):
            Output ="" 
            for j in range (len(Numbers) ) : 
                if i % Numbers[j] == 0:
                    Output = Output + Labels[j]     
                      
                if Output =="" :                           
                     print(i) 
                else:
                     print(Output)
        

        【讨论】:

        • 感谢@Seljuk Gülcan 的修复。好的,所以使用这个脚本很容易添加更多的数字和标签,因为我希望很容易看到。
        【解决方案9】:

        没什么花哨的,使用while循环来达到同样的效果:

        x,xx = 1,100
        xy,xz = 3,5
        mylist = []
        
        while x <= xx:
            y = (x/xy).is_integer()
            z = (x/xz).is_integer()
        
            if y and z:
                mylist.append("fizzbuzz")
            elif y:
                mylist.append("fizz")
            elif z:
                mylist.append("buzz")
            else:
                mylist.append(x)
            x+=1
        
        print(mylist)
        

        【讨论】:

          【解决方案10】:

          请在下面找到 1 行代码(列表理解)代码。希望这很容易理解。如果不是,请告诉我。我会详细说明。

          N = 10 #user_input
          print(list(map(lambda n: "Fizz" if (n % 3 == 0) else ( "Buzz" if (n % 5 == 0) else n),[i for i in range(1,N+1)])))
          

          【讨论】:

            【解决方案11】:
            def fizz_buzz(input):
              if (input % 3 == 0) and (input % 5 == 0):
                 return "FizzBuzz"
              if input % 3 == 0:
                 return "Fizz"
              if input % 5 == 0:
                 return "Buzz"
              return input
            
            
            print(fizz_buzz(15))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-03-16
              • 1970-01-01
              • 1970-01-01
              • 2012-02-21
              • 2018-07-18
              • 2012-11-04
              • 1970-01-01
              相关资源
              最近更新 更多