首页 > 解决方案 > 这个 FizzBu​​zz 解决方案中的星号 (*) 在做什么?

问题描述

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

所以我的挑战被称为“FizzBu​​zz”挑战。说明很简单:

创建一个将数字作为参数并返回“Fizz”、“Buzz”或“FizzBu​​zz”的函数。

如果数字是 3 的倍数,则输出应为“Fizz”。如果给定的数字是 5 的倍数,则输出应为“Buzz”。如果给定的数字是 3 和 5 的倍数,则输出应为“FizzBu​​zz”。如果数字不是 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)

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

标签: pythonfizzbuzz

解决方案


bool在 Python 中是int;的子类 True有值1, False, 0.

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

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

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

相同的工作被完成"Buzz"并连接。如果它们都产生了空字符串(这是假的),则评估并返回or均值str(num)(Python的or并且and不评估为严格TrueFalse,它们评估为最后评估的项目,并且短路,所以or总是评估为第一个真实的项目,或or链中的最后一个项目,无论真实性如何)。


推荐阅读