Python

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

はじめに

先日 怠惰な 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