需要帮助来理解python代码 - 我是Python的初学者

时间:2017-01-20 06:57:22

标签: python algorithm

下面有这个算法问题,我可以在网上找到一个解决方案,看起来很像我想出的但是我无法理解3和5部分的倍数。

问题是"编写一个程序,输出从1到n的数字的字符串表示。但是对于三倍的倍数,它应输出“Fizz”而不是数字,并输出五个输出“Buzz”的倍数。对于三个和五个输出“FizzBu​​zz”的倍数的数字。"

这是谷歌的解决方案:

def fizzBuzz(n):
    for i in range(1,n+1):
        return ['Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in range(1, n+1)]

这就是我想为类似的问题做的事情:

def nicFizzbuzz(n):
    for i in range(1,n+1):
        #print(i)
        if ( not i % 3):
            print('Fizz')
        elif(not i % 5):
            print('Buzz')
        elif(not i % 3) and (not i % 5):
            print("FizzBuzz")
        else:
            print(i)

有人可以解释我哪里出错吗?

3 个答案:

答案 0 :(得分:1)

你必须先写下3和5的案例。

def nicFizzbuzz(n):
  for i in range(1,n+1):
    #print(i)
    if(not i % 3) and (not i % 5):
      print("FizzBuzz")
    elif ( not i % 3):
        print('Fizz')
    elif(not i % 5):
        print('Buzz')
    else:
        print(i)

答案 1 :(得分:0)

您正在评估错误的条件。让我们假设n是从1到20.你希望看到“FizzBu​​zz”打印在15处。但是从你的函数中,你首先评估15可以被3整除,这是真的。该函数不评估其余条件并移至16。

一个简单的解决方法是将3和5的可分性条件移到顶部,如

def nicFizzbuzz(n):
    for i in range(1,n+1):
        if(not i % 3) and (not i % 5):
            print("FizzBuzz")  
        elif ( not i % 3):
            print('Fizz')
        elif(not i % 5):
            print('Buzz')
        else:
            print(i)

n = 20

nicFizzbuzz(n)

,这导致

  

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBu​​zz 16 17 Fizz   19 Buzz

答案 2 :(得分:0)

将测试值移到3和5之上的值可以在其他测试之上移动,这是获得正确结果的好方法,但我想添加另一种方法来实现这一点。
而不是单独对每个组合进行测试,而是。此版本不是使用elif,而是累积要打印的值。

def nicFizzbuzz(n):
    for i in range(1,n+1):
        val = ''
        if (not i % 3):
            val += 'Fizz'
        if (not i % 5):
            val += 'Buzz'
        print(val or i)