星号 (*) 在此 FizzBuzz 解决方案中做什么?
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
的值为 1
、False
、0
。
Python中的序列(包括str
)可以相乘,得到重复多次的序列,所以:
"Fizz"*(num%3==0)
当 num % 3 == 0
时, 将 "Fizz"
乘以 1
(True
的数值),生成原始字符串,并乘以 0
(True
的数值False
) 否则,生成空字符串。
用 "Buzz"
完成相同的工作并连接起来。如果它们都产生了空字符串(这是假的),那么 or
意味着 str(num)
被评估并返回(Python 的 or
和 and
不要评估为严格的 True
或 False
,它们评估为最后评估的项目,并且短路,因此 or
总是评估为第一个真实的项目,或最后一个项目or
链,不考虑真实性)。
*
照常是字符串乘法。它只是根据是否满足打印短语的条件乘以 0
或 1
。如果两个条件都不满足,它会默认返回数字,因为它应该。
我不知道资源,但我可以告诉你它的作用。短语 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 == 0
和 True == 1
这一事实。所以如果 num
能被 3 整除,你得到一次 'Fizz'
,如果 num
能被 5 整除,你得到一次 'Buzz'
。否则你会得到一个空字符串 ''
,因为空字符串是假的,or
子句意味着它将被 str(num)
.
替换
我不知道 link 关于它的任何文档或资源,但我可以向您解释。
首先在python中str
可以乘以一个数,比如'Fizz' * 3
会return 'FizzFizzFizz'
或者'Fizz' * 0
会return ''
,一个空字符串。
其次python中的bool
也可以识别为int
,即True
是1
,False
是0
.
第三,在 python 中可以添加字符串,例如'Fizz'+'Buzz'
将 return 'FizzBuzz'
最好的解决方案是非常简单的 num%3==0
他得到 bool
然后乘以 str
'Fizz' 或 'Buzz' 然后returns.
在 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
的值为 1
、False
、0
。
Python中的序列(包括str
)可以相乘,得到重复多次的序列,所以:
"Fizz"*(num%3==0)
当 num % 3 == 0
时, 将 "Fizz"
乘以 1
(True
的数值),生成原始字符串,并乘以 0
(True
的数值False
) 否则,生成空字符串。
用 "Buzz"
完成相同的工作并连接起来。如果它们都产生了空字符串(这是假的),那么 or
意味着 str(num)
被评估并返回(Python 的 or
和 and
不要评估为严格的 True
或 False
,它们评估为最后评估的项目,并且短路,因此 or
总是评估为第一个真实的项目,或最后一个项目or
链,不考虑真实性)。
*
照常是字符串乘法。它只是根据是否满足打印短语的条件乘以 0
或 1
。如果两个条件都不满足,它会默认返回数字,因为它应该。
我不知道资源,但我可以告诉你它的作用。短语 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 == 0
和 True == 1
这一事实。所以如果 num
能被 3 整除,你得到一次 'Fizz'
,如果 num
能被 5 整除,你得到一次 'Buzz'
。否则你会得到一个空字符串 ''
,因为空字符串是假的,or
子句意味着它将被 str(num)
.
我不知道 link 关于它的任何文档或资源,但我可以向您解释。
首先在python中str
可以乘以一个数,比如'Fizz' * 3
会return 'FizzFizzFizz'
或者'Fizz' * 0
会return ''
,一个空字符串。
其次python中的bool
也可以识别为int
,即True
是1
,False
是0
.
第三,在 python 中可以添加字符串,例如'Fizz'+'Buzz'
将 return 'FizzBuzz'
最好的解决方案是非常简单的 num%3==0
他得到 bool
然后乘以 str
'Fizz' 或 'Buzz' 然后returns.