2

我才刚刚开始将 python 作为我的第一语言学习,虽然我为 fizzbuzz 编写了代码,但我一辈子都无法用它来完成以下项目。我还希望它水平打印而不是垂直打印。任何帮助都会很棒(头晕目眩)。创建一个执行此操作的函数。例如

fizzbuzz(20) 

会打印 1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16,17,fizz,19,buzz

def fizzbuzz(n):

    for x in range (101):
        if x%3==0 and x%5==0:
            print("fizz buzz")
        elif x%3==0:
            print('fizz')
        elif x%5==0:
            print('buzz')
        else:
            print (x)    

def main():
  print(fizzbuzz(20))
4

12 回答 12

6

更短:

for n in range(100):
    print("Fizz"*(not n % 3) + "Buzz"*(not n % 5) or n)

是的,但是为什么?

为了理解这一点,让我们分别看一下各个部分。

"Fizz"*(not n % 3)

在 Python 中,我们可以“相乘”字符串,因此"a"*3会产生"aaa". 您还可以将字符串与布尔值相乘:"a" * Trueis "a",而"a" * Falseis 是一个空字符串,""。这就是我们的"Fizz" 在这里发生的事情。当n % 3 == 0(即 n 为 3、6、9、...)时,not n % 3将与 相同not 0,即True。相反,何时n为1、2、4、5、7、...。 .. thenn % 3将是 1 或 2,并且not n % 3为 false。换句话说,每当 n 可被 3 整除时,该术语"Fizz"*(not n % 3)将字符串乘以"Fizz"True,如果不是,则乘以 False,结果为空细绳。

相同的逻辑适用于下一部分"Buzz"*(not n % 5)n当它不能被 5 整除时它会给我们一个空字符串,"Buzz"当它被 5 整除时它会给我们一个字符串。

现在我们将这两件事加在一起:

"Fizz"*(not n % 3) + "Buzz"*(not n % 5)

当 n既不能被 3 也不能被 5 整除时,这将把两个空字符串加在一起(即。"" + ""),这当然会给我们另一个空字符串。在这种情况下,整个打印语句的内容为print("" or n). 由于空字符串是 False-y,它将打印我们的数字 n。如果 n 可以被 3 整除(但不是 5),这将是print("Fizz" or n),并且由于"Fizz"是 Truthy,它只会打印它并省略数字。

奖励积分

或者,如果你真的想给面试官留下深刻印象,

for n in range(100):
    print("FizzBuzz"[n%-3&4:12&8-(n%-5&4)] or n)
于 2016-05-27T19:56:05.343 回答
3

将项目收集到一个列表中。然后在函数结束时打印列表。您可以使用逗号将这些项目连接在一起', '.join(...)

def fizzbuzz(n):
    result = []
    for x in range(1, n+1):
        if x % 3 == 0 and x % 5 == 0:
            result.append("fizz buzz")
        elif x % 3 == 0:
            result.append('fizz')
        elif x % 5 == 0:
            result.append('buzz')
        else:
            result.append(str(x))
    return result

def main():
    print(', '.join(fizzbuzz(20)))

main()

也很高兴知道print(..., end=', ')最后会打印“水平”并带有逗号和空格,这几乎可以解决您的问题,除了最后一个项目最后也会有逗号和空格,这不是您想要的.


(1) 将打印与计算分开,(2) 使函数可重用通常是一个好主意。您通常希望计算比打印更频繁。将来,您可能希望在打印之前将计算传递给其他函数。所以立即打印的功能没有那么有用。所以我建议将打印语句从fizzbuzz.

您可以返回 string ', '.join(result),但这有多大用处?该列表result可能(将来)对进一步处理更有用,所以我选择了 return result。我为该main功能留下的印刷品。

于 2013-08-25T09:23:56.230 回答
2
def fizzbuzz(numbers, fizz, buzz):
    x = ['Fizzbuzz' if x % fizz == 0 and x % buzz == 0 else 'Fizz' if x % fizz == 0 else 'Buzz' if x % buzz == 0 else x for x in numbers]
    return x
于 2016-06-25T09:04:52.570 回答
1

优雅一些

def fizzbuzz(n):
    for x in range(1,n+1):
        if not x % 15:
            yield 'fizz buzz'
        elif not x % 3:
            yield 'fizz'
        elif not x % 5:
            yield 'buzz'
        else:
            yield x

if __name__ == "__main__":
    print ','.join(fizzbuzz(20))
于 2014-08-04T04:35:56.640 回答
1

我是新手编码员,所以有些答案我不明白,或者似乎并不直接适用于我的问题。此答案将 Fizz_Buzz 作为变量合并,x 的范围由用户确定。我查看了上述解决方案并提出了这个:

def Fizz_Buzz(x): 
     for x in range (0,x):      
        if x % 3 == 0 and x % 5 == 0:           
            print('FizzBuzz')       
        elif x % 3 == 0:            
            print('Fizz')       
        elif x % 5 == 0:            
            print ('Buzz')      
        else:           
            print (x)
于 2016-09-10T05:16:41.310 回答
1

您可以添加end=', '到 print 以便在同一行上打印,使用您想要分隔值的任何字符。

class FizzBuzz:
    @staticmethod
    def fizz_buzz(n):
        if n % 15 == 0:
            return 'FizzBuzz'
        elif n % 3 == 0:
            return 'Fizz'
        elif n % 5 == 0:
            return 'Buzz'
        else:
            return str(n)

    def __str__(self, rng):
        [print(self.fizz_buzz(n), end=', ') for n in range(1, rng + 1)]

但它,最终会离开。反而:

    def __str__(self, rng):
        print(', '.join(self.fizz_buzz(n) for n in range(1, rng + 1)))
于 2016-10-21T09:24:36.163 回答
1

再来一个 :) 只是为了好玩 :)

get_index = lambda i: bool(i%3)+2*bool(i%5) if i !=0 else 3
afb = lambda x: ('fizzbuzz','buzz', 'fizz', str(x))[get_index(x)]
fizzbuzz = lambda inpt: print(','.join([ afb(i) for i in inpt ]))
fizzbuzz(range(101))

'0,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 ,嗡嗡声

于 2017-03-22T14:59:35.717 回答
1

我做了一个适用于任何数字和单词的 fizzbuzz,所以如果你愿意,你可以做 fizzbuzzfuzz。我做了 6 行(如果算上穿过 fizzfuzz 的行,则为 7)

def f(n:int,m:list,w:list):
    s=''
    for x in m:
        if n%x==0:    s+=w[m.index(x)] 
    if s=='':  s=n
    return s
for i in range(1, 100 +1):  print(f(i,[3,5],['Fizz','Buzz']))
于 2019-11-21T20:20:56.587 回答
0
def fizzbuzz(num):
    if x % 3 == 0 and x % 5 == 0:
    return "Fizz Buzz"
    elif x % 3 == 0:
        return "Fizz"
    elif x % 5 == 0:
        return "Buzz"
    else:
        return x    

MAXNUM = 100
for x in range (MAXNUM):
    print fizzbuzz(x)
于 2015-03-05T15:06:30.020 回答
0

我发现以下效果很好(Python 3):

def fizzbuzz():
for i in range(1,101):
    print("Fizz"*(i%3==0)+"Buzz"*(i%5==0) or i)

print (fizzbuzz())
于 2016-01-09T13:31:35.340 回答
0

这是一个有趣的(显然不是最好的可读性,但考虑列表推导仍然很有趣):

def fizzBuzz():
    print(", ".join(["FizzBuzz" if x%15==0 else "Fizz" if x%3 == 0 else "Buzz" if x%5==0 else str(x) for x in range(1,101)]))

别忘了,3 和 5 互质!所以你可以检查x % 15而不是(x % 3 and x % 5)“FizzBu​​zz”。

于 2016-04-25T15:24:06.680 回答
0

另一个具有列表理解和 Python3 的

def is_mod_zero(num, *div):
    return not [d for d in div if num % d is not 0]

def fizz_buzz(num):
    if is_mod_zero(num, 3, 5):
        return 'FizzBuzz'
    if is_mod_zero(num, 3):
        return 'Fizz'
    if is_mod_zero(num, 5):
        return 'Buzz'
    return num

if __name__ == "__main__":
    for i in range(100):
        print(fizz_buzz(i))
于 2017-08-01T09:55:20.753 回答