← Назад к вопросам
FizzBuzz
1.0 Junior🔥 281 комментариев
#Python Core
Условие
Напишите программу, которая выводит числа от 1 до n.
- Если число делится на 3 — выведите "Fizz"
- Если число делится на 5 — выведите "Buzz"
- Если число делится на 3 и 5 — выведите "FizzBuzz"
- Иначе — выведите само число
Пример
fizzbuzz(15) → [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
FizzBuzz
Классическое решение
Эта знаменитая задача часто используется на собеседованиях для проверки базовых навыков программирования. Есть несколько подходов различной сложности.
1. Наивное решение
def fizzbuzz_naive(n: int) -> list:
"""
Простое решение с проверкой условий.
"""
result = []
for i in range(1, n + 1):
if i % 15 == 0: # Делится на 3 и 5
result.append("FizzBuzz")
elif i % 3 == 0:
result.append("Fizz")
elif i % 5 == 0:
result.append("Buzz")
else:
result.append(i)
return result
# Использование
print(fizzbuzz_naive(15))
# [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
Особенности:
- Проверяем условия в правильном порядке (3 и 5 перед 3 и 5 отдельно)
- Проверяем 15 (3×5) перед 3 и 5
- Временная сложность: O(N)
- Пространственная: O(N) для результата
2. Решение со строковой конкатенацией
def fizzbuzz_string(n: int) -> list:
"""
Более элегантное решение, легче расширяется.
Вместо множественных условий строим строку.
"""
result = []
for i in range(1, n + 1):
value = ""
if i % 3 == 0:
value += "Fizz"
if i % 5 == 0:
value += "Buzz"
result.append(value or i) # Если value пусто, берем число
return result
Преимущества:
- Легче добавить новые правила (например, на 7 → Woof)
- Не нужно проверять 15 отдельно
- Более читаемо
3. Решение с функциональным подходом
def fizzbuzz_functional(n: int) -> list:
"""
List comprehension версия.
"""
def convert(i):
value = ""
if i % 3 == 0:
value += "Fizz"
if i % 5 == 0:
value += "Buzz"
return value or i
return [convert(i) for i in range(1, n + 1)]
# Или совсем компактно
def fizzbuzz_compact(n: int) -> list:
return [(
(i % 3 == 0 and "Fizz" or "") +
(i % 5 == 0 and "Buzz" or "")
) or i for i in range(1, n + 1)]
4. Решение с использованием словаря (расширяемое)
def fizzbuzz_dict(n: int, rules: dict = None) -> list:
"""
Обобщенное решение, где правила хранятся в словаре.
Легко добавлять новые правила без изменения логики.
rules: {делитель: строка}
"""
if rules is None:
rules = {3: "Fizz", 5: "Buzz"}
result = []
for i in range(1, n + 1):
value = ""
for divisor, word in sorted(rules.items()):
if i % divisor == 0:
value += word
result.append(value or i)
return result
# Использование
print(fizzbuzz_dict(15)) # Стандартные правила
# Расширение
print(fizzbuzz_dict(21, {3: "Fizz", 5: "Buzz", 7: "Woof"}))
# [1, 2, "Fizz", 4, "Buzz", "Fizz", "Woof", 8, "Fizz", "Buzz", 11, "Fizz", 13, "Woof", "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "FizzWoof"]
5. Решение с использованием класса (ООП подход)
class FizzBuzzRule:
"""Правило FizzBuzz"""
def __init__(self, divisor: int, word: str):
self.divisor = divisor
self.word = word
def check(self, num: int) -> str:
return self.word if num % self.divisor == 0 else ""
class FizzBuzz:
"""Генератор FizzBuzz последовательности"""
def __init__(self, rules: list = None):
if rules is None:
rules = [
FizzBuzzRule(3, "Fizz"),
FizzBuzzRule(5, "Buzz")
]
self.rules = rules
def generate(self, n: int) -> list:
result = []
for i in range(1, n + 1):
value = "".join(rule.check(i) for rule in self.rules)
result.append(value or i)
return result
# Использование
fizzbuzz = FizzBuzz()
print(fizzbuzz.generate(15))
# Расширение
custom_rules = [
FizzBuzzRule(3, "Fizz"),
FizzBuzzRule(5, "Buzz"),
FizzBuzzRule(7, "Woof")
]
fizzbuzz_extended = FizzBuzz(custom_rules)
print(fizzbuzz_extended.generate(21))
6. Generator версия (для больших n)
def fizzbuzz_generator(n: int):
"""
Вместо возврата списка, генерируем значения по одному.
Экономит память для больших n.
"""
for i in range(1, n + 1):
value = ""
if i % 3 == 0:
value += "Fizz"
if i % 5 == 0:
value += "Buzz"
yield value or i
# Использование
for item in fizzbuzz_generator(15):
print(item)
# Или преобразовать в список
result = list(fizzbuzz_generator(15))
Сравнение подходов
| Подход | Простота | Расширяемость | Когда использовать |
|---|---|---|---|
| Наивное | Легко | Плохо | На собеседовании, быстрый старт |
| Строковое | Средне | Хорошо | Если нужны вариации |
| Функциональное | Средне | Плохо | Когда нравится list comprehension |
| Словарь | Средне | Отлично | Production код |
| ООП | Сложно | Отлично | Большой проект с расширениями |
| Generator | Средне | Хорошо | Большие N или потоковая обработка |
На собеседовании
Что показать интервьюеру:
- Базовое решение (1-2 минуты)
def fizzbuzz(n):
return [(i % 3 == 0 and "Fizz" or "") + (i % 5 == 0 and "Buzz" or "") or i for i in range(1, n + 1)]
- Объяснить логику → порядок проверок
- Предложить улучшение → словарь для правил
- Если интересует → обсудить расширяемость
Ошибки, которых избегать:
- Проверять 15 вместо (3 и 5)
- Забыть
or iдля чисел - Использовать
elifвместоifдля конкатенации