星号 (*) 在此 FizzBu​​zz 解决方案中做什么?

What is the star (*) doing in this FizzBuzz solution?

在 Python 学习编程,我正在做一些挑战。我已经 运行 了解了一些我还没有学过的东西,并且很好奇这段代码在做什么。

所以我的挑战叫做 "FizzBuzz" 挑战。说明很简单:

Create a function that takes a number as an argument and returns "Fizz", "Buzz" or "FizzBuzz".

If the number is a multiple of 3 the output should be "Fizz". If the number given is a multiple of 5, the output should be "Buzz". If the number given is a multiple of both 3 and 5, the output should be "FizzBuzz". If the number is not a multiple of either 3 or 5, the number should be output on its own.

我写了这段代码来解决它(显然它可以更好):

def fizz_buzz(num):
    if num % 3 == 0 and num % 5 == 0:
        return 'FizzBuzz'
    elif num % 3 == 0:
        return 'Fizz'
    elif num % 5 == 0:
        return 'Buzz'
    else:
        return str(num)

但是,一旦我提交了我的解决方案,我就能够看到最佳解决方案,即:

def fizz_buzz(num):
    return "Fizz"*(num%3==0) + "Buzz"*(num%5==0) or str(num)

我的问题是 * 在这里做什么?有人可以指点我解决此人代码所做的事情的文档或资源吗?我不觉得它的可读性很强,但它显然是解决问题的最佳方法。

bool in Python 是 int 的子类; True 的值为 1False0

Python中的序列(包括str)可以相乘,得到重复多次的序列,所以:

"Fizz"*(num%3==0)
num % 3 == 0 时,

"Fizz" 乘以 1True 的数值),生成原始字符串,并乘以 0True 的数值False) 否则,生成空字符串。

"Buzz" 完成相同的工作并连接起来。如果它们都产生了空字符串(这是假的),那么 or 意味着 str(num) 被评估并返回(Python 的 orand不要评估为严格的 TrueFalse,它们评估为最后评估的项目,并且短路,因此 or 总是评估为第一个真实的项目,或最后一个项目or 链,不考虑真实性)。

*照常是字符串乘法。它只是根据是否满足打印短语的条件乘以 01。如果两个条件都不满足,它会默认返回数字,因为它应该。

我不知道资源,但我可以告诉你它的作用。短语 num%3==0 是一个布尔值,如果数字可以被 3 整除则为真。如果是这种情况,则此短语 returns 为 1(如果为假则为 0)。 num%5==0 相同,可被 5 整除。然后将其乘以字符串 Fizz and/or Buzz 并连接在一起,其中乘以 1 returns 字符串0什么都没有。如果两者都不成立,则 returns str(num).

首先,更短并不总是意味着更好。在这种情况下,您的解决方案很好,并且 "top solution" 很聪明,但如您所知,不必要地造成混淆:P

这位明星正在做字符串乘法,它正在利用 False == 0True == 1 这一事实。所以如果 num 能被 3 整除,你得到一次 'Fizz',如果 num 能被 5 整除,你得到一次 'Buzz'。否则你会得到一个空字符串 '',因为空字符串是假的,or 子句意味着它将被 str(num).

替换

我不知道 link 关于它的任何文档或资源,但我可以向您解释。

首先在python中str可以乘以一个数,比如'Fizz' * 3会return 'FizzFizzFizz'或者'Fizz' * 0会return '',一个空字符串。

其次python中的bool也可以识别为int,即True1False0.

第三,在 python 中可以添加字符串,例如'Fizz'+'Buzz' 将 return 'FizzBuzz'

最好的解决方案是非常简单的 num%3==0 他得到 bool 然后乘以 str 'Fizz' 或 'Buzz' 然后returns.