python - 这个 FizzBuzz 解决方案中的星号 (*) 在做什么?
问题描述
学习 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)
我的问题是 * 在这里做什么?有人可以指出我的文档或资源解决了这个人的代码所做的事情吗?我不觉得它超级可读,但它显然是解决问题的最佳方法。
解决方案
bool
在 Python 中是int
;的子类 True
有值1
, False
, 0
.
Python 中的序列(包括str
)可以相乘,以使序列重复多次,因此:
"Fizz"*(num%3==0)
当 时乘以"Fizz"
(的1
数值True
)num % 3 == 0
,生成原始字符串,否则乘以0
(的数值False
),生成空字符串。
相同的工作被完成"Buzz"
并连接。如果它们都产生了空字符串(这是假的),则评估并返回or
均值str(num)
(Python的or
并且and
不评估为严格True
或False
,它们评估为最后评估的项目,并且短路,所以or
总是评估为第一个真实的项目,或or
链中的最后一个项目,无论真实性如何)。
推荐阅读
- swift - 一个新的 NSViewController 的 segue 应该在覆盖整个 Window 的旧的顶部显示新的
- azure - 具有多个终结点的 Azure 机器学习 (AML) Web 服务 REST API
- python - 从字符串设置 qml 模型和属性
- mysql - 如何配置 sequalize & node mysql 以使用新的 aws rds root cert rds-ca-2019
- php - 尝试创建带有 CollectionType 调用另一个 FromType 的复选框时的表单问题(跨实体情况)
- javascript - 如何使用 java 脚本知道 pdf 的尺寸,并对其进行快照以显示在网页上?
- java - Java - 客户端和服务器是否可以通过 IPv4 连接而无需端口转发?
- c++ - 多项式上的调车场
- android - unity google ads 插件问题 CommandInvokationFailure: 无法重新打包资源
- reactjs - ReactJS - 从外部进程触发重新渲染