DamiRocK

Python: range() и строковый результат FizzBuzz

Перебираем числа от 1 до n включительно, подставляем Fizz, Buzz и FizzBuzz, соединяем элементы одним пробелом без лишнего пробела по краям.

Правая граница range не включается

range(1, 5) даёт 1, 2, 3, 4. Чтобы пройти от 1 до n включительно, нужна граница n+1. При отрицательном шаге направление меняется: range(3, 0, -1) даёт 3, 2, 1.

Задание источника

Верните строку чисел от 1 до n: кратные 3 заменяются Fizz, кратные 5 — Buzz, кратные обоим — FizzBuzz. Элементы разделяются пробелами.

def fizzbuzz(n: int) -> str:
    result = ""
    for i in range(1, n + 1):
        if i % 3 == 0 and i % 5 == 0:
            word = "FizzBuzz"
        elif i % 3 == 0:
            word = "Fizz"
        elif i % 5 == 0:
            word = "Buzz"
        else:
            word = str(i)
        if result == "":
            result = word
        else:
            result += " " + word
    return result

Проверка

Для n=15 результат:

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz

Проверка кратности обоим стоит первой. Если начать с одного делителя, число 15 попадёт в более раннюю ветвь Fizz и не дойдёт до совместного случая.

Разделители и возврат

Первое слово сохраняется без ведущего пробела. Каждое следующее получает один пробел перед собой. В конце дополнительный пробел не добавляется. Функция возвращает одну строку, а не печатает каждый элемент отдельным вызовом.

При n=0 или отрицательном n диапазон пуст, и реализация возвращает пустую строку. Неотрицательность или положительность входа, если она обязательна для приложения, проверяется отдельно. Range хранит описание арифметической последовательности, а не требует заранее создать список всех её чисел.

Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Алгоритм и формат результата сохранены.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.