Gra Fizz Buzz to klasyczne zadanie – test na odfiltrowanie z ciągu liczb tych, które są podzielne przez zadane liczby bez reszty tzn. jeśli mamy np. ciąg od 0 do 5 i szukamy takich liczb, które dzielą się np. przez 3 i przez 5 bez reszty, to kolejno otrzymujemy: dla 0 łańcuch FIZZBUZZ, dla 1 pusty łańcuch, dla 2 pusty łańcuch, dla 3 otrzymujemy FIZZ, dla 4 mamy pusty łańcuch i dla 5 mamy BUZZ.
Moje rozwiązanie zadania za pomocą dekoratorów wygląda następująco:
def fizzbuzz(number, message):
def decor(func):
def wrapper(*args):
dict = func(*args)
for key in dict:
if not (key % number):
dict[key] += message
return dict
return wrapper
return decor
Utworzę jeszcze funkcję numbers(), która będzie zwracała słownik o kluczach będących liczbami o zakresie podanym jako argumenty tzn.
def numbers(start, end):
return {key: '' for key in range(start, end+1)}
Definicja funkcji numbers() po dodaniu dekoratora będzie wyglądać następująco:
@fizzbuzz(5, 'BUZZ')
@fizzbuzz(3, 'FIZZ')
def numbers(start, end):
return {key: '' for key in range(start, end+1)}
Zmodyfikowany słownik możemy wyświetlić za pomocą wywołania zmodyfikowanej poprzez użycie dekoratorów funkcji numbers() tzn.
for key, value in numbers(1, 15).items():
print(key, value)