Posted at

怠惰な FizzBuzz を作ってみた (Python 版)

More than 1 year has passed since last update.


はじめに

先日 怠惰な FizzBuzz を作ってみた という、Ruby で FizzBuzz を実装する記事を投稿しました。今回はそれを Python で実装します。

Ruby 版では怠惰さを Enumerator::Lazy で実現しましたが、Python 版では ジェネレータ を利用します。


実装

itertools 万歳 :innocent:


fizzbuzz.py

import itertools

class FizzBuzzRule(object):
@classmethod
def say(cls, word):
return cls(word)

def __init__(self, word):
self.word = word

def for_multiples_of(self, number):
return itertools.cycle((*itertools.repeat('', number - 1), self.word))

numbers = itertools.count(1)
fizzes = FizzBuzzRule.say('Fizz').for_multiples_of(3)
buzzes = FizzBuzzRule.say('Buzz').for_multiples_of(5)

fizzbuzz_generator = (f'{fizz}{buzz}' or n
for n, fizz, buzz
in zip(numbers, fizzes, buzzes))

if __name__ == '__main__':
for word in itertools.islice(fizzbuzz_generator, 30):
print(word)


$ python fizzbuzz.py

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz