Правая граница 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. Алгоритм и формат результата сохранены.