学习Python编程和我正在做一些挑战。我遇到了一些我还没有学到的东西,我很好奇这段代码在做什么。
所以我的挑战被称为"FizzBuzz“挑战。说明很简单:
创建一个函数,该函数以一个数字作为参数,并返回"Fizz“、"Buzz”或"FizzBuzz“。
如果数字是3的倍数,输出应该是"Fizz“。如果给定的数字是5的倍数,则输出应该是"Buzz“。如果给定的数字是3和5的倍数,则输出应该是"FizzBuzz“。如果该数字不是3或5的倍数,则应自行输出该数字。
我编写了这段代码来解决这个问题(显然,它可能会更好):
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)我的问题是*在这里做什么?有人能给我指出解决这个人代码所做的事情的文档或资源吗?我不认为它是超级可读的,但它显然是解决这个问题的最佳方法。
发布于 2020-03-06 19:12:01
第一,短并不总是意味着更好。在本例中,您的解决方案很好,“顶级解决方案”很聪明,但您知道,这是不必要的混淆:
恒星正在做字符串乘法,它利用了False == 0和True == 1这一事实。因此,如果num可被3整除,则得到一次'Fizz',如果num可被5整除,则得到'Buzz'一次。否则,您将得到一个空字符串,'',因为空字符串是falsy,所以or子句意味着它将被str(num)替换。
发布于 2020-03-06 18:53:55
Python中的bool是int的子类;True有值1、False、0。
可以将Python中的序列(包括str)相乘,以使序列重复多次,因此:
"Fizz"*(num%3==0)当"Fizz"生成原始字符串时,将1 (True的数值)乘以num % 3 == 0,否则乘以0 (False的数值),生成空字符串。
同样的工作是通过"Buzz"和级联完成的。如果它们都生成空字符串(这是falsy),那么or就意味着计算和返回str(num) (Python的or和and不计算严格的True或False,它们计算的是最后一个被评估的项,并且短路,所以or总是计算到第一个真实项,或者or链中的最后一个项,而不管是否真实)。
发布于 2020-03-06 18:54:44
*和往常一样是字符串乘法。根据打印短语的条件是否满足,它只是乘以0或1。如果两个条件都不满足,则默认返回数字,就像它应该返回的那样。
https://stackoverflow.com/questions/60569970
复制相似问题