Что делает звезда (*) в этом решении FizzBuzz? - PullRequest
1 голос
/ 06 марта 2020

Обучение программированию в 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)

Мой вопрос: что здесь делает *? Может ли кто-нибудь указать мне на документацию или ресурсы, которые касаются того, что сделал этот личный код? Я не нахожу это супер читабельным, но это, видимо, лучшее решение проблемы.

Ответы [ 5 ]

4 голосов
/ 06 марта 2020

bool в Python является подклассом int; True имеет значение 1, False, 0.

Последовательности (включая str) в Python можно умножить, чтобы последовательность повторялась столько раз, поэтому:

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

умножает "Fizz" на 1 (число c значение True) при num % 3 == 0, создавая исходную строку, и на 0 (число c значение False) в противном случае получается пустая строка.

Та же самая работа выполняется с "Buzz" и сцепляется. Если они оба выдали пустую строку (что ложно), то or означает, что str(num) вычисляется и возвращается (Python 'or и and не оцениваются как строгие True или False они оценивают до последнего оцениваемого элемента и имеют короткое замыкание, поэтому or всегда оценивает первый истинный элемент или последний элемент в цепочке or независимо от истинности).

2 голосов
/ 06 марта 2020

Во-первых, короче не всегда значит лучше. В этом случае ваше решение в порядке, а «верхнее решение» - умное, но бесполезное, как вам известно: * и True == 1. Таким образом, если num делится на 3, вы получаете 'Fizz' один раз, а если num делится на 5, вы получаете 'Buzz' один раз. В противном случае вы получите пустую строку, '', и поскольку пустая строка является ложной, предложение or означает, что она будет заменена на str(num).

0 голосов
/ 06 марта 2020

Я не знаю ссылку на какую-либо документацию или ресурс по этому поводу, но я могу вам это объяснить.

Сначала в python str можно умножить на число, например 'Fizz' * 3 вернет 'FizzFizzFizz' или 'Fizz' * 0 вернет '', пустую строку.

Во-вторых, bool в python также можно распознать как int, то есть True равно 1, а False равно 0.

В-третьих, в python могут быть добавлены строки, например, 'Fizz'+'Buzz' вернет 'FizzBuzz'

То, что делает лучший парень решения, очень просто: num%3==0 он получает bool и просто умножает str 'Fizz' или 'Buzz' на него и возвращает.

0 голосов
/ 06 марта 2020

Я не знаю о ресурсе, но могу рассказать вам, что он делает. Фраза num%3==0 является логическим значением, которое истинно, если число делится на 3. Если это так, эта фраза возвращает 1 (или 0, если False). То же самое для num%5==0 и делится на 5. Затем это умножается на строку Fizz и / или Buzz и объединяется вместе, где умножение на 1 возвращает строку, а 0 - ничего. Если ни один из них не выполняется, возвращается str(num).

0 голосов
/ 06 марта 2020

* - это умножение строк как обычно. Он просто умножается на 0 или 1 в зависимости от того, выполнено ли условие для печати фразы. Если ни одно из условий не выполняется, по умолчанию возвращается число, как и должно быть.

...