首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这个FizzBuzz解决方案中,星星(*)在做什么?

在这个FizzBuzz解决方案中,星星(*)在做什么?
EN

Stack Overflow用户
提问于 2020-03-06 18:49:36
回答 5查看 207关注 0票数 1

学习Python编程和我正在做一些挑战。我遇到了一些我还没有学到的东西,我很好奇这段代码在做什么。

所以我的挑战被称为"FizzBuzz“挑战。说明很简单:

创建一个函数,该函数以一个数字作为参数,并返回"Fizz“、"Buzz”或"FizzBuzz“。

如果数字是3的倍数,输出应该是"Fizz“。如果给定的数字是5的倍数,则输出应该是"Buzz“。如果给定的数字是3和5的倍数,则输出应该是"FizzBuzz“。如果该数字不是3或5的倍数,则应自行输出该数字。

我编写了这段代码来解决这个问题(显然,它可能会更好):

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
def fizz_buzz(num):
    return "Fizz"*(num%3==0) + "Buzz"*(num%5==0) or str(num)

我的问题是*在这里做什么?有人能给我指出解决这个人代码所做的事情的文档或资源吗?我不认为它是超级可读的,但它显然是解决这个问题的最佳方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-03-06 19:12:01

第一,短并不总是意味着更好。在本例中,您的解决方案很好,“顶级解决方案”很聪明,但您知道,这是不必要的混淆:

恒星正在做字符串乘法,它利用了False == 0True == 1这一事实。因此,如果num可被3整除,则得到一次'Fizz',如果num可被5整除,则得到'Buzz'一次。否则,您将得到一个空字符串,'',因为空字符串是falsy,所以or子句意味着它将被str(num)替换。

票数 2
EN

Stack Overflow用户

发布于 2020-03-06 18:53:55

Python中的boolint的子类;True有值1False0

可以将Python中的序列(包括str)相乘,以使序列重复多次,因此:

代码语言:javascript
运行
复制
"Fizz"*(num%3==0)

"Fizz"生成原始字符串时,将1 (True的数值)乘以num % 3 == 0,否则乘以0 (False的数值),生成空字符串。

同样的工作是通过"Buzz"和级联完成的。如果它们都生成空字符串(这是falsy),那么or就意味着计算和返回str(num) (Python的orand不计算严格的TrueFalse,它们计算的是最后一个被评估的项,并且短路,所以or总是计算到第一个真实项,或者or链中的最后一个项,而不管是否真实)。

票数 4
EN

Stack Overflow用户

发布于 2020-03-06 18:54:44

*和往常一样是字符串乘法。根据打印短语的条件是否满足,它只是乘以01。如果两个条件都不满足,则默认返回数字,就像它应该返回的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60569970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档