试图将 fizzbuzz 变成 python 3 中的函数

新手上路,请多包涵

我才刚刚开始学习 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))

原文由 user2715061 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 626
2 个回答

将项目收集到列表中。然后在函数末尾打印列表。您可以使用 ', '.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 中取出打印语句。

您可以返回字符串 ', '.join(result) ,但这有多大用处?列表 result 可能(将来)对进一步处理更有用,所以我选择返回 result 。我为 main 函数留下的打印。

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

更短:

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

是的,但是为什么?

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

 "Fizz"*(not n % 3)

在 Python 中,我们可以“乘以”字符串,因此 "a"*3 将导致 "aaa" 。 You can also multiply a string with a boolean: "a" * True is "a" , whereas "a" * False is an empty string, "" .这就是我们的 "Fizz 在这里发生的事情。当 n % 3 == 0 (即 n 是 3、6、9,…),那么 not n % 3 same as not 0 , which is True . Conversely, when n is 1, 2, 4, 5, 7, … then n % 3 将是 1 或 2,并且 not n % 3 将为假。换句话说,只要 n 可以被 3 整除,术语 "Fizz"*(not n % 3) 将乘以字符串 "Fizz" 乘以 True,否则乘以 False,结果为空字符串。

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

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

 "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)

原文由 Manuel Ebert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题